From ba8d02a808ec039fc6f9cc29bcd53479564f53c1 Mon Sep 17 00:00:00 2001 From: macekj Date: Tue, 17 Nov 2020 17:36:58 -0500 Subject: [PATCH 001/187] add quick shortcut emoji feature and tests Signed-off-by: macekj --- src/autocomplete/EmojiProvider.tsx | 2 +- .../views/rooms/BasicMessageComposer.tsx | 4 +- .../views/rooms/SendMessageComposer.js | 61 +++++++++++++++++++ src/editor/parts.ts | 4 +- .../views/rooms/SendMessageComposer-test.js | 42 ++++++++++++- 5 files changed, 107 insertions(+), 6 deletions(-) diff --git a/src/autocomplete/EmojiProvider.tsx b/src/autocomplete/EmojiProvider.tsx index 705474f8d0..d4791d69f1 100644 --- a/src/autocomplete/EmojiProvider.tsx +++ b/src/autocomplete/EmojiProvider.tsx @@ -34,7 +34,7 @@ const LIMIT = 20; // Match for ascii-style ";-)" emoticons or ":wink:" shortcodes provided by emojibase // anchored to only match from the start of parts otherwise it'll show emoji suggestions whilst typing matrix IDs -const EMOJI_REGEX = new RegExp('(' + EMOTICON_REGEX.source + '|(?:^|\\s):[+-\\w]*:?)$', 'g'); +const EMOJI_REGEX = new RegExp('(' + EMOTICON_REGEX.source + '|(?:^|\\s|(?<=^\\+)):[+-\\w]*:?)$', 'g'); interface IEmojiShort { emoji: IEmoji; diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index 311a4734fd..43316e90f2 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -47,7 +47,7 @@ import AutocompleteWrapperModel from "../../../editor/autocomplete"; import DocumentPosition from "../../../editor/position"; import {ICompletion} from "../../../autocomplete/Autocompleter"; -const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s$'); +const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s|(?<=^\\+))(' + EMOTICON_REGEX.source + ')\\s$'); const IS_MAC = navigator.platform.indexOf("Mac") !== -1; @@ -524,7 +524,7 @@ export default class BasicMessageEditor extends React.Component const position = model.positionForOffset(caret.offset, caret.atNodeEnd); const range = model.startRange(position); range.expandBackwardsWhile((index, offset, part) => { - return part.text[offset] !== " " && ( + return part.text[offset] !== " " && part.text[offset] !== "+" && ( part.type === "plain" || part.type === "pill-candidate" || part.type === "command" diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 78b1dd85db..4f5243a765 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -43,6 +43,8 @@ import MatrixClientContext from "../../../contexts/MatrixClientContext"; import RateLimitedFunc from '../../../ratelimitedfunc'; import {Action} from "../../../dispatcher/actions"; import CountlyAnalytics from "../../../CountlyAnalytics"; +import {MatrixClientPeg} from "../../../MatrixClientPeg"; +import EMOJI_REGEX from 'emojibase-regex'; function addReplyToMessageContent(content, repliedToEvent, permalinkCreator) { const replyContent = ReplyThread.makeReplyMixIn(repliedToEvent); @@ -88,6 +90,25 @@ export function createMessageContent(model, permalinkCreator, replyToEvent) { return content; } +// exported for tests +export function isQuickReaction(model) { + const parts = model.parts; + if (parts.length == 0) return false; + let text = parts[0].text; + text += parts[1] ? parts[1].text : ""; + // shortcut takes the form "+:emoji:" or "+ :emoji:"" + // can be in 1 or 2 parts + if (parts.length <= 2) { + const hasShortcut = text.startsWith("+") || text.startsWith("+ "); + const emojiMatch = text.match(EMOJI_REGEX); + if (hasShortcut && emojiMatch && emojiMatch.length == 1) { + return emojiMatch[0] === text.substring(1) || + emojiMatch[0] === text.substring(2); + } + } + return false; +} + export default class SendMessageComposer extends React.Component { static propTypes = { room: PropTypes.object.isRequired, @@ -216,6 +237,41 @@ export default class SendMessageComposer extends React.Component { return false; } + _sendQuickReaction() { + const timeline = this.props.room.getLiveTimeline(); + const events = timeline.getEvents(); + const reaction = this.model.parts[1].text; + for (let i = events.length - 1; i >= 0; i--) { + if (events[i].getType() === "m.room.message") { + let shouldReact = true; + const lastMessage = events[i]; + const userId = MatrixClientPeg.get().getUserId(); + const messageReactions = this.props.room.getUnfilteredTimelineSet() + .getRelationsForEvent(lastMessage.getId(), "m.annotation", "m.reaction"); + + // if we have already sent this reaction, don't redact but don't re-send + if (messageReactions) { + const myReactionEvents = messageReactions.getAnnotationsBySender()[userId] || []; + const myReactionKeys = [...myReactionEvents] + .filter(event => !event.isRedacted()) + .map(event => event.getRelation().key); + shouldReact = !myReactionKeys.includes(reaction); + } + if (shouldReact) { + MatrixClientPeg.get().sendEvent(lastMessage.getRoomId(), "m.reaction", { + "m.relates_to": { + "rel_type": "m.annotation", + "event_id": lastMessage.getId(), + "key": reaction, + }, + }); + dis.dispatch({action: "message_sent"}); + } + break; + } + } + } + _getSlashCommand() { const commandText = this.model.parts.reduce((text, part) => { // use mxid to textify user pills in a command @@ -303,6 +359,11 @@ export default class SendMessageComposer extends React.Component { } } + if (isQuickReaction(this.model)) { + shouldSend = false; + this._sendQuickReaction(); + } + const replyToEvent = this.props.replyToEvent; if (shouldSend) { const startTime = CountlyAnalytics.getTimestamp(); diff --git a/src/editor/parts.ts b/src/editor/parts.ts index 5ed0c0529f..8a7ccfcb7b 100644 --- a/src/editor/parts.ts +++ b/src/editor/parts.ts @@ -190,7 +190,9 @@ abstract class PlainBasePart extends BasePart { return true; } // only split if the previous character is a space - return this._text[offset - 1] !== " "; + // or if it is a + and this is a : + return this._text[offset - 1] !== " " && + (this._text[offset - 1] !== "+" || chr !== ":"); } return true; } diff --git a/test/components/views/rooms/SendMessageComposer-test.js b/test/components/views/rooms/SendMessageComposer-test.js index 83a9388609..6eeac7ceea 100644 --- a/test/components/views/rooms/SendMessageComposer-test.js +++ b/test/components/views/rooms/SendMessageComposer-test.js @@ -18,8 +18,10 @@ import Adapter from "enzyme-adapter-react-16"; import { configure, mount } from "enzyme"; import React from "react"; import {act} from "react-dom/test-utils"; - -import SendMessageComposer, {createMessageContent} from "../../../../src/components/views/rooms/SendMessageComposer"; +import SendMessageComposer, { + createMessageContent, + isQuickReaction, +} from "../../../../src/components/views/rooms/SendMessageComposer"; import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; import EditorModel from "../../../../src/editor/model"; import {createPartCreator, createRenderer} from "../../../editor/mock"; @@ -227,6 +229,42 @@ describe('', () => { }); }); }); + + describe("isQuickReaction", () => { + it("correctly detects quick reaction", () => { + const model = new EditorModel([], createPartCreator(), createRenderer()); + model.update("+😊", "insertText", {offset: 3, atNodeEnd: true}); + + const isReaction = isQuickReaction(model); + + expect(isReaction).toBeTruthy(); + }); + + it("correctly detects quick reaction with space", () => { + const model = new EditorModel([], createPartCreator(), createRenderer()); + model.update("+ 😊", "insertText", {offset: 4, atNodeEnd: true}); + + const isReaction = isQuickReaction(model); + + expect(isReaction).toBeTruthy(); + }); + + it("correctly rejects quick reaction with extra text", () => { + const model = new EditorModel([], createPartCreator(), createRenderer()); + const model2 = new EditorModel([], createPartCreator(), createRenderer()); + const model3 = new EditorModel([], createPartCreator(), createRenderer()); + const model4 = new EditorModel([], createPartCreator(), createRenderer()); + model.update("+😊hello", "insertText", {offset: 8, atNodeEnd: true}); + model2.update(" +😊", "insertText", {offset: 4, atNodeEnd: true}); + model3.update("+ 😊😊", "insertText", {offset: 6, atNodeEnd: true}); + model4.update("+smiley", "insertText", {offset: 7, atNodeEnd: true}); + + expect(isQuickReaction(model)).toBeFalsy(); + expect(isQuickReaction(model2)).toBeFalsy(); + expect(isQuickReaction(model3)).toBeFalsy(); + expect(isQuickReaction(model4)).toBeFalsy(); + }); + }); }); From 2ffdfaef68bb2ae1e5d2fbcc7d1a2ee658f4dcb6 Mon Sep 17 00:00:00 2001 From: macekj Date: Tue, 24 Nov 2020 11:42:53 -0500 Subject: [PATCH 002/187] remove unnecessary lookbehind and comment emoticon regex Signed-off-by: macekj --- src/components/views/rooms/BasicMessageComposer.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index 43316e90f2..1fa2ad681f 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -47,7 +47,8 @@ import AutocompleteWrapperModel from "../../../editor/autocomplete"; import DocumentPosition from "../../../editor/position"; import {ICompletion} from "../../../autocomplete/Autocompleter"; -const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s|(?<=^\\+))(' + EMOTICON_REGEX.source + ')\\s$'); +// matches emoticons which follow the start of a line, whitespace, or a plus at the start of a line +const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s|^\\+)(' + EMOTICON_REGEX.source + ')\\s$'); const IS_MAC = navigator.platform.indexOf("Mac") !== -1; From 200c061968a12c2fb0a5d53e0d7ad6f857ab35d0 Mon Sep 17 00:00:00 2001 From: macekj Date: Fri, 27 Nov 2020 19:41:45 -0500 Subject: [PATCH 003/187] remove unnecessary plus checks in emoji regexes Signed-off-by: macekj --- src/autocomplete/EmojiProvider.tsx | 2 +- src/components/views/rooms/BasicMessageComposer.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/autocomplete/EmojiProvider.tsx b/src/autocomplete/EmojiProvider.tsx index d4791d69f1..705474f8d0 100644 --- a/src/autocomplete/EmojiProvider.tsx +++ b/src/autocomplete/EmojiProvider.tsx @@ -34,7 +34,7 @@ const LIMIT = 20; // Match for ascii-style ";-)" emoticons or ":wink:" shortcodes provided by emojibase // anchored to only match from the start of parts otherwise it'll show emoji suggestions whilst typing matrix IDs -const EMOJI_REGEX = new RegExp('(' + EMOTICON_REGEX.source + '|(?:^|\\s|(?<=^\\+)):[+-\\w]*:?)$', 'g'); +const EMOJI_REGEX = new RegExp('(' + EMOTICON_REGEX.source + '|(?:^|\\s):[+-\\w]*:?)$', 'g'); interface IEmojiShort { emoji: IEmoji; diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index 1fa2ad681f..2ececdeaed 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -47,8 +47,8 @@ import AutocompleteWrapperModel from "../../../editor/autocomplete"; import DocumentPosition from "../../../editor/position"; import {ICompletion} from "../../../autocomplete/Autocompleter"; -// matches emoticons which follow the start of a line, whitespace, or a plus at the start of a line -const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s|^\\+)(' + EMOTICON_REGEX.source + ')\\s$'); +// matches emoticons which follow the start of a line or whitespace +const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s$'); const IS_MAC = navigator.platform.indexOf("Mac") !== -1; From 5787915cb5e93666bd3fbcd995225d9eab5b4df8 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Wed, 2 Dec 2020 14:51:42 +0000 Subject: [PATCH 004/187] Translated using Weblate (Swedish) Currently translated at 97.4% (2633 of 2702 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 | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 93ff8808cb..7b8e5b6383 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -2776,12 +2776,20 @@ "Caribbean Netherlands": "Karibiska Nederländerna", "Cape Verde": "Kap Verde", "Change which room you're viewing": "Ändra vilket rum du visar", - "Send stickers into your active room": "Skicka dekaler in i ditt aktiva rum", - "Send stickers into this room": "Skicka dekaler in i det här rummet", + "Send stickers into your active room": "Skicka in dekaler i ditt aktiva rum", + "Send stickers into this room": "Skicka in dekaler i det här rummet", "Remain on your screen while running": "Stanna kvar på skärmen när det körs", "Remain on your screen when viewing another room, when running": "Stanna kvar på skärmen när ett annat rum visas, när det körs", "See when the topic changes in this room": "Se när ämnet ändras i det här rummet", "Change the topic of this room": "Ändra ämnet för det här rummet", "See when the topic changes in your active room": "Se när ämnet ändras i ditt aktiva rum", - "Change the topic of your active room": "Ändra ämnet för ditt aktiva rum" + "Change the topic of your active room": "Ändra ämnet för ditt aktiva rum", + "Change the avatar of your active room": "Byta avatar för ditt aktiva rum", + "Change the avatar of this room": "Byta avatar för det här rummet", + "Change the name of your active room": "Byta namn på ditt aktiva rum", + "Change the name of this room": "Byta namn på det här rummet", + "See when the avatar changes in your active room": "Se när avataren byts för ditt aktiva rum", + "See when the avatar changes in this room": "Se när avataren byts för det här rummet", + "See when the name changes in your active room": "Se när namnet på ditt aktiva rum byts", + "See when the name changes in this room": "Se när namnet på det här rummet byts" } From 27a853c5861d6d6668369b5ba194981fa3ce0a8d Mon Sep 17 00:00:00 2001 From: macekj Date: Wed, 2 Dec 2020 15:01:44 -0500 Subject: [PATCH 005/187] use textSerialize function to get model text --- src/components/views/rooms/SendMessageComposer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 4f5243a765..5e0611a953 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -94,8 +94,7 @@ export function createMessageContent(model, permalinkCreator, replyToEvent) { export function isQuickReaction(model) { const parts = model.parts; if (parts.length == 0) return false; - let text = parts[0].text; - text += parts[1] ? parts[1].text : ""; + const text = textSerialize(model); // shortcut takes the form "+:emoji:" or "+ :emoji:"" // can be in 1 or 2 parts if (parts.length <= 2) { From 6772f30b51e9cdbd206591c8881be8c3353bcc38 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Wed, 2 Dec 2020 20:00:25 +0000 Subject: [PATCH 006/187] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2701 of 2701 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 | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 613f889370..fd8ef04b22 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2859,5 +2859,32 @@ "Call failed because no webcam or microphone could not be accessed. Check that:": "A chamada falhou porque não foi possível acessar alguma câmera ou microfone. Verifique se:", "Unable to access webcam / microphone": "Não é possível acessar a câmera/microfone", "Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada falhou porque não foi possível acessar algum microfone. Verifique se o microfone está conectado e configurado corretamente.", - "Unable to access microphone": "Não é possível acessar o microfone" + "Unable to access microphone": "Não é possível acessar o microfone", + "New? Create account": "Quer se registrar? Crie uma conta", + "Decide where your account is hosted": "Decida onde a sua conta será hospedada", + "Host account on": "Hospedar conta em", + "Already have an account? Sign in here": "Já tem uma conta? Entre aqui", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s ou %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Continuar com %(ssoButtons)s", + "That username already exists, please try another.": "Este nome de usuário já existe. Por favor, digite outro.", + "There was a problem communicating with the homeserver, please try again later.": "Ocorreu um problema de comunicação com o servidor local. Tente novamente mais tarde.", + "Use email to optionally be discoverable by existing contacts.": "Seja encontrado por seus contatos a partir de um e-mail.", + "Use email or phone to optionally be discoverable by existing contacts.": "Seja encontrado por seus contatos a partir de um e-mail ou número de telefone.", + "Add an email to be able to reset your password.": "Adicione um e-mail para depois poder redefinir sua senha.", + "Forgot password?": "Esqueceu a senha?", + "That phone number doesn't look quite right, please check and try again": "Esse número de telefone não é válido, verifique e tente novamente", + "About homeservers": "Sobre os servidores locais", + "Learn more": "Saiba mais", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Use o seu servidor local Matrix preferido, ou hospede o seu próprio servidor.", + "Other homeserver": "Outro servidor local", + "We call the places you where you can host your account ‘homeservers’.": "Chamamos de \"servidores locais\" os locais onde você pode hospedar a sua conta.", + "Sign into your homeserver": "Faça login em seu servidor local", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org é o maior servidor local público do mundo, então é um bom lugar para muitas pessoas.", + "Specify a homeserver": "Digite um servidor local", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Apenas um aviso: se você não adicionar um e-mail e depois esquecer sua senha, poderá perder permanentemente o acesso à sua conta.", + "Continuing without email": "Continuar sem e-mail", + "Continue with %(provider)s": "Continuar com %(provider)s", + "Homeserver": "Servidor local", + "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.": "Você pode usar as opções personalizadas de servidor para entrar em outros servidores Matrix, especificando um URL de servidor local diferente. Isso permite que você use o Element com uma conta Matrix em um servidor local diferente.", + "Server Options": "Opções do servidor" } From 7d936dea926a00515897f848a0f1bb08007e8c6d Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 3 Dec 2020 02:15:48 +0000 Subject: [PATCH 007/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2701 of 2701 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 | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 3355a7d383..8d7d44d61a 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2930,5 +2930,32 @@ "Call failed because no webcam or microphone could not be accessed. Check that:": "因為無法存取網路攝影機或麥克風,所以通話失敗。請檢查:", "Unable to access webcam / microphone": "無法存取網路攝影機/麥克風", "Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "因為無法存取麥克風,所以通話失敗。請檢查是否已插入麥克風並正確設定。", - "Unable to access microphone": "無法存取麥克風" + "Unable to access microphone": "無法存取麥克風", + "Decide where your account is hosted": "決定託管帳號的位置", + "Host account on": "帳號託管於", + "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.": "使用者名稱已存在,請試試其他的。", + "New? Create account": "新人?建立帳號", + "There was a problem communicating with the homeserver, please try again later.": "與家伺服器通訊時出現問題,請再試一次。", + "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.": "新增電子郵件以重設您的密碼。", + "Forgot password?": "忘記密碼?", + "That phone number doesn't look quite right, please check and try again": "電話號碼看起來不太對,請檢查並再試一次", + "About homeservers": "關於家伺服器", + "Learn more": "取得更多資訊", + "Use your preferred Matrix homeserver if you have one, or host your own.": "如果您有的話,可以使用您偏好的 Matrix 家伺服器,或是自己架一個。", + "Other homeserver": "其他家伺服器", + "We call the places you 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": "指定家伺服器", + "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": "不用電子郵件繼續", + "Continue with %(provider)s": "使用 %(provider)s 繼續", + "Homeserver": "家伺服器", + "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 使用自訂伺服器選項來登入其他 Matrix 伺服器。這讓您可以使用在不同家伺服器上的既有 Matrix 帳號。", + "Server Options": "伺服器選項" } From 0b94e7629d7bd4107e7b92983a9c1a724788b4bb Mon Sep 17 00:00:00 2001 From: XoseM Date: Thu, 3 Dec 2020 06:42:42 +0000 Subject: [PATCH 008/187] Translated using Weblate (Galician) Currently translated at 100.0% (2701 of 2701 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 | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index fec99d1e7c..f59b05cc7a 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2927,5 +2927,32 @@ "Call failed because no webcam or microphone could not be accessed. Check that:": "A chamada fallou porque non están accesibles a cámara ou o micrófono. Comproba que:", "Unable to access webcam / microphone": "Non se puido acceder a cámara / micrófono", "Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada fallou porque non se puido acceder a un micrófono. Comproba que o micrófono está conectado e correctamente configurado.", - "Unable to access microphone": "Non se puido acceder ó micrófono" + "Unable to access microphone": "Non se puido acceder ó micrófono", + "Decide where your account is hosted": "Decide onde queres crear a túa conta", + "Host account on": "Crea a conta en", + "Already have an account? Sign in here": "Xa tes unha conta? Conecta aquí", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s Ou %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Continúa con %(ssoButtons)s", + "That username already exists, please try another.": "Ese nome de usuaria xa existe, proba con outro.", + "New? Create account": "Recén cheagada? Crea unha conta", + "There was a problem communicating with the homeserver, please try again later.": "Houbo un problema de comunicación co servidor de inicio, inténtao máis tarde.", + "Use email to optionally be discoverable by existing contacts.": "Usa o email para ser opcionalmente descubrible para os contactos existentes.", + "Use email or phone to optionally be discoverable by existing contacts.": "Usa un email ou teléfono para ser (opcionalmente) descubrible polos contactos existentes.", + "Add an email to be able to reset your password.": "Engade un email para poder restablecer o contrasinal.", + "Forgot password?": "Esqueceches o contrasinal?", + "That phone number doesn't look quite right, please check and try again": "Non semella correcto este número, compróbao e inténtao outra vez", + "About homeservers": "Acerca dos servidores de inicio", + "Learn more": "Saber máis", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Usa o teu servidor de inicio Matrix preferido, ou usa o teu propio.", + "Other homeserver": "Outro servidor de inicio", + "We call the places you where you can host your account ‘homeservers’.": "Chamámoslle 'Servidores de inicio' ós servidores onde poderías ter a túa conta.", + "Sign into your homeserver": "Conecta co teu servidor de inicio", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org é o servidor de inicio máis grande de todos, polo que é lugar común para moitas persoas.", + "Specify a homeserver": "Indica un servidor de inicio", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Lembra que se non engades un email e esqueces o contrasinal perderás de xeito permanente o acceso á conta.", + "Continuing without email": "Continuando sen email", + "Continue with %(provider)s": "Continuar con %(provider)s", + "Homeserver": "Servidor de inicio", + "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.": "Podes usar as opcións do servidor para poder conectarte a outros servidores Matrix indicando o URL dese servidor. Esto permíteche usar Element cunha conta Matrix existente noutro servidor.", + "Server Options": "Opcións do servidor" } From 44954ad0845b2b5a02df962b52f016cf620ff5d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 2 Dec 2020 22:38:45 +0000 Subject: [PATCH 009/187] Translated using Weblate (Estonian) Currently translated at 99.1% (2679 of 2701 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 0b338bd9d4..a1ecae2154 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2928,5 +2928,10 @@ "Call failed because no webcam or microphone could not be accessed. Check that:": "Kuna veebikaamerat või mikrofoni kasutada ei saanud, siis kõne ei õnnestunud. Palun kontrolli, et:", "Unable to access webcam / microphone": "Puudub ligipääs veebikaamerale ja mikrofonile", "Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Kuna mikrofoni kasutada ei saanud, siis kõne ei õnnestunud. Palun kontrolli, et mikrofon oleks ühendatud ja seadistatud.", - "Unable to access microphone": "Puudub ligipääs mikrofonile" + "Unable to access microphone": "Puudub ligipääs mikrofonile", + "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.": "Serveri seadistusi muutes võid teise koduserveri aadressi sisestamisel logida sisse muudesse Matrix'i serveritesse. See võimaldab sul vestlusrakenduses Element kasutada olemasolevat kasutajakontot teises koduserveris.", + "Continuing without email": "Jätka ilma e-posti aadressi seadistamiseta", + "Continue with %(provider)s": "Jätka %(provider)s kasutamist", + "Homeserver": "Koduserver", + "Server Options": "Serveri seadistused" } From fb96cbbba5e2f984dfd7af27379f8aa32aca39ab Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Thu, 3 Dec 2020 13:49:28 +0000 Subject: [PATCH 010/187] Translated using Weblate (Swedish) Currently translated at 97.1% (2624 of 2701 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 | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 7b8e5b6383..4cdf1faffe 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -2791,5 +2791,24 @@ "See when the avatar changes in your active room": "Se när avataren byts för ditt aktiva rum", "See when the avatar changes in this room": "Se när avataren byts för det här rummet", "See when the name changes in your active room": "Se när namnet på ditt aktiva rum byts", - "See when the name changes in this room": "Se när namnet på det här rummet byts" + "See when the name changes in this room": "Se när namnet på det här rummet byts", + "See text messages posted to your active room": "Se textmeddelanden som skickas i ditt aktiva rum", + "See text messages posted to this room": "Se textmeddelanden som skickas i det här rummet", + "Send text messages as you in your active room": "Skicka textmeddelanden som dig i ditt aktiva rum", + "Send text messages as you in this room": "Skicka textmeddelanden som dig i det här rummet", + "See messages posted to your active room": "Se meddelanden som skickas i ditt aktiva rum", + "See messages posted to this room": "Se meddelanden som skickas i det här rummet", + "Send messages as you in your active room": "Skicka meddelanden som dig i ditt aktiva rum", + "Send messages as you in this room": "Skicka meddelanden som dig i det här rummet", + "with an empty state key": "med en tom statusnyckel", + "The %(capability)s capability": "%(capability)s-kapaciteten", + "See %(eventType)s events posted to your active room": "Se %(eventType)s-händelser som skickas i ditt aktiva rum", + "Send %(eventType)s events as you in your active room": "Skicka %(eventType)s-händelser som dig i ditt aktiva rum", + "See %(eventType)s events posted to this room": "Se %(eventType)s-händelser skickade i det här rummet", + "Send %(eventType)s events as you in this room": "Skicka %(eventType)s-händelser som dig i det här rummet", + "with state key %(stateKey)s": "med statusnyckel %(stateKey)s", + "See when a sticker is posted in this room": "Se när en dekal skickas i det här rummet", + "See when anyone posts a sticker to your active room": "Se när någon skickar en dekal till ditt aktiva rum", + "Send stickers to your active room as you": "Skicka dekaler till ditt aktiva rum som dig", + "Send stickers to this room as you": "Skicka dekaler till det här rummet som dig" } From eaa4b17af44e824a321e266b98e8a3265670a91a Mon Sep 17 00:00:00 2001 From: Hivaa Date: Thu, 3 Dec 2020 15:20:01 +0000 Subject: [PATCH 011/187] Translated using Weblate (Persian) Currently translated at 7.0% (191 of 2701 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fa/ --- src/i18n/strings/fa.json | 60 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index eacc029d03..af5e9d312c 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -158,5 +158,63 @@ "Whether or not you're logged in (we don't record your username)": "وارد حساب خود می‌شوید یا خیر (ما نام کاربری شما را ثبت نمی‌کنیم)", "Click the button below to confirm adding this phone number.": "برای تائید اضافه‌شدن این شماره تلفن، بر روی دکمه‌ی زیر کلیک کنید.", "Confirm adding this phone number by using Single Sign On to prove your identity.": "برای اثبات هویت خود، اضافه‌شدن این شماره تلفن را با استفاده از Single Sign On تائید کنید.", - "Failed to verify email address: make sure you clicked the link in the email": "خطا در تائید آدرس ایمیل: مطمئن شوید که بر روی لینک موجود در ایمیل کلیک کرده اید" + "Failed to verify email address: make sure you clicked the link in the email": "خطا در تائید آدرس ایمیل: مطمئن شوید که بر روی لینک موجود در ایمیل کلیک کرده اید", + "Forget room": "فراموش کردن اتاق", + "Filter room members": "فیلتر کردن اعضای اتاق", + "Failure to create room": "ایجاد اتاق با خطا مواجه شد", + "Failed to upload profile picture!": "آپلود عکس پروفایل با خطا مواجه شد!", + "Failed to unban": "رفع مسدودیت با خطا مواجه شد", + "Failed to set display name": "تنظیم نام نمایشی با خطا مواجه شد", + "Failed to send request.": "ارسال درخواست با خطا مواجه شد.", + "Failed to send email": "ارسال ایمیل با خطا مواجه شد", + "Failed to join room": "پیوستن به اتاق انجام نشد", + "Failed to ban user": "کاربر مسدود نشد", + "Error decrypting attachment": "خطا در رمزگشایی پیوست", + "%(senderName)s ended the call.": "%(senderName)s به تماس پایان داد.", + "Emoji": "شکلک", + "Email address": "آدرس ایمیل", + "Email": "ایمیل", + "Drop File Here": "پرونده را اینجا رها کنید", + "Download %(text)s": "دانلود 2%(text)s", + "Disinvite": "پس‌گرفتن دعوت", + "Default": "پیشفرض", + "Deops user with given id": "کاربر را با شناسه داده شده را از بین می برد", + "Decrypt %(text)s": "رمزگشایی %(text)s", + "Deactivate Account": "غیرفعال کردن حساب", + "/ddg is not a command": "/ddg یک فرمان نیست", + "Current password": "گذرواژه فعلی", + "Cryptography": "رمزنگاری", + "Create Room": "ایجاد اتاق", + "Confirm password": "تأیید گذرواژه", + "Commands": "فرمان‌ها", + "Command error": "خطای فرمان", + "Click here to fix": "برای رفع مشکل اینجا کلیک کنید", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s نام اتاق را حذف کرد.", + "%(senderName)s changed their profile picture.": "%(senderName)s عکس پروفایل خود را تغییر داد.", + "Change Password": "تغییر گذواژه", + "Banned users": "کاربران مسدود شده", + "Autoplay GIFs and videos": "پخش خودکار GIF و فیلم", + "Attachment": "پیوست", + "Are you sure you want to reject the invitation?": "آیا مطمئن هستید که می خواهید دعوت را رد کنید؟", + "Are you sure you want to leave the room '%(roomName)s'?": "آیا مطمئن هستید که می خواهید از اتاق '2%(roomName)s' خارج شوید؟", + "Are you sure?": "مطمئنی؟", + "Anyone who knows the room's link, including guests": "هرکسی که لینک اتاق را می داند و کاربران مهمان", + "Anyone who knows the room's link, apart from guests": "هرکسی که لینک اتاق را می‌داند، غیر از کاربران مهمان", + "Anyone": "هر کس", + "An error has occurred.": "خطایی رخ داده است.", + "%(senderName)s answered the call.": "%(senderName)s تماس را پاسخ داد.", + "A new password must be entered.": "گذواژه جدید باید وارد شود.", + "Authentication": "احراز هویت", + "Always show message timestamps": "همیشه مهر زمان‌های پیام را نشان بده", + "Advanced": "پیشرفته", + "Camera": "دوربین", + "Microphone": "میکروفون", + "Default Device": "دستگاه پیشفرض", + "No media permissions": "عدم مجوز رسانه", + "No Webcams detected": "هیچ وبکمی شناسایی نشد", + "No Microphones detected": "هیچ میکروفونی شناسایی نشد", + "Admin": "ادمین", + "Add": "افزودن", + "Access Token:": "توکن دسترسی:", + "Account": "حساب کابری" } From 52ec76158fd7802eb0e8ba7085d56a791752d621 Mon Sep 17 00:00:00 2001 From: Hivaa Date: Thu, 3 Dec 2020 15:26:43 +0000 Subject: [PATCH 012/187] Translated using Weblate (Persian) Currently translated at 7.2% (197 of 2701 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fa/ --- src/i18n/strings/fa.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index af5e9d312c..b16700ead6 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -71,7 +71,7 @@ "Collecting logs": "درحال جمع‌آوری گزارش‌ها", "Search": "جستجو", "(HTTP status %(httpStatus)s)": "(HTTP وضعیت %(httpStatus)s)", - "Failed to forget room %(errCode)s": "فراموش کردن گپ‌گاه %(errCode)s موفقیت‌آمیز نبود", + "Failed to forget room %(errCode)s": "فراموش کردن اتاق با خطا مواجه شد %(errCode)s", "Wednesday": "چهارشنبه", "Quote": "گفتآورد", "Send": "ارسال", @@ -175,7 +175,7 @@ "Email address": "آدرس ایمیل", "Email": "ایمیل", "Drop File Here": "پرونده را اینجا رها کنید", - "Download %(text)s": "دانلود 2%(text)s", + "Download %(text)s": "دانلود 2%(text)s", "Disinvite": "پس‌گرفتن دعوت", "Default": "پیشفرض", "Deops user with given id": "کاربر را با شناسه داده شده را از بین می برد", @@ -216,5 +216,11 @@ "Admin": "ادمین", "Add": "افزودن", "Access Token:": "توکن دسترسی:", - "Account": "حساب کابری" + "Account": "حساب کابری", + "Incorrect verification code": "کد فعال‌سازی اشتباه است", + "Incorrect username and/or password.": "نام کاربری و یا گذرواژه اشتباه است.", + "I have verified my email address": "ایمیل خود را تأید کردم", + "Home": "خانه", + "Hangup": "قطع", + "For security, this session has been signed out. Please sign in again.": "برای امنیت، این نشست نامعتبر شده است. لطفاً دوباره وارد سیستم شوید." } From 5acb81aa44237873a66ae1f59d944d7c1f3145d8 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 4 Dec 2020 09:56:40 +0000 Subject: [PATCH 013/187] Translated using Weblate (Albanian) Currently translated at 99.7% (2694 of 2701 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 | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 74a85031ac..6082bcf65b 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2919,5 +2919,32 @@ "Call failed because no webcam or microphone could not be accessed. Check that:": "Thirrja dështoi, ngaqë s’u bë dot hyrje në kamerë ose mikrofon. Kontrolloni që:", "Unable to access webcam / microphone": "S’arrihet të përdoret kamerë / mikrofon", "Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Thirrja dështoi, ngaqë s’u hap dot ndonjë mikrofon. Shihni që të jetë futur një mikrofon dhe ujdiseni saktë.", - "Unable to access microphone": "S’arrihet të përdoret mikrofoni" + "Unable to access microphone": "S’arrihet të përdoret mikrofoni", + "Decide where your account is hosted": "Vendosni se ku të ruhet llogaria juaj", + "Host account on": "Strehoni llogari në", + "Already have an account? Sign in here": "Keni tashmë një llogari? Bëni hyrjen këtu", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s Ose %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Vazhdo me %(ssoButtons)s", + "That username already exists, please try another.": "Ka tashmë një emër përdoruesi të tillë, ju lutemi, provoni një tjetër.", + "New? Create account": "I ri? Krijoni llogari", + "There was a problem communicating with the homeserver, please try again later.": "Pati një problem në komunikimin me shërbyesin Home, ju lutemi, riprovoni më vonë.", + "Use email to optionally be discoverable by existing contacts.": "Përdorni email që, nëse doni, të mund t’ju gjejnë kontaktet ekzistues.", + "Use email or phone to optionally be discoverable by existing contacts.": "Përdorni email ose telefon që, nëse doni, të mund t’ju gjejnë kontaktet ekzistues.", + "Add an email to be able to reset your password.": "Shtoni një email, që të jeni në gjendje të ricaktoni fjalëkalimin tuaj.", + "Forgot password?": "Harruat fjalëkalimin?", + "That phone number doesn't look quite right, please check and try again": "Ai numër telefoni s’duket i saktë, ju lutemi, rikontrollojeni dhe riprovojeni", + "About homeservers": "Mbi shërbyesit Home", + "Learn more": "Mësoni më tepër", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Përdorni shërbyesin tuaj Home të parapëlqyer Matrix, nëse keni një të tillë, ose strehoni një tuajin.", + "Other homeserver": "Tjetër shërbyes home", + "We call the places you where you can host your account ‘homeservers’.": "Vendet ku mund të strehoni llogarinë tuaj i quajmë “shërbyes Home”.", + "Sign into your homeserver": "Bëni hyrjen te shërbyesi juaj Home", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org është shërbyesi Home më i madh në botë, ndaj është një vend i mirë për shumë vetë.", + "Specify a homeserver": "Tregoni një shërbyes Home", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Që mos thoni nuk e dinim, nëse s’shtoni një email dhe harroni fjalëkalimin tuaj, mund të humbi përgjithmonë hyrjen në llogarinë tuaj.", + "Continuing without email": "Vazhdim pa email", + "Continue with %(provider)s": "Vazhdo me %(provider)s", + "Homeserver": "Shërbyes Home", + "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.": "Mund të përdorni mundësi vetjake shërbyesi që të bëni hyrjen në shërbyes të tjerë Matrix duke dhënë një tjetër URL shërbyesi Home. Kjo ju lejon të përdorni Element-in me një llogari Matrix ekzistuese në një tjetër shërbyes Home.", + "Server Options": "Mundësi Shërbyesi" } From 0f1f3d43388b8dd1de8fcac6b72b93586ba4c151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 3 Dec 2020 22:09:24 +0000 Subject: [PATCH 014/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2701 of 2701 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 | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index a1ecae2154..b7532bdd1b 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2933,5 +2933,27 @@ "Continuing without email": "Jätka ilma e-posti aadressi seadistamiseta", "Continue with %(provider)s": "Jätka %(provider)s kasutamist", "Homeserver": "Koduserver", - "Server Options": "Serveri seadistused" + "Server Options": "Serveri seadistused", + "Host account on": "Sinu kasutajakontot teenindab", + "Decide where your account is hosted": "Vali kes võiks sinu kasutajakontot teenindada", + "Already have an account? Sign in here": "Sul juba on kasutajakonto olemas? Logi siin sisse", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s või %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Jätkamiseks kasuta %(ssoButtons)s teenuseid", + "That username already exists, please try another.": "Selline kasutajanimi on juba olemas, palun vali midagi muud.", + "New? Create account": "Täitsa uus asi sinu jaoks? Loo omale kasutajakonto", + "There was a problem communicating with the homeserver, please try again later.": "Serveriühenduses tekkis viga. Palun proovi mõne aja pärast uuesti.", + "Use email to optionally be discoverable by existing contacts.": "Kui soovid, et teised kasutajad saaksid sind leida, siis palun lisa oma e-posti aadress.", + "Use email or phone to optionally be discoverable by existing contacts.": "Kui soovid, et teised kasutajad saaksid sind leida, siis palun lisa oma e-posti aadress või telefoninumber.", + "Add an email to be able to reset your password.": "Selleks et saaksid vajadusel oma salasõna muuta, palun lisa oma e-posti aadress.", + "Forgot password?": "Kas unustasid oma salasõna?", + "That phone number doesn't look quite right, please check and try again": "See telefoninumber ei tundu õige olema, palun kontrolli ta üle ja proovi uuesti", + "About homeservers": "Teave koduserverite kohta", + "Learn more": "Loe veel", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Kui sul on oma koduserveri eelistus olemas, siis kasuta seda. Samuti võid soovi korral oma enda koduserveri püsti panna.", + "Other homeserver": "Muu koduserver", + "We call the places you where you can host your account ‘homeservers’.": "Me nimetame „koduserveriks“ sellist serverit, mis haldab sinu kasutajakontot.", + "Sign into your homeserver": "Logi sisse oma koduserverisse", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org on maailma suurim avalik koduserver ja see sobib paljude jaoks.", + "Specify a homeserver": "Sisesta koduserver", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Lihtsalt hoiatame, et kui sa ei lisa e-posti aadressi ning unustad oma konto salasõna, siis sa võid püsivalt kaotada ligipääsu oma kontole." } From de7f2ab2e0e2292dcf90c0106554041c25c8516f Mon Sep 17 00:00:00 2001 From: schwukas Date: Sun, 6 Dec 2020 08:42:08 +0000 Subject: [PATCH 015/187] Translated using Weblate (German) Currently translated at 99.9% (2701 of 2702 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 | 43 ++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 5d5ca50fc9..8588ccb7d6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -604,9 +604,9 @@ "Flair": "Abzeichen", "Showing flair for these communities:": "Abzeichen für diese Communities zeigen:", "This room is not showing flair for any communities": "Dieser Raum zeigt für keine Communities die Abzeichen an", - "Something went wrong when trying to get your communities.": "Beim Laden deiner Communites ist etwas schief gelaufen.", + "Something went wrong when trying to get your communities.": "Beim Laden deiner Communities ist etwas schief gelaufen.", "Display your community flair in rooms configured to show it.": "Zeige deinen Community-Flair in den Räumen, die es erlauben.", - "This homeserver doesn't offer any login flows which are supported by this client.": "Dieser Heimserver verfügt über keinen, von diesem Client unterstütztes Anmeldeverfahren.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Dieser Heimserver verfügt über kein von diesem Client unterstütztes Anmeldeverfahren.", "Call Failed": "Anruf fehlgeschlagen", "Send": "Senden", "collapse": "Verbergen", @@ -2913,5 +2913,42 @@ "Åland Islands": "Äland-Inseln", "Afghanistan": "Afghanistan", "United States": "Vereinigte Staaten", - "United Kingdom": "Großbritannien" + "United Kingdom": "Großbritannien", + "We call the places you where you can host your account ‘homeservers’.": "Orte, an denen du dein Benutzerkonto hosten kannst, nennen wir \"Homeserver\".", + "Specify a homeserver": "Gib einen Homeserver an", + "Render LaTeX maths in messages": "Zeige LaTeX-Matheformeln in Nachrichten an", + "Decide where your account is hosted": "Gib an wo dein Benutzerkonto gehostet werden soll", + "Already have an account? Sign in here": "Hast du schon ein Benutzerkonto? Melde dich hier an", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s oder %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Mit %(ssoButtons)s fortfahren", + "That username already exists, please try another.": "Dieser Benutzername existiert schon. Bitte versuche es mit einem anderen.", + "New? Create account": "Neu? Erstelle ein Benutzerkonto", + "There was a problem communicating with the homeserver, please try again later.": "Es gab ein Problem bei der Kommunikation mit dem Homseserver. Bitte versuche es später erneut.", + "New here? Create an account": "Neu hier? Erstelle ein Benutzerkonto", + "Got an account? Sign in": "Hast du schon ein Benutzerkonto? Melde dich an", + "Use email to optionally be discoverable by existing contacts.": "Nutze optional eine E-Mail-Adresse, um von Nutzern gefunden werden zu können.", + "Use email or phone to optionally be discoverable by existing contacts.": "Nutze optional eine E-Mail-Adresse oder Telefonnummer, um von Nutzern gefunden werden zu können.", + "Add an email to be able to reset your password.": "Füge eine E-Mail-Adresse hinzu, um dein Passwort zurücksetzen zu können.", + "Forgot password?": "Passwort vergessen?", + "That phone number doesn't look quite right, please check and try again": "Diese Telefonummer sieht nicht ganz richtig aus. Bitte überprüfe deine Eingabe und versuche es erneut", + "About homeservers": "Über Homeserver", + "Learn more": "Mehr dazu", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Verwende einen Matrix-Homeserver deiner Wahl oder hoste deinen eigenen.", + "Other homeserver": "Anderer Homeserver", + "Sign into your homeserver": "Melde dich bei deinem Homeserver an", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org ist der größte öffentliche Homeserver der Welt und daher ein guter Ort für viele.", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Aufgepasst: Wenn du keine E-Mail-Adresse angibst und dein Passwort vergisst, kannst du den Zugriff auf deinen Account dauerhaft verlieren.", + "Continuing without email": "Ohne E-Mail fortfahren", + "Reason (optional)": "Grund (optional)", + "Continue with %(provider)s": "Mit %(provider)s fortfahren", + "Homeserver": "Heimserver", + "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.": "Du kannst in den benutzerdefinierten Serveroptionen eine andere Heimserver-URL angeben, um dich bei anderen Matrixservern anzumelden.", + "Server Options": "Servereinstellungen", + "No other application is using the webcam": "Keine andere Anwendung auf die Webcam zugreift", + "Permission is granted to use the webcam": "Auf die Webcam zugegriffen werden darf", + "A microphone and webcam are plugged in and set up correctly": "Mikrofon und Webcam eingesteckt und richtig eingerichtet sind", + "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" } From 88cd776926f218689969bc5150da5d0659d7d509 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Sat, 5 Dec 2020 20:40:02 +0000 Subject: [PATCH 016/187] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2702 of 2702 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 fd8ef04b22..55f35e638e 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2886,5 +2886,6 @@ "Continue with %(provider)s": "Continuar com %(provider)s", "Homeserver": "Servidor local", "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.": "Você pode usar as opções personalizadas de servidor para entrar em outros servidores Matrix, especificando um URL de servidor local diferente. Isso permite que você use o Element com uma conta Matrix em um servidor local diferente.", - "Server Options": "Opções do servidor" + "Server Options": "Opções do servidor", + "Reason (optional)": "Motivo (opcional)" } From 1d1cef97b254d37e38f4679aeb52af0b6878ab72 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 7 Dec 2020 07:49:29 +0000 Subject: [PATCH 017/187] Translated using Weblate (Swedish) Currently translated at 98.6% (2666 of 2702 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 | 50 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 4cdf1faffe..9a42a046cd 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -87,7 +87,7 @@ "Failed to set display name": "Misslyckades att ange visningsnamn", "Failed to unban": "Misslyckades att avbanna", "Failed to verify email address: make sure you clicked the link in the email": "Misslyckades att bekräfta e-postadressen: set till att du klickade på länken i e-postmeddelandet", - "Favourite": "Favorit", + "Favourite": "Favoritmarkera", "Accept": "Godkänn", "Access Token:": "Åtkomsttoken:", "Active call (%(roomName)s)": "Aktiv samtal (%(roomName)s)", @@ -2506,7 +2506,7 @@ "Brazil": "Brasilien", "Bouvet Island": "Bouvetön", "Botswana": "Botswana", - "Bosnia": "Bosnien", + "Bosnia": "Bosnien och Hercegovina", "Bolivia": "Bolivia", "Bhutan": "Bhutan", "Bermuda": "Bermuda", @@ -2601,7 +2601,7 @@ "Syria": "Syrien", "Switzerland": "Schweiz", "Sweden": "Sverige", - "Swaziland": "Swaziland", + "Swaziland": "Eswatini", "Svalbard & Jan Mayen": "Svalbard och Jan Mayen", "Suriname": "Surinam", "Sudan": "Sudan", @@ -2810,5 +2810,47 @@ "See when a sticker is posted in this room": "Se när en dekal skickas i det här rummet", "See when anyone posts a sticker to your active room": "Se när någon skickar en dekal till ditt aktiva rum", "Send stickers to your active room as you": "Skicka dekaler till ditt aktiva rum som dig", - "Send stickers to this room as you": "Skicka dekaler till det här rummet som dig" + "Send stickers to this room as you": "Skicka dekaler till det här rummet som dig", + "Reason (optional)": "Orsak (valfritt)", + "Continue with %(provider)s": "Fortsätt med %(provider)s", + "Homeserver": "Hemserver", + "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.": "Du kan använda anpassade serveralternativ för att logga in på andra Matrixservrar genom att specificera en annan hemserver-URL. Detta låter dig använda Element med ett existerande Matrix-konto på en annan hemserver.", + "Server Options": "Serveralternativ", + "Start a new chat": "Starta en ny chatt", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Cacha på ett säkert sätt krypterade meddelanden lokalt för att de ska visas i sökresultat, och använd %(size)s för att lagra meddelanden från %(rooms)s rum.", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Cacha på ett säkert sätt krypterade meddelanden lokalt för att de ska visas i sökresultat, och använd %(size)s för att lagra meddelanden från %(rooms)s rum.", + "Return to call": "Återgå till samtal", + "Fill Screen": "Fyll skärmen", + "Voice Call": "Röstsamtal", + "Video Call": "Videosamtal", + "Use Ctrl + Enter to send a message": "Använd Ctrl + Enter för att skicka ett meddelande", + "Use Command + Enter to send a message": "Använd Kommando + Enter för att skicka ett meddelande", + "Render LaTeX maths in messages": "Rendera LaTeX-matte i meddelanden", + "No other application is using the webcam": "Inget annat program använder webbkameran", + "Permission is granted to use the webcam": "Åtkomst till webbkameran har beviljats", + "A microphone and webcam are plugged in and set up correctly": "En webbkamera och en mikrofon är inkopplad och korrekt inställd", + "Call failed because no webcam or microphone could not be accessed. Check that:": "Samtal misslyckades eftersom ingen webbkamera eller mikrofon kunde kommas åt. Kolla att:", + "Unable to access webcam / microphone": "Kan inte komma åt webbkamera eller mikrofon", + "Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Samtal misslyckades eftersom ingen mikrofon kunde kommas åt. Kolla att en mikrofon är inkopplad och korrekt inställd.", + "Unable to access microphone": "Kan inte komma åt mikrofonen", + "See %(msgtype)s messages posted to your active room": "Se %(msgtype)s-meddelanden som skickas i ditt aktiva rum", + "See %(msgtype)s messages posted to this room": "Se %(msgtype)s-meddelanden som skickas i det här rummet", + "Send %(msgtype)s messages as you in your active room": "Skicka %(msgtype)s-meddelanden som dig i ditt aktiva rum", + "Send %(msgtype)s messages as you in this room": "Skicka %(msgtype)s-meddelanden som dig i det här rummet", + "See general files posted to your active room": "Se generella filer som skickas i ditt aktiva rum", + "See general files posted to this room": "Se generella filer som skickas i det här rummet", + "Send general files as you in your active room": "Skicka generella filer som dig i ditt aktiva rum", + "Send general files as you in this room": "Skicka generella filer som dig i det här rummet", + "See videos posted to your active room": "Se videor som skickas i ditt aktiva rum", + "See videos posted to this room": "Se videor som skickas i det här rummet", + "Send videos as you in your active room": "Skicka videor som dig i ditt aktiva rum", + "Send videos as you in this room": "Skicka videor som dig i det här rummet", + "See images posted to your active room": "Se bilder som skickas i ditt aktiva rum", + "See images posted to this room": "Se bilder som skickas i det här rummet", + "Send images as you in your active room": "Skicka bilder som dig i ditt aktiva rum", + "Send images as you in this room": "Skicka bilder som dig i det här rummet", + "See emotes posted to your active room": "Se emotes som skickas i ditt aktiva rum", + "See emotes posted to this room": "Se emotes som skickas i det här rummet", + "Send emotes as you in your active room": "Skicka emotes som dig i ditt aktiva rum", + "Send emotes as you in this room": "Skicka emotes som dig i det här rummet" } From df3fd6baa98851b4f1d9f6fbea38197eeaaa73d5 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sun, 6 Dec 2020 11:56:17 +0000 Subject: [PATCH 018/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2702 of 2702 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 8d7d44d61a..ffb82d05a2 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2957,5 +2957,6 @@ "Continue with %(provider)s": "使用 %(provider)s 繼續", "Homeserver": "家伺服器", "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 使用自訂伺服器選項來登入其他 Matrix 伺服器。這讓您可以使用在不同家伺服器上的既有 Matrix 帳號。", - "Server Options": "伺服器選項" + "Server Options": "伺服器選項", + "Reason (optional)": "理由(選擇性)" } From ed10693feda2a921287eb3276cb2257269341fb9 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Mon, 7 Dec 2020 04:42:26 +0000 Subject: [PATCH 019/187] Translated using Weblate (Ukrainian) Currently translated at 53.3% (1442 of 2702 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 | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index eaf8fdbe88..ad3bf634e2 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -124,7 +124,7 @@ "Explore Room State": "Перегляд статуса кімнати", "Source URL": "Джерельне посилання", "Messages sent by bot": "Повідомлення, надіслані ботом", - "Filter results": "Відцідити результати", + "Filter results": "Відфільтрувати результати", "Members": "Учасники", "No update available.": "Оновлення відсутні.", "Resend": "Перенадіслати", @@ -794,7 +794,7 @@ "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", "Custom user status messages": "користувацький статус", - "Group & filter rooms by custom tags (refresh to apply changes)": "Групувати та проціджувати кімнати за нетиповими наличками (оновіть щоб застосувати зміни)", + "Group & filter rooms by custom tags (refresh to apply changes)": "Групувати та фільтрувати кімнати за нетиповими наличками (оновіть, щоб застосувати зміни)", "Multiple integration managers": "Декілька менджерів інтеграції", "Try out new ways to ignore people (experimental)": "Спробуйте нові способи ігнорувати людей (експериментальні)", "Support adding custom themes": "Підтримка користувацьких тем", @@ -1017,7 +1017,7 @@ "Unable to revoke sharing for email address": "Не вдалось відкликати оприлюднювання адреси е-пошти", "Revoke": "Відкликати", "Unable to revoke sharing for phone number": "Не вдалось відкликати оприлюднювання телефонного номеру", - "Filter room members": "Відцідити учасників кімнати", + "Filter room members": "Відфільтрувати учасників кімнати", "Voice call": "Голосовий виклик", "Video call": "Відеовиклик", "Not now": "Не зараз", @@ -1186,7 +1186,7 @@ "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування кімнат зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування серверів зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", - "Enable Community Filter Panel": "Увімкнути панель спільнот", + "Enable Community Filter Panel": "Увімкнути фільтр панелі спільнот", "Messages containing my username": "Повідомлення, що містять моє користувацьке ім'я", "Messages containing @room": "Повідомлення, що містять @room", "When rooms are upgraded": "Коли кімнати поліпшено", @@ -1204,8 +1204,8 @@ "You have ignored this user, so their message is hidden. Show anyways.": "Ви ігноруєте цього користувача, тож його повідомлення приховано. Все одно показати.", "Show all": "Показати все", "Add an Integration": "Додати інтеграцію", - "Filter community members": "Відцідити учасників спільноти", - "Filter community rooms": "Відцідити кімнати спільноти", + "Filter community members": "Відфільтрувати учасників спільноти", + "Filter community rooms": "Відфільтрувати кімнати спільноти", "Display your community flair in rooms configured to show it.": "Відбивати ваш спільнотний значок у кімнатах, що налаштовані показувати його.", "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Користування цим знадобом може призвести до поширення ваших даних з %(widgetDomain)s та вашим менеджером інтеграцій.", "Show advanced": "Показати розширені", @@ -1219,13 +1219,13 @@ "Did you know: you can use communities to filter your %(brand)s experience!": "Чи знаєте ви, що спільноти можна використовувати для припасування %(brand)s під ваші потреби?", "Communities": "Спільноти", "Create a new community": "Створити нову спільноту", - "Clear filter": "Очистити цідило", + "Clear filter": "Очистити фільтр", "Syncing...": "Синхронізування…", "Signing In...": "Входження…", "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": "Очистити поле цідила списку кімнат", + "Clear room list filter field": "Очистити поле фільтра списку кімнат", "Cancel autocomplete": "Скасувати самодоповнення", "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.": "Журнали зневадження містять дані використання застосунку, включно з вашим користувацьким ім’ям, ідентифікаторами або псевдонімами відвіданих вами кімнат або груп, а також іменами інших користувачів. Вони не містять повідомлень.", "Confirm your account deactivation by using Single Sign On to prove your identity.": "Підтвердьте знедіяння вашого облікового запису через Single Sign On щоб підтвердити вашу особу.", @@ -1523,5 +1523,6 @@ "Finland": "Фінляндія", "Fiji": "Фіджі", "Faroe Islands": "Фарерські Острови", - "Unable to access microphone": "Неможливо доступитись до мікрофона" + "Unable to access microphone": "Неможливо доступитись до мікрофона", + "Filter rooms and people": "Відфільтрувати кімнати та людей" } From c491ac6e29d44b9ad37135cb42c1794e13c20240 Mon Sep 17 00:00:00 2001 From: Kaede Date: Sun, 6 Dec 2020 16:37:52 +0000 Subject: [PATCH 020/187] Translated using Weblate (Japanese) Currently translated at 50.0% (1352 of 2702 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 | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 4ab5bc0de2..1b107e0da4 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1007,7 +1007,7 @@ "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "他の Matrix ホームサーバーからの参加を禁止する (この設定はあとから変更できません!)", "Room Settings - %(roomName)s": "部屋の設定 - %(roomName)s", "Explore": "探索", - "Filter": "フィルター", + "Filter": "検索", "Find a room… (e.g. %(exampleRoom)s)": "部屋を探す… (例: %(exampleRoom)s)", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "もしお探しの部屋が見つからない場合、招待してもらうか部屋を作成しましょう。", "Enable room encryption": "部屋の暗号化を有効化", @@ -1466,5 +1466,16 @@ "Recently Direct Messaged": "最近ダイレクトメッセージで会話したユーザー", "Invite someone using their name, username (like ) or share this room.": "この部屋に誰かを招待したい場合は、招待したいユーザーの名前、( の様な)ユーザー名、またはメールアドレスを指定するか、この部屋を共有してください。", "Invite someone using their name, email address, username (like ) or share this room.": "この部屋に誰かを招待したい場合は、招待したいユーザーの名前、メールアドレス、または( の様な)ユーザー名を指定するか、この部屋を共有してください。", - "Upgrade your encryption": "暗号化をアップグレード" + "Upgrade your encryption": "暗号化をアップグレード", + "Role": "役割", + "Send a reply…": "返信を送信する…", + "Send a message…": "メッセージを送信する…", + "This is the beginning of your direct message history with .": "ここがあなたと のダイレクトメッセージの履歴の先頭です。", + "This is the start of .": "ここが の先頭です。", + "Add a topic to help people know what it is about.": "トピックを追加すると参加者がこの部屋の目的を理解しやすくなります。", + "Topic: %(topic)s (edit)": "トピック: %(topic)s (編集)", + "Topic: %(topic)s ": "トピック: %(topic)s ", + "%(displayName)s created this room.": "%(displayName)s がこの部屋を作成しました。", + "You created this room.": "あなたがこの部屋を作成しました。", + "%(creator)s created this DM.": "%(creator)s がこの DM を作成しました。" } From 5cee82f9d5f7cf6afdfe39b79f6e7d29195477d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Sun, 6 Dec 2020 21:11:37 +0000 Subject: [PATCH 021/187] Translated using Weblate (Czech) Currently translated at 77.1% (2084 of 2702 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 | 43 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 4d9d27363f..e3c19b2676 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2213,5 +2213,46 @@ "Upload completed": "Nahrávání dokončeno", "Cancelled signature upload": "Nahrávání podpisu zrušeno", "Unable to upload": "Nelze nahrát", - "Server isn't responding": "Server neodpovídá" + "Server isn't responding": "Server neodpovídá", + "End": "End", + "Space": "Mezerník", + "Enter": "Enter", + "Esc": "Esc", + "Page Down": "Page Down", + "Page Up": "Page Up", + "Cancel autocomplete": "Zrušit automatické doplňování", + "Move autocomplete selection up/down": "Posun nahoru/dolu v automatickém doplňování", + "Toggle this dialog": "Zobrazit/skrýt tento dialog", + "Activate selected button": "Aktivovat označené tlačítko", + "Close dialog or context menu": "Zavřít dialog nebo kontextové menu", + "Toggle the top left menu": "Zobrazit/skrýt menu vlevo nahoře", + "Scroll up/down in the timeline": "Posunous se nahoru/dolů v historii", + "Clear room list filter field": "Smazat filtr místností", + "Expand room list section": "Rozbalit seznam místností", + "Collapse room list section": "Sbalit seznam místností", + "Select room from the room list": "Vybrat místnost v seznamu", + "Navigate up/down in the room list": "Posouvat se nahoru/dolů v seznamu místností", + "Jump to room search": "Filtrovat místnosti", + "Toggle video on/off": "Zapnout nebo vypnout video", + "Toggle microphone mute": "Ztlumit nebo zapnout mikrofon", + "Jump to start/end of the composer": "Skočit na konec/začátek textového pole", + "New line": "Nový řádek", + "Toggle Quote": "Citace", + "Toggle Italics": "Kurzíva", + "Toggle Bold": "Tučné písmo", + "Ctrl": "Ctrl", + "Shift": "Shift", + "Alt Gr": "Alt Gr", + "Autocomplete": "Automatické doplňování", + "Room List": "Seznam místností", + "Calls": "Hovory", + "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.": "Pro nastavení filtru přetáhněte avatar skupiny do panelu filtrování na levé straně obrazovky. Pak v tomto panelu můžete kdykoliv klepnout na avatar skupiny a uvidíte jen místnosti a lidi z dané skupiny.", + "Send feedback": "Odeslat zpětnou vazbu", + "Feedback": "Zpětná vazba", + "Feedback sent": "Zpětná vazba byla odeslána", + "Security & privacy": "Zabezpečení", + "All settings": "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)" } From fdeeb26cbe124b20deabd4055787f69c20316ece Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sun, 6 Dec 2020 21:03:16 +0000 Subject: [PATCH 022/187] Translated using Weblate (Czech) Currently translated at 77.1% (2084 of 2702 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, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index e3c19b2676..123b1f4327 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -131,14 +131,14 @@ "Failed to send request.": "Odeslání žádosti se nezdařilo.", "Failed to set display name": "Nepodařilo se nastavit zobrazované jméno", "Failed to unban": "Přijetí zpět se nezdařilo", - "Failed to upload profile picture!": "Nahrání profilového obrázku se nezdařilo", + "Failed to upload profile picture!": "Nahrání profilového obrázku se nezdařilo!", "Failure to create room": "Vytvoření místnosti se nezdařilo", "Forget room": "Zapomenout místnost", "For security, this session has been signed out. Please sign in again.": "Z bezpečnostních důvodů bylo toto přihlášení ukončeno. Přihlašte se prosím znovu.", "and %(count)s others...|other": "a %(count)s další...", "%(widgetName)s widget modified by %(senderName)s": "Uživatel %(senderName)s upravil widget %(widgetName)s", "%(widgetName)s widget removed by %(senderName)s": "Uživatel %(senderName)s odstranil widget %(widgetName)s", - "%(widgetName)s widget added by %(senderName)s": "Uživatel %(senderName)s přidal widget %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "Uživatel %(senderName)s přidal widget %(widgetName)s", "Automatically replace plain text Emoji": "Automaticky nahrazovat textové emoji", "Failed to upload image": "Obrázek se nepodařilo nahrát", "%(senderName)s answered the call.": "Uživatel %(senderName)s přijal hovor.", @@ -438,7 +438,7 @@ "URL previews are enabled by default for participants in this room.": "Ve výchozím nastavení jsou náhledy URL adres povolené pro členy této místnosti.", "URL previews are disabled by default for participants in this room.": "Ve výchozím nastavení jsou náhledy URL adres zakázané pro členy této místnosti.", "Invalid file%(extra)s": "Neplatný soubor%(extra)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?": "Budete přesměrováni na stránku třetí strany k ověření svého účtu pro používání s %(integrationsUrl)s. Chcete pokračovat?", + "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?": "Budete přesměrováni na stránku třetí strany k ověření svého účtu pro používání s %(integrationsUrl)s. Chcete pokračovat?", "Please check your email to continue registration.": "Pro pokračování v registraci prosím zkontrolujte své e-maily.", "Token incorrect": "Neplatný token", "A text message has been sent to %(msisdn)s": "Na číslo %(msisdn)s byla odeslána textová zpráva", @@ -557,7 +557,7 @@ "Failed to add the following users to the summary of %(groupId)s:": "Do souhrnného seznamu skupiny %(groupId)s se nepodařilo přidat následující uživatele:", "Add a User": "Přidat uživatele", "Failed to remove a user from the summary of %(groupId)s": "Ze souhrnného seznamu skupiny %(groupId)s se nepodařilo odstranit uživatele", - "The user '%(displayName)s' could not be removed from the summary.": "Nelze odstranit uživatele '%(displayName)s' ze souhrnného seznamu.", + "The user '%(displayName)s' could not be removed from the summary.": "Nelze odstranit uživatele '%(displayName)s' ze souhrnného seznamu.", "Unable to accept invite": "Nelze přijmout pozvání", "Unable to reject invite": "Nelze odmítnout pozvání", "Community Settings": "Nastavení skupiny", From 5178d335ecc468ec58a4293ae1f67b14ea394998 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Sun, 6 Dec 2020 20:45:09 +0000 Subject: [PATCH 023/187] Translated using Weblate (Czech) Currently translated at 77.1% (2084 of 2702 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 123b1f4327..c1d07e1f47 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -219,7 +219,7 @@ "Submit": "Odeslat", "Success": "Úspěch", "The phone number entered looks invalid": "Zadané telefonní číslo se zdá být neplatné", - "This email address is already in use": "Tato e-mailová adresa je již požívána", + "This email address is already in use": "Tato e-mailová adresa je již používána", "This email address was not found": "Tato e-mailová adresa nebyla nalezena", "This room has no local addresses": "Tato místnost nemá žádné místní adresy", "This room is not recognised.": "Tato místnost nebyla rozpoznána.", From 81c16555f63381a8e0a2294d51a94ab1abfbd514 Mon Sep 17 00:00:00 2001 From: XoseM Date: Sat, 5 Dec 2020 05:49:10 +0000 Subject: [PATCH 024/187] Translated using Weblate (Galician) Currently translated at 100.0% (2702 of 2702 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 f59b05cc7a..9bc6c2961b 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2954,5 +2954,6 @@ "Continue with %(provider)s": "Continuar con %(provider)s", "Homeserver": "Servidor de inicio", "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.": "Podes usar as opcións do servidor para poder conectarte a outros servidores Matrix indicando o URL dese servidor. Esto permíteche usar Element cunha conta Matrix existente noutro servidor.", - "Server Options": "Opcións do servidor" + "Server Options": "Opcións do servidor", + "Reason (optional)": "Razón (optativa)" } From 51ededb94d026918e84038a71da539736ffc61af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 4 Dec 2020 20:47:10 +0000 Subject: [PATCH 025/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2702 of 2702 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 b7532bdd1b..07cc44c85b 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2955,5 +2955,6 @@ "Sign into your homeserver": "Logi sisse oma koduserverisse", "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org on maailma suurim avalik koduserver ja see sobib paljude jaoks.", "Specify a homeserver": "Sisesta koduserver", - "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Lihtsalt hoiatame, et kui sa ei lisa e-posti aadressi ning unustad oma konto salasõna, siis sa võid püsivalt kaotada ligipääsu oma kontole." + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Lihtsalt hoiatame, et kui sa ei lisa e-posti aadressi ning unustad oma konto salasõna, siis sa võid püsivalt kaotada ligipääsu oma kontole.", + "Reason (optional)": "Põhjus (kui soovid lisada)" } From 89d5d88ca43c37b26af2ec70bebac6ba7d03ea8b Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Mon, 7 Dec 2020 18:46:01 +0000 Subject: [PATCH 026/187] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2702 of 2702 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 55f35e638e..4794981b01 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2887,5 +2887,8 @@ "Homeserver": "Servidor local", "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.": "Você pode usar as opções personalizadas de servidor para entrar em outros servidores Matrix, especificando um URL de servidor local diferente. Isso permite que você use o Element com uma conta Matrix em um servidor local diferente.", "Server Options": "Opções do servidor", - "Reason (optional)": "Motivo (opcional)" + "Reason (optional)": "Motivo (opcional)", + "We call the places where you can host your account ‘homeservers’.": "Os locais onde você pode hospedar sua conta são chamados de \"servidores locais\".", + "Call failed because webcam or microphone could not be accessed. Check that:": "A chamada falhou porque a câmera ou o microfone não puderam ser acessados. Verifique se:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada falhou porque não foi possível acessar o microfone. Verifique se o microfone está conectado e configurado corretamente." } From 47e31ab06ff4ca49b539d58964637a211db9a8ed Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 7 Dec 2020 19:36:18 +0000 Subject: [PATCH 027/187] Translated using Weblate (Swedish) Currently translated at 98.6% (2666 of 2702 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 9a42a046cd..598b8ae2d0 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -2852,5 +2852,7 @@ "See emotes posted to your active room": "Se emotes som skickas i ditt aktiva rum", "See emotes posted to this room": "Se emotes som skickas i det här rummet", "Send emotes as you in your active room": "Skicka emotes som dig i ditt aktiva rum", - "Send emotes as you in this room": "Skicka emotes som dig i det här rummet" + "Send emotes as you in this room": "Skicka emotes som dig i det här rummet", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "En förvarning, om du inte lägger till en e-postadress och glömmer ditt lösenord, så kan du permanent förlora åtkomst till ditt konto.", + "Continuing without email": "Fortsätter utan e-post" } From d90e2db68c01e5c92749ade58e1f6bebaf3ecace Mon Sep 17 00:00:00 2001 From: random Date: Mon, 7 Dec 2020 16:00:51 +0000 Subject: [PATCH 028/187] Translated using Weblate (Italian) Currently translated at 97.6% (2639 of 2702 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 | 45 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 4ad806f55e..18ca54dc60 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2852,5 +2852,48 @@ "Go to Home View": "Vai alla vista home", "

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 per la pagina della tua comunità

\n

\n Usa la descrizione estesa per introdurre i nuovi membri alla comunità, o distribuisci\n alcuni link importanti\n

\n

\n Puoi anche aggiungere immagini con gli URL Matrix \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": "Salva in cache i messaggi cifrati localmente in modo che appaiano nei risultati di ricerca, usando %(size)s per salvarli da %(rooms)s stanza.", - "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Salva in cache i messaggi cifrati localmente in modo che appaiano nei risultati di ricerca, usando %(size)s per salvarli da %(rooms)s stanze." + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Salva in cache i messaggi cifrati localmente in modo che appaiano nei risultati di ricerca, usando %(size)s per salvarli da %(rooms)s stanze.", + "See text messages posted to your active room": "Vedi messaggi di testo inviati alla tua stanza attiva", + "See text messages posted to this room": "Vedi messaggi di testo inviati a questa stanza", + "Send text messages as you in your active room": "Invia messaggi di testo a tuo nome nella tua stanza attiva", + "Send text messages as you in this room": "Invia messaggi di testo a tuo nome in questa stanza", + "See messages posted to your active room": "Vedi messaggi inviati alla tua stanza attiva", + "See messages posted to this room": "Vedi messaggi inviati a questa stanza", + "Send messages as you in your active room": "Invia messaggi a tuo nome nella tua stanza attiva", + "Send messages as you in this room": "Invia messaggi a tuo nome in questa stanza", + "The %(capability)s capability": "La capacità %(capability)s", + "See %(eventType)s events posted to your active room": "Vedi eventi %(eventType)s inviati alla tua stanza attiva", + "Send %(eventType)s events as you in your active room": "Invia eventi %(eventType)s a tuo nome nella tua stanza attiva", + "See %(eventType)s events posted to this room": "Vedi eventi %(eventType)s inviati a questa stanza", + "Send %(eventType)s events as you in this room": "Invia eventi %(eventType)s a tuo nome in questa stanza", + "with state key %(stateKey)s": "con la chiave di stato %(stateKey)s", + "with an empty state key": "con una chiave di stato vuota", + "See when anyone posts a sticker to your active room": "Vedi quando qualcuno invia un adesivo alla tua stanza attiva", + "Send stickers to this room as you": "Invia adesivi a questa stanza a tuo nome", + "Send stickers to your active room as you": "Invia adesivi alla tua stanza attiva a tuo nome", + "See when a sticker is posted in this room": "Vedi quando viene inviato un adesivo in questa stanza", + "See when the avatar changes in your active room": "Vedi quando l'avatar cambia nella tua stanza attiva", + "Change the avatar of your active room": "Cambia l'avatar della tua stanza attiva", + "See when the avatar changes in this room": "Vedi quando l'avatar cambia in questa stanza", + "Change the avatar of this room": "Cambia l'avatar di questa stanza", + "See when the name changes in your active room": "Vedi quando il nome cambia nella tua stanza attiva", + "Change the name of your active room": "Cambia il nome della tua stanza attiva", + "See when the name changes in this room": "Vedi quando il nome cambia in questa stanza", + "Change the name of this room": "Cambia il nome di questa stanza", + "See when the topic changes in your active room": "Vedi quando l'argomento cambia nella tua stanza attiva", + "Change the topic of your active room": "Cambia l'argomento della tua stanza attiva", + "See when the topic changes in this room": "Vedi quando l'argomento cambia in questa stanza", + "Change the topic of this room": "Cambia l'argomento di questa stanza", + "Change which room you're viewing": "Cambia quale stanza stai vedendo", + "Send stickers into your active room": "Invia adesivi nella tua stanza attiva", + "Send stickers into this room": "Invia adesivi in questa stanza", + "Remain on your screen while running": "Resta sul tuo schermo mentre in esecuzione", + "Remain on your screen when viewing another room, when running": "Resta sul tuo schermo quando vedi un'altra stanza, quando in esecuzione", + "No other application is using the webcam": "Nessun'altra applicazione sta usando la webcam", + "Permission is granted to use the webcam": "Permesso concesso per usare la webcam", + "A microphone and webcam are plugged in and set up correctly": "Un microfono e una webcam siano collegati e configurati correttamente", + "Unable to access webcam / microphone": "Impossibile accedere alla webcam / microfono", + "Call failed because webcam or microphone could not be accessed. Check that:": "Chiamata fallita perchè la webcam o il microfono non sono accessibili. Controlla che:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Chiamata fallita perchè il microfono non è accessibile. Controlla che ci sia un microfono collegato e configurato correttamente.", + "Unable to access microphone": "Impossibile accedere al microfono" } From 1da90ea5dc15f3fa3a2444df724f504a7c5ab315 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Mon, 7 Dec 2020 21:17:00 +0000 Subject: [PATCH 029/187] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2703 of 2703 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 4794981b01..251f121088 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2890,5 +2890,7 @@ "Reason (optional)": "Motivo (opcional)", "We call the places where you can host your account ‘homeservers’.": "Os locais onde você pode hospedar sua conta são chamados de \"servidores locais\".", "Call failed because webcam or microphone could not be accessed. Check that:": "A chamada falhou porque a câmera ou o microfone não puderam ser acessados. Verifique se:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada falhou porque não foi possível acessar o microfone. Verifique se o microfone está conectado e configurado corretamente." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada falhou porque não foi possível acessar o microfone. Verifique se o microfone está conectado e configurado corretamente.", + "Invalid URL": "URL inválido", + "Unable to validate homeserver": "Não foi possível validar o servidor local" } From cffeb940a5d5d34952de1ca3479ed32660343b5c Mon Sep 17 00:00:00 2001 From: Kaede Date: Mon, 7 Dec 2020 20:39:02 +0000 Subject: [PATCH 030/187] Translated using Weblate (Japanese) Currently translated at 50.3% (1362 of 2703 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 | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 1b107e0da4..3fa0a502ca 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -497,7 +497,7 @@ "'%(groupId)s' is not a valid community ID": "'%(groupId)s' は有効なコミュニティIDではありません", "Showing flair for these communities:": "次のコミュニティのバッジを表示:", "This room is not showing flair for any communities": "この部屋はどんなコミュニティに対してもバッジを表示していません", - "New community ID (e.g. +foo:%(localDomain)s)": "新しいコミュニティID (例 +foo:%(localDomain)s)", + "New community ID (e.g. +foo:%(localDomain)s)": "新しいコミュニティ ID (例: +foo:%(localDomain)s)", "You have enabled URL previews by default.": "デフォルトで URL プレビューが有効です。", "You have disabled URL previews by default.": "デフォルトで URL プレビューが無効です。", "URL previews are enabled by default for participants in this room.": "この部屋の参加者は、デフォルトで URL プレビューが有効です。", @@ -981,7 +981,7 @@ "Preferences": "環境設定", "Security & Privacy": "セキュリティとプライバシー", "Room information": "部屋の情報", - "Internal room ID:": "内部 部屋ID:", + "Internal room ID:": "内部部屋 ID:", "Room version": "部屋のバージョン", "Room version:": "部屋のバージョン:", "Developer options": "開発者オプション", @@ -1477,5 +1477,15 @@ "Topic: %(topic)s ": "トピック: %(topic)s ", "%(displayName)s created this room.": "%(displayName)s がこの部屋を作成しました。", "You created this room.": "あなたがこの部屋を作成しました。", - "%(creator)s created this DM.": "%(creator)s がこの DM を作成しました。" + "%(creator)s created this DM.": "%(creator)s がこの DM を作成しました。", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "ここでのメッセージはエンドツーエンド暗号化されています。%(displayName)s のアバターをタップして、プロフィールから検証を行うことができます。", + "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "この部屋内でのメッセージの送受信はエンドツーエンド暗号化されています。参加者のアバターをタップして、プロフィールから検証を行うことができます。", + "Use default": "既定の設定を使用", + "e.g. my-room": "例: my-room", + "Room address": "ルームアドレス", + "New published address (e.g. #alias:server)": "新しい公開アドレス (例: #alias:server)", + "No other published addresses yet, add one below": "現在、公開アドレスがありません。以下から追加可能です。", + "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": "メンションとキーワード" } From ad0ab079fd623112eddd8b3bc2bd1aed5fcff09b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 7 Dec 2020 21:06:15 +0000 Subject: [PATCH 031/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2703 of 2703 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, 7 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 07cc44c85b..40c5f5675c 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1016,7 +1016,7 @@ "Community %(groupId)s not found": "%(groupId)s kogukonda ei leidunud", "This homeserver does not support communities": "See koduserver ei toeta kogukondade funktsionaalsust", "Failed to load %(groupId)s": "%(groupId)s kogukonna laadimine ei õnnestunud", - "Welcome to %(appName)s": "Tere tulemast %(appName)s kasutajaks", + "Welcome to %(appName)s": "Tere tulemast suhtlusrakenduse %(appName)s kasutajaks", "Liberate your communication": "Vabasta oma suhtlus", "Send a Direct Message": "Saada otsesõnum", "Are you sure you want to leave the room '%(roomName)s'?": "Kas oled kindel, et soovid lahkuda jututoast '%(roomName)s'?", @@ -2956,5 +2956,10 @@ "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org on maailma suurim avalik koduserver ja see sobib paljude jaoks.", "Specify a homeserver": "Sisesta koduserver", "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Lihtsalt hoiatame, et kui sa ei lisa e-posti aadressi ning unustad oma konto salasõna, siis sa võid püsivalt kaotada ligipääsu oma kontole.", - "Reason (optional)": "Põhjus (kui soovid lisada)" + "Reason (optional)": "Põhjus (kui soovid lisada)", + "We call the places where you can host your account ‘homeservers’.": "Me nimetame „koduserveriks“ sellist serverit, mis haldab sinu kasutajakontot.", + "Invalid URL": "Vigane aadress", + "Unable to validate homeserver": "Koduserveri õigsust ei õnnestunud kontrollida", + "Call failed because webcam or microphone could not be accessed. Check that:": "Kuna veebikaamerat või mikrofoni kasutada ei saanud, siis kõne ei õnnestunud. Palun kontrolli, et:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Kuna mikrofoni kasutada ei saanud, siis kõne ei õnnestunud. Palun kontrolli, et mikrofon oleks ühendatud ja seadistatud." } From 48f40de14a43190bdf8ef3edd4dbd581e0b05ff1 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Tue, 8 Dec 2020 00:44:56 +0000 Subject: [PATCH 032/187] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2707 of 2707 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 251f121088..397c02deec 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2892,5 +2892,9 @@ "Call failed because webcam or microphone could not be accessed. Check that:": "A chamada falhou porque a câmera ou o microfone não puderam ser acessados. Verifique se:", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada falhou porque não foi possível acessar o microfone. Verifique se o microfone está conectado e configurado corretamente.", "Invalid URL": "URL inválido", - "Unable to validate homeserver": "Não foi possível validar o servidor local" + "Unable to validate homeserver": "Não foi possível validar o servidor local", + "sends confetti": "envia confetes", + "Sends the given message with confetti": "Envia a mensagem com confetes", + "Show chat effects": "Mostrar efeitos em conversas", + "Effects": "Efeitos" } From 483216ce53ed33773ed114c921398d503c5167aa Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 8 Dec 2020 02:25:09 +0000 Subject: [PATCH 033/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2707 of 2707 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 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index ffb82d05a2..d8cc146e7f 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2958,5 +2958,14 @@ "Homeserver": "家伺服器", "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 使用自訂伺服器選項來登入其他 Matrix 伺服器。這讓您可以使用在不同家伺服器上的既有 Matrix 帳號。", "Server Options": "伺服器選項", - "Reason (optional)": "理由(選擇性)" + "Reason (optional)": "理由(選擇性)", + "We call the places where you can host your account ‘homeservers’.": "我們將可以託管您的帳號的地方稱為「家伺服器」。", + "Invalid URL": "無效的 URL", + "Unable to validate homeserver": "無法驗證家伺服器", + "sends confetti": "傳送五彩碎紙", + "Sends the given message with confetti": "使用五彩碎紙傳送訊息", + "Show chat effects": "顯示聊天特效", + "Effects": "影響", + "Call failed because webcam or microphone could not be accessed. Check that:": "通話失敗,因為無法存取網路攝影機或麥克風。請檢查:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "通話失敗,因為無法存取麥克風。請檢查是否已插入麥克風並正確設定。" } From f380e4d97d8dd32615d1dc1af2d9ed9126a5fa0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Tue, 8 Dec 2020 14:02:57 +0000 Subject: [PATCH 034/187] Translated using Weblate (Czech) Currently translated at 77.9% (2111 of 2707 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 | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index c1d07e1f47..a50dff9123 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2254,5 +2254,33 @@ "All settings": "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)" + "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.", + "(an error occurred)": "(došlo k chybě)", + "(their device couldn't start the camera / microphone)": "(zařízení druhé strany nemohlo spustit kameru / mikrofon)", + "(connection failed)": "(spojení selhalo)", + "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 K místnosti nemá přístup žádný server! Místnost už nemůže být používána.", + "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Vloží ( ͡° ͜ʖ ͡°) na začátek zprávy", + "Czech Republic": "Česká republika", + "Algeria": "Alžírsko", + "Albania": "Albánie", + "Åland Islands": "Alandy", + "Afghanistan": "Afgánistán", + "United States": "Spojené Státy", + "United Kingdom": "Spojené Království", + "This will end the conference for everyone. Continue?": "Ukončíme konferenci pro všechny účastníky. Chcete pokračovat?", + "End conference": "Ukončit konferenci", + "No other application is using the webcam": "Webkamera není blokována jinou aplikací", + "Permission is granted to use the webcam": "Aplikace má k webkameře povolen přístup", + "A microphone and webcam are plugged in and set up correctly": "Mikrofon a webkamera jsou zapojeny a správně nastaveny", + "Call failed because webcam or microphone could not be accessed. Check that:": "Hovor selhal, protože nešlo použít mikrofon nebo webkameru. Zkontrolujte, že:", + "Unable to access webcam / microphone": "Není možné použít webkameru nebo mikrofon", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Hovor selhal, protože nešlo použít mikrofon. Zkontrolujte, že je mikrofon připojen a správně nastaven.", + "Unable to access microphone": "Není možné použít mikrofon", + "The call was answered on another device.": "Hovor byl přijat na jiném zařízení.", + "Answered Elsewhere": "Zodpovězeno jinde", + "The call could not be established": "Hovor se nepovedlo navázat", + "The other party declined the call.": "Druhá strana hovor odmítla.", + "Call Declined": "Hovor odmítnut" } From 8a3a6ca2f37e97f48a021f2d985e6915853da91e Mon Sep 17 00:00:00 2001 From: XoseM Date: Tue, 8 Dec 2020 07:25:26 +0000 Subject: [PATCH 035/187] Translated using Weblate (Galician) Currently translated at 100.0% (2707 of 2707 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 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 9bc6c2961b..5f9eced4f7 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2955,5 +2955,14 @@ "Homeserver": "Servidor de inicio", "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.": "Podes usar as opcións do servidor para poder conectarte a outros servidores Matrix indicando o URL dese servidor. Esto permíteche usar Element cunha conta Matrix existente noutro servidor.", "Server Options": "Opcións do servidor", - "Reason (optional)": "Razón (optativa)" + "Reason (optional)": "Razón (optativa)", + "We call the places where you can host your account ‘homeservers’.": "Ós lugares onde podes ter unha conta chamámoslle 'servidores de inicio'.", + "Invalid URL": "URL non válido", + "Unable to validate homeserver": "Non se puido validar o servidor de inicio", + "sends confetti": "envía confetti", + "Sends the given message with confetti": "Envía a mensaxe con confetti", + "Show chat effects": "Mostrar efectos do chat", + "Effects": "Efectos", + "Call failed because webcam or microphone could not be accessed. Check that:": "A chamada fallou porque non tiñas acceso á cámara ou ó micrófono. Comproba:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada fallou porque non tiñas acceso ó micrófono. Comproba que o micrófono está conectado e correctamente configurado." } From 4dd8ed1746069c53b8403c5f4dd573afbf4866cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 8 Dec 2020 07:03:01 +0000 Subject: [PATCH 036/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2707 of 2707 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 40c5f5675c..d3d7011bd2 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2961,5 +2961,9 @@ "Invalid URL": "Vigane aadress", "Unable to validate homeserver": "Koduserveri õigsust ei õnnestunud kontrollida", "Call failed because webcam or microphone could not be accessed. Check that:": "Kuna veebikaamerat või mikrofoni kasutada ei saanud, siis kõne ei õnnestunud. Palun kontrolli, et:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Kuna mikrofoni kasutada ei saanud, siis kõne ei õnnestunud. Palun kontrolli, et mikrofon oleks ühendatud ja seadistatud." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Kuna mikrofoni kasutada ei saanud, siis kõne ei õnnestunud. Palun kontrolli, et mikrofon oleks ühendatud ja seadistatud.", + "sends confetti": "saatis serpentiine", + "Sends the given message with confetti": "Lisab sellele sõnumile serpentiine", + "Show chat effects": "Näita vestlustes efekte", + "Effects": "Vahvad täiendused" } From d1483d512fd15fbdf295fe5110233c7b5cb0aee0 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 8 Dec 2020 21:44:30 +0000 Subject: [PATCH 037/187] Translated using Weblate (Swedish) Currently translated at 98.6% (2671 of 2707 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 598b8ae2d0..8c053de410 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -2854,5 +2854,11 @@ "Send emotes as you in your active room": "Skicka emotes som dig i ditt aktiva rum", "Send emotes as you in this room": "Skicka emotes som dig i det här rummet", "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "En förvarning, om du inte lägger till en e-postadress och glömmer ditt lösenord, så kan du permanent förlora åtkomst till ditt konto.", - "Continuing without email": "Fortsätter utan e-post" + "Continuing without email": "Fortsätter utan e-post", + "sends confetti": "skickar konfetti", + "Sends the given message with confetti": "Skickar det givna meddelandet med konfetti", + "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." } From dbaf5311224c3e58eb5c88b83f8dc1cb77decf12 Mon Sep 17 00:00:00 2001 From: MamasLT Date: Wed, 9 Dec 2020 02:48:54 +0000 Subject: [PATCH 038/187] Translated using Weblate (Lithuanian) Currently translated at 70.1% (1898 of 2707 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/lt/ --- src/i18n/strings/lt.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index c1191aa020..516fcc977b 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -2027,5 +2027,17 @@ "See when the avatar changes in this room": "Matyti kada šiame kambaryje pasikeičia pseudoportretas", "Change the avatar of this room": "Pakeisti šio kambario pseudoportretą", "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Žinutės šiame kambaryje yra visapusiškai užšifruotos. Kai žmonės prisijungia, jūs galite patvirtinti juos jų profilyje, tiesiog paspauskite ant jų pseudoportreto.", - "Mentions & Keywords": "Paminėjimai ir Raktažodžiai" + "Mentions & Keywords": "Paminėjimai ir Raktažodžiai", + "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.": "Nepavyksta prisijungti prie serverio - patikrinkite savo ryšį, įsitikinkite, kad jūsų serverio SSL sertifikatas yra patikimas ir, kad naršyklės plėtinys neužblokuoja užklausų.", + "Not trusted": "Nepatikimas", + "Trusted": "Patikimas", + "Role": "Rolė", + "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.": "Anksčiau šiame seanse naudojote naujesnę %(brand)s versiją. Norėdami vėl naudoti šią versiją su visapusiu šifravimu, turėsite atsijungti ir prisijungti iš naujo.", + "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": "Tam, kad neprarastumėte savo pokalbių istorijos, prieš atsijungdami turite eksportuoti kambario raktus. Norėdami tai padaryti, turėsite grįžti į naujesnę %(brand)s versiją", + "New version of %(brand)s is available": "Yra nauja %(brand)s versija", + "Failed to update community": "Nepavyko atnaujinti bendruomenės", + "Update status": "Atnaujinti statusą", + "Update community": "Atnaujinti bendruomenę", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Kambario %(roomName)s matomumas bendruomenėje %(groupId)s negalėjo būti atnaujintas.", + "Update %(brand)s": "Atnaujinti %(brand)s" } From 6731613cd07d6dbc1ce8143e713f7a85ef378606 Mon Sep 17 00:00:00 2001 From: random Date: Wed, 9 Dec 2020 16:20:04 +0000 Subject: [PATCH 039/187] Translated using Weblate (Italian) Currently translated at 100.0% (2707 of 2707 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 | 71 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 18ca54dc60..dd3641981a 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2895,5 +2895,74 @@ "Unable to access webcam / microphone": "Impossibile accedere alla webcam / microfono", "Call failed because webcam or microphone could not be accessed. Check that:": "Chiamata fallita perchè la webcam o il microfono non sono accessibili. Controlla che:", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Chiamata fallita perchè il microfono non è accessibile. Controlla che ci sia un microfono collegato e configurato correttamente.", - "Unable to access microphone": "Impossibile accedere al microfono" + "Unable to access microphone": "Impossibile accedere al microfono", + "Decide where your account is hosted": "Decidi dove ospitare il tuo account", + "Host account on": "Ospita account su", + "Already have an account? Sign in here": "Hai già un account? Accedi qui", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s o %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Continua con %(ssoButtons)s", + "That username already exists, please try another.": "Quel nome utente esiste già, provane un altro.", + "New? Create account": "Prima volta? Crea un account", + "There was a problem communicating with the homeserver, please try again later.": "C'è stato un problema nella comunicazione con l'homeserver, riprova più tardi.", + "New here? Create an account": "Prima volta qui? Crea un account", + "Got an account? Sign in": "Hai un account? Accedi", + "Use email to optionally be discoverable by existing contacts.": "Usa l'email per essere facoltativamente trovabile dai contatti esistenti.", + "Use email or phone to optionally be discoverable by existing contacts.": "Usa l'email o il telefono per essere facoltativamente trovabile dai contatti esistenti.", + "Add an email to be able to reset your password.": "Aggiungi un'email per poter reimpostare la password.", + "Forgot password?": "Hai dimenticato la password?", + "That phone number doesn't look quite right, please check and try again": "Quel numero di telefono non sembra corretto, controlla e riprova", + "Enter phone number": "Inserisci numero di telefono", + "Enter email address": "Inserisci indirizzo email", + "Decline All": "Rifiuta tutti", + "Approve widget permissions": "Approva permessi del widget", + "Approve": "Approva", + "This widget would like to:": "Il widget vorrebbe:", + "About homeservers": "Riguardo gli homeserver", + "Learn more": "Maggiori informazioni", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Usa il tuo homeserver Matrix preferito se ne hai uno, o ospitane uno tuo.", + "Other homeserver": "Altro homeserver", + "We call the places where you can host your account ‘homeservers’.": "Chiamiamo \"homeserver\" i posti dove puoi ospitare il tuo account.", + "Sign into your homeserver": "Accedi al tuo homeserver", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org è il più grande homeserver pubblico del mondo, quindi è un buon posto per molti.", + "Specify a homeserver": "Specifica un homeserver", + "Invalid URL": "URL non valido", + "Unable to validate homeserver": "Impossibile validare l'homeserver", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Solo un avviso, se non aggiungi un'email e dimentichi la password, potresti perdere permanentemente l'accesso al tuo account.", + "Continuing without email": "Continuando senza email", + "Reason (optional)": "Motivo (facoltativo)", + "Continue with %(provider)s": "Continua con %(provider)s", + "Homeserver": "Homeserver", + "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.": "Puoi usare le opzioni di server personalizzato per accedere ad altri server Matrix specificando un URL homeserver diverso. Ciò ti permette di usare Element con un account Matrix esistente su un homeserver differente.", + "Server Options": "Opzioni server", + "Return to call": "Torna alla chiamata", + "Fill Screen": "Riempi schermo", + "Voice Call": "Telefonata", + "Video Call": "Videochiamata", + "sends confetti": "invia coriandoli", + "Sends the given message with confetti": "Invia il messaggio in questione con coriandoli", + "Show chat effects": "Mostra effetti chat", + "Use Ctrl + Enter to send a message": "Usa Ctrl + Invio per inviare un messaggio", + "Use Command + Enter to send a message": "Usa Comando + Invio per inviare un messaggio", + "Render LaTeX maths in messages": "Renderizza matematica LaTeX nei messaggi", + "See %(msgtype)s messages posted to your active room": "Vedi messaggi %(msgtype)s inviati alla tua stanza attiva", + "See %(msgtype)s messages posted to this room": "Vedi messaggi %(msgtype)s inviati a questa stanza", + "Send %(msgtype)s messages as you in your active room": "Invia messaggi %(msgtype)s a tuo nome nella tua stanza attiva", + "Send %(msgtype)s messages as you in this room": "Invia messaggi %(msgtype)s a tuo nome in questa stanza", + "See general files posted to your active room": "Vedi file generici inviati alla tua stanza attiva", + "See general files posted to this room": "Vedi file generici inviati a questa stanza", + "Send general files as you in your active room": "Invia file generici a tuo nome nella tua stanza attiva", + "Send general files as you in this room": "Invia file generici a tuo nome in questa stanza", + "See videos posted to your active room": "Vedi video inviati alla tua stanza attiva", + "See videos posted to this room": "Vedi video inviati a questa stanza", + "Send videos as you in your active room": "Invia video a tuo nome nella tua stanza attiva", + "Send videos as you in this room": "Invia video a tuo nome in questa stanza", + "See images posted to your active room": "Vedi immagini inviate alla tua stanza attiva", + "See images posted to this room": "Vedi immagini inviate a questa stanza", + "Send images as you in your active room": "Invia immagini a tuo nome nella tua stanza attiva", + "Send images as you in this room": "Invia immagini a tuo nome in questa stanza", + "See emotes posted to your active room": "Vedi emoticon inviate alla tua stanza attiva", + "See emotes posted to this room": "Vedi emoticon inviate a questa stanza", + "Send emotes as you in your active room": "Invia emoticon a tuo nome nella tua stanza attiva", + "Send emotes as you in this room": "Invia emoticon a tuo nome in questa stanza", + "Effects": "Effetti" } From 7324bb3f1464fe117cdaab0339da3a7c17baeafc Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Wed, 9 Dec 2020 18:35:54 +0000 Subject: [PATCH 040/187] Translated using Weblate (Finnish) Currently translated at 82.3% (2229 of 2707 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 | 62 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 075c1e278a..a78c5b0448 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2376,5 +2376,65 @@ "Change the topic of this room": "Muuta huoneen aihetta", "Change which room you're viewing": "Vaihda näytettävää huonetta", "Send stickers into your active room": "Lähetä tarroja aktiiviseen huoneeseesi", - "Send stickers into this room": "Lähetä tarroja tähän huoneeseen" + "Send stickers into this room": "Lähetä tarroja tähän huoneeseen", + "Comoros": "Komorit", + "Colombia": "Kolumbia", + "Cocos (Keeling) Islands": "Kookossaaret", + "Christmas Island": "Joulusaari", + "China": "Kiina", + "Chile": "Chile", + "Chad": "Tšad", + "Central African Republic": "Keski-Afrikan tasavalta", + "Cayman Islands": "Caymansaaret", + "Caribbean Netherlands": "Alankomaiden Karibia", + "Cape Verde": "Kap Verde", + "Canada": "Kanada", + "Cameroon": "Kamerun", + "Cambodia": "Kambodža", + "Burundi": "Burundi", + "Burkina Faso": "Burkina Faso", + "Bulgaria": "Bulgaria", + "Brunei": "Brunei", + "British Virgin Islands": "Brittiläiset Neitsytsaaret", + "British Indian Ocean Territory": "Brittiläinen Intian valtameren alue", + "Brazil": "Brasilia", + "Bouvet Island": "Bouvet’nsaari", + "Botswana": "Botswana", + "Bosnia": "Bosnia ja Hertsegovina", + "Bolivia": "Bolivia", + "Bhutan": "Bhutan", + "Bermuda": "Bermuda", + "Benin": "Benin", + "Belize": "Belize", + "Belgium": "Belgia", + "Belarus": "Valko-Venäjä", + "Barbados": "Barbados", + "Bangladesh": "Bangladesh", + "Bahrain": "Bahrain", + "Bahamas": "Bahama", + "Azerbaijan": "Azerbaidžan", + "Austria": "Itävalta", + "Australia": "Australia", + "Aruba": "Aruba", + "Armenia": "Armenia", + "Argentina": "Argentiina", + "Antigua & Barbuda": "Antigua ja Barbuda", + "Antarctica": "Antarktis", + "Anguilla": "Anguilla", + "Angola": "Angola", + "Andorra": "Andorra", + "American Samoa": "Amerikan Samoa", + "Algeria": "Algeria", + "Albania": "Albania", + "Åland Islands": "Ahvenanmaa", + "Afghanistan": "Afganistan", + "United States": "Yhdysvallat", + "United Kingdom": "Iso-Britannia", + "No other application is using the webcam": "Mikään muu sovellus ei käytä kameraa", + "Permission is granted to use the webcam": "Lupa käyttää kameraa myönnetty", + "A microphone and webcam are plugged in and set up correctly": "Mikrofoni ja kamera on kytketty ja asennettu oiken", + "Call failed because webcam or microphone could not be accessed. Check that:": "Puhelu epäonnistui, koska kameraa tai mikrofonia ei voitu käyttää. Tarkista että:", + "Unable to access webcam / microphone": "Kameraa / mikrofonia ei voi käyttää", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Puhelu epäonnistui, koska mikrofonia ei voitu käyttää. Tarkista, että mikrofoni on kytketty ja asennettu oikein.", + "Unable to access microphone": "Mikrofonia ei voi käyttää" } From 753ec9e45ac3a7283deeec5b80de24ac18a5b084 Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Wed, 9 Dec 2020 18:40:31 -0500 Subject: [PATCH 041/187] use random pickle key on all platforms, and store access token encrypted in IDB --- src/BasePlatform.ts | 68 +++++++++++++- src/IndexedDB.ts | 92 +++++++++++++++++++ src/Lifecycle.ts | 82 ++++++++++++----- .../structures/auth/Registration.tsx | 3 +- 4 files changed, 219 insertions(+), 26 deletions(-) create mode 100644 src/IndexedDB.ts diff --git a/src/BasePlatform.ts b/src/BasePlatform.ts index 4f7c7126e9..46fa998f15 100644 --- a/src/BasePlatform.ts +++ b/src/BasePlatform.ts @@ -18,6 +18,7 @@ limitations under the License. */ import {MatrixClient} from "matrix-js-sdk/src/client"; +import {encodeUnpaddedBase64} from "matrix-js-sdk/src/crypto/olmlib"; import dis from './dispatcher/dispatcher'; import BaseEventIndexManager from './indexing/BaseEventIndexManager'; import {ActionPayload} from "./dispatcher/payloads"; @@ -25,6 +26,7 @@ import {CheckUpdatesPayload} from "./dispatcher/payloads/CheckUpdatesPayload"; import {Action} from "./dispatcher/actions"; import {hideToast as hideUpdateToast} from "./toasts/UpdateToast"; import {MatrixClientPeg} from "./MatrixClientPeg"; +import {idbLoad, idbSave, idbDelete} from "./IndexedDB"; export const SSO_HOMESERVER_URL_KEY = "mx_sso_hs_url"; export const SSO_ID_SERVER_URL_KEY = "mx_sso_is_url"; @@ -273,7 +275,40 @@ export default abstract class BasePlatform { * pickle key has been stored. */ async getPickleKey(userId: string, deviceId: string): Promise { - return null; + if (!window.crypto || !window.crypto.subtle) { + return null; + } + let data; + try { + data = await idbLoad("pickleKey", [userId, deviceId]); + } catch (e) {} + if (!data) { + return null; + } + if (!data.encrypted || !data.iv || !data.cryptoKey) { + console.error("Badly formatted pickle key"); + return null; + } + + const additionalData = new Uint8Array(userId.length + deviceId.length + 1); + for (let i = 0; i < userId.length; i++) { + additionalData[i] = userId.charCodeAt(i); + } + additionalData[userId.length] = 124; // "|" + for (let i = 0; i < deviceId.length; i++) { + additionalData[userId.length + 1 + i] = deviceId.charCodeAt(i); + } + + try { + const key = await crypto.subtle.decrypt( + {name: "AES-GCM", iv: data.iv, additionalData}, data.cryptoKey, + data.encrypted, + ); + return encodeUnpaddedBase64(key); + } catch (e) { + console.error("Error decrypting pickle key"); + return null; + } } /** @@ -284,7 +319,33 @@ export default abstract class BasePlatform { * support storing pickle keys. */ async createPickleKey(userId: string, deviceId: string): Promise { - return null; + if (!window.crypto || !window.crypto.subtle) { + return null; + } + const crypto = window.crypto; + const randomArray = new Uint8Array(32); + crypto.getRandomValues(randomArray); + const cryptoKey = await crypto.subtle.generateKey( + {name: "AES-GCM", length: 256}, false, ["encrypt", "decrypt"], + ); + const iv = new Uint8Array(32); + crypto.getRandomValues(iv); + + const additionalData = new Uint8Array(userId.length + deviceId.length + 1); + for (let i = 0; i < userId.length; i++) { + additionalData[i] = userId.charCodeAt(i); + } + additionalData[userId.length] = 124; // "|" + for (let i = 0; i < deviceId.length; i++) { + additionalData[userId.length + 1 + i] = deviceId.charCodeAt(i); + } + + const encrypted = await crypto.subtle.encrypt( + {name: "AES-GCM", iv, additionalData}, cryptoKey, randomArray, + ); + + await idbSave("pickleKey", [userId, deviceId], {encrypted, iv, cryptoKey}); + return encodeUnpaddedBase64(randomArray); } /** @@ -293,5 +354,8 @@ export default abstract class BasePlatform { * @param {string} userId the device ID that the pickle key is for. */ async destroyPickleKey(userId: string, deviceId: string): Promise { + try { + await idbDelete("pickleKey", [userId, deviceId]); + } catch (e) {} } } diff --git a/src/IndexedDB.ts b/src/IndexedDB.ts new file mode 100644 index 0000000000..bf03ffccb7 --- /dev/null +++ b/src/IndexedDB.ts @@ -0,0 +1,92 @@ +/* +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. +*/ + +/* Simple wrapper around IndexedDB. + */ + +let idb = null; + +async function idbInit(): Promise { + idb = await new Promise((resolve, reject) => { + const request = window.indexedDB.open("element", 1); + request.onerror = reject; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore: TS thinks target.result doesn't exist + request.onsuccess = (event) => { resolve(event.target.result); }; + request.onupgradeneeded = (event) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore: TS thinks target.result doesn't exist + const db = event.target.result; + db.createObjectStore("pickleKey"); + db.createObjectStore("account"); + }; + }); +} + +export async function idbLoad( + table: string, + key: string | string[], +): Promise { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb.transaction([table], "readonly"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.get(key); + request.onerror = reject; + request.onsuccess = (event) => { resolve(request.result); }; + }); +} + +export async function idbSave( + table: string, + key: string | string[], + data: any, +): Promise { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb.transaction([table], "readwrite"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.put(data, key); + request.onerror = reject; + request.onsuccess = (event) => { resolve(); }; + }); +} + +export async function idbDelete( + table: string, + key: string | string[], +): Promise { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb.transaction([table], "readwrite"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.delete(key); + request.onerror = reject; + request.onsuccess = (event) => { resolve(); }; + }); +} diff --git a/src/Lifecycle.ts b/src/Lifecycle.ts index ac96d59b09..2f6309415f 100644 --- a/src/Lifecycle.ts +++ b/src/Lifecycle.ts @@ -21,6 +21,7 @@ limitations under the License. import Matrix from 'matrix-js-sdk'; import { InvalidStoreError } from "matrix-js-sdk/src/errors"; import { MatrixClient } from "matrix-js-sdk/src/client"; +import {decryptAES, encryptAES} from "matrix-js-sdk/src/crypto/aes"; import {IMatrixClientCreds, MatrixClientPeg} from './MatrixClientPeg'; import SecurityCustomisations from "./customisations/Security"; @@ -50,6 +51,7 @@ import ThreepidInviteStore from "./stores/ThreepidInviteStore"; import CountlyAnalytics from "./CountlyAnalytics"; import CallHandler from './CallHandler'; import LifecycleCustomisations from "./customisations/Lifecycle"; +import {idbLoad, idbSave, idbDelete} from "./IndexedDB"; const HOMESERVER_URL_KEY = "mx_hs_url"; const ID_SERVER_URL_KEY = "mx_is_url"; @@ -147,20 +149,13 @@ export async function loadSession(opts: ILoadSessionOpts = {}): Promise * Gets the user ID of the persisted session, if one exists. This does not validate * that the user's credentials still work, just that they exist and that a user ID * is associated with them. The session is not loaded. - * @returns {String} The persisted session's owner, if an owner exists. Null otherwise. + * @returns {[String, bool]} The persisted session's owner and whether the stored + * session is for a guest user, if an owner exists. If there is no stored session, + * return [null, null]. */ -export function getStoredSessionOwner(): string { - const {hsUrl, userId, accessToken} = getLocalStorageSessionVars(); - return hsUrl && userId && accessToken ? userId : null; -} - -/** - * @returns {bool} True if the stored session is for a guest user or false if it is - * for a real user. If there is no stored session, return null. - */ -export function getStoredSessionIsGuest(): boolean { - const sessVars = getLocalStorageSessionVars(); - return sessVars.hsUrl && sessVars.userId && sessVars.accessToken ? sessVars.isGuest : null; +export async function getStoredSessionOwner(): Promise<[string, boolean]> { + const {hsUrl, userId, accessToken, isGuest} = await getLocalStorageSessionVars(); + return hsUrl && userId && accessToken ? [userId, isGuest] : [null, null]; } /** @@ -197,8 +192,8 @@ export function attemptTokenLogin( }, ).then(function(creds) { console.log("Logged in with token"); - return clearStorage().then(() => { - persistCredentialsToLocalStorage(creds); + return clearStorage().then(async () => { + await persistCredentialsToLocalStorage(creds); // remember that we just logged in sessionStorage.setItem("mx_fresh_login", String(true)); return true; @@ -290,10 +285,17 @@ export interface ILocalStorageSession { * may not be valid, as it is not tested for consistency here. * @returns {Object} Information about the session - see implementation for variables. */ -export function getLocalStorageSessionVars(): ILocalStorageSession { +export async function getLocalStorageSessionVars(): Promise { const hsUrl = localStorage.getItem(HOMESERVER_URL_KEY); const isUrl = localStorage.getItem(ID_SERVER_URL_KEY); - const accessToken = localStorage.getItem("mx_access_token"); + let accessToken = await idbLoad("account", "mx_access_token"); + if (!accessToken) { + accessToken = localStorage.getItem("mx_access_token"); + if (accessToken) { + await idbSave("account", "mx_access_token", accessToken); + localStorage.removeItem("mx_access_token"); + } + } const userId = localStorage.getItem("mx_user_id"); const deviceId = localStorage.getItem("mx_device_id"); @@ -308,6 +310,30 @@ export function getLocalStorageSessionVars(): ILocalStorageSession { return {hsUrl, isUrl, accessToken, userId, deviceId, isGuest}; } +// The pickle key is a string of unspecified length and format. For AES, we +// need a 256-bit Uint8Array. So we HKDF the pickle key to generate the AES +// key. The AES key should be zeroed after it is used. +async function pickleKeyToAesKey(pickleKey: string): Promise { + const pickleKeyBuffer = new Uint8Array(pickleKey.length); + for (let i = 0; i < pickleKey.length; i++) { + pickleKeyBuffer[i] = pickleKey.charCodeAt(i); + } + const hkdfKey = await window.crypto.subtle.importKey( + "raw", pickleKeyBuffer, "HKDF", false, ["deriveBits"], + ); + pickleKeyBuffer.fill(0); + return new Uint8Array(await window.crypto.subtle.deriveBits( + { + name: "HKDF", hash: "SHA-256", + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore: https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/879 + salt: new Uint8Array(32), info: new Uint8Array(0), + }, + hkdfKey, + 256, + )); +} + // returns a promise which resolves to true if a session is found in // localstorage // @@ -325,7 +351,7 @@ async function restoreFromLocalStorage(opts?: { ignoreGuest?: boolean }): Promis return false; } - const {hsUrl, isUrl, accessToken, userId, deviceId, isGuest} = getLocalStorageSessionVars(); + const {hsUrl, isUrl, accessToken, userId, deviceId, isGuest} = await getLocalStorageSessionVars(); if (accessToken && userId && hsUrl) { if (ignoreGuest && isGuest) { @@ -333,9 +359,15 @@ async function restoreFromLocalStorage(opts?: { ignoreGuest?: boolean }): Promis return false; } + let decryptedAccessToken = accessToken; const pickleKey = await PlatformPeg.get().getPickleKey(userId, deviceId); if (pickleKey) { console.log("Got pickle key"); + if (typeof accessToken !== "string") { + const encrKey = await pickleKeyToAesKey(pickleKey); + decryptedAccessToken = await decryptAES(accessToken, encrKey, "access_token"); + encrKey.fill(0); + } } else { console.log("No pickle key available"); } @@ -347,7 +379,7 @@ async function restoreFromLocalStorage(opts?: { ignoreGuest?: boolean }): Promis await doSetLoggedIn({ userId: userId, deviceId: deviceId, - accessToken: accessToken, + accessToken: decryptedAccessToken, homeserverUrl: hsUrl, identityServerUrl: isUrl, guest: isGuest, @@ -516,7 +548,7 @@ async function doSetLoggedIn( if (localStorage) { try { - persistCredentialsToLocalStorage(credentials); + await persistCredentialsToLocalStorage(credentials); // make sure we don't think that it's a fresh login any more sessionStorage.removeItem("mx_fresh_login"); } catch (e) { @@ -545,18 +577,22 @@ function showStorageEvictedDialog(): Promise { // `instanceof`. Babel 7 supports this natively in their class handling. class AbortLoginAndRebuildStorage extends Error { } -function persistCredentialsToLocalStorage(credentials: IMatrixClientCreds): void { +async function persistCredentialsToLocalStorage(credentials: IMatrixClientCreds): Promise { localStorage.setItem(HOMESERVER_URL_KEY, credentials.homeserverUrl); if (credentials.identityServerUrl) { localStorage.setItem(ID_SERVER_URL_KEY, credentials.identityServerUrl); } localStorage.setItem("mx_user_id", credentials.userId); - localStorage.setItem("mx_access_token", credentials.accessToken); localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest)); if (credentials.pickleKey) { + const encrKey = await pickleKeyToAesKey(credentials.pickleKey); + const encryptedAccessToken = await encryptAES(credentials.accessToken, encrKey, "access_token"); + encrKey.fill(0); + await idbSave("account", "mx_access_token", encryptedAccessToken); localStorage.setItem("mx_has_pickle_key", String(true)); } else { + await idbSave("account", "mx_access_token", credentials.accessToken); if (localStorage.getItem("mx_has_pickle_key")) { console.error("Expected a pickle key, but none provided. Encryption may not work."); } @@ -733,6 +769,8 @@ async function clearStorage(opts?: { deleteEverything?: boolean }): Promise { diff --git a/src/components/structures/auth/Registration.tsx b/src/components/structures/auth/Registration.tsx index e1a2fc5590..d1dfa5ea50 100644 --- a/src/components/structures/auth/Registration.tsx +++ b/src/components/structures/auth/Registration.tsx @@ -325,8 +325,7 @@ export default class Registration extends React.Component { // isn't a guest user since we'll usually have set a guest user session before // starting the registration process. This isn't perfect since it's possible // the user had a separate guest session they didn't actually mean to replace. - const sessionOwner = Lifecycle.getStoredSessionOwner(); - const sessionIsGuest = Lifecycle.getStoredSessionIsGuest(); + const [sessionOwner, sessionIsGuest] = await Lifecycle.getStoredSessionOwner(); if (sessionOwner && !sessionIsGuest && sessionOwner !== response.userId) { console.log( `Found a session for ${sessionOwner} but ${response.userId} has just registered.`, From 25033eb982bd53aa820d5aa5f89cbc4cf7f22067 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Thu, 10 Dec 2020 09:57:19 +0000 Subject: [PATCH 042/187] Translated using Weblate (Russian) Currently translated at 97.5% (2642 of 2707 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 | 302 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 294 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 3c5ead3aa1..64bbfec40a 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1084,8 +1084,8 @@ "Headphones": "Наушники", "Folder": "Папка", "Pin": "Кнопка", - "Your keys are being backed up (the first backup could take a few minutes).": "Выполняется резервная копия ключей (первый раз это может занять несколько минут).", - "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Размер файла '%(fileName)s' превышает ограничения сервера для загрузки.", + "Your keys are being backed up (the first backup could take a few minutes).": "Выполняется резервная копия ключей (первый раз это может занять несколько минут).", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Размер файла '%(fileName)s' превышает ограничения сервера для загрузки", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Добавляет смайл ¯\\_(ツ)_/¯ в начало сообщения", "Changes your display nickname in the current room only": "Изменяет ваш псевдоним только для текущей комнаты", "Gets or sets the room topic": "Читает или устанавливает тему комнаты", @@ -1507,7 +1507,7 @@ "Italics": "Курсив", "Strikethrough": "Перечёркнутый", "Code block": "Блок кода", - "%(count)s unread messages.|other": "%(count)s непрочитанные сообщения.", + "%(count)s unread messages.|other": "%(count)s непрочитанных сообщений.", "Unread mentions.": "Непрочитанные упоминания.", "Show image": "Показать изображение", "e.g. my-room": "например, моя-комната", @@ -1535,7 +1535,7 @@ "This client does not support end-to-end encryption.": "Этот клиент не поддерживает сквозное шифрование.", "Messages in this room are not end-to-end encrypted.": "Сообщения в этой комнате не шифруются сквозным шифрованием.", "Please create a new issue on GitHub so that we can investigate this bug.": "Пожалуйста, создайте новую проблему/вопрос на GitHub, чтобы мы могли расследовать эту ошибку.", - "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Используйте идентификационный сервер для приглашения по электронной почте. Используйте значение по умолчанию (%(defaultIdentityServerName)s) или управляйте в Настройках.", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Используйте идентификационный сервер для приглашения по электронной почте. Используйте значение по умолчанию (%(defaultIdentityServerName)s) или управляйте в Настройках.", "Use an identity server to invite by email. Manage in Settings.": "Используйте идентификационный сервер для приглашения по электронной почте. Управление в Настройки.", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Запретить пользователям других Matrix-Серверов присоединяться к этой комнате (этот параметр нельзя изменить позже!)", "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.": "Отчет о данном сообщении отправит свой уникальный 'event ID' администратору вашего домашнего сервера. Если сообщения в этой комнате зашифрованы, администратор вашего домашнего сервера не сможет прочитать текст сообщения или просмотреть какие-либо файлы или изображения.", @@ -2191,8 +2191,8 @@ "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 creating that address. It may not be allowed by the server or a temporary failure occurred.": "При создании этого адреса произошла ошибка. Это может быть запрещено сервером или произошел временный сбой.", "There was an error removing that address. It may no longer exist or a temporary error occurred.": "Произошла ошибка при удалении этого адреса. Возможно, он больше не существует или произошла временная ошибка.", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s и вашим Менеджером Интеграции.", - "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 и вашим Менеджером Интеграции.", + "Using this widget may share data with %(widgetDomain)s.": "Используя этот виджет, вы можете делиться данными с %(widgetDomain)s.", "Can't find this server or its room list": "Не можем найти этот сервер или его список комнат", "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.": "Удаление ключей кросс-подписи является мгновенным и необратимым действием. Любой, с кем вы прошли проверку, увидит предупреждения безопасности. Вы почти наверняка не захотите этого делать, если только не потеряете все устройства, с которых можно совершать кросс-подпись.", "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Очистка всех данных этой сессии является необратимым действием. Зашифрованные сообщения будут потеряны, если их ключи не были сохранены.", @@ -2524,7 +2524,7 @@ "Starting microphone...": "Запуск микрофона…", "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Все серверы запрещены к участию! Эта комната больше не может быть использована.", "Remove messages sent by others": "Удалить сообщения, отправленные другими", - "Offline encrypted messaging using dehydrated devices": "Автономный обмен зашифрованными сообщениями с сохраненными устройствами", + "Offline encrypted messaging using dehydrated devices": "Автономный обмен зашифрованными сообщениями с сохранёнными устройствами", "Move right": "Сдвинуть вправо", "Move left": "Сдвинуть влево", "Revoke permissions": "Отозвать разрешения", @@ -2605,5 +2605,291 @@ "Return to call": "Вернуться к звонку", "Got an account? Sign in": "Есть учётная запись? Войти", "New here? Create an account": "Впервые здесь? Создать учётную запись", - "Render LaTeX maths in messages": "Отображать математику LaTeX в сообщениях" + "Render LaTeX maths in messages": "Отображать математику LaTeX в сообщениях", + "

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 Вы даже можете добавлять изображения с URL-адресами Matrix \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": "Надежно кэшируйте зашифрованные сообщения локально, чтобы они отображались в результатах поиска, используется %(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 комнат.", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Сообщения в этом чате полностью зашифрованы. Вы можете проверить профиль %(displayName)s, нажав на аватар.", + "Unable to validate homeserver": "Невозможно проверить домашний сервер", + "Sign into your homeserver": "Войдите на свой домашний сервер", + "with state key %(stateKey)s": "с ключом состояния %(stateKey)s", + "%(creator)s created this DM.": "%(creator)s начал этот чат.", + "Show chat effects": "Показать эффекты чата", + "Host account on": "Ваша учётная запись обслуживается", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s или %(usernamePassword)s", + "Continuing without email": "Продолжить без электронной почты", + "Continue with %(ssoButtons)s": "Продолжить с %(ssoButtons)s", + "New? Create account": "Впервые тут? Создать учётную запись", + "Specify a homeserver": "Укажите домашний сервер", + "Continue with %(provider)s": "Продолжить с %(provider)s", + "Enter phone number": "Введите номер телефона", + "Enter email address": "Введите адрес электронной почты", + "The %(capability)s capability": "%(capability)s возможности", + "sends confetti": "отправить конфетти", + "Invalid URL": "Неправильный URL-адрес", + "Reason (optional)": "Причина (необязательно)", + "Forgot password?": "Забыли пароль?", + "About homeservers": "О домашних серверах", + "Learn more": "Узнать больше", + "Other homeserver": "Другой домашний сервер", + "Server Options": "Параметры сервера", + "Decline All": "Отклонить все", + "Homeserver": "Домашний сервер", + "Approve": "Одобрить", + "Approve widget permissions": "Одобрить разрешения виджета", + "Send stickers into your active room": "Отправить стикеры в активную комнату", + "Remain on your screen while running": "Оставаться на экране во время работы", + "Remain on your screen when viewing another room, when running": "Оставаться на экране, при отображании другой комнаты, во время работы", + "Effects": "Эффекты", + "Zimbabwe": "Зимбабве", + "Zambia": "Замбия", + "Yemen": "Йемен", + "Western Sahara": "Западная Сахара", + "Wallis & Futuna": "Уоллис и Футуна", + "Vietnam": "Вьетнам", + "Venezuela": "Венесуэла", + "Vatican City": "Ватикан", + "Vanuatu": "Вануату", + "Uzbekistan": "Узбекистан", + "Uruguay": "Уругвай", + "United Arab Emirates": "Объединенные Арабские Эмираты", + "Ukraine": "Украина", + "Uganda": "Уганда", + "U.S. Virgin Islands": "Виргинские острова (США)", + "Tuvalu": "Тувалу", + "Turks & Caicos Islands": "Острова Теркс и Кайкос", + "Turkmenistan": "Туркменистан", + "Turkey": "Турция", + "Tunisia": "Тунис", + "Trinidad & Tobago": "Тринидад и Тобаго", + "Tonga": "Тонга", + "Tokelau": "Токелау", + "Togo": "Того", + "Timor-Leste": "Тимор-Лешти", + "Thailand": "Таиланд", + "Tanzania": "Танзания", + "Tajikistan": "Таджикистан", + "Taiwan": "Тайвань", + "São Tomé & Príncipe": "Сан-Томе и Принсипи", + "Syria": "Сирия", + "Switzerland": "Швейцария", + "Sweden": "Швеция", + "Swaziland": "Эсватини", + "Svalbard & Jan Mayen": "Шпицберген и Ян-Майен", + "Suriname": "Суринам", + "Sudan": "Судан", + "St. Vincent & Grenadines": "Сент-Винсент и Гренадины", + "St. Pierre & Miquelon": "Сен-Пьер и Микелон", + "St. Martin": "Сен-Мартен", + "St. Lucia": "Сент-Люсия", + "St. Kitts & Nevis": "Сент-Китс и Невис", + "St. Helena": "Остров Святой Елены", + "St. Barthélemy": "Сен-Бартелеми", + "Sri Lanka": "Шри-Ланка", + "Spain": "Испания", + "South Sudan": "Южный Судан", + "South Korea": "Южная Корея", + "South Georgia & South Sandwich Islands": "Южная Георгия и Южные Сандвичевы острова", + "South Africa": "Южная Африка", + "Somalia": "Сомали", + "Solomon Islands": "Соломоновы острова", + "Slovenia": "Словения", + "Slovakia": "Словакия", + "Sint Maarten": "Синт-Мартен", + "Singapore": "Сингапур", + "Sierra Leone": "Сьерра-Леоне", + "Seychelles": "Сейшельские острова", + "Serbia": "Сербия", + "Senegal": "Сенегал", + "Saudi Arabia": "Саудовская Аравия", + "San Marino": "Сан-Марино", + "Samoa": "Самоа", + "Réunion": "Реюньон", + "Rwanda": "Руанда", + "Russia": "Российская Федерация", + "Romania": "Румыния", + "Qatar": "Катар", + "Puerto Rico": "Пуэрто-Рико", + "Portugal": "Португалия", + "Poland": "Польша", + "Pitcairn Islands": "Питкэрн", + "Philippines": "Филиппины", + "Peru": "Перу", + "Paraguay": "Парагвай", + "Papua New Guinea": "Папуа - Новая Гвинея", + "Panama": "Панама", + "Palestine": "Палестина", + "Palau": "Палау", + "Pakistan": "Пакистан", + "Oman": "Оман", + "Norway": "Норвегия", + "Northern Mariana Islands": "Северные Марианские острова", + "North Korea": "Северная Корея", + "Norfolk Island": "Остров Норфолк", + "Niue": "Ниуэ", + "Nigeria": "Нигерия", + "Niger": "Нигер", + "Nicaragua": "Никарагуа", + "New Zealand": "Новая Зеландия", + "New Caledonia": "Новая Каледония", + "Netherlands": "Нидерланды", + "Nepal": "Непал", + "Nauru": "Науру", + "Namibia": "Намибия", + "Myanmar": "Мьянма", + "Mozambique": "Мозамбик", + "Morocco": "Марокко", + "Montserrat": "Монсеррат", + "Montenegro": "Черногория", + "Mongolia": "Монголия", + "Monaco": "Монако", + "Moldova": "Молдова", + "Micronesia": "Микронезия", + "Mexico": "Мексика", + "Mayotte": "Майотта", + "Mauritius": "Маврикий", + "Mauritania": "Мавритания", + "Martinique": "Мартиника", + "Marshall Islands": "Маршалловы острова", + "Malta": "Мальта", + "Mali": "Мали", + "Maldives": "Мальдивы", + "Malaysia": "Малайзия", + "Malawi": "Малави", + "Madagascar": "Мадагаскар", + "Macedonia": "Северная Македония", + "Macau": "Макао", + "Luxembourg": "Люксембург", + "Lithuania": "Литва", + "Liechtenstein": "Лихтенштейн", + "Libya": "Ливия", + "Liberia": "Либерия", + "Lesotho": "Лесото", + "Lebanon": "Ливан", + "Latvia": "Латвия", + "Laos": "Лаосская Народно-Демократическая Республика", + "Kyrgyzstan": "Кыргызстан", + "Kuwait": "Кувейт", + "Kosovo": "Косово", + "Kiribati": "Кирибати", + "Kenya": "Кения", + "Kazakhstan": "Казахстан", + "Jordan": "Иордания", + "Jersey": "Джерси", + "Japan": "Япония", + "Jamaica": "Ямайка", + "Italy": "Италия", + "Israel": "Израиль", + "Isle of Man": "Остров Мэн", + "Ireland": "Ирландия", + "Iraq": "Ирак", + "Iran": "Иран", + "Indonesia": "Индонезия", + "India": "Индия", + "Iceland": "Исландия", + "Hungary": "Венгрия", + "Hong Kong": "Гонконг", + "Honduras": "Гондурас", + "Heard & McDonald Islands": "Остров Херд и Острова Макдоналд", + "Haiti": "Гаити", + "Guyana": "Гайана", + "Guinea-Bissau": "Гвинея-Бисау", + "Guinea": "Гвинея", + "Guernsey": "Гернси", + "Guatemala": "Гватемала", + "Guam": "Гуам", + "Guadeloupe": "Гваделупа", + "Grenada": "Гренада", + "Greenland": "Гренландия", + "Greece": "Греция", + "Gibraltar": "Гибралтар", + "Ghana": "Гана", + "Germany": "Германия", + "Georgia": "Грузия", + "Gambia": "Гамбия", + "Gabon": "Габон", + "French Southern Territories": "Южные Французские Территории", + "French Polynesia": "Французская Полинезия", + "French Guiana": "Французская Гвиана", + "France": "Франция", + "Finland": "Финляндия", + "Fiji": "Фиджи", + "Faroe Islands": "Фарерские острова", + "Falkland Islands": "Фолклендские острова", + "Ethiopia": "Эфиопия", + "Estonia": "Эстония", + "Eritrea": "Еритрея", + "Equatorial Guinea": "Экваториальная Гвинея", + "El Salvador": "Сальвадор", + "Egypt": "Египет", + "Ecuador": "Эквадор", + "Dominican Republic": "Доминиканская Республика", + "Dominica": "Доминика", + "Djibouti": "Джибути", + "Denmark": "Дания", + "Côte d’Ivoire": "Кот-д'Ивуар", + "Czech Republic": "Чехия", + "Cyprus": "Кипр", + "Curaçao": "Кюрасао", + "Cuba": "Куба", + "Croatia": "Хорватия", + "Costa Rica": "Коста-Рика", + "Cook Islands": "Острова Кука", + "Congo - Kinshasa": "Демократическая Республика Конго", + "Congo - Brazzaville": "Конго", + "Comoros": "Коморские острова", + "Colombia": "Колумбия", + "Cocos (Keeling) Islands": "Кокосовые (Килинг) острова", + "Christmas Island": "Остров Рождества", + "China": "Китай", + "Chile": "Чили", + "Chad": "Чад", + "Central African Republic": "Центрально-Африканская Республика", + "Cayman Islands": "Каймановы острова", + "Caribbean Netherlands": "Бонайре, Синт-Эстатиус и Саба", + "Cape Verde": "Кабо-Верде", + "Canada": "Канада", + "Cameroon": "Камерун", + "Cambodia": "Камбоджа", + "Burundi": "Бурунди", + "Burkina Faso": "Буркина-Фасо", + "Bulgaria": "Болгария", + "Brunei": "Бруней", + "British Virgin Islands": "Британские Виргинские острова", + "British Indian Ocean Territory": "Британская территория Индийского океана", + "Brazil": "Бразилия", + "Bouvet Island": "Остров Буве", + "Botswana": "Ботсвана", + "Bosnia": "Босния и Герцеговина", + "Bolivia": "Боливия", + "Bhutan": "Бутан", + "Bermuda": "Бермудские острова", + "Benin": "Бенин", + "Belize": "Белиз", + "Belgium": "Бельгия", + "Belarus": "Беларусь", + "Barbados": "Барбадос", + "Bangladesh": "Бангладеш", + "Bahrain": "Бахрейн", + "Bahamas": "Багамские острова", + "Azerbaijan": "Азербайджан", + "Austria": "Австрия", + "Australia": "Австралия", + "Aruba": "Аруба", + "Armenia": "Армения", + "Argentina": "Аргентина", + "Antigua & Barbuda": "Антигуа и Барбуда", + "Antarctica": "Антарктика", + "Anguilla": "Ангилья", + "Angola": "Ангола", + "Andorra": "Андорра", + "American Samoa": "Американское Самоа", + "Algeria": "Алжир", + "Albania": "Албания", + "Åland Islands": "Аландские острова", + "Afghanistan": "Афганистан", + "United States": "Соединенные Штаты Америки", + "United Kingdom": "Великобритания", + "Call failed because webcam or microphone could not be accessed. Check that:": "Вызов не удался, потому что не удалось получить доступ к веб-камере или микрофону. Проверь это:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Вызов не удался из-за отсутствия доступа к микрофону. Убедитесь, что микрофон подключен и правильно настроен." } From aed89c7053ef21c540e3ebdec51ca99821cc7ea3 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Thu, 10 Dec 2020 12:17:31 +0000 Subject: [PATCH 043/187] Translated using Weblate (Russian) Currently translated at 100.0% (2707 of 2707 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 | 67 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 64bbfec40a..22abf3b929 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2891,5 +2891,70 @@ "United States": "Соединенные Штаты Америки", "United Kingdom": "Великобритания", "Call failed because webcam or microphone could not be accessed. Check that:": "Вызов не удался, потому что не удалось получить доступ к веб-камере или микрофону. Проверь это:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Вызов не удался из-за отсутствия доступа к микрофону. Убедитесь, что микрофон подключен и правильно настроен." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Вызов не удался из-за отсутствия доступа к микрофону. Убедитесь, что микрофон подключен и правильно настроен.", + "See %(msgtype)s messages posted to your active room": "Посмотрите %(msgtype)s сообщения, размещённые в вашей активной комнате", + "Send general files as you in your active room": "Отправьте файлы от своего имени в активной комнате", + "Change the topic of your active room": "Измените тему вашей активной комнаты", + "See when the topic changes in this room": "Посмотрите, изменится ли тема этого чата", + "Change the topic of this room": "Измените тему этой комнаты", + "Change which room you're viewing": "Измените комнату, которую вы просматриваете", + "See %(msgtype)s messages posted to this room": "Посмотрите %(msgtype)s сообщения размещённые в этой комнате", + "Send %(msgtype)s messages as you in your active room": "Отправьте %(msgtype)s сообщения от своего имени в вашу активную комнату", + "Send %(msgtype)s messages as you in this room": "Отправьте %(msgtype)s сообщения от своего имени в эту комнату", + "See general files posted to your active room": "Посмотрите файлы, размещённые в вашей активной комнате", + "See general files posted to this room": "Посмотрите файлы, размещённые в этой комнате", + "Send general files as you in this room": "Отправьте файлы от своего имени в этой комнате", + "See videos posted to your active room": "Посмотрите видео размещённые в вашей активной комнате", + "See videos posted to this room": "Посмотрите видео размещённые в этой комнате", + "Send videos as you in your active room": "Отправьте видео от своего имени в вашей активной комнате", + "Send videos as you in this room": "Отправьте видео от своего имени в этой комнате", + "See images posted to this room": "Посмотрите изображения, размещённые в этой комнате", + "See emotes posted to your active room": "Посмотрите эмоции, размещённые в вашей активной комнате", + "See emotes posted to this room": "Посмотрите эмоции, размещённые в этой комнате", + "See text messages posted to your active room": "Посмотрите текстовые сообщения, размещённые в вашей активной комнате", + "See text messages posted to this room": "Посмотрите текстовые сообщения, размещённые в этой комнате", + "See messages posted to your active room": "Посмотрите сообщения, размещённые в вашей активной комнате", + "See messages posted to this room": "Посмотрите сообщения, размещённые в этой комнате", + "See %(eventType)s events posted to your active room": "Посмотрите %(eventType)s события, размещённые в вашей активной комнате", + "See %(eventType)s events posted to this room": "Посмотрите %(eventType)s события, размещённые в этой комнате", + "See when anyone posts a sticker to your active room": "Посмотрите, когда кто-нибудь размещает стикер в вашей активной комнате", + "See when a sticker is posted in this room": "Посмотрите, когда в этой комнате размещается стикер", + "See images posted to your active room": "Посмотрите изображения, размещённые в вашей активной комнате", + "Send images as you in your active room": "Отправьте изображения от своего имени в свою активную комнату", + "Send images as you in this room": "Отправьте изображения от своего имени в эту комнату", + "Send emotes as you in your active room": "Отправляйте эмоции от своего имени в активную комнату", + "Send emotes as you in this room": "Отправляйте эмоции от своего имени в эту комнату", + "Send text messages as you in your active room": "Отправляйте текстовые сообщения от своего имени в активную комнату", + "Send text messages as you in this room": "Отправляйте текстовые сообщения от своего имени в этой комнате", + "Send messages as you in your active room": "Отправляйте сообщения от своего имени в вашу активную комнату", + "Send messages as you in this room": "Отправляйте сообщения от своего имени в этой комнате", + "Send %(eventType)s events as you in your active room": "Отправляйте %(eventType)s события от своего имени в вашей активной комнате", + "Send %(eventType)s events as you in this room": "Отправляйте события %(eventType)s от своего имени в этой комнате", + "Send stickers to your active room as you": "Отправьте стикер от своего имени в активную комнату", + "Send stickers to this room as you": "Отправьте стикеры от своего имени в эту комнату", + "with an empty state key": "с пустым ключом состояния", + "See when the avatar changes in your active room": "Посмотрите, когда изменится аватар в вашей активной комнате", + "See when the avatar changes in this room": "Посмотрите, когда изменится аватар в этой комнате", + "See when the name changes in your active room": "Посмотрите, когда изменится название в вашей активной комнате", + "See when the name changes in this room": "Посмотрите, когда изменится название этой комнаты", + "Change the avatar of your active room": "Измените аватар вашей активной комнаты", + "Change the avatar of this room": "Смените аватар этой комнаты", + "Change the name of this room": "Измените название этой комнаты", + "Change the name of your active room": "Измените название вашей активной комнаты", + "See when the topic changes in your active room": "Посмотрите, изменится ли тема текущего активного чата", + "This widget would like to:": "Этому виджету хотелось бы:", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Вы можете использовать настраиваемые параметры сервера для входа на другие серверы Matrix, указав другой URL-адрес домашнего сервера. Это позволяет вам использовать Element с существующей учётной записью Matrix на другом домашнем сервере.", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Предупреждаем: если вы не добавите адрес электронной почты и забудете пароль, вы можете навсегда потерять доступ к своей учётной записи.", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org - крупнейший в мире домашний публичный сервер, который подходит многим.", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Если вы предпочитаете домашний сервер Matrix, используйте его. Вы также можете настроить свой собственный домашний сервер, если хотите.", + "That phone number doesn't look quite right, please check and try again": "Этот номер телефона неправильный, проверьте его и повторите попытку", + "Add an email to be able to reset your password.": "Чтобы иметь возможность изменить свой пароль в случае необходимости, добавьте свой адрес электронной почты.", + "Use email or phone to optionally be discoverable by existing contacts.": "Если вы хотите, чтобы другие пользователи могли вас найти, укажите свой адрес электронной почты или номер телефона.", + "Use email to optionally be discoverable by existing contacts.": "Если вы хотите, чтобы другие пользователи могли вас найти, укажите свой адрес электронной почты.", + "There was a problem communicating with the homeserver, please try again later.": "Возникла проблема при обмене данными с домашним сервером. Повторите попытку позже.", + "That username already exists, please try another.": "Это имя пользователя уже существует, попробуйте другое.", + "Already have an account? Sign in here": "Уже есть учётная запись? Войдите здесь", + "Decide where your account is hosted": "Выберите, кто обслуживает вашу учётную запись", + "We call the places where you can host your account ‘homeservers’.": "Мы называем места, где вы можете разместить свою учётную запись, 'домашними серверами'.", + "Sends the given message with confetti": "Отправляет данное сообщение с конфетти" } From 5770472c7088c1e4f842765e5e999efdc10e2380 Mon Sep 17 00:00:00 2001 From: Jadran Prodan Date: Thu, 10 Dec 2020 10:47:31 +0000 Subject: [PATCH 044/187] Translated using Weblate (Slovenian) Currently translated at 1.0% (28 of 2707 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sl/ --- src/i18n/strings/sl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sl.json b/src/i18n/strings/sl.json index 2024821bb2..0e9bdb3d3e 100644 --- a/src/i18n/strings/sl.json +++ b/src/i18n/strings/sl.json @@ -25,5 +25,7 @@ "Call Declined": "Klic zavrnjen", "Call Failed": "Klic ni uspel", "Your homeserver's URL": "URL domačega strežnika", - "End": "Konec" + "End": "Konec", + "Use default": "Uporabi privzeto", + "Change": "Sprememba" } From 649ea0d148ee17eb2d1fefc550582146530d6953 Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Thu, 10 Dec 2020 21:52:18 -0500 Subject: [PATCH 045/187] apply changes from review, and other fixes/improvements --- src/BasePlatform.ts | 8 ++- src/IndexedDB.ts | 92 ----------------------------- src/Lifecycle.ts | 115 ++++++++++++++++++++++++++---------- src/utils/StorageManager.js | 76 ++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 125 deletions(-) delete mode 100644 src/IndexedDB.ts diff --git a/src/BasePlatform.ts b/src/BasePlatform.ts index 46fa998f15..c301aa6a10 100644 --- a/src/BasePlatform.ts +++ b/src/BasePlatform.ts @@ -26,7 +26,7 @@ import {CheckUpdatesPayload} from "./dispatcher/payloads/CheckUpdatesPayload"; import {Action} from "./dispatcher/actions"; import {hideToast as hideUpdateToast} from "./toasts/UpdateToast"; import {MatrixClientPeg} from "./MatrixClientPeg"; -import {idbLoad, idbSave, idbDelete} from "./IndexedDB"; +import {idbLoad, idbSave, idbDelete} from "./utils/StorageManager"; export const SSO_HOMESERVER_URL_KEY = "mx_sso_hs_url"; export const SSO_ID_SERVER_URL_KEY = "mx_sso_is_url"; @@ -344,7 +344,11 @@ export default abstract class BasePlatform { {name: "AES-GCM", iv, additionalData}, cryptoKey, randomArray, ); - await idbSave("pickleKey", [userId, deviceId], {encrypted, iv, cryptoKey}); + try { + await idbSave("pickleKey", [userId, deviceId], {encrypted, iv, cryptoKey}); + } catch (e) { + return null; + } return encodeUnpaddedBase64(randomArray); } diff --git a/src/IndexedDB.ts b/src/IndexedDB.ts deleted file mode 100644 index bf03ffccb7..0000000000 --- a/src/IndexedDB.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* -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. -*/ - -/* Simple wrapper around IndexedDB. - */ - -let idb = null; - -async function idbInit(): Promise { - idb = await new Promise((resolve, reject) => { - const request = window.indexedDB.open("element", 1); - request.onerror = reject; - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore: TS thinks target.result doesn't exist - request.onsuccess = (event) => { resolve(event.target.result); }; - request.onupgradeneeded = (event) => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore: TS thinks target.result doesn't exist - const db = event.target.result; - db.createObjectStore("pickleKey"); - db.createObjectStore("account"); - }; - }); -} - -export async function idbLoad( - table: string, - key: string | string[], -): Promise { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb.transaction([table], "readonly"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.get(key); - request.onerror = reject; - request.onsuccess = (event) => { resolve(request.result); }; - }); -} - -export async function idbSave( - table: string, - key: string | string[], - data: any, -): Promise { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb.transaction([table], "readwrite"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.put(data, key); - request.onerror = reject; - request.onsuccess = (event) => { resolve(); }; - }); -} - -export async function idbDelete( - table: string, - key: string | string[], -): Promise { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb.transaction([table], "readwrite"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.delete(key); - request.onerror = reject; - request.onsuccess = (event) => { resolve(); }; - }); -} diff --git a/src/Lifecycle.ts b/src/Lifecycle.ts index 2f6309415f..f87af1a791 100644 --- a/src/Lifecycle.ts +++ b/src/Lifecycle.ts @@ -51,7 +51,6 @@ import ThreepidInviteStore from "./stores/ThreepidInviteStore"; import CountlyAnalytics from "./CountlyAnalytics"; import CallHandler from './CallHandler'; import LifecycleCustomisations from "./customisations/Lifecycle"; -import {idbLoad, idbSave, idbDelete} from "./IndexedDB"; const HOMESERVER_URL_KEY = "mx_hs_url"; const ID_SERVER_URL_KEY = "mx_is_url"; @@ -154,8 +153,8 @@ export async function loadSession(opts: ILoadSessionOpts = {}): Promise * return [null, null]. */ export async function getStoredSessionOwner(): Promise<[string, boolean]> { - const {hsUrl, userId, accessToken, isGuest} = await getLocalStorageSessionVars(); - return hsUrl && userId && accessToken ? [userId, isGuest] : [null, null]; + const {hsUrl, userId, hasAccessToken, isGuest} = await getStoredSessionVars(); + return hsUrl && userId && hasAccessToken ? [userId, isGuest] : [null, null]; } /** @@ -193,7 +192,7 @@ export function attemptTokenLogin( ).then(function(creds) { console.log("Logged in with token"); return clearStorage().then(async () => { - await persistCredentialsToLocalStorage(creds); + await persistCredentials(creds); // remember that we just logged in sessionStorage.setItem("mx_fresh_login", String(true)); return true; @@ -271,31 +270,42 @@ function registerAsGuest( }); } -export interface ILocalStorageSession { +export interface IStoredSession { hsUrl: string; isUrl: string; - accessToken: string; + hasAccessToken: boolean; + accessToken: string | object; userId: string; deviceId: string; isGuest: boolean; } /** - * Retrieves information about the stored session in localstorage. The session + * Retrieves information about the stored session from the browser's storage. The session * may not be valid, as it is not tested for consistency here. * @returns {Object} Information about the session - see implementation for variables. */ -export async function getLocalStorageSessionVars(): Promise { +export async function getStoredSessionVars(): Promise { const hsUrl = localStorage.getItem(HOMESERVER_URL_KEY); const isUrl = localStorage.getItem(ID_SERVER_URL_KEY); - let accessToken = await idbLoad("account", "mx_access_token"); + let accessToken; + try { + accessToken = await StorageManager.idbLoad("account", "mx_access_token"); + } catch (e) {} if (!accessToken) { accessToken = localStorage.getItem("mx_access_token"); if (accessToken) { - await idbSave("account", "mx_access_token", accessToken); - localStorage.removeItem("mx_access_token"); + try { + // try to migrate access token to IndexedDB if we can + await StorageManager.idbSave("account", "mx_access_token", accessToken); + localStorage.removeItem("mx_access_token"); + } catch (e) {} } } + // if we pre-date storing "mx_has_access_token", but we retrieved an access + // token, then we should say we have an access token + const hasAccessToken = + (localStorage.getItem("mx_has_access_token") === "true") || !!accessToken; const userId = localStorage.getItem("mx_user_id"); const deviceId = localStorage.getItem("mx_device_id"); @@ -307,7 +317,7 @@ export async function getLocalStorageSessionVars(): Promise { )); } +async function abortLogin() { + const signOut = await showStorageEvictedDialog(); + if (signOut) { + await clearStorage(); + // This error feels a bit clunky, but we want to make sure we don't go any + // further and instead head back to sign in. + throw new AbortLoginAndRebuildStorage( + "Aborting login in progress because of storage inconsistency", + ); + } +} + // returns a promise which resolves to true if a session is found in // localstorage // @@ -351,7 +373,11 @@ async function restoreFromLocalStorage(opts?: { ignoreGuest?: boolean }): Promis return false; } - const {hsUrl, isUrl, accessToken, userId, deviceId, isGuest} = await getLocalStorageSessionVars(); + const {hsUrl, isUrl, hasAccessToken, accessToken, userId, deviceId, isGuest} = await getStoredSessionVars(); + + if (hasAccessToken && !accessToken) { + abortLogin(); + } if (accessToken && userId && hsUrl) { if (ignoreGuest && isGuest) { @@ -379,7 +405,7 @@ async function restoreFromLocalStorage(opts?: { ignoreGuest?: boolean }): Promis await doSetLoggedIn({ userId: userId, deviceId: deviceId, - accessToken: decryptedAccessToken, + accessToken: decryptedAccessToken as string, homeserverUrl: hsUrl, identityServerUrl: isUrl, guest: isGuest, @@ -518,15 +544,7 @@ async function doSetLoggedIn( // crypto store, we'll be generally confused when handling encrypted data. // Show a modal recommending a full reset of storage. if (results.dataInLocalStorage && results.cryptoInited && !results.dataInCryptoStore) { - const signOut = await showStorageEvictedDialog(); - if (signOut) { - await clearStorage(); - // This error feels a bit clunky, but we want to make sure we don't go any - // further and instead head back to sign in. - throw new AbortLoginAndRebuildStorage( - "Aborting login in progress because of storage inconsistency", - ); - } + await abortLogin(); } Analytics.setLoggedIn(credentials.guest, credentials.homeserverUrl); @@ -548,7 +566,7 @@ async function doSetLoggedIn( if (localStorage) { try { - await persistCredentialsToLocalStorage(credentials); + await persistCredentials(credentials); // make sure we don't think that it's a fresh login any more sessionStorage.removeItem("mx_fresh_login"); } catch (e) { @@ -577,7 +595,7 @@ function showStorageEvictedDialog(): Promise { // `instanceof`. Babel 7 supports this natively in their class handling. class AbortLoginAndRebuildStorage extends Error { } -async function persistCredentialsToLocalStorage(credentials: IMatrixClientCreds): Promise { +async function persistCredentials(credentials: IMatrixClientCreds): Promise { localStorage.setItem(HOMESERVER_URL_KEY, credentials.homeserverUrl); if (credentials.identityServerUrl) { localStorage.setItem(ID_SERVER_URL_KEY, credentials.identityServerUrl); @@ -585,14 +603,47 @@ async function persistCredentialsToLocalStorage(credentials: IMatrixClientCreds) localStorage.setItem("mx_user_id", credentials.userId); localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest)); + // store whether we expect to find an access token, to detect the case + // where IndexedDB is blown away + if (credentials.accessToken) { + localStorage.setItem("mx_has_access_token", "true"); + } else { + localStorage.deleteItem("mx_has_access_token"); + } + if (credentials.pickleKey) { - const encrKey = await pickleKeyToAesKey(credentials.pickleKey); - const encryptedAccessToken = await encryptAES(credentials.accessToken, encrKey, "access_token"); - encrKey.fill(0); - await idbSave("account", "mx_access_token", encryptedAccessToken); + let encryptedAccessToken; + try { + // try to encrypt the access token using the pickle key + const encrKey = await pickleKeyToAesKey(credentials.pickleKey); + encryptedAccessToken = await encryptAES(credentials.accessToken, encrKey, "access_token"); + encrKey.fill(0); + } catch (e) { + console.warn("Could not encrypt access token", e); + } + try { + // save either the encrypted access token, or the plain access + // token if we were unable to encrypt (e.g. if the browser doesn't + // have WebCrypto). + await StorageManager.idbSave( + "account", "mx_access_token", + encryptedAccessToken || credentials.accessToken, + ); + } catch (e) { + // if we couldn't save to indexedDB, fall back to localStorage. We + // store the access token unencrypted since localStorage only saves + // strings. + localStorage.setItem("mx_access_token", credentials.accessToken); + } localStorage.setItem("mx_has_pickle_key", String(true)); } else { - await idbSave("account", "mx_access_token", credentials.accessToken); + try { + await StorageManager.idbSave( + "account", "mx_access_token", credentials.accessToken, + ); + } catch (e) { + localStorage.setItem("mx_access_token", credentials.accessToken); + } if (localStorage.getItem("mx_has_pickle_key")) { console.error("Expected a pickle key, but none provided. Encryption may not work."); } @@ -769,7 +820,9 @@ async function clearStorage(opts?: { deleteEverything?: boolean }): Promise { + if (!indexedDB) { + throw new Error("IndexedDB not available"); + } + idb = await new Promise((resolve, reject) => { + const request = indexedDB.open("matrix-react-sdk", 1); + request.onerror = reject; + request.onsuccess = (event) => { resolve(request.result); }; + request.onupgradeneeded = (event) => { + const db = request.result; + db.createObjectStore("pickleKey"); + db.createObjectStore("account"); + }; + }); +} + +export async function idbLoad( + table: string, + key: string | string[], +): Promise { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb.transaction([table], "readonly"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.get(key); + request.onerror = reject; + request.onsuccess = (event) => { resolve(request.result); }; + }); +} + +export async function idbSave( + table: string, + key: string | string[], + data: any, +): Promise { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb.transaction([table], "readwrite"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.put(data, key); + request.onerror = reject; + request.onsuccess = (event) => { resolve(); }; + }); +} + +export async function idbDelete( + table: string, + key: string | string[], +): Promise { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb.transaction([table], "readwrite"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.delete(key); + request.onerror = reject; + request.onsuccess = (event) => { resolve(); }; + }); +} From 456d21c9e7bb9ee4349445ab105d34584d435499 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Dec 2020 02:56:41 +0000 Subject: [PATCH 046/187] Bump ini from 1.3.5 to 1.3.7 Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1a6a0b0fb3..ba2aba1b91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5058,9 +5058,9 @@ inherits@2, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== inquirer@^7.0.0: version "7.3.2" From b15ac77d6c640f3b8ac7e021f0f1c174e4305f3e Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Thu, 10 Dec 2020 23:07:57 +0000 Subject: [PATCH 047/187] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2710 of 2710 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 397c02deec..05c6db5c0c 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2896,5 +2896,9 @@ "sends confetti": "envia confetes", "Sends the given message with confetti": "Envia a mensagem com confetes", "Show chat effects": "Mostrar efeitos em conversas", - "Effects": "Efeitos" + "Effects": "Efeitos", + "Hold": "Pausar", + "Resume": "Retomar", + "%(peerName)s held the call": "%(peerName)s pausou a chamada", + "You held the call Resume": "Você pausou a chamada Retomar" } From 44d68130689f58ea7adad903f256bc5d2c91c91d Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Fri, 11 Dec 2020 08:33:35 +0000 Subject: [PATCH 048/187] Translated using Weblate (Russian) Currently translated at 100.0% (2710 of 2710 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 22abf3b929..d2e674c3ed 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2956,5 +2956,9 @@ "Already have an account? Sign in here": "Уже есть учётная запись? Войдите здесь", "Decide where your account is hosted": "Выберите, кто обслуживает вашу учётную запись", "We call the places where you can host your account ‘homeservers’.": "Мы называем места, где вы можете разместить свою учётную запись, 'домашними серверами'.", - "Sends the given message with confetti": "Отправляет данное сообщение с конфетти" + "Sends the given message with confetti": "Отправляет данное сообщение с конфетти", + "Hold": "Удерживать", + "Resume": "Возобновить", + "%(peerName)s held the call": "%(peerName)s удерживает звонок", + "You held the call Resume": "Вы удерживаете звонок Возобновить" } From 3d9e7d25f9d53534d7a8b3fe7dc7d9e4d19a25a3 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 11 Dec 2020 02:47:05 +0000 Subject: [PATCH 049/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2711 of 2711 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 d8cc146e7f..1b73d78286 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2967,5 +2967,9 @@ "Show chat effects": "顯示聊天特效", "Effects": "影響", "Call failed because webcam or microphone could not be accessed. Check that:": "通話失敗,因為無法存取網路攝影機或麥克風。請檢查:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "通話失敗,因為無法存取麥克風。請檢查是否已插入麥克風並正確設定。" + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "通話失敗,因為無法存取麥克風。請檢查是否已插入麥克風並正確設定。", + "Hold": "保留", + "Resume": "繼續", + "%(peerName)s held the call": "%(peerName)s 保留通話", + "You held the call Resume": "您已保留通話 繼續" } From 3f5fae014d4abc09e0547420f91109628c90f081 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Thu, 10 Dec 2020 20:05:32 +0000 Subject: [PATCH 050/187] Translated using Weblate (Finnish) Currently translated at 82.8% (2245 of 2710 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 | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index a78c5b0448..297cd69790 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2436,5 +2436,22 @@ "Call failed because webcam or microphone could not be accessed. Check that:": "Puhelu epäonnistui, koska kameraa tai mikrofonia ei voitu käyttää. Tarkista että:", "Unable to access webcam / microphone": "Kameraa / mikrofonia ei voi käyttää", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Puhelu epäonnistui, koska mikrofonia ei voitu käyttää. Tarkista, että mikrofoni on kytketty ja asennettu oikein.", - "Unable to access microphone": "Mikrofonia ei voi käyttää" + "Unable to access microphone": "Mikrofonia ei voi käyttää", + "El Salvador": "El Salvador", + "Egypt": "Egypti", + "Ecuador": "Ecuador", + "Dominican Republic": "Dominikaaninen tasavalta", + "Dominica": "Dominica", + "Djibouti": "Djibouti", + "Denmark": "Tanska", + "Côte d’Ivoire": "Norsunluurannikko", + "Czech Republic": "Tšekki", + "Cyprus": "Kypros", + "Curaçao": "Curaçao", + "Cuba": "Kuuba", + "Croatia": "Kroatia", + "Costa Rica": "Costa Rica", + "Cook Islands": "Cookinsaaret", + "Congo - Kinshasa": "Kongo-Kinshasa", + "Congo - Brazzaville": "Kongo-Brazzavile" } From fd26954e196868d97af06c16dd02bfa019ae98c8 Mon Sep 17 00:00:00 2001 From: XoseM Date: Fri, 11 Dec 2020 05:51:53 +0000 Subject: [PATCH 051/187] Translated using Weblate (Galician) Currently translated at 100.0% (2710 of 2710 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 5f9eced4f7..dc58d97f79 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2964,5 +2964,9 @@ "Show chat effects": "Mostrar efectos do chat", "Effects": "Efectos", "Call failed because webcam or microphone could not be accessed. Check that:": "A chamada fallou porque non tiñas acceso á cámara ou ó micrófono. Comproba:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada fallou porque non tiñas acceso ó micrófono. Comproba que o micrófono está conectado e correctamente configurado." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada fallou porque non tiñas acceso ó micrófono. Comproba que o micrófono está conectado e correctamente configurado.", + "Hold": "Colgar", + "Resume": "Retomar", + "%(peerName)s held the call": "%(peerName)s finalizou a chamada", + "You held the call Resume": "Colgaches a chamada, Retomar" } From 7a33b92884882f32f7a0af7b59c306b7b4cf1c87 Mon Sep 17 00:00:00 2001 From: MamasLT Date: Thu, 10 Dec 2020 21:56:58 +0000 Subject: [PATCH 052/187] Translated using Weblate (Lithuanian) Currently translated at 70.0% (1898 of 2710 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/lt/ --- src/i18n/strings/lt.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 516fcc977b..0e00436d27 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -2039,5 +2039,6 @@ "Update status": "Atnaujinti statusą", "Update community": "Atnaujinti bendruomenę", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Kambario %(roomName)s matomumas bendruomenėje %(groupId)s negalėjo būti atnaujintas.", - "Update %(brand)s": "Atnaujinti %(brand)s" + "Update %(brand)s": "Atnaujinti %(brand)s", + "Someone is using an unknown session": "Kažkas naudoja nežinomą seansą" } From 1e23345deff5066f1d14ef69a207eeca2d86bad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 10 Dec 2020 18:27:10 +0000 Subject: [PATCH 053/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2710 of 2710 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 d3d7011bd2..f369c44db7 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2965,5 +2965,9 @@ "sends confetti": "saatis serpentiine", "Sends the given message with confetti": "Lisab sellele sõnumile serpentiine", "Show chat effects": "Näita vestlustes efekte", - "Effects": "Vahvad täiendused" + "Effects": "Vahvad täiendused", + "Hold": "Pane ootele", + "Resume": "Jätka", + "%(peerName)s held the call": "%(peerName)s pani kõne ootele", + "You held the call Resume": "Sa panid kõne ootele. Jätka kõnet" } From a14d858802da2b8a90869aed1fb8498621450b0e Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Fri, 11 Dec 2020 12:06:52 +0000 Subject: [PATCH 054/187] Translated using Weblate (Russian) Currently translated at 100.0% (2711 of 2711 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index d2e674c3ed..bb6dbdf308 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2960,5 +2960,8 @@ "Hold": "Удерживать", "Resume": "Возобновить", "%(peerName)s held the call": "%(peerName)s удерживает звонок", - "You held the call Resume": "Вы удерживаете звонок Возобновить" + "You held the call Resume": "Вы удерживаете звонок Возобновить", + "%(name)s paused": "%(name)s приостановлен", + "You've reached the maximum number of simultaneous calls.": "Вы достигли максимального количества одновременных звонков.", + "Too Many Calls": "Слишком много звонков" } From 822b8c799d3277720094e8408d142459ec13c87f Mon Sep 17 00:00:00 2001 From: MamasLT Date: Fri, 11 Dec 2020 15:58:23 +0000 Subject: [PATCH 055/187] Translated using Weblate (Lithuanian) Currently translated at 70.1% (1903 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/lt/ --- src/i18n/strings/lt.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 0e00436d27..62b34104a6 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1686,7 +1686,7 @@ "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s pašalino alternatyvius šio kambario adresus %(addresses)s.", "Room settings": "Kambario nustatymai", "Link to most recent message": "Nuoroda į naujausią žinutę", - "Invite someone using their name, username (like ) or share this room.": "Pakviesti ką nors naudojant jų vardą, vartotojo vardą (pavyzdžiui ) arba bendrinti šį kambarį.", + "Invite someone using their name, username (like ) or share this room.": "Pakviesti ką nors naudojant jų vardą, vartotojo vardą (pvz.: ) arba bendrinti šį kambarį.", "Share Room Message": "Bendrinti Kambario Žinutę", "Share Room": "Bendrinti Kambarį", "Use bots, bridges, widgets and sticker packs": "Naudoti botus, tiltus, valdiklius ir lipdukų pakuotes", @@ -2040,5 +2040,12 @@ "Update community": "Atnaujinti bendruomenę", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Kambario %(roomName)s matomumas bendruomenėje %(groupId)s negalėjo būti atnaujintas.", "Update %(brand)s": "Atnaujinti %(brand)s", - "Someone is using an unknown session": "Kažkas naudoja nežinomą seansą" + "Someone is using an unknown session": "Kažkas naudoja nežinomą seansą", + "PRO TIP: If you start a bug, please submit debug logs to help us track down the problem.": "PRO PATARIMAS: Jei pradėjote klaidos pranešimą, pateikite derinimo žurnalus, kad padėtumėte mums išsiaiškinti problemą.", + "Please review and accept the policies of this homeserver:": "Peržiūrėkite ir sutikite su šio serverio politika:", + "Please review and accept all of the homeserver's policies": "Peržiūrėkite ir sutikite su visa serverio politika", + "Please view existing bugs on Github first. No match? Start a new one.": "Pirmiausia peržiūrėkite Github'e esančius pranešimus apie klaidas. Jokio atitikmens? Pradėkite naują pranešimą.", + "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.": "Paprastai tai turi įtakos tik kambario apdorojimui serveryje. Jei jūs turite problemų su savo %(brand)s, praneškite apie klaidą.", + "Report a bug": "Pranešti apie klaidą", + "Invite someone using their name, email address, username (like ) or share this room.": "Pakviesti ką nors, naudojant jų vardą, el. pašto adresą, vartotojo vardą (pvz.: ) arba bendrinti šį kambarį." } From e99060e951376caa6696e09c9b043c694ae6bd34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 11 Dec 2020 17:55:43 +0000 Subject: [PATCH 056/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2711 of 2711 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 f369c44db7..738f0c6e08 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2969,5 +2969,8 @@ "Hold": "Pane ootele", "Resume": "Jätka", "%(peerName)s held the call": "%(peerName)s pani kõne ootele", - "You held the call Resume": "Sa panid kõne ootele. Jätka kõnet" + "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" } From 9ffabfa5caad24b07677635bae802195529944aa Mon Sep 17 00:00:00 2001 From: strix aluco Date: Sun, 13 Dec 2020 00:50:21 +0000 Subject: [PATCH 057/187] Translated using Weblate (Ukrainian) Currently translated at 53.3% (1445 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 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index ad3bf634e2..d8123dd7b6 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -177,7 +177,7 @@ "Can't update user notification settings": "Неможливо оновити налаштування користувацьких сповіщень", "Notify for all other messages/rooms": "Сповіщати щодо всіх повідомлень/кімнат", "Unable to look up room ID from server": "Неможливо знайти ID кімнати на сервері", - "Couldn't find a matching Matrix room": "Неможливо знайти відповідну кімнату", + "Couldn't find a matching Matrix room": "Не вдалось знайти відповідну кімнату", "Invite to this room": "Запросити до цієї кімнати", "Thursday": "Четвер", "Search…": "Пошук…", @@ -1524,5 +1524,9 @@ "Fiji": "Фіджі", "Faroe Islands": "Фарерські Острови", "Unable to access microphone": "Неможливо доступитись до мікрофона", - "Filter rooms and people": "Відфільтрувати кімнати та людей" + "Filter rooms and people": "Відфільтрувати кімнати та людей", + "Find a room… (e.g. %(exampleRoom)s)": "Знайти кімнату… (напр. %(exampleRoom)s)", + "Find a room…": "Знайти кімнату…", + "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", + "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч." } From 78fa9203c3b9709fb4b16ca7cfa4b3ca3bdb287d Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sat, 12 Dec 2020 13:51:38 +0000 Subject: [PATCH 058/187] Translated using Weblate (Ukrainian) Currently translated at 53.3% (1445 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 | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index d8123dd7b6..bebe718976 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -66,14 +66,14 @@ "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-сертифікат домашнього сервера є довіреним і що розширення браузера не блокує запити.", "Cannot add any more widgets": "Неможливо додати більше віджетів", "Change Password": "Змінити пароль", - "%(senderName)s changed their profile picture.": "%(senderName)s змінив/ла зображення профілю.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s змінив(-ла) рівень повноважень %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s змінив/ла назву кімнати на %(roomName)s.", + "%(senderName)s changed their profile picture.": "%(senderName)s змінює зображення профілю.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s змінює рівень повноважень %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s змінює назву кімнати на %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s видалив ім'я кімнати.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s змінив тему на %(topic)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s змінює тему на %(topic)s.", "Email": "е-пошта", "Email address": "Адреса е-пошти", - "Failed to send email": "Помилка відправки е-почти", + "Failed to send email": "Помилка надсилання електронного листа", "Edit": "Відредагувати", "Unpin Message": "Відкріпити повідомлення", "Register": "Зареєструватися", @@ -326,13 +326,13 @@ "Reason": "Причина", "%(senderName)s requested a VoIP conference.": "%(senderName)s бажає розпочати дзвінок-конференцію.", "%(senderName)s invited %(targetName)s.": "%(senderName)s запросив/ла %(targetName)s.", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s змінив(-ла) своє видиме ім'я на %(displayName)s.", + "%(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 set a profile picture.": "%(senderName)s встановлює світлину профілю.", "VoIP conference started.": "Розпочато дзвінок-конференцію.", - "%(targetName)s joined the room.": "%(targetName)s приєднав/лася до кімнати.", + "%(targetName)s joined the room.": "%(targetName)s приєднується до кімнати.", "VoIP conference finished.": "Дзвінок-конференцію завершено.", "%(targetName)s rejected the invitation.": "%(targetName)s відкинув/ла запрошення.", "%(targetName)s left the room.": "%(targetName)s залишив/ла кімнату.", @@ -347,7 +347,7 @@ "(could not connect media)": "(не можливо під'єднати медіа)", "(no answer)": "(немає відповіді)", "(unknown failure: %(reason)s)": "(невідома помилка: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s завершив/ла дзвінок.", + "%(senderName)s ended the call.": "%(senderName)s завершує дзвінок.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s надіслав(-ла) запрошення %(targetDisplayName)s приєднатися до кімнати.", "Show developer tools": "Показувати розробницькі засоби", "Default": "Типово", @@ -357,8 +357,8 @@ "%(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).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s з %(fromPowerLevel)s до %(toPowerLevel)s", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s змінив(-ла) приколоті повідомлення у кімнаті.", - "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s змінив(-ла) знадіб %(widgetName)s", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s змінює приколоті повідомлення у кімнаті.", + "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s змінює знадіб %(widgetName)s", "%(widgetName)s widget added by %(senderName)s": "%(senderName)s додав(-ла) знадіб %(widgetName)s", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s вилучив(-ла) знадіб %(widgetName)s", "Failure to create room": "Не вдалося створити кімнату", @@ -658,23 +658,23 @@ "Opens chat with the given user": "Відкриває балачку з вказаним користувачем", "Sends a message to the given user": "Надсилає повідомлення вказаному користувачеві", "%(senderName)s made no change.": "%(senderName)s не запровадив(-ла) жодних змін.", - "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s змінив(ла) назву кімнати з %(oldRoomName)s на %(newRoomName)s.", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s змінює назву кімнати з %(oldRoomName)s на %(newRoomName)s.", "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s поліпшив(-ла) цю кімнату.", "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s зробив(-ла) кімнату відкритою для всіх, хто знає посилання.", "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s зробив(-ла) кімнату доступною лише за запрошеннями.", - "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s змінив(-ла) правило приєднування на \"%(rule)s\"", + "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s змінює правило приєднування на \"%(rule)s\"", "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s дозволив(-ла) гостям приєднуватися до кімнати.", "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s заборонив(-ла) гостям приєднуватися до кімнати.", - "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s змінив(-ла) гостьовий доступ на \"%(rule)s\"", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s змінює гостьовий доступ на \"%(rule)s\"", "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s увімкнув(-ла) значок для %(groups)s у цій кімнаті.", "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s вимкнув(-ла) значок для %(groups)s в цій кімнаті.", "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s додав(-ла) альтернативні адреси %(addresses)s для цієї кімнати.", "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s додав(-ла) альтернативні адреси %(addresses)s для цієї кімнати.", "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s прибрав(-ла) альтернативні адреси %(addresses)s для цієї кімнати.", "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s прибрав(-ла) альтернативні адреси %(addresses)s для цієї кімнати.", - "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s змінив(-ла) альтернативні адреси для цієї кімнати.", - "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s змінив(-ла) головні та альтернативні адреси для цієї кімнати.", - "%(senderName)s changed the addresses for this room.": "%(senderName)s змінив(-ла) адреси для цієї кімнати.", + "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s змінює альтернативні адреси для цієї кімнати.", + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s змінює головні та альтернативні адреси для цієї кімнати.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s змінює адреси для цієї кімнати.", "%(senderName)s placed a voice call.": "%(senderName)s розпочав(-ла) голосовий виклик.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s розпочав(-ла) голосовий виклик. (не підтримується цим переглядачем)", "%(senderName)s placed a video call.": "%(senderName)s розпочав(-ла) відеовиклик.", @@ -780,7 +780,7 @@ "Guest": "Гість", "There was an error joining the room": "Помилка при вході в кімнату", "You joined the call": "Ви приєднались до дзвінку", - "%(senderName)s joined the call": "%(senderName)s приєднався(лась) до дзвінку", + "%(senderName)s joined the call": "%(senderName)s приєднується до розмови", "Call in progress": "Дзвінок у процесі", "You left the call": "Ви припинили розмову", "%(senderName)s left the call": "%(senderName)s покинув(ла) дзвінок", @@ -998,7 +998,7 @@ "Disconnect": "Відключити", "You should:": "Вам варто:", "Disconnect anyway": "Відключити в будь-якому випадку", - "Identity Server (%(server)s)": "Сервер ідентифікації (%(server)s)", + "Identity Server (%(server)s)": "Сервер ідентифікації (%(server)s)", "Identity Server": "Сервер ідентифікації", "Do not use an identity server": "Не використовувати сервер ідентифікації", "Enter a new identity server": "Введіть новий сервер ідентифікації", @@ -1182,10 +1182,10 @@ "Emoji": "Емодзі", "Emoji Autocomplete": "Самодоповнення емодзі", "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s створив(-ла) правило блокування зі збігом з %(glob)s через %(reason)s", - "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування користувачів зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", - "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування кімнат зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", - "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування серверів зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", - "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінює правило блокування користувачів зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінює правило блокування кімнат зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінює правило блокування серверів зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінєю правило блокування зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", "Enable Community Filter Panel": "Увімкнути фільтр панелі спільнот", "Messages containing my username": "Повідомлення, що містять моє користувацьке ім'я", "Messages containing @room": "Повідомлення, що містять @room", @@ -1345,8 +1345,8 @@ "Cook Islands": "Острови Кука", "Congo - Kinshasa": "Демократична Республіка Конго", "Congo - Brazzaville": "Конго", - "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s змінив серверні права доступу для цієї кімнати.", - "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s встановив серверні права доступу для цієї кімнати", + "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s змінює серверні права доступу для цієї кімнати.", + "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s встановлює серверні права доступу для цієї кімнати.", "Takes the call in the current room off hold": "Зніміть дзвінок у поточній кімнаті з утримання", "Places the call in the current room on hold": "Переведіть дзвінок у поточній кімнаті на утримання", "Zimbabwe": "Зімбабве", From 586d2df9a6de8cb4a7bb4bdd0214792a06d3981e Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sat, 12 Dec 2020 17:44:24 +0000 Subject: [PATCH 059/187] Translated using Weblate (Czech) Currently translated at 79.3% (2151 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 | 47 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index a50dff9123..9c60938728 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1332,7 +1332,7 @@ "The homeserver may be unavailable or overloaded.": "Domovský server je nedostupný nebo přetížený.", "Add room": "Přidat místnost", "You have %(count)s unread notifications in a prior version of this room.|other": "Máte %(count)s nepřečtených oznámení v předchozí verzi této místnosti.", - "You have %(count)s unread notifications in a prior version of this room.|one": "Máte jedno nepřečtené oznámení v předchozí verzi této místnosti.", + "You have %(count)s unread notifications in a prior version of this room.|one": "Máte %(count)s nepřečtených oznámení v předchozí verzi této místnosti.", "Your profile": "Váš profil", "Your Matrix account on ": "Váš účet Matrix na serveru ", "Failed to get autodiscovery configuration from server": "Nepovedlo se automaticky načíst konfiguraci ze serveru", @@ -2282,5 +2282,48 @@ "Answered Elsewhere": "Zodpovězeno jinde", "The call could not be established": "Hovor se nepovedlo navázat", "The other party declined the call.": "Druhá strana hovor odmítla.", - "Call Declined": "Hovor odmítnut" + "Call Declined": "Hovor odmítnut", + "PRO TIP: If you start a bug, please submit debug logs to help us track down the problem.": "TIP pro profíky: Pokud nahlásíte chybu, odešlete prosím ladicí protokoly, které nám pomohou problém vypátrat.", + "Please view existing bugs on Github first. No match? Start a new one.": "Nejříve si prosím prohlédněte existující chyby na Githubu. Žádná shoda? Nahlašte novou chybu.", + "Report a bug": "Nahlásit chybu", + "Add widgets, bridges & bots": "Přidat widgety, bridge a boty", + "Widgets": "Widgety", + "Show Widgets": "Zobrazit widgety", + "Hide Widgets": "Skrýt widgety", + "Room settings": "Nastavení místnosti", + "Use the Desktop app to see all encrypted files": "Pomocí desktopové aplikace zobrazíte všechny šifrované soubory", + "Attach files from chat or just drag and drop them anywhere in a room.": "Připojte soubory z chatu nebo je jednoduše přetáhněte kamkoli do místnosti.", + "No files visible in this room": "V této místnosti nejsou viditelné žádné soubory", + "Show files": "Zobrazit soubory", + "%(count)s people|other": "%(count)s lidé", + "About": "O", + "You’re all caught up": "Vše vyřízeno", + "You have no visible notifications in this room.": "V této místnosti nemáte žádná viditelná oznámení.", + "Hey you. You're the best!": "Hej ty. Jsi nejlepší!", + "Secret storage:": "Bezpečné úložiště:", + "Backup key cached:": "Klíč zálohy cachován:", + "Backup key stored:": "Klíč zálohy uložen:", + "Backup version:": "Verze zálohy:", + "Algorithm:": "Algoritmus:", + "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "Tuto možnost můžete povolit, pokud bude místnost použita pouze pro spolupráci s interními týmy na vašem domovském serveru. Toto nelze později změnit.", + "Block anyone not part of %(serverName)s from ever joining this room.": "Blokovat komukoli, kdo není součástí serveru %(serverName)s, aby se nikdy nepřipojil do této místnosti.", + "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.": "Zálohujte šifrovací klíče s daty vašeho účtu pro případ, že ztratíte přístup k relacím. Vaše klíče budou zabezpečeny jedinečným klíčem pro obnovení.", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Níže můžete spravovat jména a odhlásit se ze svých relací nebo je ověřtit v uživatelském profilu.", + "or another cross-signing capable Matrix client": "nebo jiný Matrix klient schopný cross-signing", + "Cross-signing is not set up.": "Cross-signing není nastaveno.", + "Cross-signing is ready for use.": "Cross-signing je připraveno k použití.", + "Create a Group Chat": "Vytvořit skupinový chat", + "Send a Direct Message": "Poslat přímou zprávu", + "This requires the latest %(brand)s on your other devices:": "To vyžaduje nejnovější %(brand)s na vašich ostatních zařízeních:", + "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Potvrďte svou identitu ověřením tohoto přihlášení z jedné z vašich dalších relací a udělte mu přístup k šifrovaným zprávám.", + "Verify this login": "Ověřte toto přihlášení", + "Welcome to %(appName)s": "Vítá vás %(appName)s", + "Liberate your communication": "Osvoboďte svou komunikaci", + "Navigation": "Navigace", + "Use the + to make a new room or explore existing ones below": "Pomocí + vytvořte novou místnost nebo prozkoumejte stávající místnosti", + "Secure Backup": "Zabezpečená záloha", + "Jump to oldest unread message": "Jít na nejstarší nepřečtenou zprávu", + "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ů" } From 2a97dcd74ab0509a09fc20e5cc0147db3d05d3da Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Sat, 12 Dec 2020 20:07:21 +0000 Subject: [PATCH 060/187] Translated using Weblate (Finnish) Currently translated at 85.5% (2320 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 | 80 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 297cd69790..324eb20a17 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2453,5 +2453,83 @@ "Costa Rica": "Costa Rica", "Cook Islands": "Cookinsaaret", "Congo - Kinshasa": "Kongo-Kinshasa", - "Congo - Brazzaville": "Kongo-Brazzavile" + "Congo - Brazzaville": "Kongo-Brazzavile", + "Micronesia": "Mikronesia", + "Mexico": "Meksiko", + "Mayotte": "Mayotte", + "Mauritius": "Mauritius", + "Mauritania": "Mauritania", + "Martinique": "Martinique", + "Marshall Islands": "Marshallinsaaret", + "Malta": "Malta", + "Mali": "Mali", + "Maldives": "Malediivit", + "Malaysia": "Malesia", + "Malawi": "Malawi", + "Madagascar": "Madagaskar", + "Macedonia": "Pohjois-Makedonia", + "Macau": "Macao", + "Luxembourg": "Luxemburg", + "Lithuania": "Liettua", + "Liechtenstein": "Liechtenstein", + "Libya": "Libya", + "Liberia": "Liberia", + "Lesotho": "Lesotho", + "Lebanon": "Libanon", + "Latvia": "Latvia", + "Laos": "Laos", + "Kyrgyzstan": "Kirgisia", + "Kuwait": "Kuwait", + "Kosovo": "Kosovo", + "Kiribati": "Kiribati", + "Kenya": "Kenia", + "Kazakhstan": "Kazakstan", + "Jordan": "Jordania", + "Jersey": "Jersey", + "Japan": "Japani", + "Jamaica": "Jamaika", + "Italy": "Italia", + "Israel": "Israel", + "Isle of Man": "Mansaari", + "Ireland": "Irlanti", + "Iraq": "Irak", + "Iran": "Iran", + "Indonesia": "Indonesia", + "India": "Intia", + "Iceland": "Islanti", + "Hungary": "Unkari", + "Hong Kong": "Hongkong", + "Honduras": "Honduras", + "Heard & McDonald Islands": "Heard ja McDonaldinsaaret", + "Haiti": "Haiti", + "Guyana": "Guyana", + "Guinea-Bissau": "Guinea-Bissau", + "Guinea": "Guinea", + "Guernsey": "Guernsey", + "Guatemala": "Guatemala", + "Guam": "Guam", + "Guadeloupe": "Guadeloupe", + "Grenada": "Grenada", + "Greenland": "Grönlanti", + "Greece": "Kreikka", + "Gibraltar": "Gibraltar", + "Ghana": "Ghana", + "Germany": "Saksa", + "Georgia": "Georgia", + "Gambia": "Gambia", + "Gabon": "Gabon", + "French Southern Territories": "Ranskan eteläiset ja antarktiset alueet", + "French Polynesia": "Ranskan Polynesia", + "French Guiana": "Ranskan Guayana", + "France": "Ranska", + "Finland": "Suomi", + "Fiji": "Fidži", + "Faroe Islands": "Färsaaret", + "Falkland Islands": "Falklandinsaaret", + "Ethiopia": "Etiopia", + "Estonia": "Viro", + "Eritrea": "Eritrea", + "Equatorial Guinea": "Päiväntasaajan Guinea", + "You've reached the maximum number of simultaneous calls.": "Saavutit samanaikaisten puheluiden enimmäismäärän.", + "Too Many Calls": "Liian monta puhelua" } From 48cb63baf34096d4675afd9433cba7ea6a7eaaaf Mon Sep 17 00:00:00 2001 From: XoseM Date: Sat, 12 Dec 2020 05:41:16 +0000 Subject: [PATCH 061/187] Translated using Weblate (Galician) Currently translated at 99.9% (2710 of 2711 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index dc58d97f79..05ef098860 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2968,5 +2968,7 @@ "Hold": "Colgar", "Resume": "Retomar", "%(peerName)s held the call": "%(peerName)s finalizou a chamada", - "You held the call Resume": "Colgaches a chamada, Retomar" + "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" } From 26257b07f05a2069b0395638189f8718eb55415b Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sun, 13 Dec 2020 16:16:14 +0000 Subject: [PATCH 062/187] Translated using Weblate (Czech) Currently translated at 80.8% (2191 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 | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 9c60938728..3f518f6a32 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2325,5 +2325,45 @@ "Jump to oldest unread message": "Jít na nejstarší nepřečtenou zprávu", "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ů" + "Too Many Calls": "Přiliš mnoho hovorů", + "Community and user menu": "Nabídka komunity 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", + "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í.", + "Use a different passphrase?": "Použít jinou frázi?", + "Great! This recovery passphrase looks strong enough.": "Skvělé! Tato fráze pro obnovení vypadá dostatečně silně.", + "Enter a recovery passphrase": "Zadejte frázi pro obnovení", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s nebo %(usernamePassword)s", + "If you've joined lots of rooms, this might take a while": "Pokud jste se připojili ke spoustě místností, může to chvíli trvat", + "There was a problem communicating with the homeserver, please try again later.": "Při komunikaci s domovským serverem došlo k potížím, zkuste to prosím později.", + "Continue with %(ssoButtons)s": "Pokračovat s %(ssoButtons)s", + "Use Recovery Key": "Použít klíč pro obnovu", + "Use Recovery Key or Passphrase": "Použít klíč pro obnovu nebo frázi", + "Already have an account? Sign in here": "Máte již účet? Přihlašte se zde", + "Host account on": "Hostovat účet na", + "Signing In...": "Přihlašování...", + "Syncing...": "Synchronizuji...", + "That username already exists, please try another.": "Toto uživatelské jméno již existuje, zkuste prosím jiné.", + "Verify other session": "Ověření jiné relace", + "Filter rooms and people": "Filtrovat místnosti a lidi", + "Explore rooms in %(communityName)s": "Prozkoumejte místnosti v %(communityName)s", + "delete the address.": "smazat adresu.", + "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", + "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", + "Welcome %(name)s": "Vítejte %(name)s", + "Now, let's help you get started": "Nyní vám pomůžeme začít", + "Effects": "Efekty", + "Alt": "Alt" } From 3389cb1d9130380b3cbee67d4e9e6ac8edad5db4 Mon Sep 17 00:00:00 2001 From: Kaede Date: Sun, 13 Dec 2020 11:41:37 +0000 Subject: [PATCH 063/187] Translated using Weblate (Japanese) Currently translated at 50.2% (1361 of 2711 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 3fa0a502ca..c8c356bdcd 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1487,5 +1487,6 @@ "No other published addresses yet, add one below": "現在、公開アドレスがありません。以下から追加可能です。", "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": "メンションとキーワード" + "Mentions & Keywords": "メンションとキーワード", + "Security Key": "セキュリティキー" } From 83ed6f0d685eb4bdec3ee2dc0afc3e29b7cf5a31 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Sun, 13 Dec 2020 18:44:32 +0000 Subject: [PATCH 064/187] Translated using Weblate (Finnish) Currently translated at 85.6% (2321 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 324eb20a17..0dfb946936 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2531,5 +2531,6 @@ "Eritrea": "Eritrea", "Equatorial Guinea": "Päiväntasaajan Guinea", "You've reached the maximum number of simultaneous calls.": "Saavutit samanaikaisten puheluiden enimmäismäärän.", - "Too Many Calls": "Liian monta puhelua" + "Too Many Calls": "Liian monta puhelua", + "Moldova": "Moldova" } From a4b4a9ce2e812a704b6e7a7a53cd8f28902057d7 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sun, 13 Dec 2020 15:11:22 +0000 Subject: [PATCH 065/187] Translated using Weblate (Albanian) Currently translated at 99.7% (2703 of 2711 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 | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 6082bcf65b..de80ab4a36 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -874,7 +874,7 @@ "Incompatible Database": "Bazë të dhënash e Papërputhshme", "Continue With Encryption Disabled": "Vazhdo Me Fshehtëzimin të Çaktivizuar", "Unable to load! Check your network connectivity and try again.": "S’arrihet të ngarkohet! Kontrolloni lidhjen tuaj në rrjet dhe riprovoni.", - "Forces the current outbound group session in an encrypted room to be discarded": "Forces the current outbound group session in an encrypted room to be discarded", + "Forces the current outbound group session in an encrypted room to be discarded": "", "Delete Backup": "Fshije Kopjeruajtjen", "Unable to load key backup status": "S’arrihet të ngarkohet gjendje kopjeruajtjeje kyçesh", "Backup version: ": "Version kopjeruajtjeje: ", @@ -1351,7 +1351,7 @@ "Ensure you have a stable internet connection, or get in touch with the server admin": "Sigurohuni se keni një lidhje të qëndrueshme internet, ose lidhuni me përgjegjësin e shërbyesit", "Your %(brand)s is misconfigured": "%(brand)s-i juaj është i keqformësuar", "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Kërkojini përgjegjësit të %(brand)s-it tuaj të kontrollojë formësimin tuaj për zëra të pasaktë ose të përsëdytur.", - "Unexpected error resolving identity server configuration": "Gabim i papritur teksa ftillohej formësimi i shërbyesit të identiteteve", + "Unexpected error resolving identity server configuration": "Gabim i papritur teksa ftillohej formësimi i shërbyesit të identiteteve", "Use lowercase letters, numbers, dashes and underscores only": "Përdorni vetëm shkronja të vogla, numra, vija ndarëse dhe nënvija", "Cannot reach identity server": "S’kapet dot shërbyesi i identiteteve", "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Mund të regjistroheni, por disa veçori do të jenë të papërdorshme, derisa shërbyesi i identiteteve të jetë sërish në linjë. Nëse vazhdoni ta shihni këtë sinjalizim, kontrolloni formësimin tuaj ose lidhuni me një përgjegjës të shërbyesit.", @@ -1400,7 +1400,7 @@ "Command Help": "Ndihmë Urdhri", "Identity Server": "Shërbyes Identitetesh", "Find others by phone or email": "Gjeni të tjerë përmes telefoni ose email-i", - "Be found by phone or email": "Bëhuni i gjetshëm përmes telefoni ose email-i", + "Be found by phone or email": "Bëhuni i gjetshëm përmes telefoni ose email-i", "Use bots, bridges, widgets and sticker packs": "Përdorni robotë, ura, widget-e dhe paketa ngjitësish", "Terms of Service": "Kushte Shërbimi", "Service": "Shërbim", @@ -1636,7 +1636,7 @@ "%(brand)s URL": "URL %(brand)s-i", "Room ID": "ID dhome", "Widget ID": "ID widget-i", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s & Përgjegjësin tuaj të Integrimeve.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s & Përgjegjësin tuaj të Integrimeve.", "Using this widget may share data with %(widgetDomain)s.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s.", "Widget added by": "Widget i shtuar nga", "This widget may use cookies.": "Ky widget mund të përdorë cookies.", @@ -2139,7 +2139,7 @@ "Enter a recovery passphrase": "Jepni një frazëkalim rimarrjesh", "Enter your recovery passphrase a second time to confirm it.": "Për ta ripohuar, jepeni edhe një herë frazëkalimin tuaj të rimarrjeve.", "Confirm your recovery passphrase": "Ripohoni frazëkalimin tuaj të rimarrjeve", - "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Kyçi juaj i rimarrjeve është një rrjet sigurie - mund ta përdorni të të rifituar hyrje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj të rimarrjeve.", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Kyçi juaj i rimarrjeve është një rrjet sigurie - mund ta përdorni për të rifituar hyrje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj të rimarrjeve.", "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Do të ruajmë një kopje të fshehtëzuar të kyçeve tuaj në shërbyesin tonë. Siguroni kopjeruajtjen tuaj me një frazëkalim rimarrjesh.", "Please enter your recovery passphrase a second time to confirm.": "Ju lutemi, jepeni frazëkalimin tuaj të rimarrjeve edhe një herë, për ta ripohuar.", "Repeat your recovery passphrase...": "Përsëritni frazëkalimin tuaj të rimarrjeve…", @@ -2768,7 +2768,7 @@ "Honduras": "Honduras", "Japan": "Japoni", "American Samoa": "Samoa Amerikane", - "South Georgia & South Sandwich Islands": "Xhorxhia Jugore dhe Ishujt Snduiç të Jugut", + "South Georgia & South Sandwich Islands": "Xhorxhia Jugore dhe Ishujt Sanduiç të Jugut", "Palestine": "Palestinë", "Austria": "Austri", "Suriname": "Surinam", @@ -2946,5 +2946,22 @@ "Continue with %(provider)s": "Vazhdo me %(provider)s", "Homeserver": "Shërbyes Home", "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.": "Mund të përdorni mundësi vetjake shërbyesi që të bëni hyrjen në shërbyes të tjerë Matrix duke dhënë një tjetër URL shërbyesi Home. Kjo ju lejon të përdorni Element-in me një llogari Matrix ekzistuese në një tjetër shërbyes Home.", - "Server Options": "Mundësi Shërbyesi" + "Server Options": "Mundësi Shërbyesi", + "Hold": "Mbaje", + "Resume": "Rimerre", + "We call the places where you can host your account ‘homeservers’.": "Vendet ku mund të strehoni llogarinë tuaj i quajmë ‘shërbyes Home’.", + "Invalid URL": "URL e pavlefshme", + "Unable to validate homeserver": "S’arrihet të vlerësohet shërbyesi Home", + "Reason (optional)": "Arsye (opsionale)", + "%(name)s paused": "%(name)s pushoi", + "%(peerName)s held the call": "%(peerName)s mbajti thirrjen", + "You held the call Resume": "E mbajtët thirrjen Rimerreni", + "sends confetti": "dërgon bonbone", + "Sends the given message with confetti": "E dërgon mesazhin e dhënë me bonbone", + "Show chat effects": "Shfaq efekte fjalosjeje", + "Effects": "Efekte", + "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." } From a0c69996b8401cf311ddfb2d997bf3973b192fa7 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Mon, 14 Dec 2020 01:34:53 +0000 Subject: [PATCH 066/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2711 of 2711 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 1b73d78286..c820d9b1cf 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2971,5 +2971,8 @@ "Hold": "保留", "Resume": "繼續", "%(peerName)s held the call": "%(peerName)s 保留通話", - "You held the call Resume": "您已保留通話 繼續" + "You held the call Resume": "您已保留通話 繼續", + "%(name)s paused": "%(name)s 已暫停", + "You've reached the maximum number of simultaneous calls.": "您已達到同時通話的最大數量。", + "Too Many Calls": "太多通話" } From 299d48533ff284f07ccb1614abd9512bfe98a43d Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Mon, 14 Dec 2020 11:11:09 +0000 Subject: [PATCH 067/187] Translated using Weblate (Czech) Currently translated at 82.5% (2237 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 | 48 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3f518f6a32..3d448ca071 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2365,5 +2365,51 @@ "Welcome %(name)s": "Vítejte %(name)s", "Now, let's help you get started": "Nyní vám pomůžeme začít", "Effects": "Efekty", - "Alt": "Alt" + "Alt": "Alt", + "Approve": "Schválit", + "Looks good!": "To vypadá dobře!", + "Wrong file type": "Špatný typ souboru", + "The server has denied your request.": "Server odmítl váš požadavek.", + "The server is offline.": "Server je offline.", + "not ready": "nepřipraveno", + "Remove messages sent by others": "Odstranit zprávy odeslané ostatními", + "Decline All": "Odmítnout vše", + "Use the Desktop app to search encrypted messages": "K prohledávání šifrovaných zpráv použijte aplikaci pro stolní počítače", + "Invite someone using their name, email address, username (like ) or share this room.": "Pozvěte někoho pomocí jeho jména, e-mailové adresy, uživatelského jména (například ) nebo sdílejte tuto místnost.", + "Super": "Super", + "Toggle right panel": "Zobrazit/skrýt pravý panel", + "Add a photo, so people can easily spot your room.": "Přidejte fotografii, aby lidé mohli snadno najít váši místnost.", + "%(displayName)s created this room.": "%(displayName)s vytvořil tuto místnost.", + "This is the start of .": "Toto je začátek místnosti .", + "Topic: %(topic)s ": "Téma: %(topic)s ", + "Topic: %(topic)s (edit)": "Téma: %(topic)s (upravit)", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Zprávy zde jsou šifrovány end-to-end. Ověřte %(displayName)s v jeho profilu - klepněte na jeho avatar.", + "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.": "Zadejte frázi zabezpečení, kterou znáte jen vy, k ochraně vašich dat. Z důvodu bezpečnosti byste neměli znovu používat heslo k účtu.", + "Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Použijte tajnou frázi, kterou znáte pouze vy, a volitelně uložte bezpečnostní klíč, který použijete pro zálohování.", + "Enter a Security Phrase": "Zadání bezpečnostní fráze", + "We’ll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "Vygenerujeme bezpečnostní klíč, který můžete uložit někde v bezpečí, například ve správci hesel nebo trezoru.", + "Generate a Security Key": "Vygenerovat bezpečnostní klíč", + "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 .", + "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, pokud nikdo z vás nikoho nepozve, aby se připojil.", + "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.", + "Invite by email": "Pozvat emailem", + "Comment": "Komentář", + "Add comment": "Přidat komentář", + "Update community": "Aktualizovat komunitu", + "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.", + "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", + "People you know on %(brand)s": "Lidé, které znáte z %(brand)s", + "Add another email": "Přidat další emailovou adresu", + "Show": "Zobrazit", + "Reason (optional)": "Důvod (volitelné)", + "Add image (optional)": "Přidat obrázek (volitelné)", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Do soukromé místnosti se lze připojit pouze s pozvánkou. Veřejné místnosti lze najít a může se do nich připojit kdokoli." } From b012490d270288736820dedfb28c77a828ba0311 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Mon, 14 Dec 2020 13:01:22 +0000 Subject: [PATCH 068/187] Translated using Weblate (Finnish) Currently translated at 90.4% (2453 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 | 155 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 143 insertions(+), 12 deletions(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 0dfb946936..7fe6e0f5db 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -626,7 +626,7 @@ "Send Custom Event": "Lähetä mukautettu tapahtuma", "Advanced notification settings": "Lisäasetukset ilmoituksille", "Forget": "Unohda", - "You cannot delete this image. (%(code)s)": "Et voi poistaa tätä kuvaa. (%(code)s)", + "You cannot delete this image. (%(code)s)": "Et voi poistaa tätä kuvaa. (%(code)s)", "Cancel Sending": "Peruuta lähetys", "This Room": "Tämä huone", "Noisy": "Äänekäs", @@ -798,7 +798,7 @@ "Apple": "Omena", "Strawberry": "Mansikka", "Corn": "Maissi", - "Pizza": "Pizza", + "Pizza": "Pitsa", "Cake": "Kakku", "Heart": "Sydän", "Smiley": "Hymiö", @@ -834,7 +834,7 @@ "Pin": "Nuppineula", "Call in Progress": "Puhelu meneillään", "General": "Yleiset", - "Security & Privacy": "Tietoturva ja -suoja", + "Security & Privacy": "Tietoturva ja yksityisyys", "Roles & Permissions": "Roolit ja oikeudet", "Room Name": "Huoneen nimi", "Room Topic": "Huoneen aihe", @@ -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 on poistettu käytöstä (b>Varoitus: tästä seuraa, että tulevat käyttäjät näkevät 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 käytöstä (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ö", @@ -1692,14 +1692,14 @@ "Cross-signing and secret storage are enabled.": "Ristivarmennus ja salavarasto on käytössä.", "Cross-signing and secret storage are not yet set up.": "Ristivarmennusta ja salavarastoa ei ole vielä otettu käyttöön.", "Bootstrap cross-signing and secret storage": "Ota käyttöön ristivarmennus ja salavarasto", - "Cross-signing public keys:": "Ristivarmennuksen julkiset avaimet:", + "Cross-signing public keys:": "Ristiinvarmennuksen julkiset avaimet:", "not found": "ei löydetty", - "Cross-signing private keys:": "Ristivarmennuksen salaiset avaimet:", + "Cross-signing private keys:": "Ristiinvarmennuksen salaiset avaimet:", "in secret storage": "salavarastossa", "Secret storage public key:": "Salavaraston julkinen avain:", "in account data": "tunnuksen tiedoissa", "not stored": "ei tallennettu", - "Cross-signing": "Ristivarmennus", + "Cross-signing": "Ristiinvarmennus", "Backup has a valid signature from this user": "Varmuuskopiossa on kelvollinen allekirjoitus tältä käyttäjältä", "Backup has a invalid signature from this user": "Varmuuskopiossa on epäkelpo allekirjoitus tältä käyttäjältä", "Backup has a signature from unknown user with ID %(deviceId)s": "Varmuuskopiossa on tuntematon allekirjoitus käyttäjältä, jonka ID on %(deviceId)s", @@ -2019,10 +2019,10 @@ "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.", - "Your homeserver does not support cross-signing.": "Kotipalvelimesi ei tue ristivarmennusta.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Tunnuksellasi on ristivarmennuksen identiteetti salavarastossa, mutta tämä istunto ei luota siihen.", + "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", - "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Varmenna jokainen käyttäjän istunto erikseen, äläkä luota ristivarmennettuihin laitteisiin.", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Varmenna jokainen istunto erikseen, äläkä luota ristiinvarmennettuihin laitteisiin.", "Securely cache encrypted messages locally for them to appear in search results.": "Pidä salatut viestit turvallisessa välimuistissa, jotta ne näkyvät hakutuloksissa.", "%(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)sissa ei ole joitain komponentteja, joita tarvitaan viestien turvalliseen välimuistitallennukseen. Jos haluat kokeilla tätä ominaisuutta, käännä mukautettu %(brand)s Desktop, jossa on mukana hakukomponentit.", "This session is backing up your keys. ": "Tämä istunto varmuuskopioi avaimesi. ", @@ -2095,7 +2095,7 @@ "%(networkName)s rooms": "Verkon %(networkName)s huoneet", "Destroy cross-signing keys?": "Tuhoa ristivarmennuksen 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.": "Ristivarmennuksen 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 pystyt ristivarmentamaan.", - "Clear cross-signing keys": "Tyhjennä ristivarmennuksen avaimet", + "Clear cross-signing keys": "Tyhjennä ristiinvarmennuksen avaimet", "Enable end-to-end encryption": "Ota osapuolten välinen salaus käyttöön", "Session key": "Istunnon tunnus", "Verification Requests": "Varmennuspyynnöt", @@ -2532,5 +2532,136 @@ "Equatorial Guinea": "Päiväntasaajan Guinea", "You've reached the maximum number of simultaneous calls.": "Saavutit samanaikaisten puheluiden enimmäismäärän.", "Too Many Calls": "Liian monta puhelua", - "Moldova": "Moldova" + "Moldova": "Moldova", + "You’re all caught up": "Olet ajan tasalla", + "Room settings": "Huoneen asetukset", + "or another cross-signing capable Matrix client": "tai muu ristiinvarmentava Matrix-asiakas", + "a device cross-signing signature": "laitteen ristiinvarmennuksen allekirjoitus", + "a new cross-signing key signature": "Uusi ristiinvarmennuksen allekirjoitus", + "Cross-signing is not set up.": "Ristiinvarmennusta ei ole asennettu.", + "Cross-signing is ready for use.": "Ristiinvarmennus on käyttövalmis.", + "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.": "Varmuuskopioi tilitietojesi salausavaimet, istuntojen menettämisen varalta. Avaimet varmistetaan ainutlaatuisella Palatusavaimella.", + "well formed": "hyvin muotoiltu", + "Backup version:": "Varmuuskopiointiversio:", + "Backup key stored:": "Varmuuskopioavain tallennettu:", + "Backup key cached:": "Välimuistissa oleva varmuuskopioavain:", + "Secret storage:": "Salainen tallennus:", + "Hey you. You're the best!": "Hei siellä, olet paras!", + "Room ID or address of ban list": "Huonetunnus tai -osoite on estolistalla", + "Secure Backup": "Turvallinen varmuuskopio", + "Add a photo, so people can easily spot your room.": "Lisää kuva, jotta ihmiset voivat helpommin huomata huoneesi.", + "Hide Widgets": "Piilota sovelmat", + "Show Widgets": "Näytä sovelmat", + "Explore community rooms": "Selaa yhteisön huoneita", + "Explore public rooms": "Selaa julkisia huoneita", + "Custom Tag": "Mukautettu tunniste", + "Explore all public rooms": "Selaa julkisia huoneita", + "List options": "Lajittele", + "Activity": "Aktiivisuus", + "A-Z": "A-Ö", + "Server Options": "Palvelimen asetukset", + "Information": "Tiedot", + "Effects": "Tehosteet", + "Zimbabwe": "Zimbabwe", + "Zambia": "Sambia", + "Yemen": "Jemen", + "Western Sahara": "Länsi-Sahara", + "Wallis & Futuna": "Wallis ja Futuna", + "Vietnam": "Vietnam", + "Venezuela": "Venezuela", + "Vatican City": "Vatikaani", + "Vanuatu": "Vanuatu", + "Uzbekistan": "Uzbekistan", + "Uruguay": "Uruguay", + "United Arab Emirates": "Yhdistyneet arabiemiirikunnat", + "Ukraine": "Ukraina", + "Uganda": "Uganda", + "U.S. Virgin Islands": "Yhdysvaltain Neitsytsaaret", + "Tuvalu": "Tuvalu", + "Turks & Caicos Islands": "Turks- ja Caicossaaret", + "Turkmenistan": "Turkmenistan", + "Turkey": "Turkki", + "Tunisia": "Tunisia", + "Trinidad & Tobago": "Trinidad ja Tobago", + "Tonga": "Tonga", + "Tokelau": "Tokelau", + "Togo": "Togo", + "Timor-Leste": "Itä-Timor", + "Thailand": "Thaimaa", + "Tanzania": "Tansania", + "Tajikistan": "Tadžikistan", + "Taiwan": "Taiwan", + "São Tomé & Príncipe": "São Tomé ja Príncipe", + "Syria": "Syyria", + "Switzerland": "Sveitsi", + "Sweden": "Ruotsi", + "Swaziland": "Swazimaa", + "Svalbard & Jan Mayen": "Huippuvuoret ja Jan Mayen", + "Suriname": "Suriname", + "Sudan": "Sudan", + "St. Vincent & Grenadines": "Saint Vincent ja Grenadiinit", + "St. Pierre & Miquelon": "Saint-Pierre ja Miquelon", + "St. Martin": "Saint-Martin", + "St. Lucia": "Saint Lucia", + "St. Kitts & Nevis": "Saint Kitts ja Nevis", + "St. Helena": "Saint Helena", + "St. Barthélemy": "Saint-Barthélemy", + "Sri Lanka": "Sri Lanka", + "Spain": "Espanja", + "South Sudan": "Etelä-Sudan", + "South Korea": "Etelä-Korea", + "South Georgia & South Sandwich Islands": "Etelä-Georgia ja Eteläiset Sandwichsaaret", + "South Africa": "Etelä-Afrikka", + "Somalia": "Somalia", + "Solomon Islands": "Salomonsaaret", + "Slovenia": "Slovenia", + "Slovakia": "Slovakia", + "Sint Maarten": "Sint Maarten", + "Singapore": "Singapore", + "Sierra Leone": "Sierra Leone", + "Seychelles": "Seychellit", + "Serbia": "Serbia", + "Senegal": "Senegal", + "Saudi Arabia": "Saudi-Arabia", + "San Marino": "San Marino", + "Samoa": "Samoa", + "Réunion": "Réunion", + "Rwanda": "Ruanda", + "Russia": "Venäjä", + "Romania": "Romania", + "Qatar": "Qatar", + "Puerto Rico": "Puerto Rico", + "Portugal": "Portugali", + "Poland": "Puola", + "Pitcairn Islands": "Pitcairnsaaret", + "Philippines": "Filippiinit", + "Peru": "Peru", + "Paraguay": "Paraguay", + "Papua New Guinea": "Papua-Uusi-Guinea", + "Panama": "Panama", + "Palestine": "Palestiina", + "Palau": "Palau", + "Pakistan": "Pakistan", + "Oman": "Oman", + "Norway": "Norja", + "Northern Mariana Islands": "Pohjois-Mariaanit", + "North Korea": "Pohjois-Korea", + "Norfolk Island": "Norfolkinsaari", + "Niue": "Niue", + "Nigeria": "Nigeria", + "Niger": "Niger", + "Nicaragua": "Nicaragua", + "New Zealand": "Uusi-Seelanti", + "New Caledonia": "Uusi-Kaledonia", + "Netherlands": "Alankomaat", + "Nepal": "Nepal", + "Nauru": "Nauru", + "Namibia": "Namibia", + "Myanmar": "Myanmar", + "Mozambique": "Mosambik", + "Morocco": "Marokko", + "Montserrat": "Montserrat", + "Montenegro": "Montenegro", + "Mongolia": "Mongolia", + "Monaco": "Monaco" } From 2e2c5a045e2a89c60657720db7c4ebb2429d065a Mon Sep 17 00:00:00 2001 From: aethralis Date: Mon, 14 Dec 2020 09:19:59 +0000 Subject: [PATCH 069/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2711 of 2711 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, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 738f0c6e08..e9f8d729ef 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1594,11 +1594,11 @@ "All settings": "Kõik seadistused", "Feedback": "Tagasiside", "Use Single Sign On to continue": "Jätkamiseks kasuta ühekordset sisselogimist", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Kinnita selle e-posti aadressi lisamine kasutades ühekordset sisselogimist oma isiku tuvastamiseks.", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Kinnita selle e-posti aadress kasutades oma isiku tuvastamiseks ühekordset sisselogimist (Single Sign On).", "Single Sign On": "SSO Ühekordne sisselogimine", "Confirm adding email": "Kinnita e-posti aadressi lisamine", "Click the button below to confirm adding this email address.": "Klõpsi järgnevat nuppu e-posti aadressi lisamise kinnitamiseks.", - "Confirm adding this phone number by using Single Sign On to prove your identity.": "Kinnita selle telefoninumbri lisamine kasutades ühekordset sisselogimist oma isiku tuvastamiseks.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Kinnita selle telefoninumbri lisamine kasutades oma isiku tuvastamiseks ühekordset sisselogimist (Single Sign On).", "Confirm adding phone number": "Kinnita telefoninumbri lisamine", "Click the button below to confirm adding this phone number.": "Klõpsi järgnevat nuppu telefoninumbri lisamise kinnitamiseks.", "Add Phone Number": "Lisa telefoninumber", @@ -2399,7 +2399,7 @@ "A connection error occurred while trying to contact the server.": "Serveriga ühenduse algatamisel tekkis viga.", "The server is not configured to indicate what the problem is (CORS).": "Server on seadistatud varjama tegelikke veapõhjuseid (CORS).", "No files visible in this room": "Selles jututoas pole nähtavaid faile", - "Attach files from chat or just drag and drop them anywhere in a room.": "Faile saad manueks lisada kas vastava nupu alt vestlusest või sikutades neid jututoa aknasse.", + "Attach files from chat or just drag and drop them anywhere in a room.": "Faile saad manuseks lisada kas vastava nupu alt vestlusest või sikutades neid jututoa aknasse.", "You have no visible notifications in this room.": "Jututoas pole nähtavaid teavitusi.", "You're all caught up.": "Ei tea... kõik vist on nüüd tehtud.", "You’re all caught up": "Ei tea... kõik vist on nüüd tehtud", From 32f693e3b0dcb36c263ec268701826c2bd4b62ce Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 14 Dec 2020 22:28:21 +0000 Subject: [PATCH 070/187] Convert InviteDialog to TypeScript Before I start using it to select VoIP transfer targets --- .../{InviteDialog.js => InviteDialog.tsx} | 104 +++++++++++------- 1 file changed, 64 insertions(+), 40 deletions(-) rename src/components/views/dialogs/{InviteDialog.js => InviteDialog.tsx} (94%) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.tsx similarity index 94% rename from src/components/views/dialogs/InviteDialog.js rename to src/components/views/dialogs/InviteDialog.tsx index c039c191c5..cacf0be5c9 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -15,13 +15,12 @@ limitations under the License. */ import React, {createRef} from 'react'; -import PropTypes from 'prop-types'; import {_t} from "../../../languageHandler"; import * as sdk from "../../../index"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {makeRoomPermalink, makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import DMRoomMap from "../../../utils/DMRoomMap"; -import {RoomMember} from "matrix-js-sdk/src/matrix"; +import {RoomMember} from "matrix-js-sdk/src/models/room-member"; import SdkConfig from "../../../SdkConfig"; import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; import * as Email from "../../../email"; @@ -132,12 +131,12 @@ class ThreepidMember extends Member { } } -class DMUserTile extends React.PureComponent { - static propTypes = { - member: PropTypes.object.isRequired, // Should be a Member (see interface above) - onRemove: PropTypes.func, // takes 1 argument, the member being removed - }; +interface IDMUserTileProps { + member: RoomMember; + onRemove: (RoomMember) => any; +} +class DMUserTile extends React.PureComponent { _onRemove = (e) => { // Stop the browser from highlighting text e.preventDefault(); @@ -173,7 +172,9 @@ class DMUserTile extends React.PureComponent { className='mx_InviteDialog_userTile_remove' onClick={this._onRemove} > - {_t('Remove')} + {_t('Remove')} ); } @@ -190,15 +191,15 @@ class DMUserTile extends React.PureComponent { } } -class DMRoomTile extends React.PureComponent { - static propTypes = { - member: PropTypes.object.isRequired, // Should be a Member (see interface above) - lastActiveTs: PropTypes.number, - onToggle: PropTypes.func.isRequired, // takes 1 argument, the member being toggled - highlightWord: PropTypes.string, - isSelected: PropTypes.bool, - }; +interface IDMRoomTileProps { + member: RoomMember; + lastActiveTs: number; + onToggle: (RoomMember) => any; + highlightWord: string; + isSelected: boolean; +} +class DMRoomTile extends React.PureComponent { _onClick = (e) => { // Stop the browser from highlighting text e.preventDefault(); @@ -298,28 +299,45 @@ class DMRoomTile extends React.PureComponent { } } -export default class InviteDialog extends React.PureComponent { - static propTypes = { - // Takes an array of user IDs/emails to invite. - onFinished: PropTypes.func.isRequired, +interface IInviteDialogProps { + // Takes an array of user IDs/emails to invite. + onFinished: (toInvite?: string[]) => any; - // The kind of invite being performed. Assumed to be KIND_DM if - // not provided. - kind: PropTypes.string, + // The kind of invite being performed. Assumed to be KIND_DM if + // not provided. + kind: string, - // The room ID this dialog is for. Only required for KIND_INVITE. - roomId: PropTypes.string, + // The room ID this dialog is for. Only required for KIND_INVITE. + roomId: string, - // Initial value to populate the filter with - initialText: PropTypes.string, - }; + // Initial value to populate the filter with + initialText: string, +} +interface IInviteDialogState { + targets: RoomMember[]; // array of Member objects (see interface above) + filterText: string; + recents: { user: DirectoryMember, userId: string }[]; + numRecentsShown: number; + suggestions: { user: DirectoryMember, userId: string }[]; + numSuggestionsShown: number; + serverResultsMixin: { user: DirectoryMember, userId: string }[]; + threepidResultsMixin: ({ user: ThreepidMember, userId: string} | { user: DirectoryMember, userId: string})[]; + canUseIdentityServer: boolean; + tryingIdentityServer: boolean; + + // These two flags are used for the 'Go' button to communicate what is going on. + busy: boolean, + errorText: string, +} + +export default class InviteDialog extends React.PureComponent { static defaultProps = { kind: KIND_DM, initialText: "", }; - _debounceTimer: number = null; + _debounceTimer: NodeJS.Timeout = null; // actually number because we're in the browser _editorRef: any = null; constructor(props) { @@ -348,8 +366,8 @@ export default class InviteDialog extends React.PureComponent { numRecentsShown: INITIAL_ROOMS_SHOWN, suggestions: this._buildSuggestions(alreadyInvited), numSuggestionsShown: INITIAL_ROOMS_SHOWN, - serverResultsMixin: [], // { user: DirectoryMember, userId: string }[], like recents and suggestions - threepidResultsMixin: [], // { user: ThreepidMember, userId: string}[], like recents and suggestions + serverResultsMixin: [], + threepidResultsMixin: [], canUseIdentityServer: !!MatrixClientPeg.get().getIdentityServerUrl(), tryingIdentityServer: false, @@ -367,7 +385,7 @@ export default class InviteDialog extends React.PureComponent { } } - static buildRecents(excludedTargetIds: Set): {userId: string, user: RoomMember, lastActive: number} { + static buildRecents(excludedTargetIds: Set): {userId: string, user: RoomMember, lastActive: number}[] { const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room // Also pull in all the rooms tagged as DefaultTagID.DM so we don't miss anything. Sometimes the @@ -430,7 +448,7 @@ export default class InviteDialog extends React.PureComponent { return recents; } - _buildSuggestions(excludedTargetIds: Set): {userId: string, user: RoomMember} { + _buildSuggestions(excludedTargetIds: Set): {userId: string, user: RoomMember}[] { const maxConsideredMembers = 200; const joinedRooms = MatrixClientPeg.get().getRooms() .filter(r => r.getMyMembership() === 'join' && r.getJoinedMemberCount() <= maxConsideredMembers); @@ -470,7 +488,7 @@ export default class InviteDialog extends React.PureComponent { }, {}); // Generates { userId: {member, numRooms, score} } - const memberScores = Object.values(memberRooms).reduce((scores, entry) => { + const memberScores = Object.values(memberRooms).reduce((scores, entry: {member: RoomMember, rooms: Room[]}) => { const numMembersTotal = entry.rooms.reduce((c, r) => c + r.getJoinedMemberCount(), 0); const maxRange = maxConsideredMembers * entry.rooms.length; scores[entry.member.userId] = { @@ -603,7 +621,7 @@ export default class InviteDialog extends React.PureComponent { return; } - const createRoomOptions = {inlineErrors: true}; + const createRoomOptions = {inlineErrors: true} as any; if (privateShouldBeEncrypted()) { // Check whether all users have uploaded device keys before. @@ -620,7 +638,7 @@ export default class InviteDialog extends React.PureComponent { // Check if it's a traditional DM and create the room if required. // TODO: [Canonical DMs] Remove this check and instead just create the multi-person DM - let createRoomPromise = Promise.resolve(); + let createRoomPromise = Promise.resolve(null) as Promise; const isSelf = targetIds.length === 1 && targetIds[0] === MatrixClientPeg.get().getUserId(); if (targetIds.length === 1 && !isSelf) { createRoomOptions.dmUserId = targetIds[0]; @@ -990,7 +1008,8 @@ export default class InviteDialog extends React.PureComponent { const hasMixins = this.state.serverResultsMixin || this.state.threepidResultsMixin; if (this.state.filterText && hasMixins && kind === 'suggestions') { // We don't want to duplicate members though, so just exclude anyone we've already seen. - const notAlreadyExists = (u: Member): boolean => { + // The type of u is a pain to define but members of both mixins have the 'userId' property + const notAlreadyExists = (u: any): boolean => { return !sourceMembers.some(m => m.userId === u.userId) && !priorityAdditionalMembers.some(m => m.userId === u.userId) && !otherAdditionalMembers.some(m => m.userId === u.userId); @@ -1169,7 +1188,8 @@ export default class InviteDialog extends React.PureComponent { if (CommunityPrototypeStore.instance.getSelectedCommunityId()) { const communityName = CommunityPrototypeStore.instance.getSelectedCommunityName(); - const inviteText = _t("This won't invite them to %(communityName)s. " + + const inviteText = _t( + "This won't invite them to %(communityName)s. " + "To invite someone to %(communityName)s, click here", {communityName}, { userId: () => { @@ -1209,7 +1229,9 @@ export default class InviteDialog extends React.PureComponent { userId: () => {userId}, a: (sub) => - {sub}, + + {sub} + , }, ); } else { @@ -1220,7 +1242,9 @@ export default class InviteDialog extends React.PureComponent { userId: () => {userId}, a: (sub) => - {sub}, + + {sub} + , }, ); } From df825792bcec2b91005f53ad58ad21ec991ae697 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 14 Dec 2020 22:51:40 +0000 Subject: [PATCH 071/187] These can just all be Members --- src/components/views/dialogs/InviteDialog.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index cacf0be5c9..dd6d343846 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -317,12 +317,12 @@ interface IInviteDialogProps { interface IInviteDialogState { targets: RoomMember[]; // array of Member objects (see interface above) filterText: string; - recents: { user: DirectoryMember, userId: string }[]; + recents: { user: Member, userId: string }[]; numRecentsShown: number; - suggestions: { user: DirectoryMember, userId: string }[]; + suggestions: { user: Member, userId: string }[]; numSuggestionsShown: number; - serverResultsMixin: { user: DirectoryMember, userId: string }[]; - threepidResultsMixin: ({ user: ThreepidMember, userId: string} | { user: DirectoryMember, userId: string})[]; + serverResultsMixin: { user: Member, userId: string }[]; + threepidResultsMixin: { user: Member, userId: string}[]; canUseIdentityServer: boolean; tryingIdentityServer: boolean; From 2d369105773fb4243eb384e3f158423268d3193a Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 14 Dec 2020 22:52:30 +0000 Subject: [PATCH 072/187] Add comment Co-authored-by: Travis Ralston --- src/components/views/dialogs/InviteDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index dd6d343846..8ccbbe473c 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -621,7 +621,7 @@ export default class InviteDialog extends React.PureComponent Date: Mon, 14 Dec 2020 17:41:10 +0000 Subject: [PATCH 073/187] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2711 of 2711 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 05c6db5c0c..b456c98aed 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2900,5 +2900,8 @@ "Hold": "Pausar", "Resume": "Retomar", "%(peerName)s held the call": "%(peerName)s pausou a chamada", - "You held the call Resume": "Você pausou a chamada Retomar" + "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" } From 73602dace379e89032ac7b37493c54ac8933bd06 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Mon, 14 Dec 2020 22:01:06 +0000 Subject: [PATCH 074/187] Translated using Weblate (Finnish) Currently translated at 90.7% (2459 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 | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 7fe6e0f5db..70431c6294 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -304,7 +304,7 @@ "Unable to enable Notifications": "Ilmoitusten käyttöönotto epäonnistui", "Uploading %(filename)s and %(count)s others|other": "Ladataan %(filename)s ja %(count)s muuta", "Upload Failed": "Lataus epäonnistui", - "Upload file": "Lataa tiedosto", + "Upload file": "Lataa tiedostoja", "Upload new:": "Lataa uusi:", "Usage": "Käyttö", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s vaihtoi aiheeksi \"%(topic)s\".", @@ -863,7 +863,7 @@ "You don't currently have any stickerpacks enabled": "Sinulla ei ole tarrapaketteja käytössä", "Stickerpack": "Tarrapaketti", "Hide Stickers": "Piilota tarrat", - "Show Stickers": "Näytä tarrat", + "Show Stickers": "Tarrat", "Profile picture": "Profiilikuva", "Set a new account password...": "Aseta uusi salasana tilille...", "Set a new status...": "Aseta uusi tila...", @@ -2144,7 +2144,7 @@ "Address (optional)": "Osoite (valinnainen)", "Light": "Vaalea", "Dark": "Tumma", - "Emoji picker": "Emojivalitsin", + "Emoji picker": "Emojit", "No recently visited rooms": "Ei hiljattain vierailtuja huoneita", "People": "Ihmiset", "Sort by": "Lajittelutapa", @@ -2663,5 +2663,11 @@ "Montserrat": "Montserrat", "Montenegro": "Montenegro", "Mongolia": "Mongolia", - "Monaco": "Monaco" + "Monaco": "Monaco", + "Room Info": "Huoneen tiedot", + "not found in storage": "ei löytynyt muistista", + "Sign into your homeserver": "Kirjaudu sisään kotipalvelimellesi", + "About homeservers": "Tietoa kotipalvelimista", + "Not encrypted": "Ei salattu", + "You have no visible notifications in this room.": "Olet nähnyt tämän huoneen kaikki ilmoitukset." } From 4cf3be824ff359c3f9439a3baf55a81cd55427fa Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 14 Dec 2020 17:42:47 +0000 Subject: [PATCH 075/187] Translated using Weblate (Albanian) Currently translated at 99.7% (2703 of 2711 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 de80ab4a36..827df3fb70 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2881,7 +2881,7 @@ "Send stickers into your active room": "Dërgoni ngjitës në dhomën tuaj aktive", "Send stickers into this room": "Dërgoni ngjitës në këtë dhomë", "Go to Home View": "Kaloni te Pamja Kreu", - "

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 për faqen e bashkësisë tuaj

\n

\n Përdoreni përshkrimin e gjatë që t’i prezantoni bashkësisë anëtarë të rinj, ose për t’u dhënë lidhje të rëndësishme\n

\n

\n Mundeni madje të shtoni figura me URL-ra Matrix \n

\n", + "

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 për faqen e bashkësisë tuaj

\n

\n Përdoreni përshkrimin e gjatë që t’i prezantoni bashkësisë anëtarë të rinj, ose për t’u dhënë lidhje të rëndësishme\n

\n

\n Mundeni madje të shtoni figura me URL-ra Matrix \n

\n", "Enter phone number": "Jepni numër telefoni", "Enter email address": "Jepni adresë email-i", "Decline All": "Hidhi Krejt Poshtë", From 3fc1a8ff78e85a69b988e2b04de91bdc105375af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 14 Dec 2020 19:55:37 +0000 Subject: [PATCH 076/187] Translated using Weblate (Estonian) Currently translated at 100.0% (2711 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index e9f8d729ef..10f4b6f4a0 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -526,7 +526,7 @@ "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s eemaldas täiendava aadressi %(addresses)s sellelt jututoalt.", "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s muutis selle jututoa täiendavat aadressi.", "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s muutis selle jututoa põhiaadressi ja täiendavat aadressi.", - "%(senderName)s changed the addresses for this room.": "%(senderName)s muutis selle jututoa aadressid.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s muutis selle jututoa aadresse.", "Someone": "Keegi", "(not supported by this browser)": "(ei ole toetatud selles brauseris)", "(could not connect media)": "(ühendus teise osapoolega ei õnnestunud)", From 018743a6399c8d7ab681260e5f7326c4df245ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Tue, 15 Dec 2020 11:45:15 +0100 Subject: [PATCH 077/187] Update _MemberList.scss --- res/css/views/rooms/_MemberList.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/css/views/rooms/_MemberList.scss b/res/css/views/rooms/_MemberList.scss index 9753d3afb5..1e3506e371 100644 --- a/res/css/views/rooms/_MemberList.scss +++ b/res/css/views/rooms/_MemberList.scss @@ -112,10 +112,10 @@ limitations under the License. } } -.mx_MemberList_inviteCommunity span { - background-image: url('$(res)/img/icon-invite-people.svg'); +.mx_MemberList_inviteCommunity span::before { + mask-image: url('$(res)/img/icon-invite-people.svg'); } -.mx_MemberList_addRoomToCommunity span { - background-image: url('$(res)/img/icons-room-add.svg'); +.mx_MemberList_addRoomToCommunity span::before { + mask-image: url('$(res)/img/icons-room-add.svg'); } From a33be00c08b37409c99f6d7b646c9233ba56e16f Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 15 Dec 2020 14:59:06 +0000 Subject: [PATCH 078/187] 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 237b942e46c79b39e76bb2fa747427546ec96ebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:08:47 +0000 Subject: [PATCH 079/187] Translated using Weblate (Ukrainian) Currently translated at 53.3% (1446 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index bebe718976..d2e18083f4 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1528,5 +1528,6 @@ "Find a room… (e.g. %(exampleRoom)s)": "Знайти кімнату… (напр. %(exampleRoom)s)", "Find a room…": "Знайти кімнату…", "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", - "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч." + "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", + "Cannot reach homeserver": "Не вдається зв`язатися з домашнім сервером" } From e183fcf169066054661196dc81f9c89f0a45dd1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:09:33 +0000 Subject: [PATCH 080/187] Translated using Weblate (Ukrainian) Currently translated at 53.3% (1447 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index d2e18083f4..a6f443f673 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1529,5 +1529,6 @@ "Find a room…": "Знайти кімнату…", "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", - "Cannot reach homeserver": "Не вдається зв`язатися з домашнім сервером" + "Cannot reach homeserver": "Не вдається зв`язатися з домашнім сервером", + "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у вас є стабільне підключення до інтернету, або зв’яжіться з сис-адміном" } From 239c0e7b23184958c7c45e6c467af29701aa6db9 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:09:05 +0000 Subject: [PATCH 081/187] Translated using Weblate (Ukrainian) Currently translated at 53.3% (1447 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index a6f443f673..23da3d9a82 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1529,6 +1529,6 @@ "Find a room…": "Знайти кімнату…", "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", - "Cannot reach homeserver": "Не вдається зв`язатися з домашнім сервером", + "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у вас є стабільне підключення до інтернету, або зв’яжіться з сис-адміном" } From b3aa6659a3f5c630fbd210feecf734321f5741b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:10:53 +0000 Subject: [PATCH 082/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1448 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 23da3d9a82..23dc13e8fa 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1530,5 +1530,6 @@ "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", - "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у вас є стабільне підключення до інтернету, або зв’яжіться з сис-адміном" + "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у вас є стабільне підключення до інтернету, або зв’яжіться з сис-адміном", + "User %(user_id)s may or may not exist": "Користувач %(user_id)s може існувати, а може й не існувати" } From 902a74b175008731479ee48ba0be0b89bb302a15 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:10:30 +0000 Subject: [PATCH 083/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1448 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 23dc13e8fa..7cb0c2ddb8 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1530,6 +1530,6 @@ "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", - "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у вас є стабільне підключення до інтернету, або зв’яжіться з сис-адміном", + "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", "User %(user_id)s may or may not exist": "Користувач %(user_id)s може існувати, а може й не існувати" } From d78993992c685f233c89fd0562f27820e823ca4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:11:34 +0000 Subject: [PATCH 084/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1449 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 7cb0c2ddb8..20cfebfe02 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1531,5 +1531,6 @@ "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", - "User %(user_id)s may or may not exist": "Користувач %(user_id)s може існувати, а може й не існувати" + "User %(user_id)s may or may not exist": "Користувач %(user_id)s може існувати, а може й не існувати", + "No need for symbols, digits, or uppercase letters": "Нема необхідності в символах, цифрах, або заголовних(?) літер" } From 77ccce7335858f3bd564c5f4df4df82af60870e0 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:11:22 +0000 Subject: [PATCH 085/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1449 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 20cfebfe02..1d65943586 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1531,6 +1531,6 @@ "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", - "User %(user_id)s may or may not exist": "Користувач %(user_id)s може існувати, а може й не існувати", + "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", "No need for symbols, digits, or uppercase letters": "Нема необхідності в символах, цифрах, або заголовних(?) літер" } From 2dd822816d566b396b4decdb4464d6bcfa066152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:12:28 +0000 Subject: [PATCH 086/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 1d65943586..95b507c886 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1532,5 +1532,6 @@ "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", - "No need for symbols, digits, or uppercase letters": "Нема необхідності в символах, цифрах, або заголовних(?) літер" + "No need for symbols, digits, or uppercase letters": "Нема необхідності в символах, цифрах, або заголовних(?) літер", + "Capitalization doesn't help very much": "Заголовні букви не дуже допомагають" } From 82450826a6e5a0eb38ba9d72dc2cb47d55565ff6 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:12:22 +0000 Subject: [PATCH 087/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 95b507c886..0c14a581b4 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1532,6 +1532,6 @@ "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", - "No need for symbols, digits, or uppercase letters": "Нема необхідності в символах, цифрах, або заголовних(?) літер", + "No need for symbols, digits, or uppercase letters": "Цифри або великі літери не вимагаються", "Capitalization doesn't help very much": "Заголовні букви не дуже допомагають" } From 7c4cfb7855c015a5d40d0a028d8ca10437182024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:14:29 +0000 Subject: [PATCH 088/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 0c14a581b4..4e505bbc7b 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1101,7 +1101,7 @@ "You'll need to authenticate with the server to confirm the upgrade.": "Ви матимете пройти розпізнання на сервері щоб підтвердити поліпшування.", "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Поліпште цей сеанс щоб уможливити звіряння інших сеансів, надаючи їм доступ до зашифрованих повідомлень та позначуючи їх довіреними для інших користувачів.", "Upgrade your encryption": "Поліпшити ваше шифрування", - "Show a placeholder for removed messages": "Показувати позначку-заповнювач для видалених повідомлень", + "Show a placeholder for removed messages": "Показувати плашки замість видалених повідомлень", "Show join/leave messages (invites/kicks/bans unaffected)": "Показувати повідомлення про приєднання/залишення (не впливає на запрошення/викидання/заборону)", "Show avatar changes": "Показувати зміни личини", "Show display name changes": "Показувати зміни видимого імені", From d8843b48eef4630ac1b185ffd8bb86f3d2c23bb2 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:13:11 +0000 Subject: [PATCH 089/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 4e505bbc7b..1b835b73fd 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1532,6 +1532,6 @@ "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", - "No need for symbols, digits, or uppercase letters": "Цифри або великі літери не вимагаються", - "Capitalization doesn't help very much": "Заголовні букви не дуже допомагають" + "No need for symbols, digits, or uppercase letters": "Цифри або великі букви не вимагаються", + "Capitalization doesn't help very much": "Великі букви не дуже допомагають" } From 77d53bfd673e5b66e8077d663f26380545e7f314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:16:15 +0000 Subject: [PATCH 090/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 1b835b73fd..6310175449 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -960,7 +960,7 @@ "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.": "Змінення пароля призведе до скидання всіх ключів наскрізного шифрування та унеможливить читання історії листування, якщо тільки ви не експортуєте ваші ключі кімнати та не імпортуєте їх згодом. Це буде вдосконалено у майбутньому.", - "Santa": "Санта Клаус", + "Santa": "Микола", "Gift": "Подарунок", "Lock": "Замок", "Cross-signing and secret storage are not yet set up.": "Перехресне підписування та таємне сховище ще не налагоджені.", From 3f2eff5675a5afd3924e827ef5f14de3b49afcdb Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:14:38 +0000 Subject: [PATCH 091/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 6310175449..8f562aa474 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1101,7 +1101,7 @@ "You'll need to authenticate with the server to confirm the upgrade.": "Ви матимете пройти розпізнання на сервері щоб підтвердити поліпшування.", "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Поліпште цей сеанс щоб уможливити звіряння інших сеансів, надаючи їм доступ до зашифрованих повідомлень та позначуючи їх довіреними для інших користувачів.", "Upgrade your encryption": "Поліпшити ваше шифрування", - "Show a placeholder for removed messages": "Показувати плашки замість видалених повідомлень", + "Show a placeholder for removed messages": "Показувати замісну позначку замість видалених повідомлень", "Show join/leave messages (invites/kicks/bans unaffected)": "Показувати повідомлення про приєднання/залишення (не впливає на запрошення/викидання/заборону)", "Show avatar changes": "Показувати зміни личини", "Show display name changes": "Показувати зміни видимого імені", From d3000b0e0d258b787761c80a769d8903635c73ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:17:52 +0000 Subject: [PATCH 092/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 8f562aa474..e19307a5ca 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1121,7 +1121,7 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ви впевнені? Ви загубите ваші зашифровані повідомлення якщо копія ключів не була зроблена коректно.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Зашифровані повідомлення захищені наскрізним шифруванням. Лише ви та отримувачі повідомлень мають ключі для їх читання.", "Display Name": "Видиме ім'я", - "wait and try again later": "почекайте та спробуйте пізніше", + "wait and try again later": "Зачекайте та попробуйте ще раз пізніше", "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Дізнатись більше про шифрування.", "Encrypted": "Зашифроване", "This room is end-to-end encrypted": "Ця кімната є наскрізно зашифрованою", From ad2245134a0f7b0b51d852ba5974c2a3ba9b6cc4 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:16:32 +0000 Subject: [PATCH 093/187] Translated using Weblate (Ukrainian) Currently translated at 53.4% (1450 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index e19307a5ca..85b89a35ca 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -960,7 +960,7 @@ "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.": "Змінення пароля призведе до скидання всіх ключів наскрізного шифрування та унеможливить читання історії листування, якщо тільки ви не експортуєте ваші ключі кімнати та не імпортуєте їх згодом. Це буде вдосконалено у майбутньому.", - "Santa": "Микола", + "Santa": "Св. Миколай", "Gift": "Подарунок", "Lock": "Замок", "Cross-signing and secret storage are not yet set up.": "Перехресне підписування та таємне сховище ще не налагоджені.", From 0460b4681fece0bbb7d244ab00349018d4aebe5f Mon Sep 17 00:00:00 2001 From: strix aluco Date: Tue, 15 Dec 2020 15:19:41 +0000 Subject: [PATCH 094/187] Translated using Weblate (Ukrainian) Currently translated at 53.5% (1452 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 85b89a35ca..0226930146 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1533,5 +1533,6 @@ "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", "No need for symbols, digits, or uppercase letters": "Цифри або великі букви не вимагаються", - "Capitalization doesn't help very much": "Великі букви не дуже допомагають" + "Capitalization doesn't help very much": "Великі букви не дуже допомагають", + "You're all caught up.": "Готово" } From 7cec20a565a98f249904155506ea8b055fe90414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 15 Dec 2020 15:18:37 +0000 Subject: [PATCH 095/187] Translated using Weblate (Ukrainian) Currently translated at 53.5% (1452 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 0226930146..51839a3236 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1534,5 +1534,6 @@ "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", "No need for symbols, digits, or uppercase letters": "Цифри або великі букви не вимагаються", "Capitalization doesn't help very much": "Великі букви не дуже допомагають", - "You're all caught up.": "Готово" + "You're all caught up.": "Готово", + "Hey you. You're the best!": "Гей, ти, так, ти. Ти найкращий!" } From b9d40fb9c2afd52bbb45c2242fdb4f1ff5b4e7f8 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:18:09 +0000 Subject: [PATCH 096/187] Translated using Weblate (Ukrainian) Currently translated at 53.5% (1452 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 51839a3236..0db7179b5b 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1121,7 +1121,7 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ви впевнені? Ви загубите ваші зашифровані повідомлення якщо копія ключів не була зроблена коректно.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Зашифровані повідомлення захищені наскрізним шифруванням. Лише ви та отримувачі повідомлень мають ключі для їх читання.", "Display Name": "Видиме ім'я", - "wait and try again later": "Зачекайте та попробуйте ще раз пізніше", + "wait and try again later": "зачекайте та спопробуйте ще раз пізніше", "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Дізнатись більше про шифрування.", "Encrypted": "Зашифроване", "This room is end-to-end encrypted": "Ця кімната є наскрізно зашифрованою", From 8d16136e4f36746d156a4fdb7686ed0989c5f0ea Mon Sep 17 00:00:00 2001 From: strix aluco Date: Tue, 15 Dec 2020 15:20:40 +0000 Subject: [PATCH 097/187] Translated using Weblate (Ukrainian) Currently translated at 53.5% (1453 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 0db7179b5b..bcabdde2b3 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1535,5 +1535,6 @@ "No need for symbols, digits, or uppercase letters": "Цифри або великі букви не вимагаються", "Capitalization doesn't help very much": "Великі букви не дуже допомагають", "You're all caught up.": "Готово", - "Hey you. You're the best!": "Гей, ти, так, ти. Ти найкращий!" + "Hey you. You're the best!": "Гей, ти, так, ти. Ти найкращий!", + "You’re all caught up": "Готово" } From 03ee5ae9db06a209c1a21e7a54d10ba9b131c873 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:20:07 +0000 Subject: [PATCH 098/187] Translated using Weblate (Ukrainian) Currently translated at 53.5% (1453 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index bcabdde2b3..5ad9b29e62 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1534,7 +1534,7 @@ "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", "No need for symbols, digits, or uppercase letters": "Цифри або великі букви не вимагаються", "Capitalization doesn't help very much": "Великі букви не дуже допомагають", - "You're all caught up.": "Готово", + "You're all caught up.": "Все готово.", "Hey you. You're the best!": "Гей, ти, так, ти. Ти найкращий!", "You’re all caught up": "Готово" } From 5aa8650fac441a71cd5e08ee3023c0d1be4a6851 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 15 Dec 2020 16:27:04 +0000 Subject: [PATCH 099/187] 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 a798772e802621375149e68a66347284f0df68b9 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 15 Dec 2020 16:53:11 +0000 Subject: [PATCH 100/187] Unregister from the dispatcher in CallHandler otherwise you end up getting multiple place_call dispatches if you place a call after logging in --- src/CallHandler.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index 41dc031b06..8bfd798f16 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -118,6 +118,7 @@ function getRemoteAudioElement(): HTMLAudioElement { export default class CallHandler { private calls = new Map(); // roomId -> call private audioPromises = new Map>(); + private dispatcherRef: string; static sharedInstance() { if (!window.mxCallHandler) { @@ -128,7 +129,7 @@ export default class CallHandler { } start() { - dis.register(this.onAction); + this.dispatcherRef = dis.register(this.onAction); // add empty handlers for media actions, otherwise the media keys // end up causing the audio elements with our ring/ringback etc // audio clips in to play. @@ -151,6 +152,7 @@ export default class CallHandler { if (cli) { cli.removeListener('Call.incoming', this.onCallIncoming); } + if (this.dispatcherRef) dis.unregister(this.dispatcherRef); } private onCallIncoming = (call) => { From 14afafdc4dd6ee9b162f6377ca5c54743171b053 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 15 Dec 2020 15:20:54 +0000 Subject: [PATCH 101/187] Translated using Weblate (Ukrainian) Currently translated at 53.5% (1453 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 5ad9b29e62..061c0799ac 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1536,5 +1536,5 @@ "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": "Все готово" } From dad1fdf974a8ad8888a6e3db192b0c0bd78221ba Mon Sep 17 00:00:00 2001 From: random Date: Tue, 15 Dec 2020 10:11:02 +0000 Subject: [PATCH 102/187] Translated using Weblate (Italian) Currently translated at 100.0% (2711 of 2711 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index dd3641981a..74255a6d2a 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2964,5 +2964,12 @@ "See emotes posted to this room": "Vedi emoticon inviate a questa stanza", "Send emotes as you in your active room": "Invia emoticon a tuo nome nella tua stanza attiva", "Send emotes as you in this room": "Invia emoticon a tuo nome in questa stanza", - "Effects": "Effetti" + "Effects": "Effetti", + "Hold": "Sospendi", + "Resume": "Riprendi", + "%(name)s paused": "%(name)s ha messo in pausa", + "%(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" } From 3c66695627557a658c127964fa1f6d48b0f9cad0 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 15 Dec 2020 16:29:59 +0000 Subject: [PATCH 103/187] Translated using Weblate (Czech) Currently translated at 83.8% (2272 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 | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3d448ca071..71d6e4ee86 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2411,5 +2411,40 @@ "Show": "Zobrazit", "Reason (optional)": "Důvod (volitelné)", "Add image (optional)": "Přidat obrázek (volitelné)", - "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Do soukromé místnosti se lze připojit pouze s pozvánkou. Veřejné místnosti lze najít a může se do nich připojit kdokoli." + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Do soukromé místnosti se lze připojit pouze s pozvánkou. Veřejné místnosti lze najít a může se do nich připojit kdokoli.", + "Currently indexing: %(currentRoom)s": "Aktuálně se indexuje: %(currentRoom)s", + "Secure your backup with a recovery passphrase": "Zabezpečte zálohu pomocí fráze pro obnovení", + "%(brand)s Android": "%(brand)s Android", + "%(brand)s iOS": "%(brand)s iOS", + "%(brand)s Desktop": "%(brand)s Desktop", + "%(brand)s Web": "%(brand)s Web", + "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", + "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?", + "Enter phone number": "Zadejte telefonní číslo", + "Enter email address": "Zadejte emailovou adresu", + "Open the link in the email to continue registration.": "Pro pokračování v registraci, otevřete odkaz v e-mailu.", + "A confirmation email has been sent to %(emailAddress)s": "Na adresu %(emailAddress)s byl zaslán potvrzovací e-mail", + "Take a picture": "Vyfotit", + "Hold": "Podržet", + "Resume": "Pokračovat", + "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 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.", + "Homeserver": "Homeserver", + "Continue with %(provider)s": "Pokračovat s %(provider)s", + "Server Options": "Možnosti serveru", + "This version of %(brand)s does not support viewing some encrypted files": "Tato verze %(brand)s nepodporuje zobrazení některých šifrovaných souborů", + "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" } From e51b59c8b5e6ad0262280f6ac52fd318846e57a2 Mon Sep 17 00:00:00 2001 From: XoseM Date: Tue, 15 Dec 2020 04:39:48 +0000 Subject: [PATCH 104/187] Translated using Weblate (Galician) Currently translated at 100.0% (2711 of 2711 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 05ef098860..cc3575dbb3 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2970,5 +2970,6 @@ "%(peerName)s held the call": "%(peerName)s finalizou a chamada", "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" + "Too Many Calls": "Demasiadas chamadas", + "%(name)s paused": "detido por %(name)s" } From a77d675664f86df5bd32ee3eda088de81b36ad70 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 15 Dec 2020 18:01:42 +0000 Subject: [PATCH 105/187] Better null check to make tests happy --- src/CallHandler.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index 8bfd798f16..eaf56b935a 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -118,7 +118,7 @@ function getRemoteAudioElement(): HTMLAudioElement { export default class CallHandler { private calls = new Map(); // roomId -> call private audioPromises = new Map>(); - private dispatcherRef: string; + private dispatcherRef: string = null; static sharedInstance() { if (!window.mxCallHandler) { @@ -152,7 +152,7 @@ export default class CallHandler { if (cli) { cli.removeListener('Call.incoming', this.onCallIncoming); } - if (this.dispatcherRef) dis.unregister(this.dispatcherRef); + if (this.dispatcherRef !== null) dis.unregister(this.dispatcherRef); } private onCallIncoming = (call) => { From 1a60d3ddd5d4107e76681ddd2e0e617b7392249f Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 15 Dec 2020 19:11:02 +0000 Subject: [PATCH 106/187] Translated using Weblate (Czech) Currently translated at 89.2% (2420 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 | 150 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 149 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 71d6e4ee86..1a460e9fa5 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2446,5 +2446,153 @@ "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 komunity", + "Role": "Role", + "Madagascar": "Madagaskar", + "Macedonia": "Makedonie", + "Macau": "Macao", + "Luxembourg": "Lucembursko", + "Lithuania": "Litva", + "Liechtenstein": "Lichtenštejnsko", + "Libya": "Libye", + "Liberia": "Libérie", + "Lesotho": "Lesotho", + "Lebanon": "Libanon", + "Latvia": "Lotyšsko", + "Laos": "Laos", + "Kyrgyzstan": "Kyrgyzstán", + "Myanmar": "Myanmar", + "Mozambique": "Mosambik", + "Morocco": "Maroko", + "Montserrat": "Montserrat", + "Montenegro": "Černá Hora", + "Mongolia": "Mongolsko", + "Monaco": "Monako", + "Moldova": "Moldavsko", + "Micronesia": "Mikronésie", + "Mexico": "Mexiko", + "Mayotte": "Mayotte", + "Mauritius": "Mauricius", + "Mauritania": "Mauretánie", + "Martinique": "Martinik", + "Marshall Islands": "Marshallovy ostrovy", + "Malta": "Malta", + "Mali": "Mali", + "Maldives": "Maledivy", + "Malaysia": "Malajsie", + "Malawi": "Malawi", + "Kuwait": "Kuwait", + "Kosovo": "Kosovo", + "Kiribati": "Kiribati", + "Kenya": "Keňa", + "Kazakhstan": "Kazachstán", + "Congo - Brazzaville": "Kongo - Brazzaville", + "Cambodia": "Kambodža", + "Burundi": "Burundi", + "Burkina Faso": "Burkina Faso", + "Bulgaria": "Bulharsko", + "Brunei": "Brunej", + "British Virgin Islands": "Britské indickooceánské území", + "British Indian Ocean Territory": "Britské indickooceánské území", + "Brazil": "Brazílie", + "Bouvet Island": "Bouvetův ostrov", + "Botswana": "Botswana", + "Bosnia": "Bosna", + "Bolivia": "Bolívie", + "Bhutan": "Bhútán", + "Bermuda": "Bermudy", + "Jordan": "Jordánsko", + "Jersey": "Jersey", + "Japan": "Japonsko", + "Jamaica": "Jamajka", + "Italy": "Itálie", + "Israel": "Izrael", + "Isle of Man": "Ostrov Man", + "Ireland": "Irsko", + "Iraq": "Irák", + "Iran": "Írán", + "Indonesia": "Indonésie", + "India": "Indie", + "Iceland": "Island", + "Hungary": "Maďarsko", + "Hong Kong": "Hong Kong", + "Honduras": "Honduras", + "Heard & McDonald Islands": "Heardovy a McDonaldovy ostrovy", + "Haiti": "Haiti", + "Guyana": "Guyana", + "Guinea-Bissau": "Guinea-Bissau", + "Guinea": "Guinea", + "Guernsey": "Guernsey", + "Guatemala": "Guatemala", + "Guam": "Guam", + "Guadeloupe": "Guadeloupe", + "Grenada": "Grenada", + "Greenland": "Grónsko", + "Greece": "Řecko", + "Gibraltar": "Gibraltar", + "Ghana": "Ghana", + "Germany": "Německo", + "Georgia": "Gruzie", + "Gambia": "Gambie", + "Gabon": "Gabon", + "French Southern Territories": "Francouzská jižní území", + "French Polynesia": "Francouzská Polynésie", + "French Guiana": "Francouzská Guyana", + "France": "Francie", + "Finland": "Finsko", + "Fiji": "Fiji", + "Faroe Islands": "Faerské ostrovy", + "Falkland Islands": "Falklandy", + "Ethiopia": "Etiopie", + "Estonia": "Estonsko", + "Eritrea": "Eritrea", + "Equatorial Guinea": "Rovníková Guinea", + "El Salvador": "El Salvador", + "Egypt": "Egypt", + "Ecuador": "Ekvádor", + "Dominican Republic": "Dominikánská republika", + "Dominica": "Dominika", + "Djibouti": "Džibuti", + "Denmark": "Dánsko", + "Côte d’Ivoire": "Pobřeží slonoviny", + "Cyprus": "Kypr", + "Curaçao": "Curaçao", + "Cuba": "Kuba", + "Croatia": "Chorvatsko", + "Costa Rica": "Kostarika", + "Cook Islands": "Cookovy ostrovy", + "Congo - Kinshasa": "Kongo - Brazzaville", + "Comoros": "Komory", + "Colombia": "Kolumbie", + "Cocos (Keeling) Islands": "Kokosové (Keelingovy) ostrovy", + "Christmas Island": "Vánoční ostrov", + "China": "Čína", + "Chile": "Chile", + "Chad": "Čad", + "Central African Republic": "Středoafrická republika", + "Cayman Islands": "Kajmanské ostrovy", + "Caribbean Netherlands": "Karibské Nizozemsko", + "Cape Verde": "Kapverdy", + "Canada": "Kanada", + "Cameroon": "Kamerun", + "Benin": "Benin", + "Belize": "Belize", + "Belgium": "Belgie", + "Belarus": "Bělorusko", + "Bangladesh": "Bangladéš", + "Barbados": "Barbados", + "Bahrain": "Bahrain", + "Bahamas": "Bahamy", + "Azerbaijan": "Ázerbajdžán", + "Austria": "Rakousko", + "Australia": "Austrálie", + "Aruba": "Aruba", + "Armenia": "Arménie", + "Argentina": "Argentina", + "Antigua & Barbuda": "Antigua a Barbuda", + "Antarctica": "Antarktida", + "Anguilla": "Anguilla", + "Angola": "Angola", + "Andorra": "Andorra", + "American Samoa": "Americká Samoa" } From 9987e4783881d9631d6bb2daa45ae19c078b5bff Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 15 Dec 2020 20:02:49 +0000 Subject: [PATCH 107/187] Translated using Weblate (Czech) Currently translated at 89.4% (2425 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, 9 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 1a460e9fa5..41acc6575e 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2383,7 +2383,7 @@ "This is the start of .": "Toto je začátek místnosti .", "Topic: %(topic)s ": "Téma: %(topic)s ", "Topic: %(topic)s (edit)": "Téma: %(topic)s (upravit)", - "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Zprávy zde jsou šifrovány end-to-end. Ověřte %(displayName)s v jeho profilu - klepněte na jeho avatar.", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Zprávy zde jsou šifrovány end-to-end. Ověřte uživatele %(displayName)s v jeho profilu - klepněte na jeho avatar.", "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.": "Zadejte frázi zabezpečení, kterou znáte jen vy, k ochraně vašich dat. Z důvodu bezpečnosti byste neměli znovu používat heslo k účtu.", "Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Použijte tajnou frázi, kterou znáte pouze vy, a volitelně uložte bezpečnostní klíč, který použijete pro zálohování.", "Enter a Security Phrase": "Zadání bezpečnostní fráze", @@ -2392,8 +2392,8 @@ "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 .", - "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, pokud nikdo z vás nikoho nepozve, aby se připojil.", + "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.", "Invite by email": "Pozvat emailem", @@ -2594,5 +2594,10 @@ "Anguilla": "Anguilla", "Angola": "Angola", "Andorra": "Andorra", - "American Samoa": "Americká Samoa" + "American Samoa": "Americká Samoa", + "Room Info": "Informace o místnosti", + "Enable desktop notifications": "Povolit oznámení na ploše", + "Invalid Recovery Key": "Neplatný klíč pro obnovení", + "Security Key": "Bezpečnostní klíč", + "Use your Security Key to continue.": "Pokračujte pomocí bezpečnostního klíče." } From d1285427aee302ac517ebcabf56703bc300c46e2 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 15 Dec 2020 20:12:37 +0000 Subject: [PATCH 108/187] Translated using Weblate (Czech) Currently translated at 89.5% (2427 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 41acc6575e..0de2ee3a9c 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2599,5 +2599,7 @@ "Enable desktop notifications": "Povolit oznámení na ploše", "Invalid Recovery Key": "Neplatný klíč pro obnovení", "Security Key": "Bezpečnostní klíč", - "Use your Security Key to continue.": "Pokračujte pomocí bezpečnostního klíče." + "Use your Security Key to continue.": "Pokračujte pomocí bezpečnostního klíče.", + "If they don't match, the security of your communication may be compromised.": "Pokud se neshodují, bezpečnost vaší komunikace může být kompromitována.", + "Confirm this user's session by comparing the following with their User Settings:": "Potvrďte relaci tohoto uživatele porovnáním následujícího s jeho uživatelským nastavením:" } From 940fdb8e2f0ee906a779f4d54dc47754634e519b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 16 Dec 2020 10:07:07 +0000 Subject: [PATCH 109/187] Better adhere to MSC process --- src/Login.ts | 2 -- src/components/views/elements/SSOButtons.tsx | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Login.ts b/src/Login.ts index 281906d861..6493b244e0 100644 --- a/src/Login.ts +++ b/src/Login.ts @@ -41,8 +41,6 @@ export interface IIdentityProvider { export interface ISSOFlow { type: "m.login.sso" | "m.login.cas"; - // eslint-disable-next-line camelcase - identity_providers: IIdentityProvider[]; "org.matrix.msc2858.identity_providers": IIdentityProvider[]; // Unstable prefix for MSC2858 } diff --git a/src/components/views/elements/SSOButtons.tsx b/src/components/views/elements/SSOButtons.tsx index f819b48cf6..57dd31f9d6 100644 --- a/src/components/views/elements/SSOButtons.tsx +++ b/src/components/views/elements/SSOButtons.tsx @@ -79,7 +79,7 @@ interface IProps { } const SSOButtons: React.FC = ({matrixClient, flow, loginType, fragmentAfterLogin, primary}) => { - const providers = flow.identity_providers || flow["org.matrix.msc2858.identity_providers"] || []; + const providers = flow["org.matrix.msc2858.identity_providers"] || []; if (providers.length < 2) { return
Date: Wed, 16 Dec 2020 10:21:05 +0000 Subject: [PATCH 110/187] Translated using Weblate (Czech) Currently translated at 94.7% (2570 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 | 151 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 147 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 0de2ee3a9c..dc53febf8f 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -119,7 +119,7 @@ "Error: Problem communicating with the given homeserver.": "Chyba: problém v komunikaci s daným domovským serverem.", "Existing Call": "Probíhající hovor", "Export": "Exportovat", - "Export E2E room keys": "Exportovat end-to-end klíče místnosti", + "Export E2E room keys": "Exportovat end-to-end klíče místností", "Failed to ban user": "Nepodařilo se vykázat uživatele", "Failed to join room": "Vstup do místnosti se nezdařil", "Failed to kick": "Vykopnutí se nezdařilo", @@ -1753,7 +1753,7 @@ "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", + "Workspace: %(networkName)s": "Pracovní oblast: %(networkName)s", "Channel: %(channelName)s": "Kanál: %(channelName)s", "Show less": "Skrýt detaily", "Show more": "Více", @@ -2308,7 +2308,7 @@ "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "Tuto možnost můžete povolit, pokud bude místnost použita pouze pro spolupráci s interními týmy na vašem domovském serveru. Toto nelze později změnit.", "Block anyone not part of %(serverName)s from ever joining this room.": "Blokovat komukoli, kdo není součástí serveru %(serverName)s, aby se nikdy nepřipojil do této místnosti.", "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.": "Zálohujte šifrovací klíče s daty vašeho účtu pro případ, že ztratíte přístup k relacím. Vaše klíče budou zabezpečeny jedinečným klíčem pro obnovení.", - "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Níže můžete spravovat jména a odhlásit se ze svých relací nebo je ověřtit v uživatelském profilu.", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Níže můžete spravovat názvy a odhlásit se ze svých relací nebo je ověřit v uživatelském profilu.", "or another cross-signing capable Matrix client": "nebo jiný Matrix klient schopný cross-signing", "Cross-signing is not set up.": "Cross-signing není nastaveno.", "Cross-signing is ready for use.": "Cross-signing je připraveno k použití.", @@ -2601,5 +2601,148 @@ "Security Key": "Bezpečnostní klíč", "Use your Security Key to continue.": "Pokračujte pomocí bezpečnostního klíče.", "If they don't match, the security of your communication may be compromised.": "Pokud se neshodují, bezpečnost vaší komunikace může být kompromitována.", - "Confirm this user's session by comparing the following with their User Settings:": "Potvrďte relaci tohoto uživatele porovnáním následujícího s jeho uživatelským nastavením:" + "Confirm this user's session by comparing the following with their User Settings:": "Potvrďte relaci tohoto uživatele porovnáním následujícího s jeho uživatelským nastavením:", + "Confirm Security Phrase": "Potvrďte bezpečnostní frázi", + "Privacy": "Soukromí", + "Click the button below to confirm setting up encryption.": "Kliknutím na tlačítko níže potvrďte nastavení šifrování.", + "Confirm encryption setup": "Potvrďte nastavení šifrování", + "Return to call": "Návrat do hovoru", + "Unable to set up keys": "Nepovedlo se nastavit klíče", + "Save your Security Key": "Uložte svůj bezpečnostní klíč", + "We call the places where you can host your account ‘homeservers’.": "Místům, kde můžete hostovat svůj účet, říkáme ‘domovské servery’.", + "About homeservers": "O domovských serverech", + "Learn more": "Zjistit více", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Použijte svůj preferovaný domovský server Matrix, pokud ho máte, nebo hostujte svůj vlastní.", + "Other homeserver": "Jiný domovský server", + "Sign into your homeserver": "Přihlaste se do svého domovského serveru", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org je největší veřejný domovský server na světě, pro mnoho lidí je dobrým místem.", + "not found in storage": "nebylo nalezeno v úložišti", + "ready": "připraven", + "May include members not in %(communityName)s": "Může zahrnovat členy, kteří nejsou v %(communityName)s", + "Specify a homeserver": "Zadejte domovský server", + "Invalid URL": "Neplatné URL", + "Unable to validate homeserver": "Nelze ověřit domovský server", + "New? Create account": "Jste zde nový? Vytvořte si účet", + "Navigate recent messages to edit": "Procházet poslední zprávy k úpravám", + "Navigate composer history": "Procházet historii editoru", + "Cancel replying to a message": "Zrušení odpovědi na zprávu", + "Don't miss a reply": "Nezmeškejte odpovědět", + "Unknown App": "Neznámá aplikace", + "%(name)s paused": "%(name)s pozastaven", + "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Zálohu nebylo možné dešifrovat pomocí tohoto klíče pro obnovení: ověřte, zda jste zadali správný klíč pro obnovení.", + "Move right": "Posunout doprava", + "Move left": "Posunout doleva", + "Go to Home View": "Přejít na domovské zobrazení", + "Dismiss read marker and jump to bottom": "Zavřít značku přečtených zpráv a skočit dolů", + "Previous/next room or DM": "Předchozí/další místnost nebo přímá zpráva", + "Previous/next unread room or DM": "Předchozí/další nepřečtená místnost nebo přímá zpráva", + "Not encrypted": "Není šifrováno", + "New here? Create an account": "Jste zde nový? Vytvořte si účet", + "Got an account? Sign in": "Máte již účet? Přihlásit se", + "This won't invite them to %(communityName)s. To invite someone to %(communityName)s, click here": "Toto je nepozve do %(communityName)s. Chcete-li někoho pozvat na %(communityName)s, klikněte sem", + "Approve widget permissions": "Schválit oprávnění widgetu", + "Enter name": "Zadejte jméno", + "Ignored attempt to disable encryption": "Ignorovaný pokus o deaktivaci šifrování", + "Show chat effects": "Zobrazit efekty chatu", + "%(count)s people|one": "%(count)s člověk", + "Takes the call in the current room off hold": "Zruší podržení hovoru v aktuální místnosti", + "Places the call in the current room on hold": "Podrží hovor v aktuální místnosti", + "Zimbabwe": "Zimbabwe", + "Zambia": "Zambie", + "Yemen": "Jemen", + "Western Sahara": "Západní Sahara", + "Wallis & Futuna": "Wallis a Futuna", + "Vietnam": "Vietnam", + "Venezuela": "Venezuela", + "Vatican City": "Vatikán", + "Vanuatu": "Vanuatu", + "Uzbekistan": "Uzbekistán", + "Uruguay": "Uruguay", + "United Arab Emirates": "Spojené arabské emiráty", + "Ukraine": "Ukrajina", + "Uganda": "Uganda", + "U.S. Virgin Islands": "Panenské ostrovy", + "Tuvalu": "Tuvalu", + "Turks & Caicos Islands": "Ostrovy Turks a Caicos", + "Turkmenistan": "Turkmenistán", + "Turkey": "Turecko", + "Tunisia": "Tunisko", + "Trinidad & Tobago": "Trinidad a Tobago", + "Tonga": "Tonga", + "Tokelau": "Tokelau", + "Togo": "Togo", + "Timor-Leste": "Východní Timor", + "Thailand": "Thajsko", + "Tanzania": "Tanzánie", + "Tajikistan": "Tádžikistán", + "Taiwan": "Taiwan", + "São Tomé & Príncipe": "Svatý Tomáš a Princův ostrov", + "Syria": "Sýrie", + "Switzerland": "Švýcarsko", + "Sweden": "Švédsko", + "Swaziland": "Svazijsko", + "Svalbard & Jan Mayen": "Špicberky a Jan Mayen", + "Suriname": "Surinam", + "Sudan": "Súdán", + "St. Vincent & Grenadines": "Svatý Vincenc a Grenadiny", + "St. Pierre & Miquelon": "Saint Pierre a Miquelon", + "St. Martin": "Svatý Martin", + "St. Lucia": "Svatá Lucie", + "St. Kitts & Nevis": "Svatý Kryštof a Nevis", + "St. Helena": "Svatá Helena", + "St. Barthélemy": "Svatý Bartoloměj", + "Sri Lanka": "Srí Lanka", + "Spain": "Španělsko", + "South Sudan": "Jižní Súdán", + "South Korea": "Jižní Korea", + "South Georgia & South Sandwich Islands": "Jižní Georgie a Jižní Sandwichovy ostrovy", + "South Africa": "Jižní Afrika", + "Somalia": "Somálsko", + "Solomon Islands": "Šalomounovy ostrovy", + "Slovenia": "Slovinsko", + "Slovakia": "Slovensko", + "Sint Maarten": "Sint Maarten", + "Singapore": "Singapur", + "Sierra Leone": "Sierra Leone", + "Seychelles": "Seychely", + "Serbia": "Srbsko", + "Senegal": "Senegal", + "Saudi Arabia": "Saudská arábie", + "San Marino": "San Marino", + "Samoa": "Samoa", + "Réunion": "Réunion", + "Rwanda": "Rwanda", + "Russia": "Rusko", + "Romania": "Rumunsko", + "Qatar": "Katar", + "Puerto Rico": "Portoriko", + "Portugal": "Portugalsko", + "Poland": "Polsko", + "Pitcairn Islands": "Pitcairnovy ostrovy", + "Philippines": "Filipíny", + "Peru": "Peru", + "Paraguay": "Paraguay", + "Papua New Guinea": "Papua-Nová Guinea", + "Panama": "Panama", + "Palestine": "Palestina", + "Palau": "Palau", + "Pakistan": "Pákistán", + "Oman": "Omán", + "Norway": "Norsko", + "Northern Mariana Islands": "Severní Mariany", + "North Korea": "Severní Korea", + "Norfolk Island": "Ostrov Norfolk", + "Niue": "Niue", + "Nigeria": "Nigérie", + "Niger": "Niger", + "Nicaragua": "Nikaragua", + "New Zealand": "Nový Zéland", + "New Caledonia": "Nová Kaledonie", + "Netherlands": "Holandsko", + "Nepal": "Nepál", + "Nauru": "Nauru", + "Namibia": "Namibie", + "Security Phrase": "Bezpečnostní fráze", + "Wrong Recovery Key": "Nesprávný klíč pro obnovení", + "Fetching keys from server...": "Načítání klíčů ze serveru ..." } From 4c2b6f410b9e5d2ace16ad44ae3e8fd0637ffe52 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 16 Dec 2020 10:41:56 +0000 Subject: [PATCH 111/187] fix tests --- src/components/structures/auth/Registration.tsx | 3 +-- test/components/structures/auth/Login-test.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/structures/auth/Registration.tsx b/src/components/structures/auth/Registration.tsx index d1dfa5ea50..095f3d3433 100644 --- a/src/components/structures/auth/Registration.tsx +++ b/src/components/structures/auth/Registration.tsx @@ -462,8 +462,7 @@ export default class Registration extends React.Component { let ssoSection; if (this.state.ssoFlow) { let continueWithSection; - const providers = this.state.ssoFlow["org.matrix.msc2858.identity_providers"] - || this.state.ssoFlow["identity_providers"] || []; + const providers = this.state.ssoFlow["org.matrix.msc2858.identity_providers"] || []; // when there is only a single (or 0) providers we show a wide button with `Continue with X` text if (providers.length > 1) { // i18n: ssoButtons is a placeholder to help translators understand context diff --git a/test/components/structures/auth/Login-test.js b/test/components/structures/auth/Login-test.js index 0631e26cbd..99faeb4b67 100644 --- a/test/components/structures/auth/Login-test.js +++ b/test/components/structures/auth/Login-test.js @@ -133,7 +133,7 @@ describe('Login', function() { root.setState({ flows: [{ type: "m.login.sso", - identity_providers: [{ + "org.matrix.msc2858.identity_providers": [{ id: "a", name: "Provider 1", }, { From 2142a65a9b1f5757d4db168accfc23fc08de0b5e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 16 Dec 2020 10:46:39 +0000 Subject: [PATCH 112/187] delint --- test/components/structures/auth/Login-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/components/structures/auth/Login-test.js b/test/components/structures/auth/Login-test.js index 99faeb4b67..9b73137936 100644 --- a/test/components/structures/auth/Login-test.js +++ b/test/components/structures/auth/Login-test.js @@ -132,7 +132,7 @@ describe('Login', function() { // Set non-empty flows & matrixClient to get past the loading spinner root.setState({ flows: [{ - type: "m.login.sso", + "type": "m.login.sso", "org.matrix.msc2858.identity_providers": [{ id: "a", name: "Provider 1", From 973a0b7b8a07d69fe221471de9b793750a042a42 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 16 Dec 2020 10:53:59 +0000 Subject: [PATCH 113/187] set dispatcher ref to null so we don't double-unregister --- src/CallHandler.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index eaf56b935a..fac4d6fc4e 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -152,7 +152,10 @@ export default class CallHandler { if (cli) { cli.removeListener('Call.incoming', this.onCallIncoming); } - if (this.dispatcherRef !== null) dis.unregister(this.dispatcherRef); + if (this.dispatcherRef !== null) { + dis.unregister(this.dispatcherRef); + this.dispatcherRef = null; + } } private onCallIncoming = (call) => { From 6878e23cb8afb0577066406970d345482f9d7182 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Tue, 15 Dec 2020 21:18:00 +0000 Subject: [PATCH 114/187] Translated using Weblate (Finnish) Currently translated at 91.9% (2493 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 | 49 +++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 70431c6294..842ee436b6 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -702,7 +702,7 @@ "Unable to join network": "Verkkoon liittyminen epäonnistui", "Sorry, your browser is not able to run %(brand)s.": "Valitettavasti %(brand)s ei toimi selaimessasi.", "Uploaded on %(date)s by %(user)s": "Ladattu %(date)s käyttäjän %(user)s toimesta", - "Messages in group chats": "Viestit ryhmäkeskusteluissa", + "Messages in group chats": "Viestit ryhmissä", "Yesterday": "Eilen", "Error encountered (%(errorDetail)s).": "Virhe: %(errorDetail)s.", "Low Priority": "Matala prioriteetti", @@ -765,7 +765,7 @@ "Show join/leave messages (invites/kicks/bans unaffected)": "Näytä liittymisten ja poistumisten viestit (ei vaikuta kutsuihin, huoneesta poistamisiin ja porttikieltoihin)", "Show developer tools": "Näytä kehitystyökalut", "Encrypted messages in one-to-one chats": "Salatut viestit kahdenkeskisissä keskusteluissa", - "Encrypted messages in group chats": "Salatut viestit ryhmäkeskusteluissa", + "Encrypted messages in group chats": "Salatut viestit ryhmissä", "The other party cancelled the verification.": "Toinen osapuoli perui varmennuksen.", "Verified!": "Varmennettu!", "You've successfully verified this user.": "Olet varmentanut tämän käyttäjän.", @@ -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äkeskustelu", + "Create a Group Chat": "Luo ryhmä", "Super": "Super", "Cancel replying to a message": "Peruuta viestiin vastaaminen", "Jump to room search": "Siirry huonehakuun", @@ -2093,8 +2093,8 @@ "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Tämän huoneen viestit ovat salattuja osapuolten välisellä salauksella. Lue lisää ja varmenna tämä käyttäjä hänen profiilistaan.", "Enter the name of a new server you want to explore.": "Syötä sen uuden palvelimen nimi, jota hauat tutkia.", "%(networkName)s rooms": "Verkon %(networkName)s huoneet", - "Destroy cross-signing keys?": "Tuhoa ristivarmennuksen 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.": "Ristivarmennuksen 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 pystyt ristivarmentamaan.", + "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", "Session key": "Istunnon tunnus", @@ -2669,5 +2669,42 @@ "Sign into your homeserver": "Kirjaudu sisään kotipalvelimellesi", "About homeservers": "Tietoa kotipalvelimista", "Not encrypted": "Ei salattu", - "You have no visible notifications in this room.": "Olet nähnyt tämän huoneen kaikki ilmoitukset." + "You have no visible notifications in this room.": "Olet nähnyt tämän huoneen kaikki ilmoitukset.", + "Session verified": "Istunto vahvistettu", + "Verify this login": "Vahvista tämä sisäänkirjautuminen", + "User settings": "Käyttäjäasetukset", + "Community settings": "Yhteisön asetukset", + "Got an account? Sign in": "Sinulla on jo tili? Kirjaudu sisään", + "New here? Create an account": "Uusi täällä? Luo tili", + "Failed to find the general chat for this community": "Tämän yhteisön yleisen keskustelun löytäminen epäonnistui", + "Explore rooms in %(communityName)s": "Tutki %(communityName)s -yhteisön huoneita", + "Delete the room address %(alias)s and remove %(name)s from the directory?": "Poistetaanko huoneosoite %(alias)s ja %(name)s hakemisto?", + "Self-verification request": "Itsevarmennuspyyntö", + "Add a photo so people know it's you.": "Lisää kuva, jotta ihmiset tietävät, että se olet sinä.", + "Great, that'll help people know it's you": "Hienoa, tämä auttaa ihmisiä tietämään, että se olet sinä", + "Attach files from chat or just drag and drop them anywhere in a room.": "Liitä tiedostot keskustelusta tai vedä ja pudota ne mihin tahansa huoneeseen.", + "Use email or phone to optionally be discoverable by existing contacts.": "Käytä sähköpostiosoitetta tai puhelinnumeroa, jos haluat olla löydettävissä nykyisille yhteystiedoille.", + "Use email to optionally be discoverable by existing contacts.": "Käytä sähköpostiosoitetta, jos haluat olla löydettävissä nykyisille yhteystiedoille.", + "Add an email to be able to reset your password.": "Lisää sähköpostiosoite, jotta voit nollata salasanasi.", + "Forgot password?": "Unohtuiko salasana?", + "That phone number doesn't look quite right, please check and try again": "Tämä puhelinnumero ei näytä oikealta, tarkista se ja yritä uudelleen", + "Move right": "Siirry oikealle", + "Move left": "Siirry vasemmalle", + "Revoke permissions": "Peruuta käyttöoikeudet", + "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.": "Varoitus: Henkilökohtaiset tietosi (mukaan lukien salausavaimet) tallennetaan edelleen tähän istuntoon. Poista ne jos lopetat istunnon käytön, tai haluat kirjautua toiselle tilille.", + "You're all caught up.": "Olet ajan tasalla.", + "Unable to validate homeserver": "Kotipalvelimen vahvistus epäonnistui", + "This version of %(brand)s does not support searching encrypted messages": "Tämä %(brand)s-versio ei tue salattujen viestien hakua", + "This version of %(brand)s does not support viewing some encrypted files": "Tämä %(brand)s-versio ei tue joidenkin salattujen tiedostojen katselua", + "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.", + "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", + "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." } From 66b682fa99f7441a0ed023f102c078700058c8d8 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 16 Dec 2020 11:42:34 +0000 Subject: [PATCH 115/187] Translated using Weblate (Czech) Currently translated at 95.0% (2577 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index dc53febf8f..3f9d231317 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2744,5 +2744,12 @@ "Namibia": "Namibie", "Security Phrase": "Bezpečnostní fráze", "Wrong Recovery Key": "Nesprávný klíč pro obnovení", - "Fetching keys from server...": "Načítání klíčů ze serveru ..." + "Fetching keys from server...": "Načítání klíčů ze serveru ...", + "Use Command + Enter to send a message": "K odeslání zprávy použijte Command + Enter", + "Use Ctrl + Enter to send a message": "K odeslání zprávy použijte Ctrl + Enter", + "Decide where your account is hosted": "Rozhodněte, kde je váš účet hostován", + "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" } From 9f8a5f5107c50e3ff1e1bb7ae58a2386f957cf28 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 16 Dec 2020 14:22:44 +0000 Subject: [PATCH 116/187] Upgrade matrix-js-sdk to 9.4.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 b328823b24..44bddbbb53 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,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.4.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 1a6a0b0fb3..5d31179fb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6512,9 +6512,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.3.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ff6612f9d0aa1a7c08b65a0b41c5ab997506016f" +matrix-js-sdk@9.4.0-rc.1: + version "9.4.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.0-rc.1.tgz#1aa983e474825b8156033ad83470e1d5690d6588" + integrity sha512-JeHPktQhRL3rl9DCuWBcZgYw3y6p84jKgHs4729tG5MfVVHMdx+n9IsUNPSJeZ/PkgoFpwMJgTiRZX0vszvLAQ== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 88ef854349a6a19be27f1ea59d642f80fc5fb3bd Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 16 Dec 2020 14:34:25 +0000 Subject: [PATCH 117/187] Prepare changelog for v3.11.0-rc.1 --- CHANGELOG.md | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 151888a17e..fde7c852b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,83 @@ +Changes in [3.11.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.0-rc.1) (2020-12-16) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.10.0...v3.11.0-rc.1) + + * Upgrade JS SDK to 9.4.0-rc.1 + * Translations update from Weblate + [\#5497](https://github.com/matrix-org/matrix-react-sdk/pull/5497) + * Unregister from the dispatcher in CallHandler + [\#5495](https://github.com/matrix-org/matrix-react-sdk/pull/5495) + * Better adhere to MSC process + [\#5496](https://github.com/matrix-org/matrix-react-sdk/pull/5496) + * Use random pickle key on all platforms + [\#5483](https://github.com/matrix-org/matrix-react-sdk/pull/5483) + * Fix mx_MemberList icons + [\#5492](https://github.com/matrix-org/matrix-react-sdk/pull/5492) + * Convert InviteDialog to TypeScript + [\#5491](https://github.com/matrix-org/matrix-react-sdk/pull/5491) + * Add keyboard shortcut for emoji reactions + [\#5425](https://github.com/matrix-org/matrix-react-sdk/pull/5425) + * Run chat effects on events sent by widgets too + [\#5488](https://github.com/matrix-org/matrix-react-sdk/pull/5488) + * Fix being unable to pin widgets + [\#5487](https://github.com/matrix-org/matrix-react-sdk/pull/5487) + * Line 1 / 2 Support + [\#5468](https://github.com/matrix-org/matrix-react-sdk/pull/5468) + * Remove impossible labs feature: sending hidden read receipts + [\#5484](https://github.com/matrix-org/matrix-react-sdk/pull/5484) + * Fix height of Remote Video in call + [\#5456](https://github.com/matrix-org/matrix-react-sdk/pull/5456) + * Add UI for hold functionality + [\#5446](https://github.com/matrix-org/matrix-react-sdk/pull/5446) + * Allow SearchBox to expand to fill width + [\#5411](https://github.com/matrix-org/matrix-react-sdk/pull/5411) + * Use room alias in generated permalink for rooms + [\#5451](https://github.com/matrix-org/matrix-react-sdk/pull/5451) + * Only show confetti if the current room is receiving an appropriate event + [\#5482](https://github.com/matrix-org/matrix-react-sdk/pull/5482) + * Throttle RoomState.members handler to improve performance + [\#5481](https://github.com/matrix-org/matrix-react-sdk/pull/5481) + * Handle manual hs urls better for the server picker + [\#5477](https://github.com/matrix-org/matrix-react-sdk/pull/5477) + * Add Olm as a dev dependency for types + [\#5479](https://github.com/matrix-org/matrix-react-sdk/pull/5479) + * Hide Invite to this room CTA if no permission + [\#5476](https://github.com/matrix-org/matrix-react-sdk/pull/5476) + * Fix width of underline in server picker dialog + [\#5478](https://github.com/matrix-org/matrix-react-sdk/pull/5478) + * Fix confetti room unread state check + [\#5475](https://github.com/matrix-org/matrix-react-sdk/pull/5475) + * Show confetti in a chat room on command or emoji + [\#5140](https://github.com/matrix-org/matrix-react-sdk/pull/5140) + * Fix inverted settings default value + [\#5391](https://github.com/matrix-org/matrix-react-sdk/pull/5391) + * Improve usability of the Server Picker Dialog + [\#5474](https://github.com/matrix-org/matrix-react-sdk/pull/5474) + * Fix typos in some strings + [\#5473](https://github.com/matrix-org/matrix-react-sdk/pull/5473) + * Bump highlight.js from 10.1.2 to 10.4.1 + [\#5472](https://github.com/matrix-org/matrix-react-sdk/pull/5472) + * Remove old app test script path + [\#5471](https://github.com/matrix-org/matrix-react-sdk/pull/5471) + * add support for giving reason when redacting + [\#5260](https://github.com/matrix-org/matrix-react-sdk/pull/5260) + * Add support for Netlify to fetchdep script + [\#5469](https://github.com/matrix-org/matrix-react-sdk/pull/5469) + * Nest other layers inside on automation + [\#5467](https://github.com/matrix-org/matrix-react-sdk/pull/5467) + * Rebrand various CI scripts and modules + [\#5466](https://github.com/matrix-org/matrix-react-sdk/pull/5466) + * Add more widget sanity checking + [\#5462](https://github.com/matrix-org/matrix-react-sdk/pull/5462) + * Fix React complaining about unknown DOM props + [\#5465](https://github.com/matrix-org/matrix-react-sdk/pull/5465) + * Jump to home page when leaving a room + [\#5464](https://github.com/matrix-org/matrix-react-sdk/pull/5464) + * Fix SSO buttons for Social Logins + [\#5463](https://github.com/matrix-org/matrix-react-sdk/pull/5463) + * Social Login and login delight tweaks + [\#5426](https://github.com/matrix-org/matrix-react-sdk/pull/5426) + Changes in [3.10.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.10.0) (2020-12-07) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.10.0-rc.1...v3.10.0) From 68b7538fca592a4018f00292ba9f3633cbae6649 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 16 Dec 2020 14:34:25 +0000 Subject: [PATCH 118/187] v3.11.0-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44bddbbb53..05d403540e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.10.0", + "version": "3.11.0-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From d2ee89fa744592355468e9bf233eb7cca5ad8b03 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 16 Dec 2020 15:57:56 +0000 Subject: [PATCH 119/187] Upgrade matrix-js-sdk to 9.4.0-rc.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 05d403540e..2c32373dd2 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "9.4.0-rc.1", + "matrix-js-sdk": "9.4.0-rc.2", "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 5d31179fb0..66c4fe2ae1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6512,10 +6512,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.4.0-rc.1: - version "9.4.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.0-rc.1.tgz#1aa983e474825b8156033ad83470e1d5690d6588" - integrity sha512-JeHPktQhRL3rl9DCuWBcZgYw3y6p84jKgHs4729tG5MfVVHMdx+n9IsUNPSJeZ/PkgoFpwMJgTiRZX0vszvLAQ== +matrix-js-sdk@9.4.0-rc.2: + version "9.4.0-rc.2" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.0-rc.2.tgz#8cd0eb9a76445c63e152ff7c8eb708513a67481e" + integrity sha512-Z2GJ0uv+/0IlwoAyducBBVZUTe4COyKtl6kanZNHK4kSGYZ/8pilTtMBj8fJJtWubOiZ6HxtaLEXrxulOJF+TA== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 01c3b79458edbcb75274b2642a4c5a0b5c4b4412 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 16 Dec 2020 16:27:15 +0000 Subject: [PATCH 120/187] Prepare changelog for v3.11.0-rc.2 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fde7c852b8..99d0aab14b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +Changes in [3.11.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.0-rc.2) (2020-12-16) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.0-rc.1...v3.11.0-rc.2) + + * Upgrade JS SDK to 9.4.0-rc.2 + Changes in [3.11.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.0-rc.1) (2020-12-16) =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.10.0...v3.11.0-rc.1) From caf795e5c2dcba575a64659036e96b9a4a16f586 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 16 Dec 2020 16:27:16 +0000 Subject: [PATCH 121/187] v3.11.0-rc.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2c32373dd2..2a3a2064f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.11.0-rc.1", + "version": "3.11.0-rc.2", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 1b2cfa5f05d3576612e7bf1e7c72b9d7d9c38163 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 17 Dec 2020 10:34:49 +0000 Subject: [PATCH 122/187] Social Login support both https and mxc icons --- src/components/views/elements/SSOButtons.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/SSOButtons.tsx b/src/components/views/elements/SSOButtons.tsx index 57dd31f9d6..89356ecf5c 100644 --- a/src/components/views/elements/SSOButtons.tsx +++ b/src/components/views/elements/SSOButtons.tsx @@ -45,8 +45,13 @@ const SSOButton: React.FC = ({ }; let icon; - if (idp && idp.icon && idp.icon.startsWith("https://")) { - icon = {label}; + if (typeof idp?.icon === "string" && idp.icon.startsWith("mxc://") || idp.icon.startsWith("https://")) { + icon = {label}; } const classes = classNames("mx_SSOButton", { From f2214c0367c64482953091f3037a05a5099c4467 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 17 Dec 2020 10:43:53 +0000 Subject: [PATCH 123/187] Fix room list help prompt alignment --- res/css/views/rooms/_RoomList.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/css/views/rooms/_RoomList.scss b/res/css/views/rooms/_RoomList.scss index 6ea99585d2..b7759d265f 100644 --- a/res/css/views/rooms/_RoomList.scss +++ b/res/css/views/rooms/_RoomList.scss @@ -41,6 +41,8 @@ limitations under the License. padding: 0 0 0 24px; font-size: inherit; margin-top: 8px; + display: block; + text-align: start; &::before { content: ''; From c498609f7994de4139509eecb45c2e7787bdafbb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 17 Dec 2020 10:47:03 +0000 Subject: [PATCH 124/187] Fix padding in confirmation email registration prompt --- res/css/views/auth/_InteractiveAuthEntryComponents.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/auth/_InteractiveAuthEntryComponents.scss b/res/css/views/auth/_InteractiveAuthEntryComponents.scss index 0a5ac9b2bc..5df73b139f 100644 --- a/res/css/views/auth/_InteractiveAuthEntryComponents.scss +++ b/res/css/views/auth/_InteractiveAuthEntryComponents.scss @@ -15,7 +15,7 @@ limitations under the License. */ .mx_InteractiveAuthEntryComponents_emailWrapper { - padding-right: 60px; + padding-right: 100px; position: relative; margin-top: 32px; margin-bottom: 32px; From 2567fcd045c3888fdbb69901e56ba465053066e9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 17 Dec 2020 12:02:16 +0000 Subject: [PATCH 125/187] add brackets for operator precedence --- src/components/views/elements/SSOButtons.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/SSOButtons.tsx b/src/components/views/elements/SSOButtons.tsx index 89356ecf5c..2416e76119 100644 --- a/src/components/views/elements/SSOButtons.tsx +++ b/src/components/views/elements/SSOButtons.tsx @@ -45,7 +45,7 @@ const SSOButton: React.FC = ({ }; let icon; - if (typeof idp?.icon === "string" && idp.icon.startsWith("mxc://") || idp.icon.startsWith("https://")) { + if (typeof idp?.icon === "string" && (idp.icon.startsWith("mxc://") || idp.icon.startsWith("https://"))) { icon = Date: Thu, 17 Dec 2020 10:47:03 +0000 Subject: [PATCH 126/187] Fix padding in confirmation email registration prompt --- res/css/views/auth/_InteractiveAuthEntryComponents.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/auth/_InteractiveAuthEntryComponents.scss b/res/css/views/auth/_InteractiveAuthEntryComponents.scss index 0a5ac9b2bc..5df73b139f 100644 --- a/res/css/views/auth/_InteractiveAuthEntryComponents.scss +++ b/res/css/views/auth/_InteractiveAuthEntryComponents.scss @@ -15,7 +15,7 @@ limitations under the License. */ .mx_InteractiveAuthEntryComponents_emailWrapper { - padding-right: 60px; + padding-right: 100px; position: relative; margin-top: 32px; margin-bottom: 32px; From 380b7296922d83e168703372b88fb1339965384e Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Thu, 17 Dec 2020 16:57:59 +0100 Subject: [PATCH 127/187] fireworks effect added --- src/effects/fireworks/index.ts | 167 +++++++++++++++++++++++++++++++++ src/effects/index.ts | 17 ++++ src/i18n/strings/en_EN.json | 2 + 3 files changed, 186 insertions(+) create mode 100644 src/effects/fireworks/index.ts diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts new file mode 100644 index 0000000000..7c84e31f1d --- /dev/null +++ b/src/effects/fireworks/index.ts @@ -0,0 +1,167 @@ +/* + Copyright 2020 Nurjin Jafar + Copyright 2020 Nordeck IT + Consulting GmbH. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import ICanvasEffect from '../ICanvasEffect'; + +export type FireworksOptions = { + /** + * the maximum number of the fireworks + */ + maxCount: number, + /** + * the alpha opacity of the fireworks (between 0 and 1, where 1 is opaque and 0 is invisible) + */ + gravity: number, + probability: number, +} + +type FireworksParticle = { + color: string, + x: number, + y: number, + vx: number, + vy: number, + alpha: number, + w: number, + h: number +} + +export const DefaultOptions: FireworksOptions = { + maxCount: 500, + gravity: 0.05, + probability: 0.04, +}; + +export default class Fireworks implements ICanvasEffect { + private readonly options: FireworksOptions; + + constructor(options: { [key: string]: any }) { + this.options = {...DefaultOptions, ...options}; + } + + private context: CanvasRenderingContext2D | null = null; + private supportsAnimationFrame = window.requestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000/60); + }; + private particles: Array = []; + public isRunning: boolean; + + public start = async (canvas: HTMLCanvasElement, timeout = 4000) => { + if (!canvas) { + return; + } + this.isRunning = true; + this.context = canvas.getContext('2d'); + this.supportsAnimationFrame.call(window, this.updateWorld); + if (timeout) { + window.setTimeout(this.stop, timeout); + } + } + + private updateWorld = () => { + if (!this.isRunning) return; + this.update(); + this.paint(); + this.supportsAnimationFrame.call(window, this.updateWorld); + } + private update = () => { + if (this.particles.length < this.options.maxCount && Math.random() < this.options.probability) { + this.createFirework(); + } + const alive = []; + for (let i=0; i { + if (!this.context || !this.context.canvas) return; + this.context.globalCompositeOperation = 'source-over'; + this.context.fillStyle = "rgba(0,0,0,0.2)"; + this.context.canvas.style.opacity = "0.8"; + this.context.fillRect(0, 0, this.context.canvas.width, this.context.canvas.height); + this.context.globalCompositeOperation = 'lighter'; + for (let i=0; i { + if (!this.context || !this.context.canvas) return; + const width = this.context.canvas.width; + const height = this.context.canvas.height; + const xPoint = Math.random() * (width - 200) + 100; + const yPoint = Math.random() * (height - 200) + 100; + const nFire = Math.random() * 50 + 100; + const color = "rgb("+(~~(Math.random()*200+55))+"," + +(~~(Math.random()*200+55))+","+(~~(Math.random()*200+55))+")"; + for (let i=0; i{}; + particle.color = color; + particle.w = particle.h = Math.random() * 4 + 1; + particle.x = xPoint - particle.w / 2; + particle.y = yPoint - particle.h / 2; + particle.vx = (Math.random()-0.5)*10; + particle.vy = (Math.random()-0.5)*10; + particle.alpha = Math.random()*.5+.5; + const vy = Math.sqrt(25 - particle.vx * particle.vx); + if (Math.abs(particle.vy) > vy) { + particle.vy = particle.vy > 0 ? vy: -vy; + } + this.particles.push(particle); + } + } + + public stop = async () => { + this.isRunning = false; + this.particles = []; + this.context.canvas.style.opacity = "1"; + this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); + } + + private drawParticle = (particle: FireworksParticle): void => { + if (!this.context || !this.context.canvas) { + return; + } + this.context.save(); + this.context.beginPath(); + + this.context.translate(particle.x + particle.w / 2, particle.y + particle.h / 2); + this.context.arc(0, 0, particle.w, 0, Math.PI * 2); + this.context.fillStyle = particle.color; + this.context.globalAlpha = particle.alpha; + + this.context.closePath(); + this.context.fill(); + this.context.restore(); + } + + + private move = (particle: FireworksParticle) => { + particle.x += particle.vx; + particle.vy += this.options.gravity; + particle.y += particle.vy; + particle.alpha -= 0.01; + return !(particle.x <= -particle.w || particle.x >= screen.width || + particle.y >= screen.height || + particle.alpha <= 0); + } +} diff --git a/src/effects/index.ts b/src/effects/index.ts index 16a0851070..27ed73622f 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -64,6 +64,11 @@ type ConfettiOptions = { * use gradient instead of solid particle color */ gradient: boolean, +}; +type FireworksOptions = { + maxCount: number, + gravity: number, + probability: number, } /** @@ -84,6 +89,18 @@ export const CHAT_EFFECTS: Array> = [ gradient: false, }, } as Effect, + { + emojis: ['🎆'], + msgType: 'nic.custom.fireworks', + command: 'fireworks', + description: () => _td("Sends the given message with fireworks"), + fallbackMessage: () => _t("sends fireworks") + "🎆", + options: { + maxCount: 500, + gravity: 0.05, + probability: 0.04, + }, + } as Effect, ]; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 1b5d4b6ec4..6d4c0dad4d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -848,6 +848,8 @@ "This is your list of users/servers you have blocked - don't leave the room!": "This is your list of users/servers you have blocked - don't leave the room!", "Sends the given message with confetti": "Sends the given message with confetti", "sends confetti": "sends confetti", + "Sends the given message with fireworks": "Sends the given message with fireworks", + "sends fireworks": "sends fireworks", "Video Call": "Video Call", "Voice Call": "Voice Call", "Fill Screen": "Fill Screen", From 8350b4152be03983840922b598d81ada5a793710 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 17 Dec 2020 17:16:00 +0000 Subject: [PATCH 128/187] Import from src in IncomingCallBox.tsx --- src/components/views/voip/IncomingCallBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/voip/IncomingCallBox.tsx b/src/components/views/voip/IncomingCallBox.tsx index 0403a9eb75..8e1d23e38e 100644 --- a/src/components/views/voip/IncomingCallBox.tsx +++ b/src/components/views/voip/IncomingCallBox.tsx @@ -24,7 +24,7 @@ import { ActionPayload } from '../../../dispatcher/payloads'; import CallHandler from '../../../CallHandler'; import RoomAvatar from '../avatars/RoomAvatar'; import FormButton from '../elements/FormButton'; -import { CallState } from 'matrix-js-sdk/lib/webrtc/call'; +import { CallState } from 'matrix-js-sdk/src/webrtc/call'; interface IProps { } From 98a1b7a2d8bc71bbb274b66e20f18fe6aaefc3f9 Mon Sep 17 00:00:00 2001 From: Emmanouil Kampitakis Date: Thu, 10 Dec 2020 12:19:13 +0100 Subject: [PATCH 129/187] Add the tableflip slashcommand Signed-off-by: Emmanouil Kampitakis --- src/SlashCommands.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index e2ae875ac3..8c86b8bcb6 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -166,6 +166,19 @@ export const Commands = [ }, category: CommandCategories.messages, }), + new Command({ + command: 'tableflip', + args: '', + description: _td('Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message'), + runFn: function(roomId, args) { + let message = '(╯°□°)╯︵ ┻━┻'; + if (args) { + message = message + ' ' + args; + } + return success(MatrixClientPeg.get().sendTextMessage(roomId, message)); + }, + category: CommandCategories.messages, + }), new Command({ command: 'lenny', args: '', From f4d366821404a8cd535cdf47cf6e421d9d25276e Mon Sep 17 00:00:00 2001 From: Emmanouil Kampitakis Date: Thu, 10 Dec 2020 12:19:30 +0100 Subject: [PATCH 130/187] Add the unflip slashcommand Signed-off-by: Emmanouil Kampitakis --- src/SlashCommands.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index 8c86b8bcb6..79c21c4af5 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -179,6 +179,19 @@ export const Commands = [ }, category: CommandCategories.messages, }), + new Command({ + command: 'unflip', + args: '', + description: _td('Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message'), + runFn: function(roomId, args) { + let message = '┬──┬ ノ( ゜-゜ノ)'; + if (args) { + message = message + ' ' + args; + } + return success(MatrixClientPeg.get().sendTextMessage(roomId, message)); + }, + category: CommandCategories.messages, + }), new Command({ command: 'lenny', args: '', From 2488a8f1eecda73e61b2aed42fe102c10900df7c Mon Sep 17 00:00:00 2001 From: Emmanouil Kampitakis Date: Wed, 16 Dec 2020 11:48:00 +0100 Subject: [PATCH 131/187] Add string-translation for english Signed-off-by: Emmanouil Kampitakis --- src/i18n/strings/en_EN.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index eb1d0a632e..f8ef44763d 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", From ad32f90beb8b2f8beebb4b547fd97ba6335b1fa6 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 17 Dec 2020 13:09:35 +0000 Subject: [PATCH 132/187] 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 133/187] 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 134/187] 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 453575d70acc51b16cb4374b9b9e6fd93a4978af Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 18 Dec 2020 13:46:58 +0000 Subject: [PATCH 135/187] Don't play call end sound for calls that never started --- src/CallHandler.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index fac4d6fc4e..7160657c07 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -341,7 +341,8 @@ export default class CallHandler { title: _t("Answered Elsewhere"), description: _t("The call was answered on another device."), }); - } else { + } else if (oldState !== CallState.Fledgling) { + // don't play the end-call sound for calls that never got off the ground this.play(AudioID.CallEnd); } } From 88d3de710a96d280bd84cd54aa1f6abe3dbd1d77 Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Fri, 18 Dec 2020 14:51:58 +0100 Subject: [PATCH 136/187] comments added --- src/effects/fireworks/index.ts | 19 +++++++++++++++++-- src/effects/index.ts | 6 ++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 7c84e31f1d..3cc209eda3 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -19,23 +19,38 @@ import ICanvasEffect from '../ICanvasEffect'; export type FireworksOptions = { /** - * the maximum number of the fireworks + * max fireworks count */ maxCount: number, /** - * the alpha opacity of the fireworks (between 0 and 1, where 1 is opaque and 0 is invisible) + * gravity value that firework adds to shift from it's start position */ gravity: number, probability: number, } type FireworksParticle = { + /** + * color + */ color: string, + /** + * x,y are the point where the particle starts to position on canvas + */ x: number, y: number, + /** + * vx,vy shift values from x and y + */ vx: number, vy: number, + /** + * the alpha opacity of the firework particle (between 0 and 1, where 1 is opaque and 0 is invisible) + */ alpha: number, + /** + * w,h width and height + */ w: number, h: number } diff --git a/src/effects/index.ts b/src/effects/index.ts index 27ed73622f..07aaa5e736 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -66,7 +66,13 @@ type ConfettiOptions = { gradient: boolean, }; type FireworksOptions = { + /** + * max fireworks count + */ maxCount: number, + /** + * gravity value that firework adds to shift from it's start position + */ gravity: number, probability: number, } From 23058112713eb06a459cfd727b96d5becee55d07 Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Fri, 18 Dec 2020 15:30:50 +0100 Subject: [PATCH 137/187] changed canvas globalCompositeOperation value and removed probability --- src/effects/fireworks/index.ts | 9 +++------ src/effects/index.ts | 2 -- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 3cc209eda3..b9898b8b22 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -26,7 +26,6 @@ export type FireworksOptions = { * gravity value that firework adds to shift from it's start position */ gravity: number, - probability: number, } type FireworksParticle = { @@ -58,7 +57,6 @@ type FireworksParticle = { export const DefaultOptions: FireworksOptions = { maxCount: 500, gravity: 0.05, - probability: 0.04, }; export default class Fireworks implements ICanvasEffect { @@ -95,7 +93,7 @@ export default class Fireworks implements ICanvasEffect { this.supportsAnimationFrame.call(window, this.updateWorld); } private update = () => { - if (this.particles.length < this.options.maxCount && Math.random() < this.options.probability) { + if (this.particles.length < this.options.maxCount) { this.createFirework(); } const alive = []; @@ -109,9 +107,8 @@ export default class Fireworks implements ICanvasEffect { private paint = () => { if (!this.context || !this.context.canvas) return; - this.context.globalCompositeOperation = 'source-over'; - this.context.fillStyle = "rgba(0,0,0,0.2)"; - this.context.canvas.style.opacity = "0.8"; + this.context.globalCompositeOperation = 'destination-out'; + this.context.fillStyle = "rgba(0,0,0,0.5)"; this.context.fillRect(0, 0, this.context.canvas.width, this.context.canvas.height); this.context.globalCompositeOperation = 'lighter'; for (let i=0; i> = [ options: { maxCount: 500, gravity: 0.05, - probability: 0.04, }, } as Effect, ]; From 3d1327ecec3d601480aac74e03afbc27facc5f09 Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Fri, 18 Dec 2020 15:32:44 +0100 Subject: [PATCH 138/187] removed unnecessary opacity --- src/effects/fireworks/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index b9898b8b22..ee32c9ac9c 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -145,7 +145,6 @@ export default class Fireworks implements ICanvasEffect { public stop = async () => { this.isRunning = false; this.particles = []; - this.context.canvas.style.opacity = "1"; this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); } From b22c28eac9d8bce4c745101df63e25fa795c651e Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 18 Dec 2020 14:49:28 +0000 Subject: [PATCH 139/187] 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 140/187] 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 141/187] 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 63e99ecf934d06b66d33fa2a1f0e7e3857c1eda6 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 18 Dec 2020 18:08:04 +0000 Subject: [PATCH 142/187] Visual fixups for call UI * Add bottom margin on PiP view * Remove avatar blurring & pause icon for held calls * Change background of incoming call box to match PiP view * Put drop shadow & border radius on PiP view & incoming call box rather than the CallContainer they're in (so they each have their own drop shadow / rounded corners). * Add margin between incoming call box and PiP view --- res/css/views/voip/_CallContainer.scss | 7 +++---- res/css/views/voip/_CallView.scss | 10 ++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/res/css/views/voip/_CallContainer.scss b/res/css/views/voip/_CallContainer.scss index eec8a1f188..ae1d37de71 100644 --- a/res/css/views/voip/_CallContainer.scss +++ b/res/css/views/voip/_CallContainer.scss @@ -18,10 +18,7 @@ limitations under the License. position: absolute; right: 20px; bottom: 72px; - border-radius: 8px; - overflow: hidden; z-index: 100; - box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); // Disable pointer events for Jitsi widgets to function. Direct // calls have their own cursor and behaviour, but we need to make @@ -49,8 +46,10 @@ limitations under the License. .mx_IncomingCallBox { min-width: 250px; - background-color: $primary-bg-color; + background-color: $secondary-accent-color; padding: 8px; + box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); + border-radius: 8px; pointer-events: initial; // restore pointer events so the user can accept/decline cursor: pointer; diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index dbe2c27e41..ad63604818 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -35,6 +35,10 @@ limitations under the License. .mx_CallView_pip { width: 320px; + padding-bottom: 8px; + margin-top: 10px; + box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); + border-radius: 8px; .mx_CallView_voice { height: 180px; @@ -84,6 +88,7 @@ limitations under the License. border-radius: 2000px; overflow: hidden; position: relative; + /* Blurred avatar images & pause icon for on-hold removed for now &::after { position: absolute; content: ''; @@ -101,17 +106,21 @@ limitations under the License. .mx_CallView_pip &::after { background-size: 30px; } + */ } + /* .mx_BaseAvatar { filter: blur(20px); overflow: hidden; } + */ } .mx_CallView_voice_secondaryAvatarContainer { border-radius: 2000px; overflow: hidden; position: relative; + /* &::after { position: absolute; content: ''; @@ -129,6 +138,7 @@ limitations under the License. .mx_CallView_pip &::after { background-size: 24px; } + */ } .mx_CallView_voice_holdText { From eab764a3c8b4c76805571234d44b34e2c0f5d39b Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 18 Dec 2020 19:35:41 +0000 Subject: [PATCH 143/187] Vary resume link text Use 'Switch' if unholding that call would hold another --- src/CallHandler.tsx | 12 ++++++++++++ src/components/views/voip/CallView.tsx | 6 ++++-- src/i18n/strings/en_EN.json | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index fac4d6fc4e..8ce0da36dc 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -616,6 +616,18 @@ export default class CallHandler { } } + /** + * @returns true if we are currently in anu call where we haven't put the remote party on hold + */ + hasAnyUnheldCall() { + for (const call of this.calls.values()) { + if (call.state === CallState.Ended) continue; + if (!call.isRemoteOnHold()) return true; + } + + return false; + } + private async startCallApp(roomId: string, type: string) { dis.dispatch({ action: 'appsDrawer', diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 65ba693b58..495a99d53c 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -19,7 +19,7 @@ import React, { createRef, CSSProperties, ReactNode } from 'react'; import dis from '../../../dispatcher/dispatcher'; import CallHandler from '../../../CallHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import { _t } from '../../../languageHandler'; +import { _t, _td } from '../../../languageHandler'; import VideoFeed, { VideoFeedType } from "./VideoFeed"; import RoomAvatar from "../avatars/RoomAvatar"; import { CallState, CallType, MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; @@ -423,7 +423,9 @@ export default class CallView extends React.Component { const isOnHold = this.state.isLocalOnHold || this.state.isRemoteOnHold; let onHoldText = null; if (this.state.isRemoteOnHold) { - onHoldText = _t("You held the call Resume", {}, { + const holdString = CallHandler.sharedInstance().hasAnyUnheldCall() ? + _td("You held the call Switch") : _td("You held the call Resume"); + onHoldText = _t(holdString, {}, { a: sub => {sub} , diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index eb1d0a632e..f91576bc4a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -847,6 +847,7 @@ "This is your list of users/servers you have blocked - don't leave the room!": "This is your list of users/servers you have blocked - don't leave the room!", "Sends the given message with confetti": "Sends the given message with confetti", "sends confetti": "sends confetti", + "You held the call Switch": "You held the call Switch", "You held the call Resume": "You held the call Resume", "%(peerName)s held the call": "%(peerName)s held the call", "Video Call": "Video Call", From aee861956c45f9c7406a1f59fda27d5770fa7f9e Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 18 Dec 2020 19:40:57 +0000 Subject: [PATCH 144/187] Remove secondary call avatar and change 'paused' to 'on hold' --- res/css/views/voip/_CallView.scss | 25 ------------------------- src/components/views/voip/CallView.tsx | 17 +---------------- src/i18n/strings/en_EN.json | 2 +- 3 files changed, 2 insertions(+), 42 deletions(-) diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index ad63604818..9fcf47cf9e 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -116,31 +116,6 @@ limitations under the License. */ } -.mx_CallView_voice_secondaryAvatarContainer { - border-radius: 2000px; - overflow: hidden; - position: relative; - /* - &::after { - position: absolute; - content: ''; - width: 100%; - height: 100%; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: rgba(0, 0, 0, 0.6); - background-image: url('$(res)/img/voip/paused.svg'); - background-position: center; - background-size: 40px; - background-repeat: no-repeat; - } - .mx_CallView_pip &::after { - background-size: 24px; - } - */ -} - .mx_CallView_voice_holdText { height: 20px; padding-top: 20px; diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 495a99d53c..6748728278 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -480,20 +480,6 @@ export default class CallView extends React.Component { mx_CallView_voice: true, mx_CallView_voice_hold: isOnHold, }); - let secondaryCallAvatar: ReactNode; - - if (this.props.secondaryCall) { - const secAvatarSize = this.props.pipMode ? 40 : 100; - secondaryCallAvatar =
- -
; - } contentView =
@@ -504,7 +490,6 @@ export default class CallView extends React.Component { width={avatarSize} />
- {secondaryCallAvatar}
{onHoldText}
{callControls} @@ -548,7 +533,7 @@ export default class CallView extends React.Component { - {_t("%(name)s paused", { name: secCallRoom.name })} + {_t("%(name)s on hold", { name: secCallRoom.name })} ; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f91576bc4a..0653aff4c3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -854,7 +854,7 @@ "Voice Call": "Voice Call", "Fill Screen": "Fill Screen", "Return to call": "Return to call", - "%(name)s paused": "%(name)s paused", + "%(name)s on hold": "%(name)s on hold", "Unknown caller": "Unknown caller", "Incoming voice call": "Incoming voice call", "Incoming video call": "Incoming video call", From 77ce8a9e39b0ba5384e79b680efc04d0794872ce Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:39:16 -0700 Subject: [PATCH 145/187] Fix minor lint problems --- src/effects/fireworks/index.ts | 21 +++++++++++---------- src/effects/index.ts | 14 +++++++------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index ee32c9ac9c..8f6cc5d82f 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -21,37 +21,37 @@ export type FireworksOptions = { /** * max fireworks count */ - maxCount: number, + maxCount: number; /** * gravity value that firework adds to shift from it's start position */ - gravity: number, + gravity: number; } type FireworksParticle = { /** * color */ - color: string, + color: string; /** * x,y are the point where the particle starts to position on canvas */ - x: number, - y: number, + x: number; + y: number; /** * vx,vy shift values from x and y */ - vx: number, - vy: number, + vx: number; + vy: number; /** * the alpha opacity of the firework particle (between 0 and 1, where 1 is opaque and 0 is invisible) */ - alpha: number, + alpha: number; /** * w,h width and height */ - w: number, - h: number + w: number; + h: number; } export const DefaultOptions: FireworksOptions = { @@ -92,6 +92,7 @@ export default class Fireworks implements ICanvasEffect { this.paint(); this.supportsAnimationFrame.call(window, this.updateWorld); } + private update = () => { if (this.particles.length < this.options.maxCount) { this.createFirework(); diff --git a/src/effects/index.ts b/src/effects/index.ts index 990d1e68ef..27f1902d7c 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -47,33 +47,33 @@ type ConfettiOptions = { /** * max confetti count */ - maxCount: number, + maxCount: number; /** * particle animation speed */ - speed: number, + speed: number; /** * the confetti animation frame interval in milliseconds */ - frameInterval: number, + frameInterval: number; /** * the alpha opacity of the confetti (between 0 and 1, where 1 is opaque and 0 is invisible) */ - alpha: number, + alpha: number; /** * use gradient instead of solid particle color */ - gradient: boolean, + gradient: boolean; }; type FireworksOptions = { /** * max fireworks count */ - maxCount: number, + maxCount: number; /** * gravity value that firework adds to shift from it's start position */ - gravity: number, + gravity: number; } /** From 4ba89cc437e821016e5bb4eb7e08bb1eb8d84d09 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:40:11 -0700 Subject: [PATCH 146/187] Lower effect time by 1 second It feels like it runs a bit too long --- src/effects/fireworks/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 8f6cc5d82f..15ba286503 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -74,7 +74,7 @@ export default class Fireworks implements ICanvasEffect { private particles: Array = []; public isRunning: boolean; - public start = async (canvas: HTMLCanvasElement, timeout = 4000) => { + public start = async (canvas: HTMLCanvasElement, timeout = 3000) => { if (!canvas) { return; } From b2825e8718e35e2dadb3a2c0a6b41eef558ccec4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:40:30 -0700 Subject: [PATCH 147/187] Use the same requestAnimationFrame as confetti --- src/effects/fireworks/index.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 15ba286503..4ca5c59fa7 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -67,10 +67,7 @@ export default class Fireworks implements ICanvasEffect { } private context: CanvasRenderingContext2D | null = null; - private supportsAnimationFrame = window.requestAnimationFrame || - function(callback) { - window.setTimeout(callback, 1000/60); - }; + private supportsAnimationFrame = window.requestAnimationFrame; private particles: Array = []; public isRunning: boolean; From 1f95acc73919325aa3571c87c1f0f19cd46d5c71 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:41:01 -0700 Subject: [PATCH 148/187] Run the effect to completion rather than chopping it off --- src/effects/fireworks/index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 4ca5c59fa7..96a27531af 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -84,14 +84,14 @@ export default class Fireworks implements ICanvasEffect { } private updateWorld = () => { - if (!this.isRunning) return; + if (!this.isRunning && this.particles.length === 0) return; this.update(); this.paint(); this.supportsAnimationFrame.call(window, this.updateWorld); } private update = () => { - if (this.particles.length < this.options.maxCount) { + if (this.particles.length < this.options.maxCount && this.isRunning) { this.createFirework(); } const alive = []; @@ -142,8 +142,6 @@ export default class Fireworks implements ICanvasEffect { public stop = async () => { this.isRunning = false; - this.particles = []; - this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); } private drawParticle = (particle: FireworksParticle): void => { From b24a98c6d240556a628fca144c256e10474ddb25 Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Thu, 17 Dec 2020 16:57:59 +0100 Subject: [PATCH 149/187] fireworks effect added --- src/effects/fireworks/index.ts | 167 +++++++++++++++++++++++++++++++++ src/effects/index.ts | 17 ++++ src/i18n/strings/en_EN.json | 2 + 3 files changed, 186 insertions(+) create mode 100644 src/effects/fireworks/index.ts diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts new file mode 100644 index 0000000000..7c84e31f1d --- /dev/null +++ b/src/effects/fireworks/index.ts @@ -0,0 +1,167 @@ +/* + Copyright 2020 Nurjin Jafar + Copyright 2020 Nordeck IT + Consulting GmbH. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import ICanvasEffect from '../ICanvasEffect'; + +export type FireworksOptions = { + /** + * the maximum number of the fireworks + */ + maxCount: number, + /** + * the alpha opacity of the fireworks (between 0 and 1, where 1 is opaque and 0 is invisible) + */ + gravity: number, + probability: number, +} + +type FireworksParticle = { + color: string, + x: number, + y: number, + vx: number, + vy: number, + alpha: number, + w: number, + h: number +} + +export const DefaultOptions: FireworksOptions = { + maxCount: 500, + gravity: 0.05, + probability: 0.04, +}; + +export default class Fireworks implements ICanvasEffect { + private readonly options: FireworksOptions; + + constructor(options: { [key: string]: any }) { + this.options = {...DefaultOptions, ...options}; + } + + private context: CanvasRenderingContext2D | null = null; + private supportsAnimationFrame = window.requestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000/60); + }; + private particles: Array = []; + public isRunning: boolean; + + public start = async (canvas: HTMLCanvasElement, timeout = 4000) => { + if (!canvas) { + return; + } + this.isRunning = true; + this.context = canvas.getContext('2d'); + this.supportsAnimationFrame.call(window, this.updateWorld); + if (timeout) { + window.setTimeout(this.stop, timeout); + } + } + + private updateWorld = () => { + if (!this.isRunning) return; + this.update(); + this.paint(); + this.supportsAnimationFrame.call(window, this.updateWorld); + } + private update = () => { + if (this.particles.length < this.options.maxCount && Math.random() < this.options.probability) { + this.createFirework(); + } + const alive = []; + for (let i=0; i { + if (!this.context || !this.context.canvas) return; + this.context.globalCompositeOperation = 'source-over'; + this.context.fillStyle = "rgba(0,0,0,0.2)"; + this.context.canvas.style.opacity = "0.8"; + this.context.fillRect(0, 0, this.context.canvas.width, this.context.canvas.height); + this.context.globalCompositeOperation = 'lighter'; + for (let i=0; i { + if (!this.context || !this.context.canvas) return; + const width = this.context.canvas.width; + const height = this.context.canvas.height; + const xPoint = Math.random() * (width - 200) + 100; + const yPoint = Math.random() * (height - 200) + 100; + const nFire = Math.random() * 50 + 100; + const color = "rgb("+(~~(Math.random()*200+55))+"," + +(~~(Math.random()*200+55))+","+(~~(Math.random()*200+55))+")"; + for (let i=0; i{}; + particle.color = color; + particle.w = particle.h = Math.random() * 4 + 1; + particle.x = xPoint - particle.w / 2; + particle.y = yPoint - particle.h / 2; + particle.vx = (Math.random()-0.5)*10; + particle.vy = (Math.random()-0.5)*10; + particle.alpha = Math.random()*.5+.5; + const vy = Math.sqrt(25 - particle.vx * particle.vx); + if (Math.abs(particle.vy) > vy) { + particle.vy = particle.vy > 0 ? vy: -vy; + } + this.particles.push(particle); + } + } + + public stop = async () => { + this.isRunning = false; + this.particles = []; + this.context.canvas.style.opacity = "1"; + this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); + } + + private drawParticle = (particle: FireworksParticle): void => { + if (!this.context || !this.context.canvas) { + return; + } + this.context.save(); + this.context.beginPath(); + + this.context.translate(particle.x + particle.w / 2, particle.y + particle.h / 2); + this.context.arc(0, 0, particle.w, 0, Math.PI * 2); + this.context.fillStyle = particle.color; + this.context.globalAlpha = particle.alpha; + + this.context.closePath(); + this.context.fill(); + this.context.restore(); + } + + + private move = (particle: FireworksParticle) => { + particle.x += particle.vx; + particle.vy += this.options.gravity; + particle.y += particle.vy; + particle.alpha -= 0.01; + return !(particle.x <= -particle.w || particle.x >= screen.width || + particle.y >= screen.height || + particle.alpha <= 0); + } +} diff --git a/src/effects/index.ts b/src/effects/index.ts index 16a0851070..27ed73622f 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -64,6 +64,11 @@ type ConfettiOptions = { * use gradient instead of solid particle color */ gradient: boolean, +}; +type FireworksOptions = { + maxCount: number, + gravity: number, + probability: number, } /** @@ -84,6 +89,18 @@ export const CHAT_EFFECTS: Array> = [ gradient: false, }, } as Effect, + { + emojis: ['🎆'], + msgType: 'nic.custom.fireworks', + command: 'fireworks', + description: () => _td("Sends the given message with fireworks"), + fallbackMessage: () => _t("sends fireworks") + "🎆", + options: { + maxCount: 500, + gravity: 0.05, + probability: 0.04, + }, + } as Effect, ]; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index eb1d0a632e..47d0eedf6f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -849,6 +849,8 @@ "sends confetti": "sends confetti", "You held the call Resume": "You held the call Resume", "%(peerName)s held the call": "%(peerName)s held the call", + "sends fireworks": "sends fireworks", + "Sends the given message with fireworks": "Sends the given message with fireworks", "Video Call": "Video Call", "Voice Call": "Voice Call", "Fill Screen": "Fill Screen", From 4a73402b214bd92002ceb63e9436b427ab9c39b5 Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Fri, 18 Dec 2020 14:51:58 +0100 Subject: [PATCH 150/187] comments added --- src/effects/fireworks/index.ts | 19 +++++++++++++++++-- src/effects/index.ts | 6 ++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 7c84e31f1d..3cc209eda3 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -19,23 +19,38 @@ import ICanvasEffect from '../ICanvasEffect'; export type FireworksOptions = { /** - * the maximum number of the fireworks + * max fireworks count */ maxCount: number, /** - * the alpha opacity of the fireworks (between 0 and 1, where 1 is opaque and 0 is invisible) + * gravity value that firework adds to shift from it's start position */ gravity: number, probability: number, } type FireworksParticle = { + /** + * color + */ color: string, + /** + * x,y are the point where the particle starts to position on canvas + */ x: number, y: number, + /** + * vx,vy shift values from x and y + */ vx: number, vy: number, + /** + * the alpha opacity of the firework particle (between 0 and 1, where 1 is opaque and 0 is invisible) + */ alpha: number, + /** + * w,h width and height + */ w: number, h: number } diff --git a/src/effects/index.ts b/src/effects/index.ts index 27ed73622f..07aaa5e736 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -66,7 +66,13 @@ type ConfettiOptions = { gradient: boolean, }; type FireworksOptions = { + /** + * max fireworks count + */ maxCount: number, + /** + * gravity value that firework adds to shift from it's start position + */ gravity: number, probability: number, } From 2a2c805031cea506dc9cac76c87a36cc975acdd4 Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Fri, 18 Dec 2020 15:30:50 +0100 Subject: [PATCH 151/187] changed canvas globalCompositeOperation value and removed probability --- src/effects/fireworks/index.ts | 9 +++------ src/effects/index.ts | 2 -- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 3cc209eda3..b9898b8b22 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -26,7 +26,6 @@ export type FireworksOptions = { * gravity value that firework adds to shift from it's start position */ gravity: number, - probability: number, } type FireworksParticle = { @@ -58,7 +57,6 @@ type FireworksParticle = { export const DefaultOptions: FireworksOptions = { maxCount: 500, gravity: 0.05, - probability: 0.04, }; export default class Fireworks implements ICanvasEffect { @@ -95,7 +93,7 @@ export default class Fireworks implements ICanvasEffect { this.supportsAnimationFrame.call(window, this.updateWorld); } private update = () => { - if (this.particles.length < this.options.maxCount && Math.random() < this.options.probability) { + if (this.particles.length < this.options.maxCount) { this.createFirework(); } const alive = []; @@ -109,9 +107,8 @@ export default class Fireworks implements ICanvasEffect { private paint = () => { if (!this.context || !this.context.canvas) return; - this.context.globalCompositeOperation = 'source-over'; - this.context.fillStyle = "rgba(0,0,0,0.2)"; - this.context.canvas.style.opacity = "0.8"; + this.context.globalCompositeOperation = 'destination-out'; + this.context.fillStyle = "rgba(0,0,0,0.5)"; this.context.fillRect(0, 0, this.context.canvas.width, this.context.canvas.height); this.context.globalCompositeOperation = 'lighter'; for (let i=0; i> = [ options: { maxCount: 500, gravity: 0.05, - probability: 0.04, }, } as Effect, ]; From 1fd6809388260a8947578e9b2605824ed7ce786c Mon Sep 17 00:00:00 2001 From: nurjinn jafar Date: Fri, 18 Dec 2020 15:32:44 +0100 Subject: [PATCH 152/187] removed unnecessary opacity --- src/effects/fireworks/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index b9898b8b22..ee32c9ac9c 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -145,7 +145,6 @@ export default class Fireworks implements ICanvasEffect { public stop = async () => { this.isRunning = false; this.particles = []; - this.context.canvas.style.opacity = "1"; this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); } From a966319c90e83d28bfd0162153236eaf2bc07478 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:39:16 -0700 Subject: [PATCH 153/187] Fix minor lint problems --- src/effects/fireworks/index.ts | 21 +++++++++++---------- src/effects/index.ts | 14 +++++++------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index ee32c9ac9c..8f6cc5d82f 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -21,37 +21,37 @@ export type FireworksOptions = { /** * max fireworks count */ - maxCount: number, + maxCount: number; /** * gravity value that firework adds to shift from it's start position */ - gravity: number, + gravity: number; } type FireworksParticle = { /** * color */ - color: string, + color: string; /** * x,y are the point where the particle starts to position on canvas */ - x: number, - y: number, + x: number; + y: number; /** * vx,vy shift values from x and y */ - vx: number, - vy: number, + vx: number; + vy: number; /** * the alpha opacity of the firework particle (between 0 and 1, where 1 is opaque and 0 is invisible) */ - alpha: number, + alpha: number; /** * w,h width and height */ - w: number, - h: number + w: number; + h: number; } export const DefaultOptions: FireworksOptions = { @@ -92,6 +92,7 @@ export default class Fireworks implements ICanvasEffect { this.paint(); this.supportsAnimationFrame.call(window, this.updateWorld); } + private update = () => { if (this.particles.length < this.options.maxCount) { this.createFirework(); diff --git a/src/effects/index.ts b/src/effects/index.ts index 990d1e68ef..27f1902d7c 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -47,33 +47,33 @@ type ConfettiOptions = { /** * max confetti count */ - maxCount: number, + maxCount: number; /** * particle animation speed */ - speed: number, + speed: number; /** * the confetti animation frame interval in milliseconds */ - frameInterval: number, + frameInterval: number; /** * the alpha opacity of the confetti (between 0 and 1, where 1 is opaque and 0 is invisible) */ - alpha: number, + alpha: number; /** * use gradient instead of solid particle color */ - gradient: boolean, + gradient: boolean; }; type FireworksOptions = { /** * max fireworks count */ - maxCount: number, + maxCount: number; /** * gravity value that firework adds to shift from it's start position */ - gravity: number, + gravity: number; } /** From ec92be4ec479e26b8f6f316ba6b4f32429969a15 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:40:11 -0700 Subject: [PATCH 154/187] Lower effect time by 1 second It feels like it runs a bit too long --- src/effects/fireworks/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 8f6cc5d82f..15ba286503 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -74,7 +74,7 @@ export default class Fireworks implements ICanvasEffect { private particles: Array = []; public isRunning: boolean; - public start = async (canvas: HTMLCanvasElement, timeout = 4000) => { + public start = async (canvas: HTMLCanvasElement, timeout = 3000) => { if (!canvas) { return; } From 4fea266003dcc04b95d0521c22d7160f8d2f7839 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:40:30 -0700 Subject: [PATCH 155/187] Use the same requestAnimationFrame as confetti --- src/effects/fireworks/index.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 15ba286503..4ca5c59fa7 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -67,10 +67,7 @@ export default class Fireworks implements ICanvasEffect { } private context: CanvasRenderingContext2D | null = null; - private supportsAnimationFrame = window.requestAnimationFrame || - function(callback) { - window.setTimeout(callback, 1000/60); - }; + private supportsAnimationFrame = window.requestAnimationFrame; private particles: Array = []; public isRunning: boolean; From ce638e717d9d5c4eee0ad819a158e31c945f69f1 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:41:01 -0700 Subject: [PATCH 156/187] Run the effect to completion rather than chopping it off --- src/effects/fireworks/index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/effects/fireworks/index.ts b/src/effects/fireworks/index.ts index 4ca5c59fa7..96a27531af 100644 --- a/src/effects/fireworks/index.ts +++ b/src/effects/fireworks/index.ts @@ -84,14 +84,14 @@ export default class Fireworks implements ICanvasEffect { } private updateWorld = () => { - if (!this.isRunning) return; + if (!this.isRunning && this.particles.length === 0) return; this.update(); this.paint(); this.supportsAnimationFrame.call(window, this.updateWorld); } private update = () => { - if (this.particles.length < this.options.maxCount) { + if (this.particles.length < this.options.maxCount && this.isRunning) { this.createFirework(); } const alive = []; @@ -142,8 +142,6 @@ export default class Fireworks implements ICanvasEffect { public stop = async () => { this.isRunning = false; - this.particles = []; - this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); } private drawParticle = (particle: FireworksParticle): void => { From 5c309042e681d04aaeb73ee152695f0a25d3cfe6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 18 Dec 2020 18:46:59 -0700 Subject: [PATCH 157/187] fix i18n order --- 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 47d0eedf6f..b96d767ccb 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -847,10 +847,10 @@ "This is your list of users/servers you have blocked - don't leave the room!": "This is your list of users/servers you have blocked - don't leave the room!", "Sends the given message with confetti": "Sends the given message with confetti", "sends confetti": "sends confetti", + "Sends the given message with fireworks": "Sends the given message with fireworks", + "sends fireworks": "sends fireworks", "You held the call Resume": "You held the call Resume", "%(peerName)s held the call": "%(peerName)s held the call", - "sends fireworks": "sends fireworks", - "Sends the given message with fireworks": "Sends the given message with fireworks", "Video Call": "Video Call", "Voice Call": "Voice Call", "Fill Screen": "Fill Screen", From 9263bf7cdaa1d4b90ef2c753b05e77f3495e5ab3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 20 Dec 2020 23:29:03 -0700 Subject: [PATCH 158/187] Add a snowfall chat effect (with /snowfall command) --- src/effects/index.ts | 28 ++++++- src/effects/snowfall/index.ts | 151 ++++++++++++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 2 + 3 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 src/effects/snowfall/index.ts diff --git a/src/effects/index.ts b/src/effects/index.ts index 27f1902d7c..a22948ebcf 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -75,6 +75,20 @@ type FireworksOptions = { */ gravity: number; } +type SnowfallOptions = { + /** + * The maximum number of snowflakes to render at a given time + */ + maxCount: number; + /** + * The amount of gravity to apply to the snowflakes + */ + gravity: number; + /** + * The amount of drift (horizontal sway) to apply to the snowflakes. Each snowflake varies. + */ + maxDrift: number; +} /** * This configuration defines room effects that can be triggered by custom message types and emojis @@ -99,12 +113,24 @@ export const CHAT_EFFECTS: Array> = [ msgType: 'nic.custom.fireworks', command: 'fireworks', description: () => _td("Sends the given message with fireworks"), - fallbackMessage: () => _t("sends fireworks") + "🎆", + fallbackMessage: () => _t("sends fireworks") + " 🎆", options: { maxCount: 500, gravity: 0.05, }, } as Effect, + { + emojis: ['❄', '🌨'], + msgType: 'io.element.effect.snowfall', + command: 'snowfall', + description: () => _td("Sends the given message with snowfall"), + fallbackMessage: () => _t("sends snowfall") + " ❄", + options: { + maxCount: 200, + gravity: 0.05, + maxDrift: 5, + }, + } as Effect, ]; diff --git a/src/effects/snowfall/index.ts b/src/effects/snowfall/index.ts new file mode 100644 index 0000000000..a91d17379b --- /dev/null +++ b/src/effects/snowfall/index.ts @@ -0,0 +1,151 @@ +/* + 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. + */ +import ICanvasEffect from '../ICanvasEffect'; +import { arrayFastClone } from "../../utils/arrays"; + +export type SnowfallOptions = { + /** + * The maximum number of snowflakes to render at a given time + */ + maxCount: number; + /** + * The amount of gravity to apply to the snowflakes + */ + gravity: number; + /** + * The amount of drift (horizontal sway) to apply to the snowflakes. Each snowflake varies. + */ + maxDrift: number; +} + +type Snowflake = { + x: number; + y: number; + xCol: number; + diameter: number; + maximumDrift: number; + gravity: number; +} + +export const DefaultOptions: SnowfallOptions = { + maxCount: 200, + gravity: 0.05, + maxDrift: 5, +}; + +const KEY_FRAME_INTERVAL = 15; // 15ms, roughly + +export default class Snowfall implements ICanvasEffect { + private readonly options: SnowfallOptions; + + constructor(options: { [key: string]: any }) { + this.options = {...DefaultOptions, ...options}; + } + + private context: CanvasRenderingContext2D | null = null; + private particles: Array = []; + private lastAnimationTime: number; + + public isRunning: boolean; + + public start = async (canvas: HTMLCanvasElement, timeout = 3000) => { + if (!canvas) { + return; + } + this.context = canvas.getContext('2d'); + this.particles = []; + const count = this.options.maxCount; + while (this.particles.length < count) { + this.particles.push(this.resetParticle({} as Snowflake, canvas.width, canvas.height)); + } + this.isRunning = true; + requestAnimationFrame(this.renderLoop); + if (timeout) { + window.setTimeout(this.stop, timeout); + } + } + + public stop = async () => { + this.isRunning = false; + } + + private resetParticle = (particle: Snowflake, width: number, height: number): Snowflake => { + particle.x = Math.random() * width; + particle.y = Math.random() * -height; + particle.xCol = particle.x; + particle.diameter = (Math.random() * 7) + 4; + particle.maximumDrift = (Math.random() * this.options.maxDrift) + 3.5; + particle.gravity = this.options.gravity + (Math.random() * 6) + 4; + return particle; + } + + private renderLoop = (): void => { + if (!this.context || !this.context.canvas) { + return; + } + if (this.particles.length === 0) { + this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); + } else { + const timeDelta = Date.now() - this.lastAnimationTime; + if (timeDelta >= KEY_FRAME_INTERVAL || !this.lastAnimationTime) { + // Clear the screen first + this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); + + this.lastAnimationTime = Date.now(); + this.animateAndRenderSnowflakes(); + } + requestAnimationFrame(this.renderLoop); + } + }; + + private animateAndRenderSnowflakes() { + if (!this.context || !this.context.canvas) { + return; + } + const height = this.context.canvas.height; + for (const particle of arrayFastClone(this.particles)) { + const leftMax = particle.xCol - particle.maximumDrift; + const rightMax = particle.xCol + particle.maximumDrift; + + particle.y += particle.gravity; + + // We treat the drift as a sine function to have a more fluid-like movement instead + // of a pong-like movement off walls of the X column. This means that for + // $x=A\sin(\frac{2\pi}{P}y)$ we use the `maximumDrift` as the amplitude (A) and a + // large multiplier to create a very long waveform through P. + const peakDistance = 75 * particle.maximumDrift; + const PI2 = Math.PI * 2; + particle.x = particle.maximumDrift * Math.sin((PI2 / peakDistance) * particle.y); + particle.x += particle.xCol; // bring the particle to the right place + + const radius = particle.diameter / 2; + this.context.save(); + this.context.beginPath(); + this.context.ellipse(particle.x, particle.y, radius, radius, 0, 0, 360); + this.context.fillStyle = '#eaeaea'; // grey so it shows up on the light theme + this.context.fill(); + this.context.closePath(); + this.context.restore(); + + // Remove any dead snowflakes + const maxBounds = radius * 4; // make sure it's *really* off screen + if (particle.y > (height + maxBounds)) { + const idx = this.particles.indexOf(particle); + this.particles.splice(idx, 1); + } + } + } +} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2fb70ecdb1..12d8171439 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -851,6 +851,8 @@ "sends confetti": "sends confetti", "Sends the given message with fireworks": "Sends the given message with fireworks", "sends fireworks": "sends fireworks", + "Sends the given message with snowfall": "Sends the given message with snowfall", + "sends snowfall": "sends snowfall", "You held the call Resume": "You held the call Resume", "%(peerName)s held the call": "%(peerName)s held the call", "Video Call": "Video Call", From a0d925b879e67b8f4683b75eb73efc4b7b961d0e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 20 Dec 2020 23:29:03 -0700 Subject: [PATCH 159/187] Add a snowfall chat effect (with /snowfall command) --- src/effects/index.ts | 28 ++++++- src/effects/snowfall/index.ts | 148 ++++++++++++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 2 + 3 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 src/effects/snowfall/index.ts diff --git a/src/effects/index.ts b/src/effects/index.ts index 27f1902d7c..a22948ebcf 100644 --- a/src/effects/index.ts +++ b/src/effects/index.ts @@ -75,6 +75,20 @@ type FireworksOptions = { */ gravity: number; } +type SnowfallOptions = { + /** + * The maximum number of snowflakes to render at a given time + */ + maxCount: number; + /** + * The amount of gravity to apply to the snowflakes + */ + gravity: number; + /** + * The amount of drift (horizontal sway) to apply to the snowflakes. Each snowflake varies. + */ + maxDrift: number; +} /** * This configuration defines room effects that can be triggered by custom message types and emojis @@ -99,12 +113,24 @@ export const CHAT_EFFECTS: Array> = [ msgType: 'nic.custom.fireworks', command: 'fireworks', description: () => _td("Sends the given message with fireworks"), - fallbackMessage: () => _t("sends fireworks") + "🎆", + fallbackMessage: () => _t("sends fireworks") + " 🎆", options: { maxCount: 500, gravity: 0.05, }, } as Effect, + { + emojis: ['❄', '🌨'], + msgType: 'io.element.effect.snowfall', + command: 'snowfall', + description: () => _td("Sends the given message with snowfall"), + fallbackMessage: () => _t("sends snowfall") + " ❄", + options: { + maxCount: 200, + gravity: 0.05, + maxDrift: 5, + }, + } as Effect, ]; diff --git a/src/effects/snowfall/index.ts b/src/effects/snowfall/index.ts new file mode 100644 index 0000000000..2affb50405 --- /dev/null +++ b/src/effects/snowfall/index.ts @@ -0,0 +1,148 @@ +/* + 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. + */ +import ICanvasEffect from '../ICanvasEffect'; +import { arrayFastClone } from "../../utils/arrays"; + +export type SnowfallOptions = { + /** + * The maximum number of snowflakes to render at a given time + */ + maxCount: number; + /** + * The amount of gravity to apply to the snowflakes + */ + gravity: number; + /** + * The amount of drift (horizontal sway) to apply to the snowflakes. Each snowflake varies. + */ + maxDrift: number; +} + +type Snowflake = { + x: number; + y: number; + xCol: number; + diameter: number; + maximumDrift: number; + gravity: number; +} + +export const DefaultOptions: SnowfallOptions = { + maxCount: 200, + gravity: 0.05, + maxDrift: 5, +}; + +const KEY_FRAME_INTERVAL = 15; // 15ms, roughly + +export default class Snowfall implements ICanvasEffect { + private readonly options: SnowfallOptions; + + constructor(options: { [key: string]: any }) { + this.options = {...DefaultOptions, ...options}; + } + + private context: CanvasRenderingContext2D | null = null; + private particles: Array = []; + private lastAnimationTime: number; + + public isRunning: boolean; + + public start = async (canvas: HTMLCanvasElement, timeout = 3000) => { + if (!canvas) { + return; + } + this.context = canvas.getContext('2d'); + this.particles = []; + const count = this.options.maxCount; + while (this.particles.length < count) { + this.particles.push(this.resetParticle({} as Snowflake, canvas.width, canvas.height)); + } + this.isRunning = true; + requestAnimationFrame(this.renderLoop); + if (timeout) { + window.setTimeout(this.stop, timeout); + } + } + + public stop = async () => { + this.isRunning = false; + } + + private resetParticle = (particle: Snowflake, width: number, height: number): Snowflake => { + particle.x = Math.random() * width; + particle.y = Math.random() * -height; + particle.xCol = particle.x; + particle.diameter = (Math.random() * 7) + 4; + particle.maximumDrift = (Math.random() * this.options.maxDrift) + 3.5; + particle.gravity = this.options.gravity + (Math.random() * 6) + 4; + return particle; + } + + private renderLoop = (): void => { + if (!this.context || !this.context.canvas) { + return; + } + if (this.particles.length === 0) { + this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); + } else { + const timeDelta = Date.now() - this.lastAnimationTime; + if (timeDelta >= KEY_FRAME_INTERVAL || !this.lastAnimationTime) { + // Clear the screen first + this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); + + this.lastAnimationTime = Date.now(); + this.animateAndRenderSnowflakes(); + } + requestAnimationFrame(this.renderLoop); + } + }; + + private animateAndRenderSnowflakes() { + if (!this.context || !this.context.canvas) { + return; + } + const height = this.context.canvas.height; + for (const particle of arrayFastClone(this.particles)) { + particle.y += particle.gravity; + + // We treat the drift as a sine function to have a more fluid-like movement instead + // of a pong-like movement off walls of the X column. This means that for + // $x=A\sin(\frac{2\pi}{P}y)$ we use the `maximumDrift` as the amplitude (A) and a + // large multiplier to create a very long waveform through P. + const peakDistance = 75 * particle.maximumDrift; + const PI2 = Math.PI * 2; + particle.x = particle.maximumDrift * Math.sin((PI2 / peakDistance) * particle.y); + particle.x += particle.xCol; // bring the particle to the right place + + const radius = particle.diameter / 2; + this.context.save(); + this.context.beginPath(); + this.context.ellipse(particle.x, particle.y, radius, radius, 0, 0, 360); + this.context.fillStyle = '#eaeaea'; // grey so it shows up on the light theme + this.context.fill(); + this.context.closePath(); + this.context.restore(); + + // Remove any dead snowflakes + const maxBounds = radius * 4; // make sure it's *really* off screen + if (particle.y > (height + maxBounds)) { + const idx = this.particles.indexOf(particle); + this.particles.splice(idx, 1); + } + } + } +} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b96d767ccb..556d217837 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -849,6 +849,8 @@ "sends confetti": "sends confetti", "Sends the given message with fireworks": "Sends the given message with fireworks", "sends fireworks": "sends fireworks", + "Sends the given message with snowfall": "Sends the given message with snowfall", + "sends snowfall": "sends snowfall", "You held the call Resume": "You held the call Resume", "%(peerName)s held the call": "%(peerName)s held the call", "Video Call": "Video Call", From d53ee58b18a04bedfdb0db13915f3d3606be0ab5 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 21 Dec 2020 00:18:58 -0700 Subject: [PATCH 160/187] Appease the linter --- src/effects/snowfall/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/effects/snowfall/index.ts b/src/effects/snowfall/index.ts index a91d17379b..2affb50405 100644 --- a/src/effects/snowfall/index.ts +++ b/src/effects/snowfall/index.ts @@ -117,9 +117,6 @@ export default class Snowfall implements ICanvasEffect { } const height = this.context.canvas.height; for (const particle of arrayFastClone(this.particles)) { - const leftMax = particle.xCol - particle.maximumDrift; - const rightMax = particle.xCol + particle.maximumDrift; - particle.y += particle.gravity; // We treat the drift as a sine function to have a more fluid-like movement instead From f63572f02b1783940838ed7f2be586d6615f76a5 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 18 Dec 2020 18:08:04 +0000 Subject: [PATCH 161/187] Visual fixups for call UI * Add bottom margin on PiP view * Remove avatar blurring & pause icon for held calls * Change background of incoming call box to match PiP view * Put drop shadow & border radius on PiP view & incoming call box rather than the CallContainer they're in (so they each have their own drop shadow / rounded corners). * Add margin between incoming call box and PiP view --- res/css/views/voip/_CallContainer.scss | 7 +++---- res/css/views/voip/_CallView.scss | 10 ++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/res/css/views/voip/_CallContainer.scss b/res/css/views/voip/_CallContainer.scss index eec8a1f188..ae1d37de71 100644 --- a/res/css/views/voip/_CallContainer.scss +++ b/res/css/views/voip/_CallContainer.scss @@ -18,10 +18,7 @@ limitations under the License. position: absolute; right: 20px; bottom: 72px; - border-radius: 8px; - overflow: hidden; z-index: 100; - box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); // Disable pointer events for Jitsi widgets to function. Direct // calls have their own cursor and behaviour, but we need to make @@ -49,8 +46,10 @@ limitations under the License. .mx_IncomingCallBox { min-width: 250px; - background-color: $primary-bg-color; + background-color: $secondary-accent-color; padding: 8px; + box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); + border-radius: 8px; pointer-events: initial; // restore pointer events so the user can accept/decline cursor: pointer; diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index dbe2c27e41..ad63604818 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -35,6 +35,10 @@ limitations under the License. .mx_CallView_pip { width: 320px; + padding-bottom: 8px; + margin-top: 10px; + box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); + border-radius: 8px; .mx_CallView_voice { height: 180px; @@ -84,6 +88,7 @@ limitations under the License. border-radius: 2000px; overflow: hidden; position: relative; + /* Blurred avatar images & pause icon for on-hold removed for now &::after { position: absolute; content: ''; @@ -101,17 +106,21 @@ limitations under the License. .mx_CallView_pip &::after { background-size: 30px; } + */ } + /* .mx_BaseAvatar { filter: blur(20px); overflow: hidden; } + */ } .mx_CallView_voice_secondaryAvatarContainer { border-radius: 2000px; overflow: hidden; position: relative; + /* &::after { position: absolute; content: ''; @@ -129,6 +138,7 @@ limitations under the License. .mx_CallView_pip &::after { background-size: 24px; } + */ } .mx_CallView_voice_holdText { From 7cc00faeb33cd7366046d7381fde9173818a5955 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 18 Dec 2020 19:35:41 +0000 Subject: [PATCH 162/187] Vary resume link text Use 'Switch' if unholding that call would hold another --- src/CallHandler.tsx | 12 ++++++++++++ src/components/views/voip/CallView.tsx | 6 ++++-- src/i18n/strings/en_EN.json | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index fac4d6fc4e..8ce0da36dc 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -616,6 +616,18 @@ export default class CallHandler { } } + /** + * @returns true if we are currently in anu call where we haven't put the remote party on hold + */ + hasAnyUnheldCall() { + for (const call of this.calls.values()) { + if (call.state === CallState.Ended) continue; + if (!call.isRemoteOnHold()) return true; + } + + return false; + } + private async startCallApp(roomId: string, type: string) { dis.dispatch({ action: 'appsDrawer', diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 65ba693b58..495a99d53c 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -19,7 +19,7 @@ import React, { createRef, CSSProperties, ReactNode } from 'react'; import dis from '../../../dispatcher/dispatcher'; import CallHandler from '../../../CallHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import { _t } from '../../../languageHandler'; +import { _t, _td } from '../../../languageHandler'; import VideoFeed, { VideoFeedType } from "./VideoFeed"; import RoomAvatar from "../avatars/RoomAvatar"; import { CallState, CallType, MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; @@ -423,7 +423,9 @@ export default class CallView extends React.Component { const isOnHold = this.state.isLocalOnHold || this.state.isRemoteOnHold; let onHoldText = null; if (this.state.isRemoteOnHold) { - onHoldText = _t("You held the call Resume", {}, { + const holdString = CallHandler.sharedInstance().hasAnyUnheldCall() ? + _td("You held the call Switch") : _td("You held the call Resume"); + onHoldText = _t(holdString, {}, { a: sub => {sub} , diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 556d217837..dcaffdfbcd 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -851,6 +851,7 @@ "sends fireworks": "sends fireworks", "Sends the given message with snowfall": "Sends the given message with snowfall", "sends snowfall": "sends snowfall", + "You held the call Switch": "You held the call Switch", "You held the call Resume": "You held the call Resume", "%(peerName)s held the call": "%(peerName)s held the call", "Video Call": "Video Call", From f325df3b6a587c11c205f8fdbefc524f961ea16d Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 18 Dec 2020 19:40:57 +0000 Subject: [PATCH 163/187] Remove secondary call avatar and change 'paused' to 'on hold' --- res/css/views/voip/_CallView.scss | 25 ------------------------- src/components/views/voip/CallView.tsx | 17 +---------------- src/i18n/strings/en_EN.json | 2 +- 3 files changed, 2 insertions(+), 42 deletions(-) diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index ad63604818..9fcf47cf9e 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -116,31 +116,6 @@ limitations under the License. */ } -.mx_CallView_voice_secondaryAvatarContainer { - border-radius: 2000px; - overflow: hidden; - position: relative; - /* - &::after { - position: absolute; - content: ''; - width: 100%; - height: 100%; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: rgba(0, 0, 0, 0.6); - background-image: url('$(res)/img/voip/paused.svg'); - background-position: center; - background-size: 40px; - background-repeat: no-repeat; - } - .mx_CallView_pip &::after { - background-size: 24px; - } - */ -} - .mx_CallView_voice_holdText { height: 20px; padding-top: 20px; diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 495a99d53c..6748728278 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -480,20 +480,6 @@ export default class CallView extends React.Component { mx_CallView_voice: true, mx_CallView_voice_hold: isOnHold, }); - let secondaryCallAvatar: ReactNode; - - if (this.props.secondaryCall) { - const secAvatarSize = this.props.pipMode ? 40 : 100; - secondaryCallAvatar =
- -
; - } contentView =
@@ -504,7 +490,6 @@ export default class CallView extends React.Component { width={avatarSize} />
- {secondaryCallAvatar}
{onHoldText}
{callControls} @@ -548,7 +533,7 @@ export default class CallView extends React.Component { - {_t("%(name)s paused", { name: secCallRoom.name })} + {_t("%(name)s on hold", { name: secCallRoom.name })} ; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index dcaffdfbcd..470defd2f9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -858,7 +858,7 @@ "Voice Call": "Voice Call", "Fill Screen": "Fill Screen", "Return to call": "Return to call", - "%(name)s paused": "%(name)s paused", + "%(name)s on hold": "%(name)s on hold", "Unknown caller": "Unknown caller", "Incoming voice call": "Incoming voice call", "Incoming video call": "Incoming video call", From 68c5482c05e6f2cdbc7fbd221930518249516323 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 21 Dec 2020 11:21:41 +0000 Subject: [PATCH 164/187] Comment typo Co-authored-by: J. Ryan Stinnett --- src/CallHandler.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index c41ec6be05..504dae5c84 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -618,7 +618,7 @@ export default class CallHandler { } /** - * @returns true if we are currently in anu call where we haven't put the remote party on hold + * @returns true if we are currently in any call where we haven't put the remote party on hold */ hasAnyUnheldCall() { for (const call of this.calls.values()) { From 189d5bf769253ad9516d0fd203b70c87f4c0f3fc Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 21 Dec 2020 11:21:50 +0000 Subject: [PATCH 165/187] Comment typo Co-authored-by: J. Ryan Stinnett --- src/CallHandler.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index 8ce0da36dc..0468a3917f 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -617,7 +617,7 @@ export default class CallHandler { } /** - * @returns true if we are currently in anu call where we haven't put the remote party on hold + * @returns true if we are currently in any call where we haven't put the remote party on hold */ hasAnyUnheldCall() { for (const call of this.calls.values()) { From 0d4b2f48dc29532a8863f9a35aadc5f13f2e9182 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 21 Dec 2020 11:24:36 +0000 Subject: [PATCH 166/187] Probably better to just remove this --- res/css/views/voip/_CallView.scss | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index 9fcf47cf9e..a9b02ff5d8 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -88,32 +88,7 @@ limitations under the License. border-radius: 2000px; overflow: hidden; position: relative; - /* Blurred avatar images & pause icon for on-hold removed for now - &::after { - position: absolute; - content: ''; - width: 100%; - height: 100%; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: rgba(0, 0, 0, 0.6); - background-image: url('$(res)/img/voip/paused.svg'); - background-position: center; - background-size: 40px; - background-repeat: no-repeat; - } - .mx_CallView_pip &::after { - background-size: 30px; - } - */ } - /* - .mx_BaseAvatar { - filter: blur(20px); - overflow: hidden; - } - */ } .mx_CallView_voice_holdText { From d851c826e5fe1a43bbdf02776797b6bdca371ec7 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 21 Dec 2020 11:24:36 +0000 Subject: [PATCH 167/187] Probably better to just remove this --- res/css/views/voip/_CallView.scss | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index 9fcf47cf9e..a9b02ff5d8 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -88,32 +88,7 @@ limitations under the License. border-radius: 2000px; overflow: hidden; position: relative; - /* Blurred avatar images & pause icon for on-hold removed for now - &::after { - position: absolute; - content: ''; - width: 100%; - height: 100%; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: rgba(0, 0, 0, 0.6); - background-image: url('$(res)/img/voip/paused.svg'); - background-position: center; - background-size: 40px; - background-repeat: no-repeat; - } - .mx_CallView_pip &::after { - background-size: 30px; - } - */ } - /* - .mx_BaseAvatar { - filter: blur(20px); - overflow: hidden; - } - */ } .mx_CallView_voice_holdText { From 162a5de82e335ccaebdc25dd41ee85b80420eb02 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 21 Dec 2020 12:46:29 +0000 Subject: [PATCH 168/187] Rename and reformat Element URL pattern This is just a code style cleanup. There are no behaviour changes in this commit. --- src/HtmlUtils.tsx | 2 +- src/linkify-matrix.js | 15 ++++++++------- src/utils/permalinks/Permalinks.js | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index 2301ad250b..ba0781f0a4 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -163,7 +163,7 @@ const transformTags: IExtendedSanitizeOptions["transformTags"] = { // custom to attribs.target = '_blank'; // by default const transformed = tryTransformPermalinkToLocalHref(attribs.href); - if (transformed !== attribs.href || attribs.href.match(linkifyMatrix.VECTOR_URL_PATTERN)) { + if (transformed !== attribs.href || attribs.href.match(linkifyMatrix.ELEMENT_URL_PATTERN)) { attribs.href = transformed; delete attribs.target; } diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 77c62ce84d..bee8e95137 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -183,12 +183,13 @@ const escapeRegExp = function(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }; -// Recognise URLs from both our local vector and official vector as vector. -// anyone else really should be using matrix.to. -matrixLinkify.VECTOR_URL_PATTERN = "^(?:https?://)?(?:" - + escapeRegExp(window.location.host + window.location.pathname) + "|" - + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" - + ")(#.*)"; +// Recognise URLs from both our local and official Element deployments. +// Anyone else really should be using matrix.to. +matrixLinkify.ELEMENT_URL_PATTERN = + "^(?:https?://)?(?:" + + escapeRegExp(window.location.host + window.location.pathname) + "|" + + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" + + ")(#.*)"; matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?://)?(?:www\\.)?matrix\\.to/#/(([#@!+]).*)"; matrixLinkify.MATRIXTO_MD_LINK_PATTERN = @@ -253,7 +254,7 @@ matrixLinkify.options = { target: function(href, type) { if (type === 'url') { const transformed = tryTransformPermalinkToLocalHref(href); - if (transformed !== href || href.match(matrixLinkify.VECTOR_URL_PATTERN)) { + if (transformed !== href || href.match(matrixLinkify.ELEMENT_URL_PATTERN)) { return null; } else { return '_blank'; diff --git a/src/utils/permalinks/Permalinks.js b/src/utils/permalinks/Permalinks.js index 39c5776852..e157ecc55e 100644 --- a/src/utils/permalinks/Permalinks.js +++ b/src/utils/permalinks/Permalinks.js @@ -331,7 +331,7 @@ export function tryTransformPermalinkToLocalHref(permalink: string): string { return permalink; } - const m = permalink.match(matrixLinkify.VECTOR_URL_PATTERN); + const m = permalink.match(matrixLinkify.ELEMENT_URL_PATTERN); if (m) { return m[1]; } @@ -365,7 +365,7 @@ export function getPrimaryPermalinkEntity(permalink: string): string { // If not a permalink, try the vector patterns. if (!permalinkParts) { - const m = permalink.match(matrixLinkify.VECTOR_URL_PATTERN); + const m = permalink.match(matrixLinkify.ELEMENT_URL_PATTERN); if (m) { // A bit of a hack, but it gets the job done const handler = new ElementPermalinkConstructor("http://localhost"); From 5d78418530f9c2f90638ee567a45c2cc3c2616c9 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 21 Dec 2020 13:15:00 +0000 Subject: [PATCH 169/187] Recognise *.element.io links as Element permalinks This ensures all Elements detect permalinks to official deployments as Element and handle them internally. Fixes https://github.com/vector-im/element-web/issues/16005 --- src/linkify-matrix.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index bee8e95137..1a40fde26f 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -188,7 +188,8 @@ const escapeRegExp = function(string) { matrixLinkify.ELEMENT_URL_PATTERN = "^(?:https?://)?(?:" + escapeRegExp(window.location.host + window.location.pathname) + "|" + - "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" + + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/|" + + "(?:app|beta|staging|develop)\\.element\\.io/" + ")(#.*)"; matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?://)?(?:www\\.)?matrix\\.to/#/(([#@!+]).*)"; From 71cbc8bf29aa62648832f9c4dc20bf9659fd3614 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 21 Dec 2020 12:46:29 +0000 Subject: [PATCH 170/187] Rename and reformat Element URL pattern This is just a code style cleanup. There are no behaviour changes in this commit. --- src/HtmlUtils.tsx | 2 +- src/linkify-matrix.js | 15 ++++++++------- src/utils/permalinks/Permalinks.js | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index 2301ad250b..ba0781f0a4 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -163,7 +163,7 @@ const transformTags: IExtendedSanitizeOptions["transformTags"] = { // custom to attribs.target = '_blank'; // by default const transformed = tryTransformPermalinkToLocalHref(attribs.href); - if (transformed !== attribs.href || attribs.href.match(linkifyMatrix.VECTOR_URL_PATTERN)) { + if (transformed !== attribs.href || attribs.href.match(linkifyMatrix.ELEMENT_URL_PATTERN)) { attribs.href = transformed; delete attribs.target; } diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 77c62ce84d..bee8e95137 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -183,12 +183,13 @@ const escapeRegExp = function(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }; -// Recognise URLs from both our local vector and official vector as vector. -// anyone else really should be using matrix.to. -matrixLinkify.VECTOR_URL_PATTERN = "^(?:https?://)?(?:" - + escapeRegExp(window.location.host + window.location.pathname) + "|" - + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" - + ")(#.*)"; +// Recognise URLs from both our local and official Element deployments. +// Anyone else really should be using matrix.to. +matrixLinkify.ELEMENT_URL_PATTERN = + "^(?:https?://)?(?:" + + escapeRegExp(window.location.host + window.location.pathname) + "|" + + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" + + ")(#.*)"; matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?://)?(?:www\\.)?matrix\\.to/#/(([#@!+]).*)"; matrixLinkify.MATRIXTO_MD_LINK_PATTERN = @@ -253,7 +254,7 @@ matrixLinkify.options = { target: function(href, type) { if (type === 'url') { const transformed = tryTransformPermalinkToLocalHref(href); - if (transformed !== href || href.match(matrixLinkify.VECTOR_URL_PATTERN)) { + if (transformed !== href || href.match(matrixLinkify.ELEMENT_URL_PATTERN)) { return null; } else { return '_blank'; diff --git a/src/utils/permalinks/Permalinks.js b/src/utils/permalinks/Permalinks.js index 39c5776852..e157ecc55e 100644 --- a/src/utils/permalinks/Permalinks.js +++ b/src/utils/permalinks/Permalinks.js @@ -331,7 +331,7 @@ export function tryTransformPermalinkToLocalHref(permalink: string): string { return permalink; } - const m = permalink.match(matrixLinkify.VECTOR_URL_PATTERN); + const m = permalink.match(matrixLinkify.ELEMENT_URL_PATTERN); if (m) { return m[1]; } @@ -365,7 +365,7 @@ export function getPrimaryPermalinkEntity(permalink: string): string { // If not a permalink, try the vector patterns. if (!permalinkParts) { - const m = permalink.match(matrixLinkify.VECTOR_URL_PATTERN); + const m = permalink.match(matrixLinkify.ELEMENT_URL_PATTERN); if (m) { // A bit of a hack, but it gets the job done const handler = new ElementPermalinkConstructor("http://localhost"); From 93e24fae7a5b109dc5b53afdcbe73789e777bc81 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 21 Dec 2020 13:15:00 +0000 Subject: [PATCH 171/187] Recognise *.element.io links as Element permalinks This ensures all Elements detect permalinks to official deployments as Element and handle them internally. Fixes https://github.com/vector-im/element-web/issues/16005 --- src/linkify-matrix.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index bee8e95137..1a40fde26f 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -188,7 +188,8 @@ const escapeRegExp = function(string) { matrixLinkify.ELEMENT_URL_PATTERN = "^(?:https?://)?(?:" + escapeRegExp(window.location.host + window.location.pathname) + "|" + - "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" + + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/|" + + "(?:app|beta|staging|develop)\\.element\\.io/" + ")(#.*)"; matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?://)?(?:www\\.)?matrix\\.to/#/(([#@!+]).*)"; From 44c705e41c73676f27c96d9c8975330391ffc71a Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 21 Dec 2020 15:24:59 +0000 Subject: [PATCH 172/187] Look for emoji in the body that will be displayed Fixes https://github.com/vector-im/element-web/issues/16013 --- src/HtmlUtils.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index ba0781f0a4..637c0a2696 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -438,13 +438,14 @@ export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts delete sanitizeParams.textFilter; } + const contentBody = isDisplayedWithHtml ? safeBody : strippedBody; if (opts.returnString) { - return isDisplayedWithHtml ? safeBody : strippedBody; + return contentBody; } let emojiBody = false; if (!opts.disableBigEmoji && bodyHasEmoji) { - let contentBodyTrimmed = strippedBody !== undefined ? strippedBody.trim() : ''; + let contentBodyTrimmed = contentBody !== undefined ? contentBody.trim() : ''; // Ignore spaces in body text. Emojis with spaces in between should // still be counted as purely emoji messages. From 3907826cd627c6365d3ca095114ed234444f6328 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 21 Dec 2020 15:24:59 +0000 Subject: [PATCH 173/187] Look for emoji in the body that will be displayed Fixes https://github.com/vector-im/element-web/issues/16013 --- src/HtmlUtils.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index 2301ad250b..9e42553dfa 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -438,13 +438,14 @@ export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts delete sanitizeParams.textFilter; } + const contentBody = isDisplayedWithHtml ? safeBody : strippedBody; if (opts.returnString) { - return isDisplayedWithHtml ? safeBody : strippedBody; + return contentBody; } let emojiBody = false; if (!opts.disableBigEmoji && bodyHasEmoji) { - let contentBodyTrimmed = strippedBody !== undefined ? strippedBody.trim() : ''; + let contentBodyTrimmed = contentBody !== undefined ? contentBody.trim() : ''; // Ignore spaces in body text. Emojis with spaces in between should // still be counted as purely emoji messages. From 78e6fb91214af5b833ac25bb81748a99f0bfc61e Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:00:39 +0000 Subject: [PATCH 174/187] Upgrade matrix-js-sdk to 9.4.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2a3a2064f2..52c9c3f730 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "9.4.0-rc.2", + "matrix-js-sdk": "9.4.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 66c4fe2ae1..3c2fcc0949 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6512,10 +6512,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.4.0-rc.2: - version "9.4.0-rc.2" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.0-rc.2.tgz#8cd0eb9a76445c63e152ff7c8eb708513a67481e" - integrity sha512-Z2GJ0uv+/0IlwoAyducBBVZUTe4COyKtl6kanZNHK4kSGYZ/8pilTtMBj8fJJtWubOiZ6HxtaLEXrxulOJF+TA== +matrix-js-sdk@9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.0.tgz#86bd3e0d974ea5b1351a40c01d3e0d7d0ca76fe3" + integrity sha512-VN52M1M4VeXCHr9cmdzAwDEcPsIjPSykZQmJG1haL5KG792jT35f95+Vbp7v0c8Mai57vbEhoC8GugA9u+qV7Q== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 74c33cabcae125f27f3bc5b453e3d06fd2d2729d Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:06:40 +0000 Subject: [PATCH 175/187] Prepare changelog for v3.11.0 --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99d0aab14b..3d92148e8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +Changes in [3.11.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.0) (2020-12-21) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.0-rc.2...v3.11.0) + + * Upgrade JS SDK to 9.4.0 + * [Release] Look for emoji in the body that will be displayed + [\#5519](https://github.com/matrix-org/matrix-react-sdk/pull/5519) + * [Release] Recognise `*.element.io` links as Element permalinks + [\#5516](https://github.com/matrix-org/matrix-react-sdk/pull/5516) + * [Release] Fixes for call UI + [\#5513](https://github.com/matrix-org/matrix-react-sdk/pull/5513) + * [RELEASE] Add a snowfall chat effect (with /snowfall command) + [\#5512](https://github.com/matrix-org/matrix-react-sdk/pull/5512) + * [Release] Fix padding in confirmation email registration prompt + [\#5502](https://github.com/matrix-org/matrix-react-sdk/pull/5502) + Changes in [3.11.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.0-rc.2) (2020-12-16) =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.0-rc.1...v3.11.0-rc.2) From d23d0b2b42ece6f83a6cc48e5eed638c152424f2 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:06:40 +0000 Subject: [PATCH 176/187] v3.11.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52c9c3f730..81cf8f8873 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.11.0-rc.2", + "version": "3.11.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From e551e7ac40a66954e1170528d80b97c34f08342e Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:08:51 +0000 Subject: [PATCH 177/187] 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 81cf8f8873..e342b9a0e2 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "9.4.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 56bbfb1249..9681f9a7a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6512,10 +6512,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.4.0: +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "9.4.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.0.tgz#86bd3e0d974ea5b1351a40c01d3e0d7d0ca76fe3" - integrity sha512-VN52M1M4VeXCHr9cmdzAwDEcPsIjPSykZQmJG1haL5KG792jT35f95+Vbp7v0c8Mai57vbEhoC8GugA9u+qV7Q== + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/5b1e3537cc8821f508473d98b5d286dedb7ed3ab" dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" 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 178/187] 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 ec274196c4dbd755d545fa84ae4b2eeb147fb26d Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:32:49 +0000 Subject: [PATCH 179/187] Prepare changlog for v3.11.1 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d92148e8e..ef31ef886f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +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) + + * Upgrade JS SDK to 9.4.1 + Changes in [3.11.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.0) (2020-12-21) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.0-rc.2...v3.11.0) From cc0bef7f8d2422967a3d2f55704adc9f7327bd77 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:36:46 +0000 Subject: [PATCH 180/187] Upgrade matrix-js-sdk to 9.4.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 81cf8f8873..f0056d1f6f 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "9.4.0", + "matrix-js-sdk": "9.4.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 3c2fcc0949..452d6fd20b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6512,10 +6512,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.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.0.tgz#86bd3e0d974ea5b1351a40c01d3e0d7d0ca76fe3" - integrity sha512-VN52M1M4VeXCHr9cmdzAwDEcPsIjPSykZQmJG1haL5KG792jT35f95+Vbp7v0c8Mai57vbEhoC8GugA9u+qV7Q== +matrix-js-sdk@9.4.1: + version "9.4.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.1.tgz#dc15ed0a8c2a2b588e2ce5011f881717bc6efd53" + integrity sha512-6iCzKym869OpZnose+g/Xg3GMNrVXn2TFJnlPEy7rshOHeKLVCoFuQcIdApcGftnfh3fi0t3qRuD7o17xt2wiA== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 5fd39954a1e7ed2dc1e5f04d2c1e8021dac9c12a Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:37:29 +0000 Subject: [PATCH 181/187] v3.11.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f0056d1f6f..f56e83fdd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.11.0", + "version": "3.11.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From c4f726932149373e9c4b6d3ef29b62e4ccc2dd78 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 21 Dec 2020 17:52:30 +0000 Subject: [PATCH 182/187] 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 f56e83fdd4..7086ec2348 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "9.4.1", + "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 4d1e54f75e..e053a0a61b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6512,10 +6512,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.4.1: +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "9.4.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.4.1.tgz#dc15ed0a8c2a2b588e2ce5011f881717bc6efd53" - integrity sha512-6iCzKym869OpZnose+g/Xg3GMNrVXn2TFJnlPEy7rshOHeKLVCoFuQcIdApcGftnfh3fi0t3qRuD7o17xt2wiA== + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/1717fcf499b943517213f2a81c41ffec0b50748e" dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 452fbb076b6b37dd064aa5567cbacd9f755043a8 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 23 Dec 2020 19:02:01 +0000 Subject: [PATCH 183/187] Add a dialpad UI for PSTN lookup Queries the homeserver for PSTN protocol support, and if found, the add-room button on the DM rooms list section opens a context menu instead with a 'dial pad' option as well as the current 'start chat' dialog. Entering a number into this and pressing dial performs a thirdparty user query for the given string and starts a DM with that user. --- res/css/_components.scss | 2 + res/css/views/rooms/_RoomList.scss | 3 + res/css/views/voip/_DialPad.scss | 62 ++++++++++++ res/css/views/voip/_DialPadModal.scss | 74 ++++++++++++++ res/img/element-icons/call/delete.svg | 10 ++ res/img/element-icons/roomlist/dialpad.svg | 3 + src/CallHandler.tsx | 34 +++++++ src/components/structures/MatrixChat.tsx | 4 + src/components/views/rooms/RoomList.tsx | 65 ++++++++++-- src/components/views/voip/DialPad.tsx | 82 +++++++++++++++ src/components/views/voip/DialPadModal.tsx | 111 +++++++++++++++++++++ src/dispatcher/actions.ts | 11 ++ src/i18n/strings/en_EN.json | 5 + 13 files changed, 460 insertions(+), 6 deletions(-) create mode 100644 res/css/views/voip/_DialPad.scss create mode 100644 res/css/views/voip/_DialPadModal.scss create mode 100644 res/img/element-icons/call/delete.svg create mode 100644 res/img/element-icons/roomlist/dialpad.svg create mode 100644 src/components/views/voip/DialPad.tsx create mode 100644 src/components/views/voip/DialPadModal.tsx diff --git a/res/css/_components.scss b/res/css/_components.scss index d8bc238db5..9041eef13f 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -236,4 +236,6 @@ @import "./views/verification/_VerificationShowSas.scss"; @import "./views/voip/_CallContainer.scss"; @import "./views/voip/_CallView.scss"; +@import "./views/voip/_DialPad.scss"; +@import "./views/voip/_DialPadModal.scss"; @import "./views/voip/_VideoFeed.scss"; diff --git a/res/css/views/rooms/_RoomList.scss b/res/css/views/rooms/_RoomList.scss index b7759d265f..66e1b827d0 100644 --- a/res/css/views/rooms/_RoomList.scss +++ b/res/css/views/rooms/_RoomList.scss @@ -24,6 +24,9 @@ limitations under the License. .mx_RoomList_iconExplore::before { mask-image: url('$(res)/img/element-icons/roomlist/explore.svg'); } +.mx_RoomList_iconDialpad::before { + mask-image: url('$(res)/img/element-icons/roomlist/dialpad.svg'); +} .mx_RoomList_explorePrompt { margin: 4px 12px 4px; diff --git a/res/css/views/voip/_DialPad.scss b/res/css/views/voip/_DialPad.scss new file mode 100644 index 0000000000..0c7bff0ce8 --- /dev/null +++ b/res/css/views/voip/_DialPad.scss @@ -0,0 +1,62 @@ +/* +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_DialPad { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; +} + +.mx_DialPad_button { + width: 40px; + height: 40px; + background-color: $theme-button-bg-color; + border-radius: 40px; + font-size: 18px; + font-weight: 600; + text-align: center; + vertical-align: middle; + line-height: 40px; +} + +.mx_DialPad_deleteButton, .mx_DialPad_dialButton { + &::before { + content: ''; + display: inline-block; + height: 40px; + width: 40px; + vertical-align: middle; + mask-repeat: no-repeat; + mask-size: 20px; + mask-position: center; + background-color: $primary-bg-color; + } +} + +.mx_DialPad_deleteButton { + background-color: $notice-primary-color; + &::before { + mask-image: url('$(res)/img/element-icons/call/delete.svg'); + mask-position: 9px; // delete icon is right-heavy so have to be slightly to the left to look centered + } +} + +.mx_DialPad_dialButton { + background-color: $accent-color; + &::before { + mask-image: url('$(res)/img/element-icons/call/voice-call.svg'); + } +} diff --git a/res/css/views/voip/_DialPadModal.scss b/res/css/views/voip/_DialPadModal.scss new file mode 100644 index 0000000000..f9d7673a38 --- /dev/null +++ b/res/css/views/voip/_DialPadModal.scss @@ -0,0 +1,74 @@ +/* +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_Dialog_dialPadWrapper .mx_Dialog { + padding: 0px; +} + +.mx_DialPadModal { + width: 192px; + height: 368px; +} + +.mx_DialPadModal_header { + margin-top: 12px; + margin-left: 12px; + margin-right: 12px; +} + +.mx_DialPadModal_title { + color: $muted-fg-color; + font-size: 12px; + font-weight: 600; +} + +.mx_DialPadModal_cancel { + float: right; + mask: url('$(res)/img/feather-customised/cancel.svg'); + mask-repeat: no-repeat; + mask-position: center; + mask-size: cover; + width: 14px; + height: 14px; + background-color: $dialog-close-fg-color; + cursor: pointer; +} + +.mx_DialPadModal_field { + border: none; + margin: 0px; +} + +.mx_DialPadModal_field input { + font-size: 18px; + font-weight: 600; +} + +.mx_DialPadModal_dialPad { + margin-left: 16px; + margin-right: 16px; + margin-top: 16px; +} + +.mx_DialPadModal_horizSep { + position: relative; + &::before { + content: ''; + position: absolute; + width: 100%; + border-bottom: 1px solid $input-darker-bg-color; + } +} diff --git a/res/img/element-icons/call/delete.svg b/res/img/element-icons/call/delete.svg new file mode 100644 index 0000000000..133bdad4ca --- /dev/null +++ b/res/img/element-icons/call/delete.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/res/img/element-icons/roomlist/dialpad.svg b/res/img/element-icons/roomlist/dialpad.svg new file mode 100644 index 0000000000..b51d4a4dc9 --- /dev/null +++ b/res/img/element-icons/roomlist/dialpad.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index 504dae5c84..bcb2042f84 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -82,6 +82,9 @@ import CountlyAnalytics from "./CountlyAnalytics"; 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'; + +const CHECK_PSTN_SUPPORT_ATTEMPTS = 3; enum AudioID { Ring = 'ringAudio', @@ -119,6 +122,8 @@ export default class CallHandler { private calls = new Map(); // roomId -> call private audioPromises = new Map>(); private dispatcherRef: string = null; + private supportsPstnProtocol = null; + private pstnSupportCheckTimer: NodeJS.Timeout; // number actually because we're in the browser static sharedInstance() { if (!window.mxCallHandler) { @@ -145,6 +150,8 @@ export default class CallHandler { if (SettingsStore.getValue(UIFeature.Voip)) { MatrixClientPeg.get().on('Call.incoming', this.onCallIncoming); } + + this.checkForPstnSupport(CHECK_PSTN_SUPPORT_ATTEMPTS); } stop() { @@ -158,6 +165,33 @@ export default class CallHandler { } } + private async checkForPstnSupport(maxTries) { + try { + const protocols = await MatrixClientPeg.get().getThirdpartyProtocols(); + if (protocols['im.vector.protocol.pstn'] !== undefined) { + this.supportsPstnProtocol = protocols['im.vector.protocol.pstn']; + } else if (protocols['m.protocol.pstn'] !== undefined) { + this.supportsPstnProtocol = protocols['m.protocol.pstn']; + } else { + this.supportsPstnProtocol = null; + } + dis.dispatch({action: Action.PstnSupportUpdated}); + } catch (e) { + if (maxTries === 1) { + console.log("Failed to check for pstn protocol support and no retries remain: assuming no support", e); + } else { + console.log("Failed to check for pstn protocol support: will retry", e); + this.pstnSupportCheckTimer = setTimeout(() => { + this.checkForPstnSupport(maxTries - 1); + }, 10000); + } + } + } + + getSupportsPstnProtocol() { + return this.supportsPstnProtocol; + } + private onCallIncoming = (call) => { // we dispatch this synchronously to make sure that the event // handlers on the call are set up immediately (so that if diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 4a8d3cc718..62c729c422 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -80,6 +80,7 @@ import CreateCommunityPrototypeDialog from "../views/dialogs/CreateCommunityProt import ThreepidInviteStore, { IThreepidInvite, IThreepidInviteWireFormat } from "../../stores/ThreepidInviteStore"; import {UIFeature} from "../../settings/UIFeature"; import { CommunityPrototypeStore } from "../../stores/CommunityPrototypeStore"; +import DialPadModal from "../views/voip/DialPadModal"; /** constants for MatrixChat.state.view */ export enum Views { @@ -703,6 +704,9 @@ export default class MatrixChat extends React.PureComponent { this.state.resizeNotifier.notifyLeftHandleResized(); }); break; + case Action.OpenDialPad: + Modal.createTrackedDialog('Dial pad', '', DialPadModal, {}, "mx_Dialog_dialPadWrapper"); + break; case 'on_logged_in': if ( !Lifecycle.isSoftLogout() && diff --git a/src/components/views/rooms/RoomList.tsx b/src/components/views/rooms/RoomList.tsx index 6e677f2b01..4a4afbc5ac 100644 --- a/src/components/views/rooms/RoomList.tsx +++ b/src/components/views/rooms/RoomList.tsx @@ -46,6 +46,7 @@ import { objectShallowClone, objectWithOnly } from "../../../utils/objects"; import { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../context_menus/IconizedContextMenu"; import AccessibleButton from "../elements/AccessibleButton"; import { CommunityPrototypeStore } from "../../../stores/CommunityPrototypeStore"; +import CallHandler from "../../../CallHandler"; interface IProps { onKeyDown: (ev: React.KeyboardEvent) => void; @@ -89,10 +90,44 @@ interface ITagAesthetics { defaultHidden: boolean; } -const TAG_AESTHETICS: { +interface ITagAestheticsMap { // @ts-ignore - TS wants this to be a string but we know better [tagId: TagID]: ITagAesthetics; -} = { +} + +// If we have no dialer support, we just show the create chat dialog +const dmOnAddRoom = (dispatcher?: Dispatcher) => { + (dispatcher || defaultDispatcher).dispatch({action: 'view_create_chat'}); +}; + +// If we have dialer support, show a context menu so the user can pick between +// the dialer and the create chat dialog +const dmAddRoomContextMenu = (onFinished: () => void) => { + return + { + e.preventDefault(); + e.stopPropagation(); + onFinished(); + defaultDispatcher.dispatch({action: "view_create_chat"}); + }} + /> + { + e.preventDefault(); + e.stopPropagation(); + onFinished(); + defaultDispatcher.fire(Action.OpenDialPad); + }} + /> + ; +}; + +const TAG_AESTHETICS: ITagAestheticsMap = { [DefaultTagID.Invite]: { sectionLabel: _td("Invites"), isInvite: true, @@ -108,9 +143,8 @@ const TAG_AESTHETICS: { isInvite: false, defaultHidden: false, addRoomLabel: _td("Start chat"), - onAddRoom: (dispatcher?: Dispatcher) => { - (dispatcher || defaultDispatcher).dispatch({action: 'view_create_chat'}); - }, + // Either onAddRoom or addRoomContextMenu are set depending on whether we + // have dialer support. }, [DefaultTagID.Untagged]: { sectionLabel: _td("Rooms"), @@ -178,6 +212,7 @@ function customTagAesthetics(tagId: TagID): ITagAesthetics { export default class RoomList extends React.PureComponent { private dispatcherRef; private customTagStoreRef; + private tagAesthetics: ITagAestheticsMap; constructor(props: IProps) { super(props); @@ -187,6 +222,10 @@ export default class RoomList extends React.PureComponent { isNameFiltering: !!RoomListStore.instance.getFirstNameFilterCondition(), }; + // shallow-copy from the template as we need to make modifications to it + this.tagAesthetics = Object.assign({}, TAG_AESTHETICS); + this.updateDmAddRoomAction(); + this.dispatcherRef = defaultDispatcher.register(this.onAction); } @@ -202,6 +241,17 @@ export default class RoomList extends React.PureComponent { if (this.customTagStoreRef) this.customTagStoreRef.remove(); } + private updateDmAddRoomAction() { + const dmTagAesthetics = Object.assign({}, TAG_AESTHETICS[DefaultTagID.DM]); + if (CallHandler.sharedInstance().getSupportsPstnProtocol()) { + dmTagAesthetics.addRoomContextMenu = dmAddRoomContextMenu; + } else { + dmTagAesthetics.onAddRoom = dmOnAddRoom; + } + + this.tagAesthetics[DefaultTagID.DM] = dmTagAesthetics; + } + private onAction = (payload: ActionPayload) => { if (payload.action === Action.ViewRoomDelta) { const viewRoomDeltaPayload = payload as ViewRoomDeltaPayload; @@ -214,6 +264,9 @@ export default class RoomList extends React.PureComponent { show_room_tile: true, // to make sure the room gets scrolled into view }); } + } else if (payload.action === Action.PstnSupportUpdated) { + this.updateDmAddRoomAction(); + this.updateLists(); } }; @@ -355,7 +408,7 @@ export default class RoomList extends React.PureComponent { const aesthetics: ITagAesthetics = isCustomTag(orderedTagId) ? customTagAesthetics(orderedTagId) - : TAG_AESTHETICS[orderedTagId]; + : this.tagAesthetics[orderedTagId]; if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`); components.push( void; +} + +class DialPadButton extends React.PureComponent { + onClick = () => { + this.props.onButtonPress(this.props.digit); + } + + render() { + switch (this.props.kind) { + case DialPadButtonKind.Digit: + return + {this.props.digit} + ; + case DialPadButtonKind.Delete: + return ; + case DialPadButtonKind.Dial: + return ; + } + } +} + +interface IProps { + onDigitPress: (string) => void; + onDeletePress: (string) => void; + onDialPress: (string) => void; +} + +export default class Dialpad extends React.PureComponent { + render() { + const buttonNodes = []; + + for (const button of BUTTONS) { + buttonNodes.push(); + } + + buttonNodes.push(); + buttonNodes.push(); + + return
+ {buttonNodes} +
; + } +} diff --git a/src/components/views/voip/DialPadModal.tsx b/src/components/views/voip/DialPadModal.tsx new file mode 100644 index 0000000000..9f7e4140c9 --- /dev/null +++ b/src/components/views/voip/DialPadModal.tsx @@ -0,0 +1,111 @@ +/* +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. +*/ + +import * as React from "react"; +import { ensureDMExists } from "../../../createRoom"; +import { _t } from "../../../languageHandler"; +import { MatrixClientPeg } from "../../../MatrixClientPeg"; +import AccessibleButton from "../elements/AccessibleButton"; +import Field from "../elements/Field"; +import DialPad from './DialPad'; +import dis from '../../../dispatcher/dispatcher'; +import Modal from "../../../Modal"; +import ErrorDialog from "../../views/dialogs/ErrorDialog"; + +interface IProps { + onFinished: (boolean) => void; +} + +interface IState { + value: string; +} + +export default class DialpadModal extends React.PureComponent { + constructor(props) { + super(props); + this.state = { + value: '', + } + } + + onCancelClick = () => { + this.props.onFinished(false); + } + + onChange = (ev) => { + this.setState({value: ev.target.value}); + } + + onFormSubmit = (ev) => { + ev.preventDefault(); + this.onDialPress(); + } + + onDigitPress = (digit) => { + this.setState({value: this.state.value + digit}); + } + + onDeletePress = () => { + if (this.state.value.length === 0) return; + this.setState({value: this.state.value.slice(0, -1)}); + } + + onDialPress = async () => { + const results = await MatrixClientPeg.get().getThirdpartyUser('im.vector.protocol.pstn', { + 'm.id.phone': this.state.value, + }); + if (!results || results.length === 0 || !results[0].userid) { + Modal.createTrackedDialog('', '', ErrorDialog, { + title: _t("Unable to look up phone number"), + description: _t("There was an error looking up the phone number"), + }); + } + const userId = results[0].userid; + + const roomId = await ensureDMExists(MatrixClientPeg.get(), userId); + + dis.dispatch({ + action: 'view_room', + room_id: roomId, + }); + + this.props.onFinished(true); + } + + render() { + return
+
+
+ {_t("Dial pad")} + +
+
+ + +
+
+
+ +
+
; + } +} diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts index 6fb71df30d..be292774de 100644 --- a/src/dispatcher/actions.ts +++ b/src/dispatcher/actions.ts @@ -94,4 +94,15 @@ export enum Action { * Trigged after the phase of the right panel is set. Should be used with AfterRightPanelPhaseChangePayload. */ AfterRightPanelPhaseChange = "after_right_panel_phase_change", + + /** + * Opens the modal dial pad + */ + OpenDialPad = "open_dial_pad", + + /** + * Fired when CallHandler has checked for PSTN protocol support + * XXX: Is an action the right thing for this? + */ + PstnSupportUpdated = "pstn_support_updated", } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 507f3e071f..be2a7b3dbe 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -861,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", @@ -1459,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", From 65285fd55e1beb9336c6f41cd5f966708e04b614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 24 Dec 2020 08:00:23 +0100 Subject: [PATCH 184/187] Fix 15988 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/NotificationPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/NotificationPanel.js b/src/components/structures/NotificationPanel.js index 2889afc1fc..b4eb6c187b 100644 --- a/src/components/structures/NotificationPanel.js +++ b/src/components/structures/NotificationPanel.js @@ -39,7 +39,7 @@ class NotificationPanel extends React.Component { const emptyState = (

{_t('You’re all caught up')}

-

{_t('You have no visible notifications in this room.')}

+

{_t('You have no visible notifications.')}

); let content; From 65af77e5464247891b7967b10681c773ceeefa1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 24 Dec 2020 08:01:35 +0100 Subject: [PATCH 185/187] i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/i18n/strings/en_EN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 507f3e071f..c0939871e2 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2431,7 +2431,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 a258a3874b87351b06787945536e9b27b553d501 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 4 Jan 2021 11:51:27 +0000 Subject: [PATCH 186/187] 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 187/187] 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",