From b21cf5edc6fa2ef68fbeec2984c165867f2679db Mon Sep 17 00:00:00 2001 From: Osoitz Date: Thu, 26 Mar 2020 16:45:55 +0000 Subject: [PATCH 001/230] Translated using Weblate (Basque) Currently translated at 100.0% (2240 of 2240 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eu/ --- src/i18n/strings/eu.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 5610493999..68162c1010 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -2275,5 +2275,21 @@ "Esc": "Esc", "Enter": "Sartu", "Space": "Zuriune-barra", - "End": "Amaiera" + "End": "Amaiera", + "Manually verify all remote sessions": "Egiaztatu eskuz urruneko saio guztiak", + "Update your secure storage": "Eguneratu zure biltegi segurua", + "Self signing private key:": "Norberak sinatutako gako pribatua:", + "cached locally": "cache lokalean", + "not found locally": "ez da lokalean aurkitu", + "User signing private key:": "Erabiltzaileak sinatzeko gako pribatua:", + "Secret Storage key format:": "Biltegi sekretuaren gakoaren formatua:", + "outdated": "zaharkitua", + "up to date": "egunean", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Egiaztatu erabiltzaile baten saio bakoitza hau fidagarri gisa markatzeko, ez dira zeharka sinatutako gailuak fidagarritzat jotzen.", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Gela zifratuetan, zuon mezuak babestuta daude, zuk zeuk eta hartzaileak bakarrik duzue hauek deszifratzeko gako bakanak.", + "Verify all users in a room to ensure it's secure.": "Egiaztatu gela bateko erabiltzaile guztiak segurua dela baieztatzeko.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Gela zifratuetan, egiaztatu erabiltzaile guztiak segurua dela baieztatzeko.", + "Verified": "Egiaztatuta", + "Verification cancelled": "Egiaztaketa ezeztatuta", + "Compare emoji": "Konparatu emojiak" } From 1110735df9eaafcd1b98775ca5dbacce721222c5 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson Date: Thu, 26 Mar 2020 14:58:40 +0000 Subject: [PATCH 002/230] Translated using Weblate (Swedish) Currently translated at 68.3% (1529 of 2240 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 94 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index e65e4e2099..3edb02df92 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -953,7 +953,7 @@ "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Du är administratör för denna community. Du kommer inte kunna gå med igen utan en inbjudan från en annan administratör.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Filen '%(fileName)s' överstiger denna hemserverns storleksgräns för uppladdningar", "Unable to load! Check your network connectivity and try again.": "Kan inte ladda! Kolla din nätverksuppkoppling och försök igen.", - "Whether or not you're logged in (we don't record your username)": "Huruvida du är inloggad (vi sparar inte ditt användarnamn)", + "Whether or not you're logged in (we don't record your username)": "Om du är inloggad eller inte (vi sparar inte ditt användarnamn)", "Failed to invite users to the room:": "Kunde inte bjuda in användare till rummet:", "Upgrades a room to a new version": "Uppgraderar ett num till en ny version", "Gets or sets the room topic": "Ger eller sätter ämnet för ett rum", @@ -1349,8 +1349,8 @@ "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Om du inte vill använda för att upptäcka och upptäckas av befintliga kontakter som du känner, ange en annan identitetsserver nedan.", "Identity Server": "Identitetsserver", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Du använder för närvarande inte en identitetsserver. Lägg till en nedan om du vill upptäcka och bli upptäckbar av befintliga kontakter som du känner.", - "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att koppla från din identitetsserver betyder att du inte kan upptäckas av andra användare och att du inte kommer att kunna bjuda in andra via e-post eller telefon.", - "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att använda en identitetsserver är valfritt. Om du väljer att inte använda en identitetsserver kan du inte upptäckas av andra användare och inte heller bjuda in andra via e-post eller telefon.", + "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att koppla från din identitetsserver betyder att du inte kan upptäckas av andra användare och att du inte kommer att kunna bjuda in andra via epost eller telefon.", + "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Att använda en identitetsserver är valfritt. Om du väljer att inte använda en identitetsserver kan du inte upptäckas av andra användare och inte heller bjuda in andra via epost eller telefon.", "Do not use an identity server": "Använd inte en identitetsserver", "Enter a new identity server": "Ange en ny identitetsserver", "Integration Manager": "Integrationshanterare", @@ -1541,10 +1541,94 @@ "Preview": "Förhandsvisa", "The message you are trying to send is too large.": "Meddelandet du försöker skicka är för stort.", "Find others by phone or email": "Hitta andra via telefon eller epost", - "Be found by phone or email": "Bli hittad via telefon eller e-post", + "Be found by phone or email": "Bli hittad via telefon eller epost", "Terms of Service": "Användarvillkor", "To continue you need to accept the terms of this service.": "För att fortsätta måste du acceptera villkoren för denna tjänst.", "Service": "Tjänst", "Summary": "Sammanfattning", - "Document": "Dokument" + "Document": "Dokument", + "The version of Riot": "Version av Riot", + "Whether you're using Riot on a device where touch is the primary input mechanism": "Om du använder Riot på en enhet där pekskärm är den primära inmatningsmekanismen", + "Whether you're using Riot as an installed Progressive Web App": "Om du använder Riot som en installerad progressiv webbapp", + "Your user agent": "Din användaragent", + "The information being sent to us to help make Riot better includes:": "Informationen som skickas till oss för att förbättra Riot inkluderar:", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det finns okända sessioner i det här rummet: om du fortsätter utan att verifiera dem kommer det att vara möjligt för någon att lyssna på ditt samtal.", + "Review Sessions": "Granska sessioner", + "If you cancel now, you won't complete verifying the other user.": "Om du avbryter nu kommer du inte att verifiera den andra användaren.", + "If you cancel now, you won't complete verifying your other session.": "Om du avbryter nu kommer du inte att verifiera din andra session.", + "If you cancel now, you won't complete your secret storage operation.": "Om du avbryter nu slutför du inte din operation för hemlig lagring.", + "Cancel entering passphrase?": "Avbryta att ange lösenfras?", + "Setting up keys": "Sätter upp nycklar", + "Verify this session": "Verifiera denna session", + "Encryption upgrade available": "Krypteringsuppgradering tillgänglig", + "Set up encryption": "Ställ in kryptering", + "Unverified session": "Overifierad session", + "Sign In or Create Account": "Logga in eller skapa konto", + "Use your account or create a new one to continue.": "Använd ditt konto eller skapa ett nytt för att fortsätta.", + "Create Account": "Skapa konto", + "Verifies a user, session, and pubkey tuple": "Verifierar en användar-, session- och pubkey-tupel", + "Unknown (user, session) pair:": "Okänt par (användare, session):", + "Session already verified!": "Sessionen är redan verifierad!", + "WARNING: Session already verified, but keys do NOT MATCH!": "VARNING: Sessionen har redan verifierats, men nycklarna MATCHAR INTE!", + "Unable to revoke sharing for email address": "Det gick inte att återkalla delning för e-postadress", + "Unable to share email address": "Det gick inte att dela e-postadress", + "Your email address hasn't been verified yet": "Din e-postadress har inte verifierats än", + "Click the link in the email you received to verify and then click continue again.": "Klicka på länken i e-postmeddelandet för att bekräfta och klicka sedan på Fortsätt igen.", + "Verify the link in your inbox": "Verifiera länken i din inkorg", + "Complete": "Färdigställ", + "Unable to revoke sharing for phone number": "Det gick inte att återkalla delning för telefonnummer", + "Unable to share phone number": "Det gick inte att dela telefonnummer", + "Please enter verification code sent via text.": "Ange verifieringskod skickad via textmeddelande.", + "Discovery options will appear once you have added a phone number above.": "Upptäcktsalternativ visas när du har lagt till ett telefonnummer ovan.", + "Verify session": "Verifiera sessionen", + "Use Legacy Verification (for older clients)": "Använd gammal verifiering (för äldre klienter)", + "Verify by comparing a short text string.": "Verifiera genom att jämföra en kort textsträng.", + "Begin Verifying": "Börja verifiera", + "Waiting for partner to accept...": "Väntar på partner att acceptera...", + "Nothing appearing? Not all clients support interactive verification yet. .": "Dyker inget upp? Alla klienter stöder inte interaktiv verifiering ännu. .", + "Waiting for %(userId)s to confirm...": "Väntar på att %(userId)s ska bekräfta...", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "För att verifiera att den här sessionen är betrodd, kontrollera att nyckeln du ser i Användarinställningar på den enheten stämmer med nyckeln nedan:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "För att verifiera att den här sessionen är betrodd, vänligen kontakta dess ägare på annat sätt (t.ex. personligen eller via ett telefonsamtal) och fråga om nyckeln i deras användarinställningar för denna session stämmer med nyckeln nedan:", + "Use two-way text verification": "Använd tvåvägs textverifiering", + "Session name": "Sessionsnamn", + "Session key": "Sessionsnyckel", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Om det matchar, tryck på verifieringsknappen nedan. Om det inte gör det, avlyssnar någon annan den här sessionen och du vill förmodligen trycka på svartlistaknappen istället.", + "Automatically invite users": "Bjud in användare automatiskt", + "Upgrade private room": "Uppgradera privat rum", + "Upgrade public room": "Uppgradera publikt rum", + "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Att uppgradera ett rum är en avancerad åtgärd och rekommenderas vanligtvis när ett rum är instabilt på grund av buggar, saknade funktioner eller säkerhetsproblem.", + "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Detta påverkar vanligtvis bara hur rummet bearbetas på servern. Om du har problem med Riot, rapportera ett fel.", + "You'll upgrade this room from to .": "Du kommer att uppgradera detta rum från till .", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Detta gör att du kan återgå till ditt konto efter att du har loggat ut, och logga in på andra sessioner.", + "Help": "Hjälp", + "Reload": "Ladda om", + "Take picture": "Ta bild", + "Remove for everyone": "Ta bort för alla", + "Remove for me": "Ta bort för mig", + "User Status": "Användarstatus", + "Confirm your identity by entering your account password below.": "Bekräfta din identitet genom att ange ditt kontolösenord nedan.", + "Space used:": "Använt utrymme:", + "Indexed messages:": "Indexerade meddelanden:", + "Indexed rooms:": "Indexerade rum:", + "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s av %(totalRooms)s", + "Navigation": "Navigering", + "Calls": "Samtal", + "Room List": "Rumslista", + "Autocomplete": "Komplettera automatiskt", + "Alt": "Alt", + "Alt Gr": "Alt Gr", + "Shift": "Shift", + "Super": "Super", + "Ctrl": "Ctrl", + "Toggle Bold": "Växla fet stil", + "Toggle Italics": "Växla kursiv", + "Toggle Quote": "Växla citat", + "New line": "Ny rad", + "Jump to room search": "Hoppa till rumssökning", + "Page Up": "Page Up", + "Page Down": "Page Down", + "Esc": "Esc", + "Enter": "Enter", + "Space": "Space", + "End": "End" } From b489a7c0d53fa5a6484b605f03249164330c5b76 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 27 Mar 2020 00:50:41 +0000 Subject: [PATCH 003/230] Allow reacting to stickers Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/utils/EventUtils.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/utils/EventUtils.js b/src/utils/EventUtils.js index 7e33aaed81..ac7ac8c9ec 100644 --- a/src/utils/EventUtils.js +++ b/src/utils/EventUtils.js @@ -31,13 +31,13 @@ export function isContentActionable(mxEvent) { // status is SENT before remote-echo, null after const isSent = !eventStatus || eventStatus === EventStatus.SENT; - if (isSent && mxEvent.getType() === 'm.room.message') { - const content = mxEvent.getContent(); - if ( - content.msgtype && - content.msgtype !== 'm.bad.encrypted' && - content.hasOwnProperty('body') - ) { + if (isSent) { + if (mxEvent.getType() === 'm.room.message') { + const content = mxEvent.getContent(); + if (content.msgtype && content.msgtype !== 'm.bad.encrypted' && content.hasOwnProperty('body')) { + return true; + } + } else if (mxEvent.getType() === 'm.sticker') { return true; } } From bfee6d83194ff6d0bb16de12dac3685e9c90ec1d Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Thu, 26 Mar 2020 18:35:19 +0000 Subject: [PATCH 004/230] Translated using Weblate (Albanian) Currently translated at 99.7% (2233 of 2240 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 543b5fadb3..7fd06eca15 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2280,5 +2280,19 @@ "Toggle video on/off": "Aktivizoni/çaktivizoni videon", "Previous/next unread room or DM": "Dhoma ose MD i palexuar i mëparshëm/pasues", "Previous/next room or DM": "Dhoma ose MD i mëparshëm/pasues", - "Toggle right panel": "Hap/mbyll panelin djathtas" + "Toggle right panel": "Hap/mbyll panelin djathtas", + "Unverified login. Was this you?": "Hyrje e paverifikuar. A qetë ju?", + "Manually verify all remote sessions": "Verifikoni dorazi krejt sesionet e largët", + "Update your secure storage": "Përditësoni depozitën tuaj të sigurt", + "Self signing private key:": "Kyç privat vetënënshkrimi:", + "cached locally": "ruajtur në fshehtinë lokalisht", + "not found locally": "i pagjetur lokalisht", + "User signing private key:": "Kyç privat nënshkrimesh përdoruesi:", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifikoni individualisht çdo sesion të përdorur nga një përdorues, për t’i vënë shenjë si i besuar, duke mos besuar pajisje cross-signed.", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Në dhoma të fshehtëzuara, mesazhet tuaj sigurohen dhe vetëm ju dhe marrësi ka kyçet unikë për shkyçjen e tyre.", + "Verify all users in a room to ensure it's secure.": "Verifiko krejt përdoruesit në dhomë, për të garantuar se është e sigurt.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Në dhoma të fshehtëzuara, verifikoni krejt përdoruesi për të garantuar se është e sigurt.", + "Verified": "I verifikuar", + "Verification cancelled": "Verifikimi u anulua", + "Compare emoji": "Krahasoni emoji" } From 538816a62608c1f7c47d2a279ff475c1841b58d3 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 27 Mar 2020 02:42:44 +0000 Subject: [PATCH 005/230] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2240 of 2240 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index eb4f94172e..58ebe3767a 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2294,5 +2294,15 @@ "Self signing private key:": "自行簽章私鑰:", "cached locally": "本機快取", "not found locally": "在本機找不到", - "User signing private key:": "使用者簽章私鑰:" + "User signing private key:": "使用者簽章私鑰:", + "Unverified login. Was this you?": "未驗證的登入。是您嗎?", + "Manually verify all remote sessions": "手動驗證所有遠端工作階段", + "Update your secure storage": "更新您的安全儲存空間", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "單獨驗證使用者使用的每個工作階段以將其標記為受信任,而非信任交叉簽章的裝置。", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "在已加密的聊天室中,您的訊息相當安全,只有您與接收者有獨一無二的金鑰可以將其解鎖。", + "Verify all users in a room to ensure it's secure.": "驗證所有在聊天室中的使用者以確保其安全。", + "In encrypted rooms, verify all users to ensure it’s secure.": "在已加密的聊天室中,驗證所有使用者以確保其安全。", + "Verified": "已驗證", + "Verification cancelled": "驗證已取消", + "Compare emoji": "比較顏文字" } From 2ec6210ebdbbf83a558b9230e153a3ce5fbd0881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Thu, 26 Mar 2020 19:50:11 +0000 Subject: [PATCH 006/230] Translated using Weblate (Czech) Currently translated at 96.7% (2167 of 2240 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 47 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 46675489b4..ef2e95949a 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2170,5 +2170,50 @@ "Mark all as read": "Označit vše jako přečtené", "Not currently indexing messages for any room.": "Aktuálně neindexujeme žádné zprávy.", "Currently indexing: %(currentRoom)s.": "Aktuálně indexujeme: %(currentRoom)s.", - "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s z %(totalRooms)s" + "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s z %(totalRooms)s", + "Review Sessions": "Prověřit relace", + "Unverified login. Was this you?": "Neověřené přihlášeni. Jste to vy?", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s změnil/a jméno místnosti z %(oldRoomName)s na %(newRoomName)s.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s přidal/a této místnosti alternativní adresy %(addresses)s.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s přidal/a této místnosti alternativní adresu %(addresses)s.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s odebral/a této místnosti alternativní adresy %(addresses)s.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s odebral/a této místnosti alternativní adresu %(addresses)s.", + "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s změnil/a této místnosti alternativní adresy.", + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s změnil/a této místnosti hlavní a alternativní adresy.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s změnil/a této místnosti adresy.", + "Manually Verify by Text": "Manuální textové ověření", + "Interactively verify by Emoji": "Interaktivní ověření s emotikonami", + "Support adding custom themes": "Umožnit přidání vlastního vzhledu", + "Manually verify all remote sessions": "Manuálně ověřit všechny relace", + "Update your secure storage": "Aktualizovat vaše bezpečné úložistě", + "cached locally": "uložen lokálně", + "not found locally": "nenalezen lolálně", + "Secret Storage key format:": "Formát klíče Bezpečného Úložistě:", + "outdated": "zastaralý", + "up to date": "aktuální", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Individuálně ověřit každou uživatelovu relaci a označit jí za důvěryhodnou, bez důvěry v cross-signing.", + "Invalid theme schema.": "Neplatné schéma vzhledu.", + "Error downloading theme information.": "Nepovedlo se stáhnout informace o vzhledu.", + "Theme added!": "Motiv vzhledu přidán!", + "Custom theme URL": "URL adresa vlastního vzhledu", + "Add theme": "Přidat motiv vzhledu", + "Keyboard Shortcuts": "Klávesové zkratky", + "Scroll to most recent messages": "Přejít na poslední zprávy", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Nepovedlo se změnit alternativní adresy místnosti. Možná to server neumožňuje a nebo je to dočasná chyba.", + "You don't have permission to delete the alias.": "Nemáte oprávnění odebrat alias.", + "Local address": "Lokální adresa", + "Published Addresses": "Publikovaná adresa", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Publikovaná adresa může být použíta kýmkoli na libovolném serveru pro přidání se do místnosti. Abyste mohli adresu publikovat, musí být nejdříve nastavená jako lokální.", + "Other published addresses:": "Další publikované adresy:", + "No other published addresses yet, add one below": "Zatím žádné další publikované adresy, přidejte nějakou níže", + "New published address (e.g. #alias:server)": "Nové publikované adresy (například #alias:server)", + "Local Addresses": "Lokální Adresy", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Nastavit adresy pro tuto místnost, aby uživatelé mohli místnost najít zkrze váš domovský server (%(localDomain)s)", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "V šifrovaných místnostech jsou vaše zprávy bezpečné a pouze vy a příjemce má klíče k jejich rozšifrování.", + "Verify all users in a room to ensure it's secure.": "Ověřit všechny uživatele v místnosti, abyste se přesvědčili o bezpečnosti.", + "In encrypted rooms, verify all users to ensure it’s secure.": "V šifrovaných místnostech ověřit všechny uživatele, abyste se přesvědčili o bezpečnosti.", + "Verified": "Oveřený", + "Verification cancelled": "Oveření bylo zrušeno", + "Compare emoji": "Porovnejte emotikony", + "Enter a server name": "Zadejte jméno serveru" } From b538bfa7dad40d3bae986cec8b6d07ce684d0747 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 26 Mar 2020 20:18:17 +0000 Subject: [PATCH 007/230] Translated using Weblate (Hungarian) Currently translated at 100.0% (2240 of 2240 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 78 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 7e78c367f7..271d7c5bc7 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1650,7 +1650,7 @@ "Make this room public": "A szoba legyen nyilvános", "Hide advanced": "Haladó elrejtése", "Show advanced": "Haladó megmutatása", - "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Felhasználók más matrix szerverekről a szobába való belépésének megakadályozása (Ezt a beállítást később nem lehet megváltoztatni!)", + "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Más szervereken lévő felhasználók belépésének letiltása-csak helyi szoba (Ezt a beállítást később nem lehet megváltoztatni!)", "Close dialog": "Ablak bezárása", "Show previews/thumbnails for images": "Előnézet/bélyegkép mutatása a képekhez", "Clear cache and reload": "Gyorsítótár ürítése és újratöltés", @@ -2226,5 +2226,79 @@ "Are you sure you want to remove %(serverName)s": "Biztos, hogy törölni szeretnéd: %(serverName)s", "Remove server": "Szerver törlése", "Matrix": "Matrix", - "Add a new server": "Új szerver hozzáadása" + "Add a new server": "Új szerver hozzáadása", + "Unverified login. Was this you?": "Ellenőrizetlen bejelentkezés. Te voltál?", + "Manually verify all remote sessions": "Az összes távoli munkamenet manuális ellenőrzése", + "Update your secure storage": "A biztonsági tárolód frissítése", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "A felhasználó által használt munkamenetek ellenőrzése egyenként, a kereszt-aláírással hitelesített eszközökben nem bízol meg.", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "A nyilvánosságra hozott címeket bárki bármelyik szerveren használhatja a szobádba való belépéshez. A cím közzétételéhez először helyi címnek kell beállítani.", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Állíts be címet ehhez a szobához, hogy a felhasználók a matrix szervereden megtalálhassák (%(localDomain)s)", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "A titkosított szobákban az üzeneted biztonságban van és csak neked és a címzetteknek van meg az egyedi kulcs a visszafejtéshez.", + "Verify all users in a room to ensure it's secure.": "Ellenőrizd a szoba összes tagját, hogy meggyőződhess a biztonságról.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Titkosított szobákban ellenőrizd a szoba összes tagját, hogy meggyőződhess a biztonságról.", + "Verified": "Hitelesített", + "Verification cancelled": "Ellenőrzés megszakítva", + "Compare emoji": "Emodzsik összehasonlítása", + "Enter the name of a new server you want to explore.": "Add meg a felfedezni kívánt új szerver nevét.", + "Server name": "Szerver neve", + "Add a new server...": "Új szerver hozzáadása…", + "%(networkName)s rooms": "%(networkName)s szobák", + "Matrix rooms": "Matrix szobák", + "Start a conversation with someone using their name, username (like ) or email address.": "Indíts beszélgetést valakinek a nevével, felhasználói nevével (mint ) vagy e-mail címével.", + "a new master key signature": "az új mester kulcs aláírás", + "a new cross-signing key signature": "az új eszközök közötti kulcs aláírása", + "a device cross-signing signature": "az eszköz eszközök közötti aláírása", + "a key signature": "kulcs aláírás", + "Riot encountered an error during upload of:": "Riot hibába ütközött a feltöltés közben:", + "Upload completed": "A feltöltés befejeződött", + "Cancelled signature upload": "Az aláírás feltöltése megszakítva", + "Unabled to upload": "A feltöltés nem lehetséges", + "Signature upload success": "Az aláírások feltöltése sikeres", + "Signature upload failed": "Az aláírások feltöltése sikertelen", + "Confirm by comparing the following with the User Settings in your other session:": "Erősítsd meg a felhasználói beállítások összehasonlításával a többi munkamenetedben:", + "Confirm this user's session by comparing the following with their User Settings:": "Ezt a munkamenetet hitelesítsd az ő felhasználói beállításának az összehasonlításával:", + "If they don't match, the security of your communication may be compromised.": "Ha nem egyeznek akkor a kommunikációtok biztonsága veszélyben lehet.", + "Open an existing session & use it to verify this one, granting it access to encrypted messages.": "Nyiss meg egy meglévő munkamenetet és használd ennek az ellenőrzéséhez, hogy a titkosított üzenetekhez hozzáférhessen.", + "Waiting…": "Várakozik…", + "If you can’t access one, ": "Ha nem érsz el egyet sem, ", + "Navigation": "Navigálás", + "Calls": "Hívások", + "Room List": "Szoba lista", + "Autocomplete": "Automatikus kiegészítés", + "Alt": "Alt", + "Alt Gr": "Alt Gr", + "Shift": "Shift", + "Super": "Super", + "Ctrl": "Ctrl", + "Toggle Bold": "Félkövér váltása", + "Toggle Italics": "Dőlt váltása", + "Toggle Quote": "Idézet váltása", + "New line": "Új sor", + "Navigate recent messages to edit": "Friss üzenetekben navigálás a szerkesztéshez", + "Jump to start/end of the composer": "Az üzenet elejére/végére ugrás a szerkesztőben", + "Navigate composer history": "A szerkesztő korábbi üzeneteiben navigálás", + "Toggle microphone mute": "Mikrofon némítás váltása", + "Toggle video on/off": "Videó ki-/bekapcsolás váltása", + "Jump to room search": "A szoba keresésre ugrás", + "Navigate up/down in the room list": "A szoba listában fel/le navigál", + "Select room from the room list": "Szoba kiválasztása a szoba listából", + "Collapse room list section": "Szoba lista rész bezárása", + "Expand room list section": "Szoba lista rész kinyitása", + "Clear room list filter field": "Szoba lista szűrő mező törlése", + "Scroll up/down in the timeline": "Az idővonalon görgetés fel/le", + "Previous/next unread room or DM": "Előző/következő olvasatlan szoba vagy közvetlen üzenet", + "Previous/next room or DM": "Előző/következő szoba vagy közvetlen üzenet", + "Toggle the top left menu": "Bal felső menü ki-/bekapcsolása", + "Close dialog or context menu": "Párbeszédablak vagy menü bezárása", + "Activate selected button": "Kiválasztott gomb aktiválása", + "Toggle right panel": "Jobb oldali panel váltása", + "Toggle this dialog": "Ennek a párbeszédablaknak a váltása", + "Move autocomplete selection up/down": "Automatikus kiegészítés kijelölésének mozgatása fel/le", + "Cancel autocomplete": "Automatikus kiegészítés megszakítása", + "Page Up": "Page Up", + "Page Down": "Page Down", + "Esc": "Esc", + "Enter": "Enter", + "Space": "Szóköz", + "End": "End" } From 15f61dca3503912d7e83390fae487721956fcdff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Fri, 27 Mar 2020 09:43:34 +0000 Subject: [PATCH 008/230] Translated using Weblate (French) Currently translated at 100.0% (2241 of 2241 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 941fd209f2..eb7e11c0f2 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2291,5 +2291,20 @@ "Toggle right panel": "Afficher/masquer le panneau de droite", "Secret Storage key format:": "Format de clé du coffre secret :", "outdated": "obsolète", - "up to date": "à jour" + "up to date": "à jour", + "Unverified login. Was this you?": "Connexion non vérifiée. Était-ce vous ?", + "Manually verify all remote sessions": "Vérifier manuellement toutes les sessions à distance", + "Update your secure storage": "Mettre à jour votre coffre sécurisé", + "Self signing private key:": "Clé privée d’auto-signature :", + "cached locally": "mise en cache localement", + "not found locally": "non trouvée localement", + "User signing private key:": "Clé privée de signature de l’utilisateur :", + "Session backup key:": "Clé de sauvegarde de session :", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Vérifiez individuellement chaque session utilisée par un utilisateur pour la marquer comme fiable, sans faire confiance aux appareils signés avec la signature croisée.", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Dans les salons chiffrés, vos messages sont sécurisés et seuls vous et le destinataire avez les clés uniques pour les déchiffrer.", + "Verify all users in a room to ensure it's secure.": "Vérifiez tous les utilisateurs d’un salon pour vous assurer qu’il est sécurisé.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Dans les salons chiffrés, vérifiez tous les utilisateurs pour vous assurer qu’il est sécurisé.", + "Verified": "Vérifié", + "Verification cancelled": "Vérification annulée", + "Compare emoji": "Comparer des émojis" } From f90dfa242184ecb3fb35f46152f5d15f8479ee66 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 27 Mar 2020 12:03:12 +0000 Subject: [PATCH 009/230] Translated using Weblate (Albanian) Currently translated at 99.7% (2234 of 2241 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 7fd06eca15..9c15bbaa3b 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2294,5 +2294,6 @@ "In encrypted rooms, verify all users to ensure it’s secure.": "Në dhoma të fshehtëzuara, verifikoni krejt përdoruesi për të garantuar se është e sigurt.", "Verified": "I verifikuar", "Verification cancelled": "Verifikimi u anulua", - "Compare emoji": "Krahasoni emoji" + "Compare emoji": "Krahasoni emoji", + "Session backup key:": "Kyç kopjeruajtjeje sesioni:" } From 71f8a49e60d32afbeb235e6699f73efc015f57d0 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Fri, 27 Mar 2020 14:55:06 +0000 Subject: [PATCH 010/230] Translated using Weblate (Basque) Currently translated at 100.0% (2241 of 2241 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eu/ --- src/i18n/strings/eu.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 68162c1010..69de024887 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -2291,5 +2291,7 @@ "In encrypted rooms, verify all users to ensure it’s secure.": "Gela zifratuetan, egiaztatu erabiltzaile guztiak segurua dela baieztatzeko.", "Verified": "Egiaztatuta", "Verification cancelled": "Egiaztaketa ezeztatuta", - "Compare emoji": "Konparatu emojiak" + "Compare emoji": "Konparatu emojiak", + "Unverified login. Was this you?": "Egiaztatu gabeko saioa. Zu izan zara?", + "Session backup key:": "Saioaren babes-kopia gakoa:" } From 39889a6e2b285f5b3f9ea7f3f0ffe1f1663c78b1 Mon Sep 17 00:00:00 2001 From: Tuomas Hietala Date: Fri, 27 Mar 2020 15:36:21 +0000 Subject: [PATCH 011/230] Translated using Weblate (Finnish) Currently translated at 92.0% (2062 of 2241 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 58 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 8f44d21c19..797acf90a6 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -1174,7 +1174,7 @@ "Only room administrators will see this warning": "Vain huoneen ylläpitäjät näkevät tämän varoituksen", "Add some now": "Lisää muutamia", "Error updating main address": "Pääosoitteen päivityksessä tapahtui virhe", - "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Huoneen pääosoitteen päivityksessä tapahtui virhe. Se ei välttämättä ole sallittua tällä palevlimella tai kyseessä on väliaikainen virhe.", + "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Huoneen pääosoitteen päivityksessä tapahtui virhe. Se ei välttämättä ole sallittua tällä palvelimella tai kyseessä on väliaikainen virhe.", "Error creating alias": "Aliaksen luonnissa tapahtui virhe", "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.": "Aliaksen luonnissa tapahtui virhe. Se ei välttämättä ole sallittua tällä palvelimella tai kyseessä on väliaikainen virhe.", "Error removing alias": "Aliaksen poistossa tapahtui virhe", @@ -2052,5 +2052,59 @@ "This bridge was provisioned by .": "Tämän sillan tarjoaa käyttäjä .", "This bridge is managed by .": "Tätä siltaa hallinnoi käyttäjä .", "Workspace: %(networkName)s": "Työtila: %(networkName)s", - "Channel: %(channelName)s": "Kanava: %(channelName)s" + "Channel: %(channelName)s": "Kanava: %(channelName)s", + "outdated": "vanhentunut", + "up to date": "ajan tasalla", + "Delete %(count)s sessions|other": "Poista %(count)s istuntoa", + "Enable": "Ota käyttöön", + "Backup is not signed by any of your sessions": "Mikään istuntosi ei ole allekirjoittanut varmuuskopiota", + "Theme added!": "Teema lisätty!", + "Add theme": "Lisää teema", + "Scroll to most recent messages": "Vieritä tuoreimpiin viesteihin", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Huoneen vaihtoehtoisten osoitteiden päivittämisessä tapahtui virhe. Palvelin ei ehkä salli sitä tai syynä oli tilapäinen virhe.", + "You don't have permission to delete the alias.": "Sinulla ei ole lupaa poistaa aliasta.", + "Local address": "Paikallinen osoite", + "Local Addresses": "Paikalliset osoitteet", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Aseta osoitteita tälle huoneelle, jotta käyttäjät löytävät tämän huoneen kotipalvelimeltasi (%(localDomain)s)", + "Your messages are not secure": "Viestisi eivät ole turvassa", + "Accepting …": "Hyväksytään …", + "Declining …": "Kieltäydytään …", + "Enter a server name": "Syötä palvelimen nimi", + "Looks good": "Hyvältä näyttää", + "Can't find this server or its room list": "Tätä palvelinta tai sen huoneluetteloa ei löydy", + "All rooms": "Kaikki huoneet", + "Your server": "Palvelimesi", + "Are you sure you want to remove %(serverName)s": "Haluatko varmasti poistaa palvelimen %(serverName)s", + "Remove server": "Poista palvelin", + "Matrix": "Matrix", + "Add a new server": "Lisää uusi palvelin", + "Server name": "Palvelimen nimi", + "Add a new server...": "Lisää uusi palvelin...", + "If you didn’t sign in to this session, your account may be compromised.": "Jos et kirjautunut tähän istuntoon, käyttäjätilisi saattaa olla vaarantunut.", + "This wasn't me": "Tämä en ollut minä", + "Unknown sessions": "Tuntemattomat istunnot", + "Waiting…": "Odotetaan…", + "Disable": "Poista käytöstä", + "Calls": "Puhelut", + "Room List": "Huoneluettelo", + "Autocomplete": "Automaattinen täydennys", + "Alt": "Alt", + "Alt Gr": "Alt Gr", + "Shift": "Vaihto", + "Ctrl": "Ctrl", + "Toggle Bold": "Lihavointi päälle/pois", + "Toggle Italics": "Kursivointi päälle/pois", + "Toggle Quote": "Lainaus päälle/pois", + "New line": "Rivinvaihto", + "Toggle microphone mute": "Mikrofonin mykistys päälle/pois", + "Toggle video on/off": "Video päälle/pois", + "Scroll up/down in the timeline": "Vieritä aikajanaa ylöspäin/alaspäin", + "Activate selected button": "Aktivoi valittu painike", + "Cancel autocomplete": "Peruuta automaattinen täydennys", + "Page Up": "Page Up", + "Page Down": "Page Down", + "Esc": "Esc", + "Enter": "Enter", + "Space": "Välilyönti", + "End": "End" } From 164854b4f8fff0354347048f1de422ce0757e0e4 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 28 Mar 2020 02:43:37 +0000 Subject: [PATCH 012/230] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2241 of 2241 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-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 58ebe3767a..a2d6f82c6b 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2304,5 +2304,6 @@ "In encrypted rooms, verify all users to ensure it’s secure.": "在已加密的聊天室中,驗證所有使用者以確保其安全。", "Verified": "已驗證", "Verification cancelled": "驗證已取消", - "Compare emoji": "比較顏文字" + "Compare emoji": "比較顏文字", + "Session backup key:": "工作階段備份金鑰:" } From b7d33a4c9ba1e824f1b1cfe8f82deb5801f7b7a3 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Sat, 28 Mar 2020 12:54:38 +0000 Subject: [PATCH 013/230] Translated using Weblate (Esperanto) Currently translated at 100.0% (2241 of 2241 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index f4bb6ec244..582b635ee1 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -2213,7 +2213,7 @@ "If you can’t access one, ": "Se vi ne povas iun atingi, ", "Manually Verify by Text": "Permane kontroli tekste", "Interactively verify by Emoji": "Interage kontroli bildosigne", - "Self signing private key:": "Memsubskriba privata ŝlosilo", + "Self signing private key:": "Memsubskriba privata ŝlosilo:", "cached locally": "kaŝmemorita loke", "not found locally": "ne trovita loke", "User signing private key:": "Uzantosubskriba privata ŝlosilo:", @@ -2233,7 +2233,7 @@ "Signature upload success": "Alŝuto de subskribo sukcesis", "Signature upload failed": "Alŝuto de subskribo malsukcesis", "Confirm by comparing the following with the User Settings in your other session:": "Konfirmu per komparo de la sekva kun la agardoj de uzanto en via alia salutaĵo:", - "Confirm this user's session by comparing the following with their User Settings:": "Konfirmu la salutaĵon de ĉi tiu uzanto per komparo de la sekva kun ĝiaj agordoj de uzanto", + "Confirm this user's session by comparing the following with their User Settings:": "Konfirmu la salutaĵon de ĉi tiu uzanto per komparo de la sekva kun ĝiaj agordoj de uzanto:", "If they don't match, the security of your communication may be compromised.": "Se ili ne akordas, la sekureco de via komunikado eble estas rompita.", "Navigation": "Navigado", "Calls": "Vokoj", @@ -2274,5 +2274,20 @@ "Esc": "Eskapa klavo", "Enter": "Eniga klavo", "Space": "Spaco", - "End": "Finen-klavo" + "End": "Finen-klavo", + "Whether you're using Riot as an installed Progressive Web App": "Ĉu vi uzas Rioton kiel Progresan retan aplikaĵon", + "Review Sessions": "Rekontroli salutaĵojn", + "Unverified login. Was this you?": "Nekontrolita salutaĵo. Ĉu tio estis vi?", + "Manually verify all remote sessions": "Permane kontroli ĉiujn forajn salutaĵojn", + "Update your secure storage": "Ĝisdatigi vian sekuran deponejon", + "Session backup key:": "Savkopia ŝlosilo de salutaĵo:", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Unuope kontroli ĉiun salutaĵon de uzanto por marki ĝin fidata, ne fidante transire subskribitajn aparatojn.", + "Invalid theme schema.": "Nevalida skemo de haŭto.", + "Mod": "Reguligisto", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "En ĉifritaj ĉambroj, viaj mesaĝoj estas sekurigitaj, kaj nur vi kaj la ricevanto havas la unikajn malĉifrajn ŝlosilojn.", + "Verify all users in a room to ensure it's secure.": "Kontroli ĉiujn uzantojn en ĉambro por certigi, ke ĝi sekuras.", + "In encrypted rooms, verify all users to ensure it’s secure.": "En ĉifritaj ĉambroj, kontroli ĉiujn uzantojn por certigi, ke ili sekuras.", + "Verified": "Kontrolita", + "Verification cancelled": "Kontrolo nuliĝis", + "Compare emoji": "Kompari bildsignojn" } From 78e46f04768249fb2aa3f62b5dc1d49f0b62dfae Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 27 Mar 2020 19:11:58 +0000 Subject: [PATCH 014/230] Translated using Weblate (Hungarian) Currently translated at 100.0% (2241 of 2241 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 271d7c5bc7..68cad86807 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2300,5 +2300,6 @@ "Esc": "Esc", "Enter": "Enter", "Space": "Szóköz", - "End": "End" + "End": "End", + "Session backup key:": "Munkamenet másolat kulcs:" } From b5c45b7d127bad0e269cdf2a58f691e11a8c44e6 Mon Sep 17 00:00:00 2001 From: random Date: Mon, 30 Mar 2020 10:16:01 +0000 Subject: [PATCH 015/230] Translated using Weblate (Italian) Currently translated at 100.0% (2242 of 2242 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 4829d4cf7a..f3aed44b05 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2288,5 +2288,21 @@ "Navigate composer history": "Naviga cronologia compositore", "Previous/next unread room or DM": "Stanza o msg non letti successivi/precedenti", "Previous/next room or DM": "Stanza o msg successivi/precedenti", - "Toggle right panel": "Apri/chiudi pannello a destra" + "Toggle right panel": "Apri/chiudi pannello a destra", + "Unverified login. Was this you?": "Accesso non verificato. Eri tu?", + "Manually verify all remote sessions": "Verifica manualmente tutte le sessioni remote", + "Update your secure storage": "Aggiorna la tua archiviazione sicura", + "Self signing private key:": "Chiave privata di auto-firma:", + "cached locally": "in cache locale", + "not found locally": "non trovato in locale", + "User signing private key:": "Chiave privata di firma utente:", + "Session backup key:": "Chiave di backup sessione:", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifica individualmente ogni sessione usata da un utente per segnarla come fidata, senza fidarsi dei dispositivi a firma incrociata.", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Nelle stanze cifrate, i tuoi messaggi sono protetti e solo tu ed il destinatario avete le chiavi univoche per sbloccarli.", + "Verify all users in a room to ensure it's secure.": "Verifica tutti gli utenti in una stanza per confermare che sia sicura.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Nelle stanze cifrate, verifica tutti gli utenti per confermare che siano sicure.", + "Verified": "Verificato", + "Verification cancelled": "Verifica annullata", + "Compare emoji": "Confronta emoji", + "Cancel replying to a message": "Annulla la risposta a un messaggio" } From da34e6241dd521a41354e10db8e1bf10810c97f8 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Mon, 30 Mar 2020 18:18:10 +0100 Subject: [PATCH 016/230] Make all 'font-size's and 'line-height's rem Font size of the whole app would ideally be controlled by a single value. This value is currently hard coded using the :root CSS selector. It is the intention to make this value configurable within riot. In the interim all font-sizes have been converted to rem by the simple process of regex. Replacing px values with their equivalent rem values assuming a font size of 15px and then rounded to three decimal places, which was the base at the time of this transformation. I'm expecting another commit cleaning up rem values but I thought it best to leave that to review. This commit doesn't address any scaling issues. I thought it better to land this unwieldy, mechanical, invisible change before the others otherwise the pr would be impossible to review thoroughly. --- res/css/_common.scss | 20 +++++++------ res/css/structures/_ContextualMenu.scss | 2 +- res/css/structures/_CreateRoom.scss | 2 +- res/css/structures/_FilePanel.scss | 8 +++--- res/css/structures/_GroupView.scss | 10 +++---- res/css/structures/_LeftPanel.scss | 2 +- res/css/structures/_MyGroups.scss | 8 +++--- res/css/structures/_NotificationPanel.scss | 4 +-- res/css/structures/_RightPanel.scss | 2 +- res/css/structures/_RoomDirectory.scss | 10 +++---- res/css/structures/_RoomStatusBar.scss | 14 +++++----- res/css/structures/_RoomSubList.scss | 4 +-- res/css/structures/_RoomView.scss | 4 +-- res/css/structures/_TabbedView.scss | 2 +- res/css/structures/_TagPanel.scss | 4 +-- res/css/structures/_ToastContainer.scss | 6 ++-- res/css/structures/_TopLeftMenuButton.scss | 2 +- res/css/structures/_ViewSource.scss | 2 +- .../structures/auth/_CompleteSecurity.scss | 2 +- res/css/views/auth/_AuthBody.scss | 8 +++--- res/css/views/auth/_AuthButtons.scss | 2 +- res/css/views/auth/_AuthFooter.scss | 2 +- res/css/views/auth/_CompleteSecurityBody.scss | 4 +-- res/css/views/auth/_LanguageSelector.scss | 2 +- res/css/views/auth/_ServerTypeSelector.scss | 2 +- .../context_menus/_RoomTileContextMenu.scss | 2 +- .../_StatusMessageContextMenu.scss | 2 +- .../context_menus/_TagTileContextMenu.scss | 2 +- res/css/views/context_menus/_TopLeftMenu.scss | 4 +-- .../views/dialogs/_AddressPickerDialog.scss | 4 +-- .../dialogs/_ConfirmUserActionDialog.scss | 8 +++--- res/css/views/dialogs/_CreateGroupDialog.scss | 4 +-- res/css/views/dialogs/_CreateRoomDialog.scss | 2 +- res/css/views/dialogs/_DevtoolsDialog.scss | 4 +-- res/css/views/dialogs/_InviteDialog.scss | 18 ++++++------ .../dialogs/_MessageEditHistoryDialog.scss | 4 +-- .../dialogs/_NewSessionReviewDialog.scss | 2 +- res/css/views/dialogs/_SetEmailDialog.scss | 2 +- res/css/views/dialogs/_SetMxIdDialog.scss | 2 +- res/css/views/dialogs/_SetPasswordDialog.scss | 2 +- res/css/views/dialogs/_TermsDialog.scss | 2 +- .../views/dialogs/_UnknownDeviceDialog.scss | 2 +- res/css/views/directory/_NetworkDropdown.scss | 14 +++++----- res/css/views/elements/_AccessibleButton.scss | 2 +- res/css/views/elements/_AddressTile.scss | 4 +-- .../views/elements/_DirectorySearchBox.scss | 2 +- res/css/views/elements/_Dropdown.scss | 4 +-- res/css/views/elements/_EventListSummary.scss | 14 +++++----- res/css/views/elements/_Field.scss | 6 ++-- res/css/views/elements/_FormButton.scss | 4 +-- res/css/views/elements/_ImageView.scss | 10 +++---- .../views/elements/_InteractiveTooltip.scss | 2 +- res/css/views/elements/_RichText.scss | 2 +- res/css/views/elements/_Tooltip.scss | 6 ++-- res/css/views/elements/_TooltipButton.scss | 4 +-- res/css/views/emojipicker/_EmojiPicker.scss | 8 +++--- res/css/views/messages/_DateSeparator.scss | 2 +- res/css/views/messages/_MessageActionBar.scss | 2 +- res/css/views/messages/_MessageTimestamp.scss | 2 +- res/css/views/messages/_ReactionsRow.scss | 2 +- .../views/messages/_ReactionsRowButton.scss | 2 +- res/css/views/messages/_ViewSourceEvent.scss | 2 +- .../views/messages/_common_CryptoEvent.scss | 4 +-- res/css/views/right_panel/_UserInfo.scss | 18 ++++++------ .../views/right_panel/_VerificationPanel.scss | 2 +- res/css/views/rooms/_AppsDrawer.scss | 10 +++---- .../views/rooms/_BasicMessageComposer.scss | 4 +-- res/css/views/rooms/_EntityTile.scss | 6 ++-- res/css/views/rooms/_EventTile.scss | 28 +++++++++---------- res/css/views/rooms/_JumpToBottomButton.scss | 4 +-- res/css/views/rooms/_MemberDeviceInfo.scss | 2 +- res/css/views/rooms/_MemberInfo.scss | 14 +++++----- res/css/views/rooms/_MemberList.scss | 2 +- res/css/views/rooms/_MessageComposer.scss | 6 ++-- .../rooms/_MessageComposerFormatBar.scss | 4 +-- res/css/views/rooms/_PresenceLabel.scss | 2 +- res/css/views/rooms/_RoomDropTarget.scss | 4 +-- res/css/views/rooms/_RoomHeader.scss | 8 +++--- res/css/views/rooms/_RoomList.scss | 4 +-- res/css/views/rooms/_RoomPreviewBar.scss | 6 ++-- res/css/views/rooms/_RoomTile.scss | 6 ++-- res/css/views/rooms/_SearchBar.scss | 4 +-- res/css/views/rooms/_SendMessageComposer.scss | 2 +- res/css/views/rooms/_WhoIsTypingTile.scss | 4 +-- res/css/views/settings/tabs/_SettingsTab.scss | 8 +++--- .../views/terms/_InlineTermsAgreement.scss | 2 +- .../verification/_VerificationShowSas.scss | 4 +-- res/css/views/voip/_CallView.scss | 2 +- res/css/views/voip/_IncomingCallbox.scss | 2 +- res/themes/dark/css/_dark.scss | 2 +- res/themes/light/css/_light.scss | 4 +-- 91 files changed, 230 insertions(+), 226 deletions(-) diff --git a/res/css/_common.scss b/res/css/_common.scss index ad64aced50..657fb21244 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -16,6 +16,10 @@ See the License for the specific language governing permissions and limitations under the License. */ +:root { + font-size: 15px; +} + html { /* hack to stop overscroll bounce on OSX and iOS. N.B. Breaks things when we have legitimate horizontal overscroll */ @@ -25,7 +29,7 @@ html { body { font-family: $font-family; - font-size: 15px; + font-size: 1rem; background-color: $primary-bg-color; color: $primary-fg-color; border: 0px; @@ -60,7 +64,7 @@ b { h2 { color: $primary-fg-color; font-weight: 400; - font-size: 18px; + font-size: 1.2rem; margin-top: 16px; margin-bottom: 16px; } @@ -76,7 +80,7 @@ input[type=search], input[type=password] { padding: 9px; font-family: $font-family; - font-size: 14px; + font-size: 0.933rem; font-weight: 600; min-width: 0; } @@ -253,7 +257,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { color: $light-fg-color; z-index: 4012; font-weight: 300; - font-size: 15px; + font-size: 1rem; position: relative; padding: 25px 30px 30px 30px; max-height: 80%; @@ -321,8 +325,8 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { } .mx_Dialog_title { - font-size: 22px; - line-height: 36px; + font-size: 1.467rem; + line-height: 2.400rem; color: $dialog-title-fg-color; } @@ -350,7 +354,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { .mx_Dialog_content { margin: 24px 0 68px; - font-size: 14px; + font-size: 0.933rem; color: $primary-fg-color; word-wrap: break-word; } @@ -446,7 +450,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { } .mx_TextInputDialog_input { - font-size: 15px; + font-size: 1rem; border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; diff --git a/res/css/structures/_ContextualMenu.scss b/res/css/structures/_ContextualMenu.scss index fa2d87029d..67e7a7a8d6 100644 --- a/res/css/structures/_ContextualMenu.scss +++ b/res/css/structures/_ContextualMenu.scss @@ -36,7 +36,7 @@ limitations under the License. background-color: $menu-bg-color; color: $primary-fg-color; position: absolute; - font-size: 14px; + font-size: 0.933rem; z-index: 5001; } diff --git a/res/css/structures/_CreateRoom.scss b/res/css/structures/_CreateRoom.scss index 10f9e23a02..3a66805bfe 100644 --- a/res/css/structures/_CreateRoom.scss +++ b/res/css/structures/_CreateRoom.scss @@ -26,7 +26,7 @@ limitations under the License. border-radius: 3px; border: 1px solid $strong-input-border-color; font-weight: 300; - font-size: 13px; + font-size: 0.867rem; padding: 9px; margin-top: 6px; } diff --git a/res/css/structures/_FilePanel.scss b/res/css/structures/_FilePanel.scss index 87e885e668..eceeab2e1b 100644 --- a/res/css/structures/_FilePanel.scss +++ b/res/css/structures/_FilePanel.scss @@ -49,7 +49,7 @@ limitations under the License. .mx_FilePanel .mx_EventTile .mx_MFileBody_download { display: flex; - font-size: 14px; + font-size: 0.933rem; color: $event-timestamp-color; } @@ -60,7 +60,7 @@ limitations under the License. .mx_FilePanel .mx_EventTile .mx_MImageBody_size { flex: 1 0 0; - font-size: 11px; + font-size: 0.733rem; text-align: right; white-space: nowrap; } @@ -80,7 +80,7 @@ limitations under the License. flex: 1 1 auto; line-height: initial; padding: 0px; - font-size: 11px; + font-size: 0.733rem; opacity: 1.0; color: $event-timestamp-color; } @@ -90,7 +90,7 @@ limitations under the License. text-align: right; visibility: visible; position: initial; - font-size: 11px; + font-size: 0.733rem; opacity: 1.0; color: $event-timestamp-color; } diff --git a/res/css/structures/_GroupView.scss b/res/css/structures/_GroupView.scss index 72a1132c15..6eb5e33462 100644 --- a/res/css/structures/_GroupView.scss +++ b/res/css/structures/_GroupView.scss @@ -134,7 +134,7 @@ limitations under the License. overflow: hidden; color: $primary-fg-color; font-weight: bold; - font-size: 22px; + font-size: 1.467rem; padding-left: 19px; padding-right: 16px; /* why isn't text-overflow working? */ @@ -148,7 +148,7 @@ limitations under the License. max-height: 42px; color: $settings-grey-fg-color; font-weight: 300; - font-size: 13px; + font-size: 0.867rem; padding-left: 19px; margin-right: 16px; overflow: hidden; @@ -196,7 +196,7 @@ limitations under the License. text-transform: uppercase; color: $h3-color; font-weight: 600; - font-size: 13px; + font-size: 0.867rem; margin-bottom: 10px; } @@ -226,7 +226,7 @@ limitations under the License. .mx_GroupView_rooms_header_addRow_label { display: inline-block; vertical-align: top; - line-height: 24px; + line-height: 1.600rem; padding-left: 28px; color: $accent-color; } @@ -258,7 +258,7 @@ limitations under the License. .mx_GroupView_membershipSection_description { /* To match textButton */ - line-height: 34px; + line-height: 2.267rem; } .mx_GroupView_membershipSection_description .mx_BaseAvatar { diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index 85fdfa092d..6af4b54f91 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -147,7 +147,7 @@ limitations under the License. } .mx_AccessibleButton { - font-size: 14px; + font-size: 0.933rem; margin: 4px 0 1px 9px; padding: 9px; padding-left: 42px; diff --git a/res/css/structures/_MyGroups.scss b/res/css/structures/_MyGroups.scss index 36150c33a5..042994e48c 100644 --- a/res/css/structures/_MyGroups.scss +++ b/res/css/structures/_MyGroups.scss @@ -105,7 +105,7 @@ limitations under the License. .mx_MyGroups_placeholder { background-color: $info-plinth-bg-color; color: $info-plinth-fg-color; - line-height: 400px; + line-height: 26.667rem; border-radius: 10px; text-align: center; } @@ -149,11 +149,11 @@ limitations under the License. .mx_GroupTile_profile .mx_GroupTile_name { margin: 0px; - font-size: 15px; + font-size: 1rem; } .mx_GroupTile_profile .mx_GroupTile_groupId { - font-size: 13px; + font-size: 0.867rem; opacity: 0.7; } @@ -161,7 +161,7 @@ limitations under the License. display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; - font-size: 13px; + font-size: 0.867rem; max-height: 36px; overflow: hidden; } diff --git a/res/css/structures/_NotificationPanel.scss b/res/css/structures/_NotificationPanel.scss index c9e0261ec9..ff95cc2dba 100644 --- a/res/css/structures/_NotificationPanel.scss +++ b/res/css/structures/_NotificationPanel.scss @@ -39,7 +39,7 @@ limitations under the License. .mx_NotificationPanel .mx_EventTile_roomName { font-weight: bold; - font-size: 14px; + font-size: 0.933rem; } .mx_NotificationPanel .mx_EventTile_roomName a { @@ -54,7 +54,7 @@ limitations under the License. .mx_NotificationPanel .mx_EventTile .mx_SenderProfile, .mx_NotificationPanel .mx_EventTile .mx_MessageTimestamp { color: $primary-fg-color; - font-size: 12px; + font-size: 0.8rem; display: inline; padding-left: 0px; } diff --git a/res/css/structures/_RightPanel.scss b/res/css/structures/_RightPanel.scss index 3c373e8883..b0c2b4650f 100644 --- a/res/css/structures/_RightPanel.scss +++ b/res/css/structures/_RightPanel.scss @@ -96,7 +96,7 @@ limitations under the License. } .mx_RightPanel_headerButton_badge { - font-size: 8px; + font-size: 0.533rem; border-radius: 8px; color: $accent-fg-color; background-color: $accent-color; diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index f3a7b0e243..b62f726d09 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -64,7 +64,7 @@ limitations under the License. } .mx_RoomDirectory_table { - font-size: 12px; + font-size: 0.8rem; color: $primary-fg-color; width: 100%; text-align: left; @@ -112,7 +112,7 @@ limitations under the License. .mx_RoomDirectory_name { display: inline-block; - font-size: 18px; + font-size: 1.2rem; font-weight: 600; } @@ -124,7 +124,7 @@ limitations under the License. border-radius: 10px; display: inline-block; height: 20px; - line-height: 20px; + line-height: 1.333rem; padding: 0 5px; color: $accent-fg-color; background-color: $rte-room-pill-color; @@ -136,7 +136,7 @@ limitations under the License. } .mx_RoomDirectory_alias { - font-size: 12px; + font-size: 0.8rem; color: $settings-grey-fg-color; } @@ -150,7 +150,7 @@ limitations under the License. } .mx_RoomDirectory > span { - font-size: 15px; + font-size: 1rem; margin-top: 0; .mx_AccessibleButton { diff --git a/res/css/structures/_RoomStatusBar.scss b/res/css/structures/_RoomStatusBar.scss index 090a40235f..1dc99b26f0 100644 --- a/res/css/structures/_RoomStatusBar.scss +++ b/res/css/structures/_RoomStatusBar.scss @@ -32,7 +32,7 @@ limitations under the License. .mx_RoomStatusBar_callBar { height: 50px; - line-height: 50px; + line-height: 3.333rem; } .mx_RoomStatusBar_placeholderIndicator span { @@ -94,7 +94,7 @@ limitations under the License. border-radius: 40px; width: 24px; height: 24px; - line-height: 24px; + line-height: 1.600rem; font-size: 0.8em; vertical-align: top; text-align: center; @@ -132,7 +132,7 @@ limitations under the License. .mx_RoomStatusBar_connectionLostBar_desc { color: $primary-fg-color; - font-size: 13px; + font-size: 0.867rem; opacity: 0.5; padding-bottom: 20px; } @@ -145,7 +145,7 @@ limitations under the License. .mx_RoomStatusBar_typingBar { height: 50px; - line-height: 50px; + line-height: 3.333rem; color: $primary-fg-color; opacity: 0.5; @@ -155,7 +155,7 @@ limitations under the License. .mx_RoomStatusBar_isAlone { height: 50px; - line-height: 50px; + line-height: 3.333rem; color: $primary-fg-color; opacity: 0.5; @@ -174,11 +174,11 @@ limitations under the License. .mx_RoomStatusBar_callBar { height: 40px; - line-height: 40px; + line-height: 2.667rem; } .mx_RoomStatusBar_typingBar { height: 40px; - line-height: 40px; + line-height: 2.667rem; } } diff --git a/res/css/structures/_RoomSubList.scss b/res/css/structures/_RoomSubList.scss index 1934e681c2..a76872a745 100644 --- a/res/css/structures/_RoomSubList.scss +++ b/res/css/structures/_RoomSubList.scss @@ -68,7 +68,7 @@ limitations under the License. text-transform: uppercase; color: $roomsublist-label-fg-color; font-weight: 700; - font-size: 12px; + font-size: 0.8rem; margin-left: 8px; } @@ -76,7 +76,7 @@ limitations under the License. flex: 0 0 auto; border-radius: 8px; font-weight: 600; - font-size: 12px; + font-size: 0.8rem; padding: 0 5px; color: $roomtile-badge-fg-color; background-color: $roomtile-name-color; diff --git a/res/css/structures/_RoomView.scss b/res/css/structures/_RoomView.scss index 5e826306c6..52de9384d7 100644 --- a/res/css/structures/_RoomView.scss +++ b/res/css/structures/_RoomView.scss @@ -23,7 +23,7 @@ limitations under the License. .mx_RoomView_fileDropTarget { min-width: 0px; width: 100%; - font-size: 18px; + font-size: 1.2rem; text-align: center; pointer-events: none; @@ -186,7 +186,7 @@ limitations under the License. .mx_RoomView_empty { flex: 1 1 auto; - font-size: 13px; + font-size: 0.867rem; padding-left: 3em; padding-right: 3em; margin-right: 20px; diff --git a/res/css/structures/_TabbedView.scss b/res/css/structures/_TabbedView.scss index 7904df5a82..20e2120bfd 100644 --- a/res/css/structures/_TabbedView.scss +++ b/res/css/structures/_TabbedView.scss @@ -39,7 +39,7 @@ limitations under the License. cursor: pointer; display: block; border-radius: 3px; - font-size: 14px; + font-size: 0.933rem; min-height: 24px; // use min-height instead of height to allow the label to overflow a bit margin-bottom: 6px; position: relative; diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index 472831c0d9..5173358bcc 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -139,7 +139,7 @@ limitations under the License. background-color: $neutral-badge-color; color: #ffffff; font-weight: 600; - font-size: 10px; + font-size: 0.667rem; text-align: center; padding-top: 1px; padding-left: 4px; @@ -157,7 +157,7 @@ limitations under the License. border-radius: 8px; color: $accent-fg-color; font-weight: 600; - font-size: 14px; + font-size: 0.933rem; padding: 0 5px; background-color: $roomtile-name-color; } diff --git a/res/css/structures/_ToastContainer.scss b/res/css/structures/_ToastContainer.scss index d1687743d6..07daf3f865 100644 --- a/res/css/structures/_ToastContainer.scss +++ b/res/css/structures/_ToastContainer.scss @@ -77,7 +77,7 @@ limitations under the License. grid-column: 1 / 3; grid-row: 1; margin: 0; - font-size: 15px; + font-size: 1rem; font-weight: 600; } @@ -96,11 +96,11 @@ limitations under the License. white-space: nowrap; text-overflow: ellipsis; margin: 4px 0 11px 0; - font-size: 12px; + font-size: 0.8rem; } .mx_Toast_deviceID { - font-size: 10px; + font-size: 0.667rem; } } } diff --git a/res/css/structures/_TopLeftMenuButton.scss b/res/css/structures/_TopLeftMenuButton.scss index ee03978f18..9bdffb530a 100644 --- a/res/css/structures/_TopLeftMenuButton.scss +++ b/res/css/structures/_TopLeftMenuButton.scss @@ -32,7 +32,7 @@ limitations under the License. .mx_TopLeftMenuButton_name { margin: 0 7px; - font-size: 18px; + font-size: 1.2rem; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; diff --git a/res/css/structures/_ViewSource.scss b/res/css/structures/_ViewSource.scss index b908861c6f..c84c48240e 100644 --- a/res/css/structures/_ViewSource.scss +++ b/res/css/structures/_ViewSource.scss @@ -29,7 +29,7 @@ limitations under the License. .mx_ViewSource pre { text-align: left; - font-size: 12px; + font-size: 0.8rem; padding: 0.5em 1em 0.5em 1em; word-wrap: break-word; white-space: pre-wrap; diff --git a/res/css/structures/auth/_CompleteSecurity.scss b/res/css/structures/auth/_CompleteSecurity.scss index 601492d43c..9367c2c996 100644 --- a/res/css/structures/auth/_CompleteSecurity.scss +++ b/res/css/structures/auth/_CompleteSecurity.scss @@ -34,7 +34,7 @@ limitations under the License. } .mx_CompleteSecurity_body { - font-size: 15px; + font-size: 1rem; } .mx_CompleteSecurity_waiting { diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index 7c5b008535..219bf6d0e7 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_AuthBody { width: 500px; - font-size: 12px; + font-size: 0.8rem; color: $authpage-secondary-color; background-color: $authpage-body-bg-color; border-radius: 0 4px 4px 0; @@ -25,14 +25,14 @@ limitations under the License. box-sizing: border-box; h2 { - font-size: 24px; + font-size: 1.600rem; font-weight: 600; margin-top: 8px; color: $authpage-primary-color; } h3 { - font-size: 14px; + font-size: 0.933rem; font-weight: 600; color: $authpage-primary-color; } @@ -98,7 +98,7 @@ limitations under the License. .mx_AuthBody_editServerDetails { padding-left: 1em; - font-size: 12px; + font-size: 0.8rem; font-weight: normal; } diff --git a/res/css/views/auth/_AuthButtons.scss b/res/css/views/auth/_AuthButtons.scss index 553adeee14..109a1f4670 100644 --- a/res/css/views/auth/_AuthButtons.scss +++ b/res/css/views/auth/_AuthButtons.scss @@ -43,7 +43,7 @@ limitations under the License. cursor: pointer; - font-size: 15px; + font-size: 1rem; padding: 0 11px; word-break: break-word; } diff --git a/res/css/views/auth/_AuthFooter.scss b/res/css/views/auth/_AuthFooter.scss index ab169a6898..b1bdcb697e 100644 --- a/res/css/views/auth/_AuthFooter.scss +++ b/res/css/views/auth/_AuthFooter.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_AuthFooter { text-align: center; width: 100%; - font-size: 14px; + font-size: 0.933rem; opacity: 0.72; padding: 20px 0; background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.8)); diff --git a/res/css/views/auth/_CompleteSecurityBody.scss b/res/css/views/auth/_CompleteSecurityBody.scss index c7860fbe74..af0620c329 100644 --- a/res/css/views/auth/_CompleteSecurityBody.scss +++ b/res/css/views/auth/_CompleteSecurityBody.scss @@ -24,13 +24,13 @@ limitations under the License. box-sizing: border-box; h2 { - font-size: 24px; + font-size: 1.600rem; font-weight: 600; margin-top: 0; } h3 { - font-size: 14px; + font-size: 0.933rem; font-weight: 600; } diff --git a/res/css/views/auth/_LanguageSelector.scss b/res/css/views/auth/_LanguageSelector.scss index 6f7eac0cf6..e9ac8688ed 100644 --- a/res/css/views/auth/_LanguageSelector.scss +++ b/res/css/views/auth/_LanguageSelector.scss @@ -20,7 +20,7 @@ limitations under the License. .mx_AuthBody_language .mx_Dropdown_input { border: none; - font-size: 14px; + font-size: 0.933rem; font-weight: 600; color: $authpage-lang-color; } diff --git a/res/css/views/auth/_ServerTypeSelector.scss b/res/css/views/auth/_ServerTypeSelector.scss index ed781726b7..2042358b8a 100644 --- a/res/css/views/auth/_ServerTypeSelector.scss +++ b/res/css/views/auth/_ServerTypeSelector.scss @@ -65,5 +65,5 @@ limitations under the License. } .mx_ServerTypeSelector_description { - font-size: 10px; + font-size: 0.667rem; } diff --git a/res/css/views/context_menus/_RoomTileContextMenu.scss b/res/css/views/context_menus/_RoomTileContextMenu.scss index 308cecfe1e..1e1a5f889f 100644 --- a/res/css/views/context_menus/_RoomTileContextMenu.scss +++ b/res/css/views/context_menus/_RoomTileContextMenu.scss @@ -38,7 +38,7 @@ limitations under the License. white-space: nowrap; display: flex; align-items: center; - line-height: 16px; + line-height: 1.067rem; } .mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet { diff --git a/res/css/views/context_menus/_StatusMessageContextMenu.scss b/res/css/views/context_menus/_StatusMessageContextMenu.scss index 2c8d608950..b68d16281a 100644 --- a/res/css/views/context_menus/_StatusMessageContextMenu.scss +++ b/res/css/views/context_menus/_StatusMessageContextMenu.scss @@ -44,7 +44,7 @@ input.mx_StatusMessageContextMenu_message { .mx_StatusMessageContextMenu_clear { @mixin mx_DialogButton; align-self: start; - font-size: 12px; + font-size: 0.8rem; padding: 6px 1em; border: 1px solid transparent; margin-right: 10px; diff --git a/res/css/views/context_menus/_TagTileContextMenu.scss b/res/css/views/context_menus/_TagTileContextMenu.scss index 46b279ce2d..20f95d7f84 100644 --- a/res/css/views/context_menus/_TagTileContextMenu.scss +++ b/res/css/views/context_menus/_TagTileContextMenu.scss @@ -22,7 +22,7 @@ limitations under the License. white-space: nowrap; display: flex; align-items: center; - line-height: 16px; + line-height: 1.067rem; } .mx_TagTileContextMenu_item object { diff --git a/res/css/views/context_menus/_TopLeftMenu.scss b/res/css/views/context_menus/_TopLeftMenu.scss index ed0d0106bc..abcaa4fcb5 100644 --- a/res/css/views/context_menus/_TopLeftMenu.scss +++ b/res/css/views/context_menus/_TopLeftMenu.scss @@ -19,12 +19,12 @@ limitations under the License. border-radius: 4px; .mx_TopLeftMenu_greyedText { - font-size: 12px; + font-size: 0.8rem; opacity: 0.5; } .mx_TopLeftMenu_upgradeLink { - font-size: 12px; + font-size: 0.8rem; img { margin-left: 5px; diff --git a/res/css/views/dialogs/_AddressPickerDialog.scss b/res/css/views/dialogs/_AddressPickerDialog.scss index 39a9260ba3..6b107b3253 100644 --- a/res/css/views/dialogs/_AddressPickerDialog.scss +++ b/res/css/views/dialogs/_AddressPickerDialog.scss @@ -28,7 +28,7 @@ limitations under the License. .mx_AddressPickerDialog_input, .mx_AddressPickerDialog_input:focus { height: 26px; - font-size: 14px; + font-size: 0.933rem; font-family: $font-family; padding-left: 12px; padding-right: 12px; @@ -50,7 +50,7 @@ limitations under the License. .mx_AddressPickerDialog_inputContainer { border-radius: 3px; border: solid 1px $input-border-color; - line-height: 36px; + line-height: 2.400rem; padding-left: 4px; padding-right: 4px; padding-top: 1px; diff --git a/res/css/views/dialogs/_ConfirmUserActionDialog.scss b/res/css/views/dialogs/_ConfirmUserActionDialog.scss index b859d6bf4d..e589ef0450 100644 --- a/res/css/views/dialogs/_ConfirmUserActionDialog.scss +++ b/res/css/views/dialogs/_ConfirmUserActionDialog.scss @@ -26,22 +26,22 @@ limitations under the License. } .mx_ConfirmUserActionDialog_name { - font-size: 18px; + font-size: 1.2rem; } .mx_ConfirmUserActionDialog_userId { - font-size: 13px; + font-size: 0.867rem; } .mx_ConfirmUserActionDialog_reasonField { font-family: $font-family; - font-size: 14px; + font-size: 0.933rem; color: $primary-fg-color; background-color: $primary-bg-color; border-radius: 3px; border: solid 1px $input-border-color; - line-height: 36px; + line-height: 2.400rem; padding-left: 16px; padding-right: 16px; padding-top: 1px; diff --git a/res/css/views/dialogs/_CreateGroupDialog.scss b/res/css/views/dialogs/_CreateGroupDialog.scss index 128eacc3ce..4159944e5d 100644 --- a/res/css/views/dialogs/_CreateGroupDialog.scss +++ b/res/css/views/dialogs/_CreateGroupDialog.scss @@ -25,7 +25,7 @@ limitations under the License. } .mx_CreateGroupDialog_input { - font-size: 15px; + font-size: 1rem; border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; @@ -44,7 +44,7 @@ limitations under the License. .mx_CreateGroupDialog_prefix, .mx_CreateGroupDialog_suffix { padding: 0px 5px; - line-height: 37px; + line-height: 2.467rem; background-color: $input-darker-bg-color; border: 1px solid $input-border-color; text-align: center; diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index 7416ec2ef4..1cdbe99843 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -49,7 +49,7 @@ limitations under the License. } .mx_CreateRoomDialog_input { - font-size: 15px; + font-size: 1rem; border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; diff --git a/res/css/views/dialogs/_DevtoolsDialog.scss b/res/css/views/dialogs/_DevtoolsDialog.scss index 500c46b5fd..399c7225f6 100644 --- a/res/css/views/dialogs/_DevtoolsDialog.scss +++ b/res/css/views/dialogs/_DevtoolsDialog.scss @@ -68,11 +68,11 @@ limitations under the License. width: 240px; color: $input-fg-color; font-family: $font-family; - font-size: 16px; + font-size: 1.067rem; } .mx_DevTools_textarea { - font-size: 12px; + font-size: 0.8rem; max-width: 684px; min-height: 250px; padding: 10px; diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index 5e0893b8fd..22b1867002 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -40,8 +40,8 @@ limitations under the License. textarea, textarea:focus { height: 34px; - line-height: 34px; - font-size: 14px; + line-height: 2.267rem; + font-size: 0.933rem; padding-left: 12px; margin: 0 !important; border: 0 !important; @@ -65,7 +65,7 @@ limitations under the License. min-width: 48px; margin-left: 10px; height: 25px; - line-height: 25px; + line-height: 1.667rem; } .mx_InviteDialog_buttonAndSpinner { @@ -84,7 +84,7 @@ limitations under the License. padding-bottom: 10px; h3 { - font-size: 12px; + font-size: 0.8rem; color: $muted-fg-color; font-weight: bold; text-transform: uppercase; @@ -143,23 +143,23 @@ limitations under the License. .mx_InviteDialog_roomTile_name { font-weight: 600; - font-size: 14px; + font-size: 0.933rem; color: $primary-fg-color; margin-left: 7px; } .mx_InviteDialog_roomTile_userId { - font-size: 12px; + font-size: 0.8rem; color: $muted-fg-color; margin-left: 7px; } .mx_InviteDialog_roomTile_time { text-align: right; - font-size: 12px; + font-size: 0.8rem; color: $muted-fg-color; float: right; - line-height: 36px; // Height of the avatar to keep the time vertically aligned + line-height: 2.400rem; // Height of the avatar to keep the time vertically aligned } .mx_InviteDialog_roomTile_highlight { @@ -176,7 +176,7 @@ limitations under the License. border-radius: 12px; display: inline-block; height: 24px; - line-height: 24px; + line-height: 1.600rem; padding-left: 8px; padding-right: 8px; color: #ffffff; // this is fine without a var because it's for both themes diff --git a/res/css/views/dialogs/_MessageEditHistoryDialog.scss b/res/css/views/dialogs/_MessageEditHistoryDialog.scss index 0066faccae..8d989f6a00 100644 --- a/res/css/views/dialogs/_MessageEditHistoryDialog.scss +++ b/res/css/views/dialogs/_MessageEditHistoryDialog.scss @@ -35,7 +35,7 @@ limitations under the License. .mx_MessageEditHistoryDialog_edits { list-style-type: none; - font-size: 14px; + font-size: 0.933rem; padding: 0; color: $primary-fg-color; @@ -60,7 +60,7 @@ limitations under the License. } .mx_MessageActionBar .mx_AccessibleButton { - font-size: 10px; + font-size: 0.667rem; padding: 0 8px; } } diff --git a/res/css/views/dialogs/_NewSessionReviewDialog.scss b/res/css/views/dialogs/_NewSessionReviewDialog.scss index 7e35fe941e..633b3a063b 100644 --- a/res/css/views/dialogs/_NewSessionReviewDialog.scss +++ b/res/css/views/dialogs/_NewSessionReviewDialog.scss @@ -32,6 +32,6 @@ limitations under the License. } .mx_NewSessionReviewDialog_deviceID { - font-size: 12px; + font-size: 0.8rem; color: $notice-secondary-color; } diff --git a/res/css/views/dialogs/_SetEmailDialog.scss b/res/css/views/dialogs/_SetEmailDialog.scss index 9d09a208df..a5013f79b1 100644 --- a/res/css/views/dialogs/_SetEmailDialog.scss +++ b/res/css/views/dialogs/_SetEmailDialog.scss @@ -20,7 +20,7 @@ limitations under the License. padding: 9px; color: $input-fg-color; background-color: $primary-bg-color; - font-size: 15px; + font-size: 1rem; width: 100%; max-width: 280px; margin-bottom: 10px; diff --git a/res/css/views/dialogs/_SetMxIdDialog.scss b/res/css/views/dialogs/_SetMxIdDialog.scss index f7d8a3d001..8208a679fd 100644 --- a/res/css/views/dialogs/_SetMxIdDialog.scss +++ b/res/css/views/dialogs/_SetMxIdDialog.scss @@ -29,7 +29,7 @@ limitations under the License. padding: 9px; color: $primary-fg-color; background-color: $primary-bg-color; - font-size: 15px; + font-size: 1rem; width: 100%; max-width: 280px; } diff --git a/res/css/views/dialogs/_SetPasswordDialog.scss b/res/css/views/dialogs/_SetPasswordDialog.scss index 325ff6c6ed..cff11c8afb 100644 --- a/res/css/views/dialogs/_SetPasswordDialog.scss +++ b/res/css/views/dialogs/_SetPasswordDialog.scss @@ -20,7 +20,7 @@ limitations under the License. padding: 9px; color: $primary-fg-color; background-color: $primary-bg-color; - font-size: 15px; + font-size: 1rem; max-width: 280px; margin-bottom: 10px; } diff --git a/res/css/views/dialogs/_TermsDialog.scss b/res/css/views/dialogs/_TermsDialog.scss index beb507e778..e9805d1b35 100644 --- a/res/css/views/dialogs/_TermsDialog.scss +++ b/res/css/views/dialogs/_TermsDialog.scss @@ -31,7 +31,7 @@ limitations under the License. } .mx_TermsDialog_termsTable { - font-size: 12px; + font-size: 0.8rem; width: 100%; } diff --git a/res/css/views/dialogs/_UnknownDeviceDialog.scss b/res/css/views/dialogs/_UnknownDeviceDialog.scss index 2b0f8dceca..8bb0ed4ff4 100644 --- a/res/css/views/dialogs/_UnknownDeviceDialog.scss +++ b/res/css/views/dialogs/_UnknownDeviceDialog.scss @@ -27,7 +27,7 @@ limitations under the License. // userid .mx_UnknownDeviceDialog p { font-weight: bold; - font-size: 16px; + font-size: 1.067rem; } .mx_UnknownDeviceDialog .mx_DeviceVerifyButtons { diff --git a/res/css/views/directory/_NetworkDropdown.scss b/res/css/views/directory/_NetworkDropdown.scss index 106392f880..2f0e3e6a17 100644 --- a/res/css/views/directory/_NetworkDropdown.scss +++ b/res/css/views/directory/_NetworkDropdown.scss @@ -47,9 +47,9 @@ limitations under the License. .mx_NetworkDropdown_server_title { padding: 0 10px; - font-size: 15px; + font-size: 1rem; font-weight: 600; - line-height: 20px; + line-height: 1.333rem; margin-bottom: 4px; // remove server button @@ -77,16 +77,16 @@ limitations under the License. .mx_NetworkDropdown_server_subtitle { padding: 0 10px; - font-size: 10px; - line-height: 14px; + font-size: 0.667rem; + line-height: 0.933rem; margin-top: -4px; margin-bottom: 4px; color: $muted-fg-color; } .mx_NetworkDropdown_server_network { - font-size: 12px; - line-height: 16px; + font-size: 0.8rem; + line-height: 1.067rem; padding: 4px 10px; cursor: pointer; position: relative; @@ -154,7 +154,7 @@ limitations under the License. .mx_NetworkDropdown_handle_server { color: $muted-fg-color; - font-size: 12px; + font-size: 0.8rem; } } diff --git a/res/css/views/elements/_AccessibleButton.scss b/res/css/views/elements/_AccessibleButton.scss index b87071745d..b7439d5856 100644 --- a/res/css/views/elements/_AccessibleButton.scss +++ b/res/css/views/elements/_AccessibleButton.scss @@ -27,7 +27,7 @@ limitations under the License. text-align: center; border-radius: 4px; display: inline-block; - font-size: 14px; + font-size: 0.933rem; } .mx_AccessibleButton_kind_primary { diff --git a/res/css/views/elements/_AddressTile.scss b/res/css/views/elements/_AddressTile.scss index 0ecfb17c83..94028481d4 100644 --- a/res/css/views/elements/_AddressTile.scss +++ b/res/css/views/elements/_AddressTile.scss @@ -19,9 +19,9 @@ limitations under the License. border-radius: 3px; background-color: rgba(74, 73, 74, 0.1); border: solid 1px $input-border-color; - line-height: 26px; + line-height: 1.733rem; color: $primary-fg-color; - font-size: 14px; + font-size: 0.933rem; font-weight: normal; margin-right: 4px; } diff --git a/res/css/views/elements/_DirectorySearchBox.scss b/res/css/views/elements/_DirectorySearchBox.scss index 75ef3fbabd..35fb80f5df 100644 --- a/res/css/views/elements/_DirectorySearchBox.scss +++ b/res/css/views/elements/_DirectorySearchBox.scss @@ -32,7 +32,7 @@ limitations under the License. background-repeat: no-repeat; text-indent: 18px; font-weight: 600; - font-size: 12px; + font-size: 0.8rem; user-select: none; cursor: pointer; } diff --git a/res/css/views/elements/_Dropdown.scss b/res/css/views/elements/_Dropdown.scss index 102ac56bf9..64bcf7a33a 100644 --- a/res/css/views/elements/_Dropdown.scss +++ b/res/css/views/elements/_Dropdown.scss @@ -29,7 +29,7 @@ limitations under the License. position: relative; border-radius: 3px; border: 1px solid $strong-input-border-color; - font-size: 12px; + font-size: 0.8rem; user-select: none; } @@ -53,7 +53,7 @@ limitations under the License. .mx_Dropdown_option { height: 35px; - line-height: 35px; + line-height: 2.333rem; padding-left: 8px; padding-right: 8px; } diff --git a/res/css/views/elements/_EventListSummary.scss b/res/css/views/elements/_EventListSummary.scss index 99a5c06a5f..a40c1384d7 100644 --- a/res/css/views/elements/_EventListSummary.scss +++ b/res/css/views/elements/_EventListSummary.scss @@ -19,7 +19,7 @@ limitations under the License. } .mx_TextualEvent.mx_EventListSummary_summary { - font-size: 14px; + font-size: 0.933rem; display: inline-flex; } @@ -27,7 +27,7 @@ limitations under the License. display: inline-block; margin-right: 8px; padding-top: 8px; - line-height: 12px; + line-height: 0.8rem; } .mx_EventListSummary_avatars .mx_BaseAvatar { @@ -46,19 +46,19 @@ limitations under the License. .mx_EventListSummary_line { border-bottom: 1px solid $primary-hairline-color; margin-left: 63px; - line-height: 30px; + line-height: 2.000rem; } .mx_MatrixChat_useCompactLayout { .mx_EventListSummary { - font-size: 13px; + font-size: 0.867rem; .mx_EventTile_line { - line-height: 20px; + line-height: 1.333rem; } } .mx_EventListSummary_line { - line-height: 22px; + line-height: 1.467rem; } .mx_EventListSummary_toggle { @@ -66,6 +66,6 @@ limitations under the License. } .mx_TextualEvent.mx_EventListSummary_summary { - font-size: 13px; + font-size: 0.867rem; } } diff --git a/res/css/views/elements/_Field.scss b/res/css/views/elements/_Field.scss index b260d4b097..26d24dba3a 100644 --- a/res/css/views/elements/_Field.scss +++ b/res/css/views/elements/_Field.scss @@ -40,7 +40,7 @@ limitations under the License. .mx_Field textarea { font-weight: normal; font-family: $font-family; - font-size: 14px; + font-size: 0.933rem; border: none; // Even without a border here, we still need this avoid overlapping the rounded // corners on the field above. @@ -102,7 +102,7 @@ limitations under the License. background-color 0.25s ease-out 0.1s; color: $primary-fg-color; background-color: transparent; - font-size: 14px; + font-size: 0.933rem; position: absolute; left: 0px; top: 0px; @@ -126,7 +126,7 @@ limitations under the License. color 0.25s ease-out 0s, top 0.25s ease-out 0s, background-color 0.25s ease-out 0s; - font-size: 10px; + font-size: 0.667rem; top: -13px; padding: 0 2px; background-color: $field-focused-label-bg-color; diff --git a/res/css/views/elements/_FormButton.scss b/res/css/views/elements/_FormButton.scss index 1483fe2091..c23ab6ee30 100644 --- a/res/css/views/elements/_FormButton.scss +++ b/res/css/views/elements/_FormButton.scss @@ -15,9 +15,9 @@ limitations under the License. */ .mx_FormButton { - line-height: 16px; + line-height: 1.067rem; padding: 5px 15px; - font-size: 12px; + font-size: 0.8rem; height: min-content; &:not(:last-child) { diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss index 67b0d6d7df..cc7fca67d3 100644 --- a/res/css/views/elements/_ImageView.scss +++ b/res/css/views/elements/_ImageView.scss @@ -102,13 +102,13 @@ limitations under the License. } .mx_ImageView_name { - font-size: 18px; + font-size: 1.2rem; margin-bottom: 6px; word-wrap: break-word; } .mx_ImageView_metadata { - font-size: 15px; + font-size: 1rem; opacity: 0.5; } @@ -118,13 +118,13 @@ limitations under the License. margin-bottom: 6px; border-radius: 5px; background-color: $lightbox-bg-color; - font-size: 14px; + font-size: 0.933rem; padding: 9px; border: 1px solid $lightbox-border-color; } .mx_ImageView_size { - font-size: 11px; + font-size: 0.733rem; } .mx_ImageView_link { @@ -133,7 +133,7 @@ limitations under the License. } .mx_ImageView_button { - font-size: 15px; + font-size: 1rem; opacity: 0.5; margin-top: 18px; cursor: pointer; diff --git a/res/css/views/elements/_InteractiveTooltip.scss b/res/css/views/elements/_InteractiveTooltip.scss index 17a76436e8..07441ef85d 100644 --- a/res/css/views/elements/_InteractiveTooltip.scss +++ b/res/css/views/elements/_InteractiveTooltip.scss @@ -24,7 +24,7 @@ limitations under the License. background-color: $interactive-tooltip-bg-color; color: $interactive-tooltip-fg-color; position: absolute; - font-size: 10px; + font-size: 0.667rem; font-weight: 600; padding: 6px; z-index: 5001; diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss index 5066ee10f3..d821f52e3d 100644 --- a/res/css/views/elements/_RichText.scss +++ b/res/css/views/elements/_RichText.scss @@ -9,7 +9,7 @@ border-radius: 16px; display: inline-block; height: 20px; - line-height: 20px; + line-height: 1.333rem; padding-left: 5px; } diff --git a/res/css/views/elements/_Tooltip.scss b/res/css/views/elements/_Tooltip.scss index cc4eb409df..61762ced92 100644 --- a/res/css/views/elements/_Tooltip.scss +++ b/res/css/views/elements/_Tooltip.scss @@ -58,8 +58,8 @@ limitations under the License. z-index: 4000; // Higher than dialogs so tooltips can be used in dialogs padding: 10px; pointer-events: none; - line-height: 14px; - font-size: 12px; + line-height: 0.933rem; + font-size: 0.8rem; font-weight: 600; color: $primary-fg-color; max-width: 200px; @@ -82,7 +82,7 @@ limitations under the License. text-align: center; border: none; border-radius: 3px; - font-size: 14px; + font-size: 0.933rem; line-height: 1.2; padding: 6px 8px; diff --git a/res/css/views/elements/_TooltipButton.scss b/res/css/views/elements/_TooltipButton.scss index 6ea36c800e..c350fc22e2 100644 --- a/res/css/views/elements/_TooltipButton.scss +++ b/res/css/views/elements/_TooltipButton.scss @@ -28,7 +28,7 @@ limitations under the License. transition: opacity 0.2s ease-in; opacity: 0.6; - line-height: 11px; + line-height: 0.733rem; text-align: center; cursor: pointer; @@ -47,6 +47,6 @@ limitations under the License. .mx_TooltipButton_helpText { width: 400px; text-align: start; - line-height: 17px !important; + line-height: 1.133rem !important; } diff --git a/res/css/views/emojipicker/_EmojiPicker.scss b/res/css/views/emojipicker/_EmojiPicker.scss index 5d9b3f2687..64b27b9ab3 100644 --- a/res/css/views/emojipicker/_EmojiPicker.scss +++ b/res/css/views/emojipicker/_EmojiPicker.scss @@ -163,7 +163,7 @@ limitations under the License. .mx_EmojiPicker_item { display: inline-block; - font-size: 20px; + font-size: 1.333rem; padding: 5px; width: 100%; height: 100%; @@ -183,7 +183,7 @@ limitations under the License. } .mx_EmojiPicker_category_label, .mx_EmojiPicker_preview_name { - font-size: 16px; + font-size: 1.067rem; font-weight: 600; margin: 0; } @@ -197,7 +197,7 @@ limitations under the License. } .mx_EmojiPicker_preview_emoji { - font-size: 32px; + font-size: 2.133rem; padding: 8px 16px; } @@ -212,7 +212,7 @@ limitations under the License. .mx_EmojiPicker_shortcode { color: $light-fg-color; - font-size: 14px; + font-size: 0.933rem; &::before, &::after { content: ":"; diff --git a/res/css/views/messages/_DateSeparator.scss b/res/css/views/messages/_DateSeparator.scss index 935ee1aba3..b02e72814f 100644 --- a/res/css/views/messages/_DateSeparator.scss +++ b/res/css/views/messages/_DateSeparator.scss @@ -19,7 +19,7 @@ limitations under the License. margin: 4px 0; display: flex; align-items: center; - font-size: 14px; + font-size: 0.933rem; color: $roomtopic-color; } diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index c032051c36..66ba0b227d 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -21,7 +21,7 @@ limitations under the License. cursor: pointer; display: flex; height: 24px; - line-height: 24px; + line-height: 1.600rem; border-radius: 4px; background: $message-action-bar-bg-color; top: -18px; diff --git a/res/css/views/messages/_MessageTimestamp.scss b/res/css/views/messages/_MessageTimestamp.scss index e5c228aa68..3a2a8d6336 100644 --- a/res/css/views/messages/_MessageTimestamp.scss +++ b/res/css/views/messages/_MessageTimestamp.scss @@ -16,5 +16,5 @@ limitations under the License. .mx_MessageTimestamp { color: $event-timestamp-color; - font-size: 10px; + font-size: 0.667rem; } diff --git a/res/css/views/messages/_ReactionsRow.scss b/res/css/views/messages/_ReactionsRow.scss index 57c02ed3e5..ee816e0fc0 100644 --- a/res/css/views/messages/_ReactionsRow.scss +++ b/res/css/views/messages/_ReactionsRow.scss @@ -21,7 +21,7 @@ limitations under the License. .mx_ReactionsRow_showAll { text-decoration: none; - font-size: 10px; + font-size: 0.667rem; font-weight: 600; margin-left: 6px; vertical-align: top; diff --git a/res/css/views/messages/_ReactionsRowButton.scss b/res/css/views/messages/_ReactionsRowButton.scss index e54201d963..7160c223be 100644 --- a/res/css/views/messages/_ReactionsRowButton.scss +++ b/res/css/views/messages/_ReactionsRowButton.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_ReactionsRowButton { display: inline-flex; height: 20px; - line-height: 21px; + line-height: 1.400rem; margin-right: 6px; padding: 0 6px; border: 1px solid $reaction-row-button-border-color; diff --git a/res/css/views/messages/_ViewSourceEvent.scss b/res/css/views/messages/_ViewSourceEvent.scss index a15924e759..088b66445d 100644 --- a/res/css/views/messages/_ViewSourceEvent.scss +++ b/res/css/views/messages/_ViewSourceEvent.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_EventTile_content.mx_ViewSourceEvent { display: flex; opacity: 0.6; - font-size: 12px; + font-size: 0.8rem; pre, code { flex: 1; diff --git a/res/css/views/messages/_common_CryptoEvent.scss b/res/css/views/messages/_common_CryptoEvent.scss index 98e1e97e39..c9499b763f 100644 --- a/res/css/views/messages/_common_CryptoEvent.scss +++ b/res/css/views/messages/_common_CryptoEvent.scss @@ -45,7 +45,7 @@ limitations under the License. .mx_cryptoEvent_title { font-weight: 600; - font-size: 15px; + font-size: 1rem; grid-column: 2; grid-row: 1; } @@ -56,7 +56,7 @@ limitations under the License. } .mx_cryptoEvent_state, .mx_cryptoEvent_subtitle { - font-size: 12px; + font-size: 0.8rem; } .mx_cryptoEvent_state, .mx_cryptoEvent_buttons { diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index 0e4b1bda9e..acc5e4641f 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -20,7 +20,7 @@ limitations under the License. flex-direction: column; flex: 1; overflow-y: auto; - font-size: 12px; + font-size: 0.8rem; .mx_UserInfo_cancel { cursor: pointer; @@ -43,7 +43,7 @@ limitations under the License. } h2 { - font-size: 18px; + font-size: 1.2rem; font-weight: 600; margin: 18px 0 0 0; } @@ -109,7 +109,7 @@ limitations under the License. justify-content: center; // override the calculated sizes so that the letter isn't HUGE - font-size: 56px !important; + font-size: 3.733rem !important; width: 100% !important; transition: font-size 0.5s; } @@ -122,7 +122,7 @@ limitations under the License. text-transform: uppercase; color: $notice-secondary-color; font-weight: bold; - font-size: 12px; + font-size: 0.8rem; margin: 4px 0; } @@ -134,8 +134,8 @@ limitations under the License. text-align: center; h2 { - font-size: 18px; - line-height: 25px; + font-size: 1.2rem; + line-height: 1.667rem; flex: 1; justify-content: center; align-items: center; @@ -197,7 +197,7 @@ limitations under the License. .mx_UserInfo_field { cursor: pointer; color: $accent-color; - line-height: 16px; + line-height: 1.067rem; margin: 8px 0; &.mx_UserInfo_destructive { @@ -206,7 +206,7 @@ limitations under the License. } .mx_UserInfo_statusMessage { - font-size: 11px; + font-size: 0.733rem; opacity: 0.5; overflow: hidden; white-space: nowrap; @@ -282,6 +282,6 @@ limitations under the License. } .mx_UserInfo_avatar .mx_BaseAvatar_initial { - font-size: 40px !important; // override the other override because here the avatar is smaller + font-size: 2.667rem !important; // override the other override because here the avatar is smaller } } diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 459622b277..4a10dcbbcd 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -95,7 +95,7 @@ limitations under the License. } .mx_VerificationPanel_QRPhase_helpText { - font-size: 14px; + font-size: 0.933rem; margin-top: 71px; text-align: center; } diff --git a/res/css/views/rooms/_AppsDrawer.scss b/res/css/views/rooms/_AppsDrawer.scss index a3fe573ad0..171cf49ba5 100644 --- a/res/css/views/rooms/_AppsDrawer.scss +++ b/res/css/views/rooms/_AppsDrawer.scss @@ -46,7 +46,7 @@ $AppsDrawerBodyHeight: 273px; padding: 0; margin: 5px auto 5px auto; color: $accent-color; - font-size: 12px; + font-size: 0.8rem; } .mx_AddWidget_button_full_width { @@ -59,7 +59,7 @@ $AppsDrawerBodyHeight: 273px; padding: 9px; color: $primary-hairline-color; background-color: $primary-bg-color; - font-size: 15px; + font-size: 1rem; } .mx_AppTile { @@ -102,7 +102,7 @@ $AppsDrawerBodyHeight: 273px; .mx_AppTileMenuBar { margin: 0; - font-size: 12px; + font-size: 0.8rem; background-color: $widget-menu-bar-bg-color; display: flex; flex-direction: row; @@ -272,7 +272,7 @@ form.mx_Custom_Widget_Form div { flex-direction: column; justify-content: center; align-items: center; - font-size: 16px; + font-size: 1.067rem; } .mx_AppPermissionWarning_row { @@ -280,7 +280,7 @@ form.mx_Custom_Widget_Form div { } .mx_AppPermissionWarning_smallText { - font-size: 12px; + font-size: 0.8rem; } .mx_AppPermissionWarning_bolder { diff --git a/res/css/views/rooms/_BasicMessageComposer.scss b/res/css/views/rooms/_BasicMessageComposer.scss index ce519b1ea7..c1f9663ea3 100644 --- a/res/css/views/rooms/_BasicMessageComposer.scss +++ b/res/css/views/rooms/_BasicMessageComposer.scss @@ -63,8 +63,8 @@ limitations under the License. border-radius: 8px; text-align: center; font-weight: normal; - line-height: 16px; - font-size: 10.4px; + line-height: 1.067rem; + font-size: 0.667rem; } } } diff --git a/res/css/views/rooms/_EntityTile.scss b/res/css/views/rooms/_EntityTile.scss index a2867de3a7..d66e4efe5c 100644 --- a/res/css/views/rooms/_EntityTile.scss +++ b/res/css/views/rooms/_EntityTile.scss @@ -78,7 +78,7 @@ limitations under the License. .mx_GroupRoomTile_name { flex: 1 1 0; overflow: hidden; - font-size: 14px; + font-size: 0.933rem; text-overflow: ellipsis; white-space: nowrap; } @@ -116,7 +116,7 @@ limitations under the License. } .mx_EntityTile_subtext { - font-size: 11px; + font-size: 0.733rem; opacity: 0.5; overflow: hidden; white-space: nowrap; @@ -125,7 +125,7 @@ limitations under the License. .mx_EntityTile_power { padding-inline-start: 6px; - font-size: 10px; + font-size: 0.667rem; color: $notice-secondary-color; max-width: 6em; overflow: hidden; diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 2fa9994155..436b158644 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -19,7 +19,7 @@ limitations under the License. max-width: 100%; clear: both; padding-top: 18px; - font-size: 14px; + font-size: 0.933rem; position: relative; } @@ -64,7 +64,7 @@ limitations under the License. .mx_EventTile .mx_SenderProfile { color: $primary-fg-color; - font-size: 14px; + font-size: 0.933rem; display: inline-block; /* anti-zalgo, with overflow hidden */ overflow: hidden; cursor: pointer; @@ -72,7 +72,7 @@ limitations under the License. padding-bottom: 0px; padding-top: 0px; margin: 0px; - line-height: 17px; + line-height: 1.133rem; /* the next three lines, along with overflow hidden, truncate long display names */ white-space: nowrap; text-overflow: ellipsis; @@ -117,7 +117,7 @@ limitations under the License. padding-bottom: 2px; border-radius: 4px; min-height: 24px; - line-height: 22px; + line-height: 1.467rem; } .mx_RoomView_timeline_rr_enabled { @@ -152,8 +152,8 @@ limitations under the License. /* HACK to override line-height which is already marked important elsewhere */ .mx_EventTile_bigEmoji.mx_EventTile_bigEmoji { - font-size: 48px !important; - line-height: 57px !important; + font-size: 3.200rem !important; + line-height: 3.800rem !important; } .mx_MessagePanel_alwaysShowTimestamps .mx_MessageTimestamp { @@ -312,7 +312,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile_readAvatarRemainder { color: $event-timestamp-color; - font-size: 11px; + font-size: 0.733rem; position: absolute; } @@ -341,7 +341,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile_spoiler_reason { color: $event-timestamp-color; - font-size: 11px; + font-size: 0.733rem; } .mx_EventTile_spoiler_content { @@ -393,7 +393,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { } .mx_EventTile_keyRequestInfo { - font-size: 12px; + font-size: 0.8rem; } .mx_EventTile_keyRequestInfo_text { @@ -471,7 +471,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile_content .mx_EventTile_edited { user-select: none; - font-size: 12px; + font-size: 0.8rem; color: $roomtopic-color; display: inline-block; margin-left: 9px; @@ -489,7 +489,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { white-space: normal !important; line-height: inherit !important; color: inherit; // inherit the colour from the dark or light theme by default (but not for code blocks) - font-size: 14px; + font-size: 0.933rem; pre, code { font-family: $monospace-font-family !important; @@ -589,9 +589,9 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile.mx_EventTile_info { // same as the padding for non-compact .mx_EventTile.mx_EventTile_info padding-top: 0px; - font-size: 13px; + font-size: 0.867rem; .mx_EventTile_line, .mx_EventTile_reply { - line-height: 20px; + line-height: 1.333rem; } .mx_EventTile_avatar { top: 4px; @@ -599,7 +599,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { } .mx_EventTile .mx_SenderProfile { - font-size: 13px; + font-size: 0.867rem; } .mx_EventTile.mx_EventTile_emote { diff --git a/res/css/views/rooms/_JumpToBottomButton.scss b/res/css/views/rooms/_JumpToBottomButton.scss index 7f458092fb..2c44eed1b8 100644 --- a/res/css/views/rooms/_JumpToBottomButton.scss +++ b/res/css/views/rooms/_JumpToBottomButton.scss @@ -34,8 +34,8 @@ limitations under the License. top: -12px; border-radius: 16px; font-weight: bold; - font-size: 12px; - line-height: 14px; + font-size: 0.8rem; + line-height: 0.933rem; text-align: center; // to be able to get it centered // with text-align in parent diff --git a/res/css/views/rooms/_MemberDeviceInfo.scss b/res/css/views/rooms/_MemberDeviceInfo.scss index 15b4832dc5..fe5a4b7659 100644 --- a/res/css/views/rooms/_MemberDeviceInfo.scss +++ b/res/css/views/rooms/_MemberDeviceInfo.scss @@ -59,7 +59,7 @@ limitations under the License. .mx_MemberDeviceInfo_deviceId { word-break: break-word; - font-size: 13px; + font-size: 0.867rem; } .mx_MemberDeviceInfo_deviceInfo { diff --git a/res/css/views/rooms/_MemberInfo.scss b/res/css/views/rooms/_MemberInfo.scss index e3f746e9d3..d4c8fbb097 100644 --- a/res/css/views/rooms/_MemberInfo.scss +++ b/res/css/views/rooms/_MemberInfo.scss @@ -48,7 +48,7 @@ limitations under the License. } .mx_MemberInfo h2 { - font-size: 18px; + font-size: 1.2rem; font-weight: 600; margin: 16px 0 16px 15px; } @@ -94,12 +94,12 @@ limitations under the License. text-transform: uppercase; color: $input-darker-fg-color; font-weight: bold; - font-size: 12px; + font-size: 0.8rem; margin: 4px 0; } .mx_MemberInfo_profileField { - font-size: 15px; + font-size: 1rem; position: relative; } @@ -109,10 +109,10 @@ limitations under the License. .mx_MemberInfo_field { cursor: pointer; - font-size: 15px; + font-size: 1rem; color: $primary-fg-color; margin-left: 8px; - line-height: 23px; + line-height: 1.533rem; } .mx_MemberInfo_createRoom { @@ -128,7 +128,7 @@ limitations under the License. } .mx_MemberInfo label { - font-size: 13px; + font-size: 0.867rem; } .mx_MemberInfo label .mx_MemberInfo_label_text { @@ -144,7 +144,7 @@ limitations under the License. } .mx_MemberInfo_statusMessage { - font-size: 11px; + font-size: 0.733rem; opacity: 0.5; overflow: hidden; white-space: nowrap; diff --git a/res/css/views/rooms/_MemberList.scss b/res/css/views/rooms/_MemberList.scss index 6e4465583c..0f676645a9 100644 --- a/res/css/views/rooms/_MemberList.scss +++ b/res/css/views/rooms/_MemberList.scss @@ -30,7 +30,7 @@ limitations under the License. text-transform: uppercase; color: $h3-color; font-weight: 600; - font-size: 13px; + font-size: 0.867rem; padding-left: 3px; padding-right: 12px; margin-top: 8px; diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index a05b4c0c0e..3777acf423 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -105,7 +105,7 @@ limitations under the License. min-height: 60px; justify-content: flex-start; align-items: flex-start; - font-size: 14px; + font-size: 0.933rem; margin-right: 6px; } @@ -161,7 +161,7 @@ limitations under the License. box-shadow: none; color: $primary-fg-color; background-color: $primary-bg-color; - font-size: 14px; + font-size: 0.933rem; max-height: 120px; overflow: auto; /* needed for FF */ @@ -242,7 +242,7 @@ limitations under the License. flex-direction: row; align-items: center; - font-size: 10px; + font-size: 0.667rem; color: $greyed-fg-color; } diff --git a/res/css/views/rooms/_MessageComposerFormatBar.scss b/res/css/views/rooms/_MessageComposerFormatBar.scss index 1b5a21bed0..0558cd48cf 100644 --- a/res/css/views/rooms/_MessageComposerFormatBar.scss +++ b/res/css/views/rooms/_MessageComposerFormatBar.scss @@ -97,13 +97,13 @@ limitations under the License. .mx_MessageComposerFormatBar_buttonTooltip { white-space: nowrap; - font-size: 13px; + font-size: 0.867rem; font-weight: 600; min-width: 54px; text-align: center; .mx_MessageComposerFormatBar_tooltipShortcut { - font-size: 9px; + font-size: 0.600rem; opacity: 0.7; } } diff --git a/res/css/views/rooms/_PresenceLabel.scss b/res/css/views/rooms/_PresenceLabel.scss index 26ed1aa6a3..6d044a69b5 100644 --- a/res/css/views/rooms/_PresenceLabel.scss +++ b/res/css/views/rooms/_PresenceLabel.scss @@ -15,6 +15,6 @@ limitations under the License. */ .mx_PresenceLabel { - font-size: 11px; + font-size: 0.733rem; opacity: 0.5; } diff --git a/res/css/views/rooms/_RoomDropTarget.scss b/res/css/views/rooms/_RoomDropTarget.scss index 1076a0563a..1ae8f73e88 100644 --- a/res/css/views/rooms/_RoomDropTarget.scss +++ b/res/css/views/rooms/_RoomDropTarget.scss @@ -28,7 +28,7 @@ limitations under the License. } .mx_RoomDropTarget { - font-size: 13px; + font-size: 0.867rem; padding-top: 5px; padding-bottom: 5px; border: 1px dashed $accent-color; @@ -41,7 +41,7 @@ limitations under the License. .mx_RoomDropTarget_label { position: relative; margin-top: 3px; - line-height: 21px; + line-height: 1.400rem; z-index: 1; text-align: center; } diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 47b8131ef0..1737014248 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -77,9 +77,9 @@ limitations under the License. } .mx_RoomHeader_simpleHeader { - line-height: 52px; + line-height: 3.467rem; color: $roomheader-color; - font-size: 18px; + font-size: 1.2rem; font-weight: 600; overflow: hidden; margin-left: 63px; @@ -102,7 +102,7 @@ limitations under the License. overflow: hidden; color: $roomheader-color; font-weight: 600; - font-size: 18px; + font-size: 1.2rem; margin: 0 7px; border-bottom: 1px solid transparent; display: flex; @@ -161,7 +161,7 @@ limitations under the License. flex: 1; color: $roomtopic-color; font-weight: 400; - font-size: 13px; + font-size: 0.867rem; margin: 0 7px; margin-top: 4px; // to align baseline of topic with room name overflow: hidden; diff --git a/res/css/views/rooms/_RoomList.scss b/res/css/views/rooms/_RoomList.scss index 5ed22f997d..b9cb2dc8e4 100644 --- a/res/css/views/rooms/_RoomList.scss +++ b/res/css/views/rooms/_RoomList.scss @@ -47,13 +47,13 @@ limitations under the License. } .mx_RoomList_emptySubListTip { - font-size: 13px; + font-size: 0.867rem; padding: 5px; border: 1px dashed $accent-color; color: $primary-fg-color; background-color: $droptarget-bg-color; border-radius: 4px; - line-height: 16px; + line-height: 1.067rem; } .mx_RoomList_emptySubListTip .mx_RoleButton { diff --git a/res/css/views/rooms/_RoomPreviewBar.scss b/res/css/views/rooms/_RoomPreviewBar.scss index 981cf06c69..8e61524fda 100644 --- a/res/css/views/rooms/_RoomPreviewBar.scss +++ b/res/css/views/rooms/_RoomPreviewBar.scss @@ -23,7 +23,7 @@ limitations under the License. -webkit-align-items: center; h3 { - font-size: 18px; + font-size: 1.2rem; font-weight: 600; &.mx_RoomPreviewBar_spinnerTitle { @@ -48,8 +48,8 @@ limitations under the License. } .mx_RoomPreviewBar_footer { - font-size: 12px; - line-height: 20px; + font-size: 0.8rem; + line-height: 1.333rem; .mx_Spinner { vertical-align: middle; diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index 31d887cbbb..57d42f6be2 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -64,7 +64,7 @@ limitations under the License. .mx_RoomTile_subtext { display: inline-block; - font-size: 11px; + font-size: 0.733rem; padding: 0 0 0 7px; margin: 0; overflow: hidden; @@ -112,7 +112,7 @@ limitations under the License. } .mx_RoomTile_name { - font-size: 14px; + font-size: 0.933rem; padding: 0 4px; color: $roomtile-name-color; white-space: nowrap; @@ -126,7 +126,7 @@ limitations under the License. padding: 0 0.4em; color: $roomtile-badge-fg-color; font-weight: 600; - font-size: 12px; + font-size: 0.8rem; } .collapsed { diff --git a/res/css/views/rooms/_SearchBar.scss b/res/css/views/rooms/_SearchBar.scss index b6748e5ad2..5b80585cef 100644 --- a/res/css/views/rooms/_SearchBar.scss +++ b/res/css/views/rooms/_SearchBar.scss @@ -22,7 +22,7 @@ limitations under the License. .mx_SearchBar_input { // border: 1px solid $input-border-color; - // font-size: 15px; + // font-size: 1rem; flex: 1 1 0; margin-left: 22px; } @@ -45,7 +45,7 @@ limitations under the License. border: 0; margin: 0 0 0 22px; padding: 5px; - font-size: 15px; + font-size: 1rem; cursor: pointer; color: $primary-fg-color; border-bottom: 2px solid $accent-color; diff --git a/res/css/views/rooms/_SendMessageComposer.scss b/res/css/views/rooms/_SendMessageComposer.scss index d20f7107b3..7233d373a3 100644 --- a/res/css/views/rooms/_SendMessageComposer.scss +++ b/res/css/views/rooms/_SendMessageComposer.scss @@ -18,7 +18,7 @@ limitations under the License. flex: 1; display: flex; flex-direction: column; - font-size: 14px; + font-size: 0.933rem; justify-content: center; margin-right: 6px; // don't grow wider than available space diff --git a/res/css/views/rooms/_WhoIsTypingTile.scss b/res/css/views/rooms/_WhoIsTypingTile.scss index 579ea7e73e..a1e6f3a3bf 100644 --- a/res/css/views/rooms/_WhoIsTypingTile.scss +++ b/res/css/views/rooms/_WhoIsTypingTile.scss @@ -49,7 +49,7 @@ limitations under the License. border-radius: 40px; width: 24px; height: 24px; - line-height: 24px; + line-height: 1.600rem; font-size: 0.8em; vertical-align: top; text-align: center; @@ -57,7 +57,7 @@ limitations under the License. .mx_WhoIsTypingTile_label { flex: 1; - font-size: 14px; + font-size: 0.933rem; font-weight: 600; color: $eventtile-meta-color; } diff --git a/res/css/views/settings/tabs/_SettingsTab.scss b/res/css/views/settings/tabs/_SettingsTab.scss index 01a1d94956..03bd3221cd 100644 --- a/res/css/views/settings/tabs/_SettingsTab.scss +++ b/res/css/views/settings/tabs/_SettingsTab.scss @@ -19,7 +19,7 @@ limitations under the License. } .mx_SettingsTab_heading { - font-size: 20px; + font-size: 1.333rem; font-weight: 600; color: $primary-fg-color; } @@ -29,7 +29,7 @@ limitations under the License. } .mx_SettingsTab_subheading { - font-size: 16px; + font-size: 1.067rem; display: block; font-family: $font-family; font-weight: 600; @@ -40,7 +40,7 @@ limitations under the License. .mx_SettingsTab_subsectionText { color: $settings-subsection-fg-color; - font-size: 14px; + font-size: 0.933rem; display: block; margin: 10px 100px 10px 0; // Align with the rest of the view } @@ -61,7 +61,7 @@ limitations under the License. .mx_SettingsTab_section .mx_SettingsFlag .mx_SettingsFlag_label { vertical-align: middle; display: inline-block; - font-size: 14px; + font-size: 0.933rem; color: $primary-fg-color; max-width: calc(100% - 48px); // Force word wrap instead of colliding with the switch box-sizing: border-box; diff --git a/res/css/views/terms/_InlineTermsAgreement.scss b/res/css/views/terms/_InlineTermsAgreement.scss index e00dcf31d1..1f9ea7a33d 100644 --- a/res/css/views/terms/_InlineTermsAgreement.scss +++ b/res/css/views/terms/_InlineTermsAgreement.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_InlineTermsAgreement_cbContainer { margin-bottom: 10px; - font-size: 14px; + font-size: 0.933rem; a { color: $accent-color; diff --git a/res/css/views/verification/_VerificationShowSas.scss b/res/css/views/verification/_VerificationShowSas.scss index 5038d40b73..fd83bf7ad4 100644 --- a/res/css/views/verification/_VerificationShowSas.scss +++ b/res/css/views/verification/_VerificationShowSas.scss @@ -48,14 +48,14 @@ limitations under the License. } .mx_VerificationShowSas_emojiSas_emoji { - font-size: 32px; + font-size: 2.133rem; } .mx_VerificationShowSas_emojiSas_label { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - font-size: 12px; + font-size: 0.8rem; } .mx_VerificationShowSas_emojiSas_break { diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index b01fbf8c66..06c9f7bed6 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -21,5 +21,5 @@ limitations under the License. text-align: center; padding: 6px; font-weight: bold; - font-size: 13px; + font-size: 0.867rem; } diff --git a/res/css/views/voip/_IncomingCallbox.scss b/res/css/views/voip/_IncomingCallbox.scss index 64eac25d01..3c8ed46639 100644 --- a/res/css/views/voip/_IncomingCallbox.scss +++ b/res/css/views/voip/_IncomingCallbox.scss @@ -54,7 +54,7 @@ limitations under the License. vertical-align: middle; width: 80px; height: 36px; - line-height: 36px; + line-height: 2.400rem; border-radius: 36px; color: $accent-fg-color; margin: auto; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index bfa2272283..1f11fd5620 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -185,7 +185,7 @@ $user-tile-hover-bg-color: $header-panel-bg-color; border: 0px; border-radius: 4px; font-family: $font-family; - font-size: 14px; + font-size: 0.933rem; color: $button-fg-color; background-color: $button-bg-color; width: auto; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 9bdd712e07..2a993a7934 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -310,7 +310,7 @@ $user-tile-hover-bg-color: $header-panel-bg-color; border: 0px; border-radius: 4px; font-family: $font-family; - font-size: 14px; + font-size: 0.933rem; color: $button-fg-color; background-color: $button-bg-color; width: auto; @@ -331,7 +331,7 @@ $user-tile-hover-bg-color: $header-panel-bg-color; @define-mixin mx_DialogButton_small { @mixin mx_DialogButton; - font-size: 15px; + font-size: 1rem; padding: 0px 1.5em 0px 1.5em; } From 98c663a41dd298f2055881428e7f0210cf97229b Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Mon, 30 Mar 2020 19:05:47 +0000 Subject: [PATCH 017/230] Translated using Weblate (German) Currently translated at 77.2% (1730 of 2242 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 58 +++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9565299b8d..a808ebd33c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1526,7 +1526,7 @@ "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsmanager um Bots, Widgets und Sticker Packs zu verwalten.", "Manage integrations": "Integrationen verwalten", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Stimme den Nutzungsbedingungen des Identitätsservers %(serverName)s zu, um dich per Email Adresse und Telefonnummer auffindbar zu machen.", - "Clear cache and reload": "Cache löschen und neu laden", + "Clear cache and reload": "Zwischenspeicher löschen und neu laden", "Customise your experience with experimental labs features. Learn more.": "Passe deine Erfahrung mit experimentellen Lab Funktionen an. Mehr erfahren.", "Ignored/Blocked": "Ignoriert/Blockiert", "Something went wrong. Please try again or view your console for hints.": "Etwas ist schief gelaufen. Bitte versuche es erneut oder sieh für weitere Hinweise in deiner Konsole nach.", @@ -1571,9 +1571,9 @@ "Notification sound": "Benachrichtigungston", "Set a new custom sound": "Setze einen neuen benutzerdefinierten Sound", "Browse": "Durchsuche", - "Direct Messages": "Direkte Nachrichten", + "Direct Messages": "Direktnachrichten", "You can use /help to list available commands. Did you mean to send this as a message?": "Sie können /help benutzen, um verfügbare Befehle aufzulisten. Wollten Sie dies als Nachricht senden?", - "Direct message": "Direkte Nachricht", + "Direct message": "Direktnachricht", "Set a room alias to easily share your room with other people.": "Setze ein Raum-Alias, um deinen Raum einfach mit anderen Personen zu teilen.", "Suggestions": "Vorschläge", "Recently Direct Messaged": "Kürzlich direkt verschickt", @@ -1625,7 +1625,7 @@ "Create a private room": "Erstelle einen privaten Raum", "Topic (optional)": "Thema (optional)", "Make this room public": "Machen Sie diesen Raum öffentlich", - "Hide advanced": "Fortgeschrittenes ausblenden", + "Hide advanced": "Weitere Einstellungen ausblenden", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Hindere Benutzer auf anderen Matrix-Homeservern daran, diesem Raum beizutreten (Diese Einstellung kann später nicht geändert werden!)", "Session name": "Name der Sitzung", "This will allow you to return to your account after signing out, and sign in on other sessions.": "So können Sie nach der Abmeldung zu Ihrem Konto zurückkehren und sich bei anderen Sitzungen anmelden.", @@ -1657,7 +1657,7 @@ "or": "oder", "Compare unique emoji": "Vergleiche einzigartige Emojis", "Start": "Starte", - "Discovery": "Entdeckung", + "Discovery": "Kontakte", "Done": "Erledigt", "Manually Verify": "Manuell verifizieren", "Trusted": "Vertrauenswürdig", @@ -1739,5 +1739,51 @@ "Start chatting": "Chat starten", "Reject & Ignore user": "Ablehnen & Nutzer ignorieren", "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", - "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s" + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Erlaube den Standard-Server zur Anrufunterstützung (turn.matrix.org) zu verwenden wenn dein Heimserver keinen eigenen anbietet (deine IP Adresse wird bei dem Anruf übermittelt)", + "Show more": "mehr", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Diese Sitzung speichert deine Schlüssel nicht, du kannst sie aber an die Schlüsselsicherung anschließen.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbinde diese Sitzung mit deiner Schlüsselsicherung bevor du dich abmeldest, um den Verlust von Schlüsseln zu vermeiden.", + "This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde", + "Enable desktop notifications for this session": "Desktop-Benachrichtigungen für diese Sitzung aktivieren", + "Enable audible notifications for this session": "Aktiviere die akustischen Benachrichtigungen für diese Sitzung", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsserver können für dich Widgets einstellen, Raum-Einladungen verschicken oder deine Berechtigungen setzen.", + "Read Marker lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung (ms)", + "Read Marker off-screen lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung außerhalb des Bildschirms (ms)", + "Session key:": "Sitzungsschlüssel:", + "A session's public name is visible to people you communicate with": "Der Sitzungsname ist sichtbar für die Personen mit denen du kommunizierst", + "Sounds": "Töne", + "Upgrade the room": "Raum hochstufen", + "Enable room encryption": "Verschlüsselung aktivieren", + "This message cannot be decrypted": "Diese Nachricht konnte nicht entschlüsselt werden", + "Encrypted by an unverified session": "Verschlüsselt von einer unbekannten Sitzung", + "Unencrypted": "Unverschlüsselt", + "Encrypted by a deleted session": "Verschlüsselt von einer gelöschten Sitzung", + "The encryption used by this room isn't supported.": "Die Verschlüsselung, die dieser Raum verwendet, wird nicht unterstützt.", + "React": "Reaktion hinzufügen", + "e.g. my-room": "z.B. mein-raum", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Verwende einen Identitätsserver um mit einer E-Mail-Adresse einzuladen. Benutzer den Standard-Identitätsserver (%(defaultIdentityServerName)s) oder konfiguriere einen in den Einstellungen.", + "Use an identity server to invite by email. Manage in Settings.": "Verwende einen Identitätsserver um mit einer E-Mail-Adresse einzuladen. Diese können in den Einstellungen konfiguriert werden.", + "Create a public room": "Erstelle einen öffentlichen Raum", + "Show advanced": "Weitere Einstellungen anzeigen", + "Verify session": "Sitzung verifizieren", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Um diese Sitzung zu verifizieren kontaktiere bitte den Benutzer über einen anderen Kanal (z.B. persönlich oder mit einem Telefonanruf) und frage ihn ob der Sitzungsschlüssel in seinen Benutzereinstellungen mit dem hier angezeigten übereinstimmt:", + "Session key": "Sitzungsschlüssel", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Wenn die Sitzungsschlüssel übereinstimmen, drücke den Knopf zur Bestätigung. Stimmen sie nicht überein versucht jemand diese Sitzung abzufangen und du solltest diese Sitzung blockieren.", + "Recent Conversations": "Letzte Unterhaltungen", + "Report Content to Your Homeserver Administrator": "Inhalte an den Administrator deines Heimservers melden", + "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.": "Wenn du diese Nachricht meldest wird dessen einzigartige 'event ID' an den Administrator deines Heimservers übermittelt. Wenn die Nachrichten in diesem Raum verschlüsselt sind wird dein Administrator nicht in der Lage sein den Text zu lesen oder Medien einzusehen.", + "Send report": "Bericht senden", + "Enter recovery passphrase": "Gib die Wiederherstellungspassphrase ein", + "Enter recovery key": "Wiederherstellungspassphrase eingeben", + "Report Content": "Inhalte melden", + "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Gib eine E-Mail-Adresse an um dein Konto wiederherstellen zu können. Die E-Mail-Adresse kann auch genutzt werden um deinen Kontakt zu finden.", + "Enter your custom homeserver URL What does this mean?": "Gib eine andere Heimserver-Adresse an Was bedeutet das?", + "%(creator)s created and configured the room.": "%(creator)s hat den Raum erstellt und konfiguriert.", + "Sender session information": "Absender Sitzungsinformationen", + "Set up with a recovery key": "Mit einem Wiederherstellungsschlüssel einrichten", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Bewahre ihn sicher auf, wie in einem Passwort-Manager oder einem Safe.", + "Your recovery key": "Dein Wiederherstellungsschlüssel", + "Copy": "In Zwischenablage kopieren", + "Make a copy of your recovery key": "Speichere deinen Wiederherstellungsschlüssel" } From b44c83aad7fc60575e0121140ab60734fd059df0 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 31 Mar 2020 06:05:09 +0000 Subject: [PATCH 018/230] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2243 of 2243 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index a2d6f82c6b..03d49e0499 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2305,5 +2305,7 @@ "Verified": "已驗證", "Verification cancelled": "驗證已取消", "Compare emoji": "比較顏文字", - "Session backup key:": "工作階段備份金鑰:" + "Session backup key:": "工作階段備份金鑰:", + "Sends a message as html, without interpreting it as markdown": "以 html 形式傳送訊息,不將其翻譯為 markdown", + "Cancel replying to a message": "取消回覆訊息" } From 6cf9166c4a3e4a85406679e997a9e0e8c3538468 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Tue, 31 Mar 2020 15:26:23 +0100 Subject: [PATCH 019/230] Use variables for the rem values. It's become obvious that these random floating points everywhere are unwieldy. Now they're all in one place with some fairly logical variable names which will help out in design->implementation phase. --- res/css/_common.scss | 18 +++---- res/css/_font-sizes.scss | 47 +++++++++++++++++++ res/css/rethemendex.sh | 2 +- res/css/structures/_ContextualMenu.scss | 2 +- res/css/structures/_CreateRoom.scss | 2 +- res/css/structures/_FilePanel.scss | 8 ++-- res/css/structures/_GroupView.scss | 10 ++-- res/css/structures/_LeftPanel.scss | 2 +- res/css/structures/_MyGroups.scss | 8 ++-- res/css/structures/_NotificationPanel.scss | 4 +- res/css/structures/_RightPanel.scss | 2 +- res/css/structures/_RoomDirectory.scss | 10 ++-- res/css/structures/_RoomStatusBar.scss | 14 +++--- res/css/structures/_RoomSubList.scss | 4 +- res/css/structures/_RoomView.scss | 4 +- res/css/structures/_TabbedView.scss | 2 +- res/css/structures/_TagPanel.scss | 4 +- res/css/structures/_ToastContainer.scss | 6 +-- res/css/structures/_TopLeftMenuButton.scss | 2 +- res/css/structures/_ViewSource.scss | 2 +- .../structures/auth/_CompleteSecurity.scss | 2 +- res/css/views/auth/_AuthBody.scss | 8 ++-- res/css/views/auth/_AuthButtons.scss | 2 +- res/css/views/auth/_AuthFooter.scss | 2 +- res/css/views/auth/_CompleteSecurityBody.scss | 4 +- res/css/views/auth/_LanguageSelector.scss | 2 +- res/css/views/auth/_ServerTypeSelector.scss | 2 +- .../context_menus/_RoomTileContextMenu.scss | 2 +- .../_StatusMessageContextMenu.scss | 2 +- .../context_menus/_TagTileContextMenu.scss | 2 +- res/css/views/context_menus/_TopLeftMenu.scss | 4 +- .../views/dialogs/_AddressPickerDialog.scss | 4 +- .../dialogs/_ConfirmUserActionDialog.scss | 8 ++-- res/css/views/dialogs/_CreateGroupDialog.scss | 4 +- res/css/views/dialogs/_CreateRoomDialog.scss | 2 +- res/css/views/dialogs/_DevtoolsDialog.scss | 4 +- res/css/views/dialogs/_InviteDialog.scss | 18 +++---- .../dialogs/_MessageEditHistoryDialog.scss | 4 +- .../dialogs/_NewSessionReviewDialog.scss | 2 +- res/css/views/dialogs/_SetEmailDialog.scss | 2 +- res/css/views/dialogs/_SetMxIdDialog.scss | 2 +- res/css/views/dialogs/_SetPasswordDialog.scss | 2 +- res/css/views/dialogs/_TermsDialog.scss | 2 +- .../views/dialogs/_UnknownDeviceDialog.scss | 2 +- res/css/views/directory/_NetworkDropdown.scss | 14 +++--- res/css/views/elements/_AccessibleButton.scss | 2 +- res/css/views/elements/_AddressTile.scss | 4 +- .../views/elements/_DirectorySearchBox.scss | 2 +- res/css/views/elements/_Dropdown.scss | 4 +- res/css/views/elements/_EventListSummary.scss | 14 +++--- res/css/views/elements/_Field.scss | 6 +-- res/css/views/elements/_FormButton.scss | 4 +- res/css/views/elements/_ImageView.scss | 10 ++-- .../views/elements/_InteractiveTooltip.scss | 2 +- res/css/views/elements/_RichText.scss | 2 +- res/css/views/elements/_Tooltip.scss | 6 +-- res/css/views/elements/_TooltipButton.scss | 4 +- res/css/views/emojipicker/_EmojiPicker.scss | 8 ++-- res/css/views/messages/_DateSeparator.scss | 2 +- res/css/views/messages/_MessageActionBar.scss | 2 +- res/css/views/messages/_MessageTimestamp.scss | 2 +- res/css/views/messages/_ReactionsRow.scss | 2 +- .../views/messages/_ReactionsRowButton.scss | 2 +- res/css/views/messages/_ViewSourceEvent.scss | 2 +- .../views/messages/_common_CryptoEvent.scss | 4 +- res/css/views/right_panel/_UserInfo.scss | 18 +++---- .../views/right_panel/_VerificationPanel.scss | 2 +- res/css/views/rooms/_AppsDrawer.scss | 10 ++-- .../views/rooms/_BasicMessageComposer.scss | 4 +- res/css/views/rooms/_EntityTile.scss | 6 +-- res/css/views/rooms/_EventTile.scss | 28 +++++------ res/css/views/rooms/_JumpToBottomButton.scss | 4 +- res/css/views/rooms/_MemberDeviceInfo.scss | 2 +- res/css/views/rooms/_MemberInfo.scss | 14 +++--- res/css/views/rooms/_MemberList.scss | 2 +- res/css/views/rooms/_MessageComposer.scss | 6 +-- .../rooms/_MessageComposerFormatBar.scss | 4 +- res/css/views/rooms/_PresenceLabel.scss | 2 +- res/css/views/rooms/_RoomDropTarget.scss | 4 +- res/css/views/rooms/_RoomHeader.scss | 8 ++-- res/css/views/rooms/_RoomList.scss | 4 +- res/css/views/rooms/_RoomPreviewBar.scss | 6 +-- res/css/views/rooms/_RoomTile.scss | 6 +-- res/css/views/rooms/_SearchBar.scss | 4 +- res/css/views/rooms/_SendMessageComposer.scss | 2 +- res/css/views/rooms/_WhoIsTypingTile.scss | 4 +- res/css/views/settings/tabs/_SettingsTab.scss | 8 ++-- .../views/terms/_InlineTermsAgreement.scss | 2 +- .../verification/_VerificationShowSas.scss | 4 +- res/css/views/voip/_CallView.scss | 2 +- res/css/views/voip/_IncomingCallbox.scss | 2 +- res/themes/dark-custom/css/dark-custom.scss | 1 + res/themes/dark/css/_dark.scss | 2 +- res/themes/dark/css/dark.scss | 1 + res/themes/light-custom/css/light-custom.scss | 1 + res/themes/light/css/_light.scss | 4 +- res/themes/light/css/light.scss | 1 + 97 files changed, 280 insertions(+), 227 deletions(-) create mode 100644 res/css/_font-sizes.scss diff --git a/res/css/_common.scss b/res/css/_common.scss index 657fb21244..03442ca510 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -16,6 +16,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +@import "./_font-sizes.scss"; + :root { font-size: 15px; } @@ -29,7 +31,7 @@ html { body { font-family: $font-family; - font-size: 1rem; + font-size: $font-15px; background-color: $primary-bg-color; color: $primary-fg-color; border: 0px; @@ -64,7 +66,7 @@ b { h2 { color: $primary-fg-color; font-weight: 400; - font-size: 1.2rem; + font-size: $font-18px; margin-top: 16px; margin-bottom: 16px; } @@ -80,7 +82,7 @@ input[type=search], input[type=password] { padding: 9px; font-family: $font-family; - font-size: 0.933rem; + font-size: $font-14px; font-weight: 600; min-width: 0; } @@ -257,7 +259,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { color: $light-fg-color; z-index: 4012; font-weight: 300; - font-size: 1rem; + font-size: $font-15px; position: relative; padding: 25px 30px 30px 30px; max-height: 80%; @@ -325,8 +327,8 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { } .mx_Dialog_title { - font-size: 1.467rem; - line-height: 2.400rem; + font-size: $font-22px; + line-height: $font-36px; color: $dialog-title-fg-color; } @@ -354,7 +356,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { .mx_Dialog_content { margin: 24px 0 68px; - font-size: 0.933rem; + font-size: $font-14px; color: $primary-fg-color; word-wrap: break-word; } @@ -450,7 +452,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { } .mx_TextInputDialog_input { - font-size: 1rem; + font-size: $font-15px; border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; diff --git a/res/css/_font-sizes.scss b/res/css/_font-sizes.scss new file mode 100644 index 0000000000..6baf11e9d6 --- /dev/null +++ b/res/css/_font-sizes.scss @@ -0,0 +1,47 @@ +$font-8px: 0.533rem; +$font-9px: 0.600rem; +$font-10px: 0.667rem; +$font-10-4px: 0.693rem; +$font-11px: 0.733rem; +$font-12px: 0.800rem; +$font-13px: 0.867rem; +$font-14px: 0.933rem; +$font-15px: 1.000rem; +$font-16px: 1.067rem; +$font-17px: 1.133rem; +$font-18px: 1.200rem; +$font-19px: 1.267rem; +$font-20px: 1.333rem; +$font-21px: 1.400rem; +$font-22px: 1.467rem; +$font-23px: 1.533rem; +$font-24px: 1.600rem; +$font-25px: 1.667rem; +$font-26px: 1.733rem; +$font-27px: 1.800rem; +$font-28px: 1.867rem; +$font-29px: 1.933rem; +$font-30px: 2.000rem; +$font-31px: 2.067rem; +$font-32px: 2.133rem; +$font-33px: 2.200rem; +$font-34px: 2.267rem; +$font-35px: 2.333rem; +$font-36px: 2.400rem; +$font-37px: 2.467rem; +$font-38px: 2.533rem; +$font-39px: 2.600rem; +$font-40px: 2.667rem; +$font-41px: 2.733rem; +$font-42px: 2.800rem; +$font-43px: 2.867rem; +$font-44px: 2.933rem; +$font-45px: 3.000rem; +$font-46px: 3.067rem; +$font-47px: 3.133rem; +$font-48px: 3.200rem; +$font-49px: 3.267rem; +$font-50px: 3.333rem; +$font-51px: 3.400rem; +$font-52px: 3.467rem; +$font-400px: 26.667rem; diff --git a/res/css/rethemendex.sh b/res/css/rethemendex.sh index 13be73f9a9..5d9e789982 100755 --- a/res/css/rethemendex.sh +++ b/res/css/rethemendex.sh @@ -8,7 +8,7 @@ cd `dirname $0` # we used to have exclude /themes from the find at this point. # as themes are no longer a spurious subdirectory of css/, we don't # need it any more. - find . -iname _\*.scss | fgrep -v _components.scss | LC_ALL=C sort | + find . -iname _\*.scss | sort | fgrep -v _components.scss | LC_ALL=C sort | while read i; do echo "@import \"$i\";" done diff --git a/res/css/structures/_ContextualMenu.scss b/res/css/structures/_ContextualMenu.scss index 67e7a7a8d6..61070a0541 100644 --- a/res/css/structures/_ContextualMenu.scss +++ b/res/css/structures/_ContextualMenu.scss @@ -36,7 +36,7 @@ limitations under the License. background-color: $menu-bg-color; color: $primary-fg-color; position: absolute; - font-size: 0.933rem; + font-size: $font-14px; z-index: 5001; } diff --git a/res/css/structures/_CreateRoom.scss b/res/css/structures/_CreateRoom.scss index 3a66805bfe..e859beb20e 100644 --- a/res/css/structures/_CreateRoom.scss +++ b/res/css/structures/_CreateRoom.scss @@ -26,7 +26,7 @@ limitations under the License. border-radius: 3px; border: 1px solid $strong-input-border-color; font-weight: 300; - font-size: 0.867rem; + font-size: $font-13px; padding: 9px; margin-top: 6px; } diff --git a/res/css/structures/_FilePanel.scss b/res/css/structures/_FilePanel.scss index eceeab2e1b..859ee28035 100644 --- a/res/css/structures/_FilePanel.scss +++ b/res/css/structures/_FilePanel.scss @@ -49,7 +49,7 @@ limitations under the License. .mx_FilePanel .mx_EventTile .mx_MFileBody_download { display: flex; - font-size: 0.933rem; + font-size: $font-14px; color: $event-timestamp-color; } @@ -60,7 +60,7 @@ limitations under the License. .mx_FilePanel .mx_EventTile .mx_MImageBody_size { flex: 1 0 0; - font-size: 0.733rem; + font-size: $font-11px; text-align: right; white-space: nowrap; } @@ -80,7 +80,7 @@ limitations under the License. flex: 1 1 auto; line-height: initial; padding: 0px; - font-size: 0.733rem; + font-size: $font-11px; opacity: 1.0; color: $event-timestamp-color; } @@ -90,7 +90,7 @@ limitations under the License. text-align: right; visibility: visible; position: initial; - font-size: 0.733rem; + font-size: $font-11px; opacity: 1.0; color: $event-timestamp-color; } diff --git a/res/css/structures/_GroupView.scss b/res/css/structures/_GroupView.scss index 6eb5e33462..ed0cf121a4 100644 --- a/res/css/structures/_GroupView.scss +++ b/res/css/structures/_GroupView.scss @@ -134,7 +134,7 @@ limitations under the License. overflow: hidden; color: $primary-fg-color; font-weight: bold; - font-size: 1.467rem; + font-size: $font-22px; padding-left: 19px; padding-right: 16px; /* why isn't text-overflow working? */ @@ -148,7 +148,7 @@ limitations under the License. max-height: 42px; color: $settings-grey-fg-color; font-weight: 300; - font-size: 0.867rem; + font-size: $font-13px; padding-left: 19px; margin-right: 16px; overflow: hidden; @@ -196,7 +196,7 @@ limitations under the License. text-transform: uppercase; color: $h3-color; font-weight: 600; - font-size: 0.867rem; + font-size: $font-13px; margin-bottom: 10px; } @@ -226,7 +226,7 @@ limitations under the License. .mx_GroupView_rooms_header_addRow_label { display: inline-block; vertical-align: top; - line-height: 1.600rem; + line-height: $font-24px; padding-left: 28px; color: $accent-color; } @@ -258,7 +258,7 @@ limitations under the License. .mx_GroupView_membershipSection_description { /* To match textButton */ - line-height: 2.267rem; + line-height: $font-34px; } .mx_GroupView_membershipSection_description .mx_BaseAvatar { diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index 6af4b54f91..7d57425f6f 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -147,7 +147,7 @@ limitations under the License. } .mx_AccessibleButton { - font-size: 0.933rem; + font-size: $font-14px; margin: 4px 0 1px 9px; padding: 9px; padding-left: 42px; diff --git a/res/css/structures/_MyGroups.scss b/res/css/structures/_MyGroups.scss index 042994e48c..73f1332cd0 100644 --- a/res/css/structures/_MyGroups.scss +++ b/res/css/structures/_MyGroups.scss @@ -105,7 +105,7 @@ limitations under the License. .mx_MyGroups_placeholder { background-color: $info-plinth-bg-color; color: $info-plinth-fg-color; - line-height: 26.667rem; + line-height: $font-400px; border-radius: 10px; text-align: center; } @@ -149,11 +149,11 @@ limitations under the License. .mx_GroupTile_profile .mx_GroupTile_name { margin: 0px; - font-size: 1rem; + font-size: $font-15px; } .mx_GroupTile_profile .mx_GroupTile_groupId { - font-size: 0.867rem; + font-size: $font-13px; opacity: 0.7; } @@ -161,7 +161,7 @@ limitations under the License. display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; - font-size: 0.867rem; + font-size: $font-13px; max-height: 36px; overflow: hidden; } diff --git a/res/css/structures/_NotificationPanel.scss b/res/css/structures/_NotificationPanel.scss index ff95cc2dba..44205b1f01 100644 --- a/res/css/structures/_NotificationPanel.scss +++ b/res/css/structures/_NotificationPanel.scss @@ -39,7 +39,7 @@ limitations under the License. .mx_NotificationPanel .mx_EventTile_roomName { font-weight: bold; - font-size: 0.933rem; + font-size: $font-14px; } .mx_NotificationPanel .mx_EventTile_roomName a { @@ -54,7 +54,7 @@ limitations under the License. .mx_NotificationPanel .mx_EventTile .mx_SenderProfile, .mx_NotificationPanel .mx_EventTile .mx_MessageTimestamp { color: $primary-fg-color; - font-size: 0.8rem; + font-size: $font-12px; display: inline; padding-left: 0px; } diff --git a/res/css/structures/_RightPanel.scss b/res/css/structures/_RightPanel.scss index b0c2b4650f..10878322e3 100644 --- a/res/css/structures/_RightPanel.scss +++ b/res/css/structures/_RightPanel.scss @@ -96,7 +96,7 @@ limitations under the License. } .mx_RightPanel_headerButton_badge { - font-size: 0.533rem; + font-size: $font-8px; border-radius: 8px; color: $accent-fg-color; background-color: $accent-color; diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index b62f726d09..e0814182f5 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -64,7 +64,7 @@ limitations under the License. } .mx_RoomDirectory_table { - font-size: 0.8rem; + font-size: $font-12px; color: $primary-fg-color; width: 100%; text-align: left; @@ -112,7 +112,7 @@ limitations under the License. .mx_RoomDirectory_name { display: inline-block; - font-size: 1.2rem; + font-size: $font-18px; font-weight: 600; } @@ -124,7 +124,7 @@ limitations under the License. border-radius: 10px; display: inline-block; height: 20px; - line-height: 1.333rem; + line-height: $font-20px; padding: 0 5px; color: $accent-fg-color; background-color: $rte-room-pill-color; @@ -136,7 +136,7 @@ limitations under the License. } .mx_RoomDirectory_alias { - font-size: 0.8rem; + font-size: $font-12px; color: $settings-grey-fg-color; } @@ -150,7 +150,7 @@ limitations under the License. } .mx_RoomDirectory > span { - font-size: 1rem; + font-size: $font-15px; margin-top: 0; .mx_AccessibleButton { diff --git a/res/css/structures/_RoomStatusBar.scss b/res/css/structures/_RoomStatusBar.scss index 1dc99b26f0..cd4390ee5c 100644 --- a/res/css/structures/_RoomStatusBar.scss +++ b/res/css/structures/_RoomStatusBar.scss @@ -32,7 +32,7 @@ limitations under the License. .mx_RoomStatusBar_callBar { height: 50px; - line-height: 3.333rem; + line-height: $font-50px; } .mx_RoomStatusBar_placeholderIndicator span { @@ -94,7 +94,7 @@ limitations under the License. border-radius: 40px; width: 24px; height: 24px; - line-height: 1.600rem; + line-height: $font-24px; font-size: 0.8em; vertical-align: top; text-align: center; @@ -132,7 +132,7 @@ limitations under the License. .mx_RoomStatusBar_connectionLostBar_desc { color: $primary-fg-color; - font-size: 0.867rem; + font-size: $font-13px; opacity: 0.5; padding-bottom: 20px; } @@ -145,7 +145,7 @@ limitations under the License. .mx_RoomStatusBar_typingBar { height: 50px; - line-height: 3.333rem; + line-height: $font-50px; color: $primary-fg-color; opacity: 0.5; @@ -155,7 +155,7 @@ limitations under the License. .mx_RoomStatusBar_isAlone { height: 50px; - line-height: 3.333rem; + line-height: $font-50px; color: $primary-fg-color; opacity: 0.5; @@ -174,11 +174,11 @@ limitations under the License. .mx_RoomStatusBar_callBar { height: 40px; - line-height: 2.667rem; + line-height: $font-40px; } .mx_RoomStatusBar_typingBar { height: 40px; - line-height: 2.667rem; + line-height: $font-40px; } } diff --git a/res/css/structures/_RoomSubList.scss b/res/css/structures/_RoomSubList.scss index a76872a745..2e0c94263e 100644 --- a/res/css/structures/_RoomSubList.scss +++ b/res/css/structures/_RoomSubList.scss @@ -68,7 +68,7 @@ limitations under the License. text-transform: uppercase; color: $roomsublist-label-fg-color; font-weight: 700; - font-size: 0.8rem; + font-size: $font-12px; margin-left: 8px; } @@ -76,7 +76,7 @@ limitations under the License. flex: 0 0 auto; border-radius: 8px; font-weight: 600; - font-size: 0.8rem; + font-size: $font-12px; padding: 0 5px; color: $roomtile-badge-fg-color; background-color: $roomtile-name-color; diff --git a/res/css/structures/_RoomView.scss b/res/css/structures/_RoomView.scss index 52de9384d7..f2154ef448 100644 --- a/res/css/structures/_RoomView.scss +++ b/res/css/structures/_RoomView.scss @@ -23,7 +23,7 @@ limitations under the License. .mx_RoomView_fileDropTarget { min-width: 0px; width: 100%; - font-size: 1.2rem; + font-size: $font-18px; text-align: center; pointer-events: none; @@ -186,7 +186,7 @@ limitations under the License. .mx_RoomView_empty { flex: 1 1 auto; - font-size: 0.867rem; + font-size: $font-13px; padding-left: 3em; padding-right: 3em; margin-right: 20px; diff --git a/res/css/structures/_TabbedView.scss b/res/css/structures/_TabbedView.scss index 20e2120bfd..4a4bb125a3 100644 --- a/res/css/structures/_TabbedView.scss +++ b/res/css/structures/_TabbedView.scss @@ -39,7 +39,7 @@ limitations under the License. cursor: pointer; display: block; border-radius: 3px; - font-size: 0.933rem; + font-size: $font-14px; min-height: 24px; // use min-height instead of height to allow the label to overflow a bit margin-bottom: 6px; position: relative; diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index 5173358bcc..f56b318e70 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -139,7 +139,7 @@ limitations under the License. background-color: $neutral-badge-color; color: #ffffff; font-weight: 600; - font-size: 0.667rem; + font-size: $font-10px; text-align: center; padding-top: 1px; padding-left: 4px; @@ -157,7 +157,7 @@ limitations under the License. border-radius: 8px; color: $accent-fg-color; font-weight: 600; - font-size: 0.933rem; + font-size: $font-14px; padding: 0 5px; background-color: $roomtile-name-color; } diff --git a/res/css/structures/_ToastContainer.scss b/res/css/structures/_ToastContainer.scss index 07daf3f865..af595aaeee 100644 --- a/res/css/structures/_ToastContainer.scss +++ b/res/css/structures/_ToastContainer.scss @@ -77,7 +77,7 @@ limitations under the License. grid-column: 1 / 3; grid-row: 1; margin: 0; - font-size: 1rem; + font-size: $font-15px; font-weight: 600; } @@ -96,11 +96,11 @@ limitations under the License. white-space: nowrap; text-overflow: ellipsis; margin: 4px 0 11px 0; - font-size: 0.8rem; + font-size: $font-12px; } .mx_Toast_deviceID { - font-size: 0.667rem; + font-size: $font-10px; } } } diff --git a/res/css/structures/_TopLeftMenuButton.scss b/res/css/structures/_TopLeftMenuButton.scss index 9bdffb530a..53d44e7c24 100644 --- a/res/css/structures/_TopLeftMenuButton.scss +++ b/res/css/structures/_TopLeftMenuButton.scss @@ -32,7 +32,7 @@ limitations under the License. .mx_TopLeftMenuButton_name { margin: 0 7px; - font-size: 1.2rem; + font-size: $font-18px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; diff --git a/res/css/structures/_ViewSource.scss b/res/css/structures/_ViewSource.scss index c84c48240e..421d1f03cd 100644 --- a/res/css/structures/_ViewSource.scss +++ b/res/css/structures/_ViewSource.scss @@ -29,7 +29,7 @@ limitations under the License. .mx_ViewSource pre { text-align: left; - font-size: 0.8rem; + font-size: $font-12px; padding: 0.5em 1em 0.5em 1em; word-wrap: break-word; white-space: pre-wrap; diff --git a/res/css/structures/auth/_CompleteSecurity.scss b/res/css/structures/auth/_CompleteSecurity.scss index 9367c2c996..3050840fe8 100644 --- a/res/css/structures/auth/_CompleteSecurity.scss +++ b/res/css/structures/auth/_CompleteSecurity.scss @@ -34,7 +34,7 @@ limitations under the License. } .mx_CompleteSecurity_body { - font-size: 1rem; + font-size: $font-15px; } .mx_CompleteSecurity_waiting { diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index 219bf6d0e7..468a4b3d62 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_AuthBody { width: 500px; - font-size: 0.8rem; + font-size: $font-12px; color: $authpage-secondary-color; background-color: $authpage-body-bg-color; border-radius: 0 4px 4px 0; @@ -25,14 +25,14 @@ limitations under the License. box-sizing: border-box; h2 { - font-size: 1.600rem; + font-size: $font-24px; font-weight: 600; margin-top: 8px; color: $authpage-primary-color; } h3 { - font-size: 0.933rem; + font-size: $font-14px; font-weight: 600; color: $authpage-primary-color; } @@ -98,7 +98,7 @@ limitations under the License. .mx_AuthBody_editServerDetails { padding-left: 1em; - font-size: 0.8rem; + font-size: $font-12px; font-weight: normal; } diff --git a/res/css/views/auth/_AuthButtons.scss b/res/css/views/auth/_AuthButtons.scss index 109a1f4670..8deb0f80ac 100644 --- a/res/css/views/auth/_AuthButtons.scss +++ b/res/css/views/auth/_AuthButtons.scss @@ -43,7 +43,7 @@ limitations under the License. cursor: pointer; - font-size: 1rem; + font-size: $font-15px; padding: 0 11px; word-break: break-word; } diff --git a/res/css/views/auth/_AuthFooter.scss b/res/css/views/auth/_AuthFooter.scss index b1bdcb697e..0bc2743d54 100644 --- a/res/css/views/auth/_AuthFooter.scss +++ b/res/css/views/auth/_AuthFooter.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_AuthFooter { text-align: center; width: 100%; - font-size: 0.933rem; + font-size: $font-14px; opacity: 0.72; padding: 20px 0; background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.8)); diff --git a/res/css/views/auth/_CompleteSecurityBody.scss b/res/css/views/auth/_CompleteSecurityBody.scss index af0620c329..46b7abe2cc 100644 --- a/res/css/views/auth/_CompleteSecurityBody.scss +++ b/res/css/views/auth/_CompleteSecurityBody.scss @@ -24,13 +24,13 @@ limitations under the License. box-sizing: border-box; h2 { - font-size: 1.600rem; + font-size: $font-24px; font-weight: 600; margin-top: 0; } h3 { - font-size: 0.933rem; + font-size: $font-14px; font-weight: 600; } diff --git a/res/css/views/auth/_LanguageSelector.scss b/res/css/views/auth/_LanguageSelector.scss index e9ac8688ed..781561f876 100644 --- a/res/css/views/auth/_LanguageSelector.scss +++ b/res/css/views/auth/_LanguageSelector.scss @@ -20,7 +20,7 @@ limitations under the License. .mx_AuthBody_language .mx_Dropdown_input { border: none; - font-size: 0.933rem; + font-size: $font-14px; font-weight: 600; color: $authpage-lang-color; } diff --git a/res/css/views/auth/_ServerTypeSelector.scss b/res/css/views/auth/_ServerTypeSelector.scss index 2042358b8a..fbd3d2655d 100644 --- a/res/css/views/auth/_ServerTypeSelector.scss +++ b/res/css/views/auth/_ServerTypeSelector.scss @@ -65,5 +65,5 @@ limitations under the License. } .mx_ServerTypeSelector_description { - font-size: 0.667rem; + font-size: $font-10px; } diff --git a/res/css/views/context_menus/_RoomTileContextMenu.scss b/res/css/views/context_menus/_RoomTileContextMenu.scss index 1e1a5f889f..9697ac9bef 100644 --- a/res/css/views/context_menus/_RoomTileContextMenu.scss +++ b/res/css/views/context_menus/_RoomTileContextMenu.scss @@ -38,7 +38,7 @@ limitations under the License. white-space: nowrap; display: flex; align-items: center; - line-height: 1.067rem; + line-height: $font-16px; } .mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet { diff --git a/res/css/views/context_menus/_StatusMessageContextMenu.scss b/res/css/views/context_menus/_StatusMessageContextMenu.scss index b68d16281a..fceb7fba34 100644 --- a/res/css/views/context_menus/_StatusMessageContextMenu.scss +++ b/res/css/views/context_menus/_StatusMessageContextMenu.scss @@ -44,7 +44,7 @@ input.mx_StatusMessageContextMenu_message { .mx_StatusMessageContextMenu_clear { @mixin mx_DialogButton; align-self: start; - font-size: 0.8rem; + font-size: $font-12px; padding: 6px 1em; border: 1px solid transparent; margin-right: 10px; diff --git a/res/css/views/context_menus/_TagTileContextMenu.scss b/res/css/views/context_menus/_TagTileContextMenu.scss index 20f95d7f84..e4ccc030a2 100644 --- a/res/css/views/context_menus/_TagTileContextMenu.scss +++ b/res/css/views/context_menus/_TagTileContextMenu.scss @@ -22,7 +22,7 @@ limitations under the License. white-space: nowrap; display: flex; align-items: center; - line-height: 1.067rem; + line-height: $font-16px; } .mx_TagTileContextMenu_item object { diff --git a/res/css/views/context_menus/_TopLeftMenu.scss b/res/css/views/context_menus/_TopLeftMenu.scss index abcaa4fcb5..973c306695 100644 --- a/res/css/views/context_menus/_TopLeftMenu.scss +++ b/res/css/views/context_menus/_TopLeftMenu.scss @@ -19,12 +19,12 @@ limitations under the License. border-radius: 4px; .mx_TopLeftMenu_greyedText { - font-size: 0.8rem; + font-size: $font-12px; opacity: 0.5; } .mx_TopLeftMenu_upgradeLink { - font-size: 0.8rem; + font-size: $font-12px; img { margin-left: 5px; diff --git a/res/css/views/dialogs/_AddressPickerDialog.scss b/res/css/views/dialogs/_AddressPickerDialog.scss index 6b107b3253..136e497994 100644 --- a/res/css/views/dialogs/_AddressPickerDialog.scss +++ b/res/css/views/dialogs/_AddressPickerDialog.scss @@ -28,7 +28,7 @@ limitations under the License. .mx_AddressPickerDialog_input, .mx_AddressPickerDialog_input:focus { height: 26px; - font-size: 0.933rem; + font-size: $font-14px; font-family: $font-family; padding-left: 12px; padding-right: 12px; @@ -50,7 +50,7 @@ limitations under the License. .mx_AddressPickerDialog_inputContainer { border-radius: 3px; border: solid 1px $input-border-color; - line-height: 2.400rem; + line-height: $font-36px; padding-left: 4px; padding-right: 4px; padding-top: 1px; diff --git a/res/css/views/dialogs/_ConfirmUserActionDialog.scss b/res/css/views/dialogs/_ConfirmUserActionDialog.scss index e589ef0450..823f4d1e28 100644 --- a/res/css/views/dialogs/_ConfirmUserActionDialog.scss +++ b/res/css/views/dialogs/_ConfirmUserActionDialog.scss @@ -26,22 +26,22 @@ limitations under the License. } .mx_ConfirmUserActionDialog_name { - font-size: 1.2rem; + font-size: $font-18px; } .mx_ConfirmUserActionDialog_userId { - font-size: 0.867rem; + font-size: $font-13px; } .mx_ConfirmUserActionDialog_reasonField { font-family: $font-family; - font-size: 0.933rem; + font-size: $font-14px; color: $primary-fg-color; background-color: $primary-bg-color; border-radius: 3px; border: solid 1px $input-border-color; - line-height: 2.400rem; + line-height: $font-36px; padding-left: 16px; padding-right: 16px; padding-top: 1px; diff --git a/res/css/views/dialogs/_CreateGroupDialog.scss b/res/css/views/dialogs/_CreateGroupDialog.scss index 4159944e5d..f7bfc61a98 100644 --- a/res/css/views/dialogs/_CreateGroupDialog.scss +++ b/res/css/views/dialogs/_CreateGroupDialog.scss @@ -25,7 +25,7 @@ limitations under the License. } .mx_CreateGroupDialog_input { - font-size: 1rem; + font-size: $font-15px; border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; @@ -44,7 +44,7 @@ limitations under the License. .mx_CreateGroupDialog_prefix, .mx_CreateGroupDialog_suffix { padding: 0px 5px; - line-height: 2.467rem; + line-height: $font-37px; background-color: $input-darker-bg-color; border: 1px solid $input-border-color; text-align: center; diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index 1cdbe99843..c542741c30 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -49,7 +49,7 @@ limitations under the License. } .mx_CreateRoomDialog_input { - font-size: 1rem; + font-size: $font-15px; border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; diff --git a/res/css/views/dialogs/_DevtoolsDialog.scss b/res/css/views/dialogs/_DevtoolsDialog.scss index 399c7225f6..35cb6bc7ab 100644 --- a/res/css/views/dialogs/_DevtoolsDialog.scss +++ b/res/css/views/dialogs/_DevtoolsDialog.scss @@ -68,11 +68,11 @@ limitations under the License. width: 240px; color: $input-fg-color; font-family: $font-family; - font-size: 1.067rem; + font-size: $font-16px; } .mx_DevTools_textarea { - font-size: 0.8rem; + font-size: $font-12px; max-width: 684px; min-height: 250px; padding: 10px; diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index 22b1867002..a77d0bfbba 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -40,8 +40,8 @@ limitations under the License. textarea, textarea:focus { height: 34px; - line-height: 2.267rem; - font-size: 0.933rem; + line-height: $font-34px; + font-size: $font-14px; padding-left: 12px; margin: 0 !important; border: 0 !important; @@ -65,7 +65,7 @@ limitations under the License. min-width: 48px; margin-left: 10px; height: 25px; - line-height: 1.667rem; + line-height: $font-25px; } .mx_InviteDialog_buttonAndSpinner { @@ -84,7 +84,7 @@ limitations under the License. padding-bottom: 10px; h3 { - font-size: 0.8rem; + font-size: $font-12px; color: $muted-fg-color; font-weight: bold; text-transform: uppercase; @@ -143,23 +143,23 @@ limitations under the License. .mx_InviteDialog_roomTile_name { font-weight: 600; - font-size: 0.933rem; + font-size: $font-14px; color: $primary-fg-color; margin-left: 7px; } .mx_InviteDialog_roomTile_userId { - font-size: 0.8rem; + font-size: $font-12px; color: $muted-fg-color; margin-left: 7px; } .mx_InviteDialog_roomTile_time { text-align: right; - font-size: 0.8rem; + font-size: $font-12px; color: $muted-fg-color; float: right; - line-height: 2.400rem; // Height of the avatar to keep the time vertically aligned + line-height: $font-36px; // Height of the avatar to keep the time vertically aligned } .mx_InviteDialog_roomTile_highlight { @@ -176,7 +176,7 @@ limitations under the License. border-radius: 12px; display: inline-block; height: 24px; - line-height: 1.600rem; + line-height: $font-24px; padding-left: 8px; padding-right: 8px; color: #ffffff; // this is fine without a var because it's for both themes diff --git a/res/css/views/dialogs/_MessageEditHistoryDialog.scss b/res/css/views/dialogs/_MessageEditHistoryDialog.scss index 8d989f6a00..e9d777effd 100644 --- a/res/css/views/dialogs/_MessageEditHistoryDialog.scss +++ b/res/css/views/dialogs/_MessageEditHistoryDialog.scss @@ -35,7 +35,7 @@ limitations under the License. .mx_MessageEditHistoryDialog_edits { list-style-type: none; - font-size: 0.933rem; + font-size: $font-14px; padding: 0; color: $primary-fg-color; @@ -60,7 +60,7 @@ limitations under the License. } .mx_MessageActionBar .mx_AccessibleButton { - font-size: 0.667rem; + font-size: $font-10px; padding: 0 8px; } } diff --git a/res/css/views/dialogs/_NewSessionReviewDialog.scss b/res/css/views/dialogs/_NewSessionReviewDialog.scss index 633b3a063b..b35c570c80 100644 --- a/res/css/views/dialogs/_NewSessionReviewDialog.scss +++ b/res/css/views/dialogs/_NewSessionReviewDialog.scss @@ -32,6 +32,6 @@ limitations under the License. } .mx_NewSessionReviewDialog_deviceID { - font-size: 0.8rem; + font-size: $font-12px; color: $notice-secondary-color; } diff --git a/res/css/views/dialogs/_SetEmailDialog.scss b/res/css/views/dialogs/_SetEmailDialog.scss index a5013f79b1..37bee7a9ff 100644 --- a/res/css/views/dialogs/_SetEmailDialog.scss +++ b/res/css/views/dialogs/_SetEmailDialog.scss @@ -20,7 +20,7 @@ limitations under the License. padding: 9px; color: $input-fg-color; background-color: $primary-bg-color; - font-size: 1rem; + font-size: $font-15px; width: 100%; max-width: 280px; margin-bottom: 10px; diff --git a/res/css/views/dialogs/_SetMxIdDialog.scss b/res/css/views/dialogs/_SetMxIdDialog.scss index 8208a679fd..1df34f3408 100644 --- a/res/css/views/dialogs/_SetMxIdDialog.scss +++ b/res/css/views/dialogs/_SetMxIdDialog.scss @@ -29,7 +29,7 @@ limitations under the License. padding: 9px; color: $primary-fg-color; background-color: $primary-bg-color; - font-size: 1rem; + font-size: $font-15px; width: 100%; max-width: 280px; } diff --git a/res/css/views/dialogs/_SetPasswordDialog.scss b/res/css/views/dialogs/_SetPasswordDialog.scss index cff11c8afb..1f99353298 100644 --- a/res/css/views/dialogs/_SetPasswordDialog.scss +++ b/res/css/views/dialogs/_SetPasswordDialog.scss @@ -20,7 +20,7 @@ limitations under the License. padding: 9px; color: $primary-fg-color; background-color: $primary-bg-color; - font-size: 1rem; + font-size: $font-15px; max-width: 280px; margin-bottom: 10px; } diff --git a/res/css/views/dialogs/_TermsDialog.scss b/res/css/views/dialogs/_TermsDialog.scss index e9805d1b35..939a31dee6 100644 --- a/res/css/views/dialogs/_TermsDialog.scss +++ b/res/css/views/dialogs/_TermsDialog.scss @@ -31,7 +31,7 @@ limitations under the License. } .mx_TermsDialog_termsTable { - font-size: 0.8rem; + font-size: $font-12px; width: 100%; } diff --git a/res/css/views/dialogs/_UnknownDeviceDialog.scss b/res/css/views/dialogs/_UnknownDeviceDialog.scss index 8bb0ed4ff4..daa6bd2352 100644 --- a/res/css/views/dialogs/_UnknownDeviceDialog.scss +++ b/res/css/views/dialogs/_UnknownDeviceDialog.scss @@ -27,7 +27,7 @@ limitations under the License. // userid .mx_UnknownDeviceDialog p { font-weight: bold; - font-size: 1.067rem; + font-size: $font-16px; } .mx_UnknownDeviceDialog .mx_DeviceVerifyButtons { diff --git a/res/css/views/directory/_NetworkDropdown.scss b/res/css/views/directory/_NetworkDropdown.scss index 2f0e3e6a17..269b507e3c 100644 --- a/res/css/views/directory/_NetworkDropdown.scss +++ b/res/css/views/directory/_NetworkDropdown.scss @@ -47,9 +47,9 @@ limitations under the License. .mx_NetworkDropdown_server_title { padding: 0 10px; - font-size: 1rem; + font-size: $font-15px; font-weight: 600; - line-height: 1.333rem; + line-height: $font-20px; margin-bottom: 4px; // remove server button @@ -77,16 +77,16 @@ limitations under the License. .mx_NetworkDropdown_server_subtitle { padding: 0 10px; - font-size: 0.667rem; - line-height: 0.933rem; + font-size: $font-10px; + line-height: $font-14px; margin-top: -4px; margin-bottom: 4px; color: $muted-fg-color; } .mx_NetworkDropdown_server_network { - font-size: 0.8rem; - line-height: 1.067rem; + font-size: $font-12px; + line-height: $font-16px; padding: 4px 10px; cursor: pointer; position: relative; @@ -154,7 +154,7 @@ limitations under the License. .mx_NetworkDropdown_handle_server { color: $muted-fg-color; - font-size: 0.8rem; + font-size: $font-12px; } } diff --git a/res/css/views/elements/_AccessibleButton.scss b/res/css/views/elements/_AccessibleButton.scss index b7439d5856..0ee1186934 100644 --- a/res/css/views/elements/_AccessibleButton.scss +++ b/res/css/views/elements/_AccessibleButton.scss @@ -27,7 +27,7 @@ limitations under the License. text-align: center; border-radius: 4px; display: inline-block; - font-size: 0.933rem; + font-size: $font-14px; } .mx_AccessibleButton_kind_primary { diff --git a/res/css/views/elements/_AddressTile.scss b/res/css/views/elements/_AddressTile.scss index 94028481d4..c42f52f8f4 100644 --- a/res/css/views/elements/_AddressTile.scss +++ b/res/css/views/elements/_AddressTile.scss @@ -19,9 +19,9 @@ limitations under the License. border-radius: 3px; background-color: rgba(74, 73, 74, 0.1); border: solid 1px $input-border-color; - line-height: 1.733rem; + line-height: $font-26px; color: $primary-fg-color; - font-size: 0.933rem; + font-size: $font-14px; font-weight: normal; margin-right: 4px; } diff --git a/res/css/views/elements/_DirectorySearchBox.scss b/res/css/views/elements/_DirectorySearchBox.scss index 35fb80f5df..e4b1ac5574 100644 --- a/res/css/views/elements/_DirectorySearchBox.scss +++ b/res/css/views/elements/_DirectorySearchBox.scss @@ -32,7 +32,7 @@ limitations under the License. background-repeat: no-repeat; text-indent: 18px; font-weight: 600; - font-size: 0.8rem; + font-size: $font-12px; user-select: none; cursor: pointer; } diff --git a/res/css/views/elements/_Dropdown.scss b/res/css/views/elements/_Dropdown.scss index 64bcf7a33a..0dd9656c9c 100644 --- a/res/css/views/elements/_Dropdown.scss +++ b/res/css/views/elements/_Dropdown.scss @@ -29,7 +29,7 @@ limitations under the License. position: relative; border-radius: 3px; border: 1px solid $strong-input-border-color; - font-size: 0.8rem; + font-size: $font-12px; user-select: none; } @@ -53,7 +53,7 @@ limitations under the License. .mx_Dropdown_option { height: 35px; - line-height: 2.333rem; + line-height: $font-35px; padding-left: 8px; padding-right: 8px; } diff --git a/res/css/views/elements/_EventListSummary.scss b/res/css/views/elements/_EventListSummary.scss index a40c1384d7..f3e9f77aa3 100644 --- a/res/css/views/elements/_EventListSummary.scss +++ b/res/css/views/elements/_EventListSummary.scss @@ -19,7 +19,7 @@ limitations under the License. } .mx_TextualEvent.mx_EventListSummary_summary { - font-size: 0.933rem; + font-size: $font-14px; display: inline-flex; } @@ -27,7 +27,7 @@ limitations under the License. display: inline-block; margin-right: 8px; padding-top: 8px; - line-height: 0.8rem; + line-height: $font-12px; } .mx_EventListSummary_avatars .mx_BaseAvatar { @@ -46,19 +46,19 @@ limitations under the License. .mx_EventListSummary_line { border-bottom: 1px solid $primary-hairline-color; margin-left: 63px; - line-height: 2.000rem; + line-height: $font-30px; } .mx_MatrixChat_useCompactLayout { .mx_EventListSummary { - font-size: 0.867rem; + font-size: $font-13px; .mx_EventTile_line { - line-height: 1.333rem; + line-height: $font-20px; } } .mx_EventListSummary_line { - line-height: 1.467rem; + line-height: $font-22px; } .mx_EventListSummary_toggle { @@ -66,6 +66,6 @@ limitations under the License. } .mx_TextualEvent.mx_EventListSummary_summary { - font-size: 0.867rem; + font-size: $font-13px; } } diff --git a/res/css/views/elements/_Field.scss b/res/css/views/elements/_Field.scss index 26d24dba3a..cf5bc7ab41 100644 --- a/res/css/views/elements/_Field.scss +++ b/res/css/views/elements/_Field.scss @@ -40,7 +40,7 @@ limitations under the License. .mx_Field textarea { font-weight: normal; font-family: $font-family; - font-size: 0.933rem; + font-size: $font-14px; border: none; // Even without a border here, we still need this avoid overlapping the rounded // corners on the field above. @@ -102,7 +102,7 @@ limitations under the License. background-color 0.25s ease-out 0.1s; color: $primary-fg-color; background-color: transparent; - font-size: 0.933rem; + font-size: $font-14px; position: absolute; left: 0px; top: 0px; @@ -126,7 +126,7 @@ limitations under the License. color 0.25s ease-out 0s, top 0.25s ease-out 0s, background-color 0.25s ease-out 0s; - font-size: 0.667rem; + font-size: $font-10px; top: -13px; padding: 0 2px; background-color: $field-focused-label-bg-color; diff --git a/res/css/views/elements/_FormButton.scss b/res/css/views/elements/_FormButton.scss index c23ab6ee30..7ec01f17e6 100644 --- a/res/css/views/elements/_FormButton.scss +++ b/res/css/views/elements/_FormButton.scss @@ -15,9 +15,9 @@ limitations under the License. */ .mx_FormButton { - line-height: 1.067rem; + line-height: $font-16px; padding: 5px 15px; - font-size: 0.8rem; + font-size: $font-12px; height: min-content; &:not(:last-child) { diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss index cc7fca67d3..0a4ed2a194 100644 --- a/res/css/views/elements/_ImageView.scss +++ b/res/css/views/elements/_ImageView.scss @@ -102,13 +102,13 @@ limitations under the License. } .mx_ImageView_name { - font-size: 1.2rem; + font-size: $font-18px; margin-bottom: 6px; word-wrap: break-word; } .mx_ImageView_metadata { - font-size: 1rem; + font-size: $font-15px; opacity: 0.5; } @@ -118,13 +118,13 @@ limitations under the License. margin-bottom: 6px; border-radius: 5px; background-color: $lightbox-bg-color; - font-size: 0.933rem; + font-size: $font-14px; padding: 9px; border: 1px solid $lightbox-border-color; } .mx_ImageView_size { - font-size: 0.733rem; + font-size: $font-11px; } .mx_ImageView_link { @@ -133,7 +133,7 @@ limitations under the License. } .mx_ImageView_button { - font-size: 1rem; + font-size: $font-15px; opacity: 0.5; margin-top: 18px; cursor: pointer; diff --git a/res/css/views/elements/_InteractiveTooltip.scss b/res/css/views/elements/_InteractiveTooltip.scss index 07441ef85d..db98d95709 100644 --- a/res/css/views/elements/_InteractiveTooltip.scss +++ b/res/css/views/elements/_InteractiveTooltip.scss @@ -24,7 +24,7 @@ limitations under the License. background-color: $interactive-tooltip-bg-color; color: $interactive-tooltip-fg-color; position: absolute; - font-size: 0.667rem; + font-size: $font-10px; font-weight: 600; padding: 6px; z-index: 5001; diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss index d821f52e3d..e3f88cc779 100644 --- a/res/css/views/elements/_RichText.scss +++ b/res/css/views/elements/_RichText.scss @@ -9,7 +9,7 @@ border-radius: 16px; display: inline-block; height: 20px; - line-height: 1.333rem; + line-height: $font-20px; padding-left: 5px; } diff --git a/res/css/views/elements/_Tooltip.scss b/res/css/views/elements/_Tooltip.scss index 61762ced92..73ac9b3558 100644 --- a/res/css/views/elements/_Tooltip.scss +++ b/res/css/views/elements/_Tooltip.scss @@ -58,8 +58,8 @@ limitations under the License. z-index: 4000; // Higher than dialogs so tooltips can be used in dialogs padding: 10px; pointer-events: none; - line-height: 0.933rem; - font-size: 0.8rem; + line-height: $font-14px; + font-size: $font-12px; font-weight: 600; color: $primary-fg-color; max-width: 200px; @@ -82,7 +82,7 @@ limitations under the License. text-align: center; border: none; border-radius: 3px; - font-size: 0.933rem; + font-size: $font-14px; line-height: 1.2; padding: 6px 8px; diff --git a/res/css/views/elements/_TooltipButton.scss b/res/css/views/elements/_TooltipButton.scss index c350fc22e2..0c85dac818 100644 --- a/res/css/views/elements/_TooltipButton.scss +++ b/res/css/views/elements/_TooltipButton.scss @@ -28,7 +28,7 @@ limitations under the License. transition: opacity 0.2s ease-in; opacity: 0.6; - line-height: 0.733rem; + line-height: $font-11px; text-align: center; cursor: pointer; @@ -47,6 +47,6 @@ limitations under the License. .mx_TooltipButton_helpText { width: 400px; text-align: start; - line-height: 1.133rem !important; + line-height: 17px !important; } diff --git a/res/css/views/emojipicker/_EmojiPicker.scss b/res/css/views/emojipicker/_EmojiPicker.scss index 64b27b9ab3..24561eeeb9 100644 --- a/res/css/views/emojipicker/_EmojiPicker.scss +++ b/res/css/views/emojipicker/_EmojiPicker.scss @@ -163,7 +163,7 @@ limitations under the License. .mx_EmojiPicker_item { display: inline-block; - font-size: 1.333rem; + font-size: $font-20px; padding: 5px; width: 100%; height: 100%; @@ -183,7 +183,7 @@ limitations under the License. } .mx_EmojiPicker_category_label, .mx_EmojiPicker_preview_name { - font-size: 1.067rem; + font-size: $font-16px; font-weight: 600; margin: 0; } @@ -197,7 +197,7 @@ limitations under the License. } .mx_EmojiPicker_preview_emoji { - font-size: 2.133rem; + font-size: $font-32px; padding: 8px 16px; } @@ -212,7 +212,7 @@ limitations under the License. .mx_EmojiPicker_shortcode { color: $light-fg-color; - font-size: 0.933rem; + font-size: $font-14px; &::before, &::after { content: ":"; diff --git a/res/css/views/messages/_DateSeparator.scss b/res/css/views/messages/_DateSeparator.scss index b02e72814f..867f58d860 100644 --- a/res/css/views/messages/_DateSeparator.scss +++ b/res/css/views/messages/_DateSeparator.scss @@ -19,7 +19,7 @@ limitations under the License. margin: 4px 0; display: flex; align-items: center; - font-size: 0.933rem; + font-size: $font-14px; color: $roomtopic-color; } diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index 66ba0b227d..9f3971ecf0 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -21,7 +21,7 @@ limitations under the License. cursor: pointer; display: flex; height: 24px; - line-height: 1.600rem; + line-height: $font-24px; border-radius: 4px; background: $message-action-bar-bg-color; top: -18px; diff --git a/res/css/views/messages/_MessageTimestamp.scss b/res/css/views/messages/_MessageTimestamp.scss index 3a2a8d6336..f8d91cc083 100644 --- a/res/css/views/messages/_MessageTimestamp.scss +++ b/res/css/views/messages/_MessageTimestamp.scss @@ -16,5 +16,5 @@ limitations under the License. .mx_MessageTimestamp { color: $event-timestamp-color; - font-size: 0.667rem; + font-size: $font-10px; } diff --git a/res/css/views/messages/_ReactionsRow.scss b/res/css/views/messages/_ReactionsRow.scss index ee816e0fc0..2f5695e1fb 100644 --- a/res/css/views/messages/_ReactionsRow.scss +++ b/res/css/views/messages/_ReactionsRow.scss @@ -21,7 +21,7 @@ limitations under the License. .mx_ReactionsRow_showAll { text-decoration: none; - font-size: 0.667rem; + font-size: $font-10px; font-weight: 600; margin-left: 6px; vertical-align: top; diff --git a/res/css/views/messages/_ReactionsRowButton.scss b/res/css/views/messages/_ReactionsRowButton.scss index 7160c223be..941153ca5b 100644 --- a/res/css/views/messages/_ReactionsRowButton.scss +++ b/res/css/views/messages/_ReactionsRowButton.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_ReactionsRowButton { display: inline-flex; height: 20px; - line-height: 1.400rem; + line-height: $font-21px; margin-right: 6px; padding: 0 6px; border: 1px solid $reaction-row-button-border-color; diff --git a/res/css/views/messages/_ViewSourceEvent.scss b/res/css/views/messages/_ViewSourceEvent.scss index 088b66445d..076932ee97 100644 --- a/res/css/views/messages/_ViewSourceEvent.scss +++ b/res/css/views/messages/_ViewSourceEvent.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_EventTile_content.mx_ViewSourceEvent { display: flex; opacity: 0.6; - font-size: 0.8rem; + font-size: $font-12px; pre, code { flex: 1; diff --git a/res/css/views/messages/_common_CryptoEvent.scss b/res/css/views/messages/_common_CryptoEvent.scss index c9499b763f..637d25d7a1 100644 --- a/res/css/views/messages/_common_CryptoEvent.scss +++ b/res/css/views/messages/_common_CryptoEvent.scss @@ -45,7 +45,7 @@ limitations under the License. .mx_cryptoEvent_title { font-weight: 600; - font-size: 1rem; + font-size: $font-15px; grid-column: 2; grid-row: 1; } @@ -56,7 +56,7 @@ limitations under the License. } .mx_cryptoEvent_state, .mx_cryptoEvent_subtitle { - font-size: 0.8rem; + font-size: $font-12px; } .mx_cryptoEvent_state, .mx_cryptoEvent_buttons { diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index acc5e4641f..b45858e491 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -20,7 +20,7 @@ limitations under the License. flex-direction: column; flex: 1; overflow-y: auto; - font-size: 0.8rem; + font-size: $font-12px; .mx_UserInfo_cancel { cursor: pointer; @@ -43,7 +43,7 @@ limitations under the License. } h2 { - font-size: 1.2rem; + font-size: $font-18px; font-weight: 600; margin: 18px 0 0 0; } @@ -109,7 +109,7 @@ limitations under the License. justify-content: center; // override the calculated sizes so that the letter isn't HUGE - font-size: 3.733rem !important; + font-size: 56px !important; width: 100% !important; transition: font-size 0.5s; } @@ -122,7 +122,7 @@ limitations under the License. text-transform: uppercase; color: $notice-secondary-color; font-weight: bold; - font-size: 0.8rem; + font-size: $font-12px; margin: 4px 0; } @@ -134,8 +134,8 @@ limitations under the License. text-align: center; h2 { - font-size: 1.2rem; - line-height: 1.667rem; + font-size: $font-18px; + line-height: $font-25px; flex: 1; justify-content: center; align-items: center; @@ -197,7 +197,7 @@ limitations under the License. .mx_UserInfo_field { cursor: pointer; color: $accent-color; - line-height: 1.067rem; + line-height: $font-16px; margin: 8px 0; &.mx_UserInfo_destructive { @@ -206,7 +206,7 @@ limitations under the License. } .mx_UserInfo_statusMessage { - font-size: 0.733rem; + font-size: $font-11px; opacity: 0.5; overflow: hidden; white-space: nowrap; @@ -282,6 +282,6 @@ limitations under the License. } .mx_UserInfo_avatar .mx_BaseAvatar_initial { - font-size: 2.667rem !important; // override the other override because here the avatar is smaller + font-size: 40px !important; // override the other override because here the avatar is smaller } } diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 4a10dcbbcd..6165420275 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -95,7 +95,7 @@ limitations under the License. } .mx_VerificationPanel_QRPhase_helpText { - font-size: 0.933rem; + font-size: $font-14px; margin-top: 71px; text-align: center; } diff --git a/res/css/views/rooms/_AppsDrawer.scss b/res/css/views/rooms/_AppsDrawer.scss index 171cf49ba5..1b1bab67bc 100644 --- a/res/css/views/rooms/_AppsDrawer.scss +++ b/res/css/views/rooms/_AppsDrawer.scss @@ -46,7 +46,7 @@ $AppsDrawerBodyHeight: 273px; padding: 0; margin: 5px auto 5px auto; color: $accent-color; - font-size: 0.8rem; + font-size: $font-12px; } .mx_AddWidget_button_full_width { @@ -59,7 +59,7 @@ $AppsDrawerBodyHeight: 273px; padding: 9px; color: $primary-hairline-color; background-color: $primary-bg-color; - font-size: 1rem; + font-size: $font-15px; } .mx_AppTile { @@ -102,7 +102,7 @@ $AppsDrawerBodyHeight: 273px; .mx_AppTileMenuBar { margin: 0; - font-size: 0.8rem; + font-size: $font-12px; background-color: $widget-menu-bar-bg-color; display: flex; flex-direction: row; @@ -272,7 +272,7 @@ form.mx_Custom_Widget_Form div { flex-direction: column; justify-content: center; align-items: center; - font-size: 1.067rem; + font-size: $font-16px; } .mx_AppPermissionWarning_row { @@ -280,7 +280,7 @@ form.mx_Custom_Widget_Form div { } .mx_AppPermissionWarning_smallText { - font-size: 0.8rem; + font-size: $font-12px; } .mx_AppPermissionWarning_bolder { diff --git a/res/css/views/rooms/_BasicMessageComposer.scss b/res/css/views/rooms/_BasicMessageComposer.scss index c1f9663ea3..cc76623a8c 100644 --- a/res/css/views/rooms/_BasicMessageComposer.scss +++ b/res/css/views/rooms/_BasicMessageComposer.scss @@ -63,8 +63,8 @@ limitations under the License. border-radius: 8px; text-align: center; font-weight: normal; - line-height: 1.067rem; - font-size: 0.667rem; + line-height: $font-16px; + font-size: $font-10-4px; } } } diff --git a/res/css/views/rooms/_EntityTile.scss b/res/css/views/rooms/_EntityTile.scss index d66e4efe5c..966d2c4e70 100644 --- a/res/css/views/rooms/_EntityTile.scss +++ b/res/css/views/rooms/_EntityTile.scss @@ -78,7 +78,7 @@ limitations under the License. .mx_GroupRoomTile_name { flex: 1 1 0; overflow: hidden; - font-size: 0.933rem; + font-size: $font-14px; text-overflow: ellipsis; white-space: nowrap; } @@ -116,7 +116,7 @@ limitations under the License. } .mx_EntityTile_subtext { - font-size: 0.733rem; + font-size: $font-11px; opacity: 0.5; overflow: hidden; white-space: nowrap; @@ -125,7 +125,7 @@ limitations under the License. .mx_EntityTile_power { padding-inline-start: 6px; - font-size: 0.667rem; + font-size: $font-10px; color: $notice-secondary-color; max-width: 6em; overflow: hidden; diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 436b158644..9d798dcb20 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -19,7 +19,7 @@ limitations under the License. max-width: 100%; clear: both; padding-top: 18px; - font-size: 0.933rem; + font-size: $font-14px; position: relative; } @@ -64,7 +64,7 @@ limitations under the License. .mx_EventTile .mx_SenderProfile { color: $primary-fg-color; - font-size: 0.933rem; + font-size: $font-14px; display: inline-block; /* anti-zalgo, with overflow hidden */ overflow: hidden; cursor: pointer; @@ -72,7 +72,7 @@ limitations under the License. padding-bottom: 0px; padding-top: 0px; margin: 0px; - line-height: 1.133rem; + line-height: $font-17px; /* the next three lines, along with overflow hidden, truncate long display names */ white-space: nowrap; text-overflow: ellipsis; @@ -117,7 +117,7 @@ limitations under the License. padding-bottom: 2px; border-radius: 4px; min-height: 24px; - line-height: 1.467rem; + line-height: $font-22px; } .mx_RoomView_timeline_rr_enabled { @@ -152,8 +152,8 @@ limitations under the License. /* HACK to override line-height which is already marked important elsewhere */ .mx_EventTile_bigEmoji.mx_EventTile_bigEmoji { - font-size: 3.200rem !important; - line-height: 3.800rem !important; + font-size: 48px !important; + line-height: 57px !important; } .mx_MessagePanel_alwaysShowTimestamps .mx_MessageTimestamp { @@ -312,7 +312,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile_readAvatarRemainder { color: $event-timestamp-color; - font-size: 0.733rem; + font-size: $font-11px; position: absolute; } @@ -341,7 +341,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile_spoiler_reason { color: $event-timestamp-color; - font-size: 0.733rem; + font-size: $font-11px; } .mx_EventTile_spoiler_content { @@ -393,7 +393,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { } .mx_EventTile_keyRequestInfo { - font-size: 0.8rem; + font-size: $font-12px; } .mx_EventTile_keyRequestInfo_text { @@ -471,7 +471,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile_content .mx_EventTile_edited { user-select: none; - font-size: 0.8rem; + font-size: $font-12px; color: $roomtopic-color; display: inline-block; margin-left: 9px; @@ -489,7 +489,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { white-space: normal !important; line-height: inherit !important; color: inherit; // inherit the colour from the dark or light theme by default (but not for code blocks) - font-size: 0.933rem; + font-size: $font-14px; pre, code { font-family: $monospace-font-family !important; @@ -589,9 +589,9 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile.mx_EventTile_info { // same as the padding for non-compact .mx_EventTile.mx_EventTile_info padding-top: 0px; - font-size: 0.867rem; + font-size: $font-13px; .mx_EventTile_line, .mx_EventTile_reply { - line-height: 1.333rem; + line-height: $font-20px; } .mx_EventTile_avatar { top: 4px; @@ -599,7 +599,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { } .mx_EventTile .mx_SenderProfile { - font-size: 0.867rem; + font-size: $font-13px; } .mx_EventTile.mx_EventTile_emote { diff --git a/res/css/views/rooms/_JumpToBottomButton.scss b/res/css/views/rooms/_JumpToBottomButton.scss index 2c44eed1b8..63cf574596 100644 --- a/res/css/views/rooms/_JumpToBottomButton.scss +++ b/res/css/views/rooms/_JumpToBottomButton.scss @@ -34,8 +34,8 @@ limitations under the License. top: -12px; border-radius: 16px; font-weight: bold; - font-size: 0.8rem; - line-height: 0.933rem; + font-size: $font-12px; + line-height: $font-14px; text-align: center; // to be able to get it centered // with text-align in parent diff --git a/res/css/views/rooms/_MemberDeviceInfo.scss b/res/css/views/rooms/_MemberDeviceInfo.scss index fe5a4b7659..71b05a93fc 100644 --- a/res/css/views/rooms/_MemberDeviceInfo.scss +++ b/res/css/views/rooms/_MemberDeviceInfo.scss @@ -59,7 +59,7 @@ limitations under the License. .mx_MemberDeviceInfo_deviceId { word-break: break-word; - font-size: 0.867rem; + font-size: $font-13px; } .mx_MemberDeviceInfo_deviceInfo { diff --git a/res/css/views/rooms/_MemberInfo.scss b/res/css/views/rooms/_MemberInfo.scss index d4c8fbb097..fb082843f1 100644 --- a/res/css/views/rooms/_MemberInfo.scss +++ b/res/css/views/rooms/_MemberInfo.scss @@ -48,7 +48,7 @@ limitations under the License. } .mx_MemberInfo h2 { - font-size: 1.2rem; + font-size: $font-18px; font-weight: 600; margin: 16px 0 16px 15px; } @@ -94,12 +94,12 @@ limitations under the License. text-transform: uppercase; color: $input-darker-fg-color; font-weight: bold; - font-size: 0.8rem; + font-size: $font-12px; margin: 4px 0; } .mx_MemberInfo_profileField { - font-size: 1rem; + font-size: $font-15px; position: relative; } @@ -109,10 +109,10 @@ limitations under the License. .mx_MemberInfo_field { cursor: pointer; - font-size: 1rem; + font-size: $font-15px; color: $primary-fg-color; margin-left: 8px; - line-height: 1.533rem; + line-height: $font-23px; } .mx_MemberInfo_createRoom { @@ -128,7 +128,7 @@ limitations under the License. } .mx_MemberInfo label { - font-size: 0.867rem; + font-size: $font-13px; } .mx_MemberInfo label .mx_MemberInfo_label_text { @@ -144,7 +144,7 @@ limitations under the License. } .mx_MemberInfo_statusMessage { - font-size: 0.733rem; + font-size: $font-11px; opacity: 0.5; overflow: hidden; white-space: nowrap; diff --git a/res/css/views/rooms/_MemberList.scss b/res/css/views/rooms/_MemberList.scss index 0f676645a9..99dc2338d4 100644 --- a/res/css/views/rooms/_MemberList.scss +++ b/res/css/views/rooms/_MemberList.scss @@ -30,7 +30,7 @@ limitations under the License. text-transform: uppercase; color: $h3-color; font-weight: 600; - font-size: 0.867rem; + font-size: $font-13px; padding-left: 3px; padding-right: 12px; margin-top: 8px; diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index 3777acf423..7b223be3a4 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -105,7 +105,7 @@ limitations under the License. min-height: 60px; justify-content: flex-start; align-items: flex-start; - font-size: 0.933rem; + font-size: $font-14px; margin-right: 6px; } @@ -161,7 +161,7 @@ limitations under the License. box-shadow: none; color: $primary-fg-color; background-color: $primary-bg-color; - font-size: 0.933rem; + font-size: $font-14px; max-height: 120px; overflow: auto; /* needed for FF */ @@ -242,7 +242,7 @@ limitations under the License. flex-direction: row; align-items: center; - font-size: 0.667rem; + font-size: $font-10px; color: $greyed-fg-color; } diff --git a/res/css/views/rooms/_MessageComposerFormatBar.scss b/res/css/views/rooms/_MessageComposerFormatBar.scss index 0558cd48cf..27ee7b9795 100644 --- a/res/css/views/rooms/_MessageComposerFormatBar.scss +++ b/res/css/views/rooms/_MessageComposerFormatBar.scss @@ -97,13 +97,13 @@ limitations under the License. .mx_MessageComposerFormatBar_buttonTooltip { white-space: nowrap; - font-size: 0.867rem; + font-size: $font-13px; font-weight: 600; min-width: 54px; text-align: center; .mx_MessageComposerFormatBar_tooltipShortcut { - font-size: 0.600rem; + font-size: $font-9px; opacity: 0.7; } } diff --git a/res/css/views/rooms/_PresenceLabel.scss b/res/css/views/rooms/_PresenceLabel.scss index 6d044a69b5..5be83c77d7 100644 --- a/res/css/views/rooms/_PresenceLabel.scss +++ b/res/css/views/rooms/_PresenceLabel.scss @@ -15,6 +15,6 @@ limitations under the License. */ .mx_PresenceLabel { - font-size: 0.733rem; + font-size: $font-11px; opacity: 0.5; } diff --git a/res/css/views/rooms/_RoomDropTarget.scss b/res/css/views/rooms/_RoomDropTarget.scss index 1ae8f73e88..2e8145c2c9 100644 --- a/res/css/views/rooms/_RoomDropTarget.scss +++ b/res/css/views/rooms/_RoomDropTarget.scss @@ -28,7 +28,7 @@ limitations under the License. } .mx_RoomDropTarget { - font-size: 0.867rem; + font-size: $font-13px; padding-top: 5px; padding-bottom: 5px; border: 1px dashed $accent-color; @@ -41,7 +41,7 @@ limitations under the License. .mx_RoomDropTarget_label { position: relative; margin-top: 3px; - line-height: 1.400rem; + line-height: $font-21px; z-index: 1; text-align: center; } diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 1737014248..969106c9ea 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -77,9 +77,9 @@ limitations under the License. } .mx_RoomHeader_simpleHeader { - line-height: 3.467rem; + line-height: $font-52px; color: $roomheader-color; - font-size: 1.2rem; + font-size: $font-18px; font-weight: 600; overflow: hidden; margin-left: 63px; @@ -102,7 +102,7 @@ limitations under the License. overflow: hidden; color: $roomheader-color; font-weight: 600; - font-size: 1.2rem; + font-size: $font-18px; margin: 0 7px; border-bottom: 1px solid transparent; display: flex; @@ -161,7 +161,7 @@ limitations under the License. flex: 1; color: $roomtopic-color; font-weight: 400; - font-size: 0.867rem; + font-size: $font-13px; margin: 0 7px; margin-top: 4px; // to align baseline of topic with room name overflow: hidden; diff --git a/res/css/views/rooms/_RoomList.scss b/res/css/views/rooms/_RoomList.scss index b9cb2dc8e4..50a9e7ee1f 100644 --- a/res/css/views/rooms/_RoomList.scss +++ b/res/css/views/rooms/_RoomList.scss @@ -47,13 +47,13 @@ limitations under the License. } .mx_RoomList_emptySubListTip { - font-size: 0.867rem; + font-size: $font-13px; padding: 5px; border: 1px dashed $accent-color; color: $primary-fg-color; background-color: $droptarget-bg-color; border-radius: 4px; - line-height: 1.067rem; + line-height: $font-16px; } .mx_RoomList_emptySubListTip .mx_RoleButton { diff --git a/res/css/views/rooms/_RoomPreviewBar.scss b/res/css/views/rooms/_RoomPreviewBar.scss index 8e61524fda..8708f13ada 100644 --- a/res/css/views/rooms/_RoomPreviewBar.scss +++ b/res/css/views/rooms/_RoomPreviewBar.scss @@ -23,7 +23,7 @@ limitations under the License. -webkit-align-items: center; h3 { - font-size: 1.2rem; + font-size: $font-18px; font-weight: 600; &.mx_RoomPreviewBar_spinnerTitle { @@ -48,8 +48,8 @@ limitations under the License. } .mx_RoomPreviewBar_footer { - font-size: 0.8rem; - line-height: 1.333rem; + font-size: $font-12px; + line-height: $font-20px; .mx_Spinner { vertical-align: middle; diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index 57d42f6be2..7be2a4e3d4 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -64,7 +64,7 @@ limitations under the License. .mx_RoomTile_subtext { display: inline-block; - font-size: 0.733rem; + font-size: $font-11px; padding: 0 0 0 7px; margin: 0; overflow: hidden; @@ -112,7 +112,7 @@ limitations under the License. } .mx_RoomTile_name { - font-size: 0.933rem; + font-size: $font-14px; padding: 0 4px; color: $roomtile-name-color; white-space: nowrap; @@ -126,7 +126,7 @@ limitations under the License. padding: 0 0.4em; color: $roomtile-badge-fg-color; font-weight: 600; - font-size: 0.8rem; + font-size: $font-12px; } .collapsed { diff --git a/res/css/views/rooms/_SearchBar.scss b/res/css/views/rooms/_SearchBar.scss index 5b80585cef..fecc8d78d8 100644 --- a/res/css/views/rooms/_SearchBar.scss +++ b/res/css/views/rooms/_SearchBar.scss @@ -22,7 +22,7 @@ limitations under the License. .mx_SearchBar_input { // border: 1px solid $input-border-color; - // font-size: 1rem; + // font-size: $font-15px; flex: 1 1 0; margin-left: 22px; } @@ -45,7 +45,7 @@ limitations under the License. border: 0; margin: 0 0 0 22px; padding: 5px; - font-size: 1rem; + font-size: $font-15px; cursor: pointer; color: $primary-fg-color; border-bottom: 2px solid $accent-color; diff --git a/res/css/views/rooms/_SendMessageComposer.scss b/res/css/views/rooms/_SendMessageComposer.scss index 7233d373a3..0b646666e7 100644 --- a/res/css/views/rooms/_SendMessageComposer.scss +++ b/res/css/views/rooms/_SendMessageComposer.scss @@ -18,7 +18,7 @@ limitations under the License. flex: 1; display: flex; flex-direction: column; - font-size: 0.933rem; + font-size: $font-14px; justify-content: center; margin-right: 6px; // don't grow wider than available space diff --git a/res/css/views/rooms/_WhoIsTypingTile.scss b/res/css/views/rooms/_WhoIsTypingTile.scss index a1e6f3a3bf..8b135152d6 100644 --- a/res/css/views/rooms/_WhoIsTypingTile.scss +++ b/res/css/views/rooms/_WhoIsTypingTile.scss @@ -49,7 +49,7 @@ limitations under the License. border-radius: 40px; width: 24px; height: 24px; - line-height: 1.600rem; + line-height: $font-24px; font-size: 0.8em; vertical-align: top; text-align: center; @@ -57,7 +57,7 @@ limitations under the License. .mx_WhoIsTypingTile_label { flex: 1; - font-size: 0.933rem; + font-size: $font-14px; font-weight: 600; color: $eventtile-meta-color; } diff --git a/res/css/views/settings/tabs/_SettingsTab.scss b/res/css/views/settings/tabs/_SettingsTab.scss index 03bd3221cd..1fbfb35927 100644 --- a/res/css/views/settings/tabs/_SettingsTab.scss +++ b/res/css/views/settings/tabs/_SettingsTab.scss @@ -19,7 +19,7 @@ limitations under the License. } .mx_SettingsTab_heading { - font-size: 1.333rem; + font-size: $font-20px; font-weight: 600; color: $primary-fg-color; } @@ -29,7 +29,7 @@ limitations under the License. } .mx_SettingsTab_subheading { - font-size: 1.067rem; + font-size: $font-16px; display: block; font-family: $font-family; font-weight: 600; @@ -40,7 +40,7 @@ limitations under the License. .mx_SettingsTab_subsectionText { color: $settings-subsection-fg-color; - font-size: 0.933rem; + font-size: $font-14px; display: block; margin: 10px 100px 10px 0; // Align with the rest of the view } @@ -61,7 +61,7 @@ limitations under the License. .mx_SettingsTab_section .mx_SettingsFlag .mx_SettingsFlag_label { vertical-align: middle; display: inline-block; - font-size: 0.933rem; + font-size: $font-14px; color: $primary-fg-color; max-width: calc(100% - 48px); // Force word wrap instead of colliding with the switch box-sizing: border-box; diff --git a/res/css/views/terms/_InlineTermsAgreement.scss b/res/css/views/terms/_InlineTermsAgreement.scss index 1f9ea7a33d..1d0e3ea8c5 100644 --- a/res/css/views/terms/_InlineTermsAgreement.scss +++ b/res/css/views/terms/_InlineTermsAgreement.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_InlineTermsAgreement_cbContainer { margin-bottom: 10px; - font-size: 0.933rem; + font-size: $font-14px; a { color: $accent-color; diff --git a/res/css/views/verification/_VerificationShowSas.scss b/res/css/views/verification/_VerificationShowSas.scss index fd83bf7ad4..6e26943640 100644 --- a/res/css/views/verification/_VerificationShowSas.scss +++ b/res/css/views/verification/_VerificationShowSas.scss @@ -48,14 +48,14 @@ limitations under the License. } .mx_VerificationShowSas_emojiSas_emoji { - font-size: 2.133rem; + font-size: $font-32px; } .mx_VerificationShowSas_emojiSas_label { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - font-size: 0.8rem; + font-size: $font-12px; } .mx_VerificationShowSas_emojiSas_break { diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index 06c9f7bed6..4650f30c1d 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -21,5 +21,5 @@ limitations under the License. text-align: center; padding: 6px; font-weight: bold; - font-size: 0.867rem; + font-size: $font-13px; } diff --git a/res/css/views/voip/_IncomingCallbox.scss b/res/css/views/voip/_IncomingCallbox.scss index 3c8ed46639..ed33de470d 100644 --- a/res/css/views/voip/_IncomingCallbox.scss +++ b/res/css/views/voip/_IncomingCallbox.scss @@ -54,7 +54,7 @@ limitations under the License. vertical-align: middle; width: 80px; height: 36px; - line-height: 2.400rem; + line-height: $font-36px; border-radius: 36px; color: $accent-fg-color; margin: auto; diff --git a/res/themes/dark-custom/css/dark-custom.scss b/res/themes/dark-custom/css/dark-custom.scss index aff647ce26..03ceef45c6 100644 --- a/res/themes/dark-custom/css/dark-custom.scss +++ b/res/themes/dark-custom/css/dark-custom.scss @@ -1,3 +1,4 @@ +@import "../../../../res/css/_font-sizes.scss"; @import "../../light/css/_paths.scss"; @import "../../light/css/_fonts.scss"; @import "../../light/css/_light.scss"; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 1f11fd5620..5d6ba033c8 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -185,7 +185,7 @@ $user-tile-hover-bg-color: $header-panel-bg-color; border: 0px; border-radius: 4px; font-family: $font-family; - font-size: 0.933rem; + font-size: $font-14px; color: $button-fg-color; background-color: $button-bg-color; width: auto; diff --git a/res/themes/dark/css/dark.scss b/res/themes/dark/css/dark.scss index e7ae7c8cf8..d81db4595f 100644 --- a/res/themes/dark/css/dark.scss +++ b/res/themes/dark/css/dark.scss @@ -1,3 +1,4 @@ +@import "../../../../res/css/_font-sizes.scss"; @import "../../light/css/_paths.scss"; @import "../../light/css/_fonts.scss"; @import "../../light/css/_light.scss"; diff --git a/res/themes/light-custom/css/light-custom.scss b/res/themes/light-custom/css/light-custom.scss index 278ca5f0b1..4f80647eba 100644 --- a/res/themes/light-custom/css/light-custom.scss +++ b/res/themes/light-custom/css/light-custom.scss @@ -1,3 +1,4 @@ +@import "../../../../res/css/_font-sizes.scss"; @import "../../light/css/_paths.scss"; @import "../../light/css/_fonts.scss"; @import "../../light/css/_light.scss"; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 2a993a7934..f5f3013354 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -310,7 +310,7 @@ $user-tile-hover-bg-color: $header-panel-bg-color; border: 0px; border-radius: 4px; font-family: $font-family; - font-size: 0.933rem; + font-size: $font-14px; color: $button-fg-color; background-color: $button-bg-color; width: auto; @@ -331,7 +331,7 @@ $user-tile-hover-bg-color: $header-panel-bg-color; @define-mixin mx_DialogButton_small { @mixin mx_DialogButton; - font-size: 1rem; + font-size: $font-15px; padding: 0px 1.5em 0px 1.5em; } diff --git a/res/themes/light/css/light.scss b/res/themes/light/css/light.scss index 6acb2d9d94..4f48557648 100644 --- a/res/themes/light/css/light.scss +++ b/res/themes/light/css/light.scss @@ -1,3 +1,4 @@ +@import "../../../../res/css/_font-sizes.scss"; @import "_paths.scss"; @import "_fonts.scss"; @import "_light.scss"; From e2685b1cf0c1300af3fe794eb76379f610f8adb3 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Tue, 31 Mar 2020 15:29:40 +0100 Subject: [PATCH 020/230] Licensing info --- res/css/_font-sizes.scss | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/res/css/_font-sizes.scss b/res/css/_font-sizes.scss index 6baf11e9d6..be6d43d3a8 100644 --- a/res/css/_font-sizes.scss +++ b/res/css/_font-sizes.scss @@ -1,3 +1,19 @@ +/* +Copyright 2020 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +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. +*/ + $font-8px: 0.533rem; $font-9px: 0.600rem; $font-10px: 0.667rem; From dcd75a801ebfd7934677d4ab51d0d56aa5982419 Mon Sep 17 00:00:00 2001 From: random Date: Tue, 31 Mar 2020 14:33:01 +0000 Subject: [PATCH 021/230] Translated using Weblate (Italian) Currently translated at 100.0% (2244 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index f3aed44b05..628c857d6e 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2304,5 +2304,7 @@ "Verified": "Verificato", "Verification cancelled": "Verifica annullata", "Compare emoji": "Confronta emoji", - "Cancel replying to a message": "Annulla la risposta a un messaggio" + "Cancel replying to a message": "Annulla la risposta a un messaggio", + "Sends a message as html, without interpreting it as markdown": "Invia un messaggio come html, senza interpretarlo come markdown", + "Sign in with SSO": "Accedi con SSO" } From eb901441cdda2c77c5cc377892ddc348b9cb3dc5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 31 Mar 2020 16:14:18 +0100 Subject: [PATCH 022/230] Fix alignment of e2e icon in userinfo and expose full displayname in title Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/right_panel/_UserInfo.scss | 23 +++++++++++--------- src/components/views/right_panel/UserInfo.js | 6 +++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index 0e4b1bda9e..d2753f5825 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -134,24 +134,27 @@ limitations under the License. text-align: center; h2 { + display: flex; font-size: 18px; line-height: 25px; flex: 1; justify-content: center; - align-items: center; - // limit to 2 lines, show an ellipsis if it overflows - // this looks webkit specific but is supported by Firefox 68+ - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; + span { + // limit to 2 lines, show an ellipsis if it overflows + // this looks webkit specific but is supported by Firefox 68+ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; - overflow: hidden; - word-break: break-all; - text-overflow: ellipsis; + overflow: hidden; + word-break: break-all; + text-overflow: ellipsis; + } .mx_E2EIcon { - margin: 5px; + margin: 4px 4px 4px 0; // no left-margin to improve visual centering + min-width: 18px; // convince flexbox to not collapse it } } diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index a2081dc9e4..82e410b361 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1444,9 +1444,11 @@ const UserInfoHeader = ({onClose, member, e2eStatus}) => {
-

+

{ e2eIcon } - { displayName } + + { displayName } +

{ member.userId }
From a0e5169b59088f91419cf829baaf540949178708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A4rt=20P=C3=B5der?= Date: Tue, 31 Mar 2020 19:48:13 +0000 Subject: [PATCH 023/230] Added translation using Weblate (Estonian) --- src/i18n/strings/et.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/i18n/strings/et.json diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src/i18n/strings/et.json @@ -0,0 +1 @@ +{} From d30db00cf174be026ac0e29a9ba02f7c7f9ae686 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Tue, 31 Mar 2020 17:38:55 +0000 Subject: [PATCH 024/230] Translated using Weblate (Basque) Currently translated at 100.0% (2244 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eu/ --- src/i18n/strings/eu.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 69de024887..1283a7a379 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -2293,5 +2293,8 @@ "Verification cancelled": "Egiaztaketa ezeztatuta", "Compare emoji": "Konparatu emojiak", "Unverified login. Was this you?": "Egiaztatu gabeko saioa. Zu izan zara?", - "Session backup key:": "Saioaren babes-kopia gakoa:" + "Session backup key:": "Saioaren babes-kopia gakoa:", + "Sends a message as html, without interpreting it as markdown": "Bidali mezua html gisa, markdown balitz aztertu gabe", + "Sign in with SSO": "Hasi saioa SSO-rekin", + "Cancel replying to a message": "Utzi mezua erantzuteari" } From 79b8fd80c9cd575d4e6d0432b51badf294877395 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 1 Apr 2020 06:19:45 +0000 Subject: [PATCH 025/230] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2244 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-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 03d49e0499..32dc7532f4 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2307,5 +2307,6 @@ "Compare emoji": "比較顏文字", "Session backup key:": "工作階段備份金鑰:", "Sends a message as html, without interpreting it as markdown": "以 html 形式傳送訊息,不將其翻譯為 markdown", - "Cancel replying to a message": "取消回覆訊息" + "Cancel replying to a message": "取消回覆訊息", + "Sign in with SSO": "使用單一登入系統登入" } From 918309f4da8b8066d6de40494b9322c62d90e167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 1 Apr 2020 07:29:12 +0000 Subject: [PATCH 026/230] Translated using Weblate (French) Currently translated at 100.0% (2244 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index eb7e11c0f2..f138f81647 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2306,5 +2306,8 @@ "In encrypted rooms, verify all users to ensure it’s secure.": "Dans les salons chiffrés, vérifiez tous les utilisateurs pour vous assurer qu’il est sécurisé.", "Verified": "Vérifié", "Verification cancelled": "Vérification annulée", - "Compare emoji": "Comparer des émojis" + "Compare emoji": "Comparer des émojis", + "Sends a message as html, without interpreting it as markdown": "Envoie un message en HTML, sans l’interpréter comme du Markdown", + "Sign in with SSO": "Se connecter avec l’authentification unique", + "Cancel replying to a message": "Annuler la réponse à un message" } From 6727024e46516f0efbc6ff803e94ca07d23df8b4 Mon Sep 17 00:00:00 2001 From: Peter Pan Date: Tue, 31 Mar 2020 21:48:54 +0000 Subject: [PATCH 027/230] Translated using Weblate (German) Currently translated at 77.1% (1731 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index a808ebd33c..1a33195f79 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1785,5 +1785,7 @@ "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Bewahre ihn sicher auf, wie in einem Passwort-Manager oder einem Safe.", "Your recovery key": "Dein Wiederherstellungsschlüssel", "Copy": "In Zwischenablage kopieren", - "Make a copy of your recovery key": "Speichere deinen Wiederherstellungsschlüssel" + "Make a copy of your recovery key": "Speichere deinen Wiederherstellungsschlüssel", + "Unverified login. Was this you?": "Nicht verifzierte Anmeldung. Bist du es gewesen?", + "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren" } From cb176dd235a0d978231485037cef0cbb059c8b82 Mon Sep 17 00:00:00 2001 From: Dvir Berebi Date: Wed, 1 Apr 2020 02:09:29 +0000 Subject: [PATCH 028/230] Translated using Weblate (Hebrew) Currently translated at 9.3% (209 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 9c3e383afc..2883da0abb 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -207,5 +207,6 @@ "Thank you!": "רב תודות!", "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "באמצעות הדפדפן הנוכחי שלך המראה של היישום יכול להיות שגוי לחלוטין וחלק מהאפשרויות לא תתפקדנה. אם תרצה לנסות בכל זאת תוכל אבל אז כל האחריות עליך!", "Checking for an update...": "בודק עדכונים...", - "There are advanced notifications which are not shown here": "ישנן התראות מתקדמות אשר אינן מוצגות כאן" + "There are advanced notifications which are not shown here": "ישנן התראות מתקדמות אשר אינן מוצגות כאן", + "Your Riot is misconfigured": "ה Riot שלך מוגדר באופן שגוי" } From 1cc2162d47d3e649b08e7ee89dbd605da99f1134 Mon Sep 17 00:00:00 2001 From: Imre Kristoffer Eilertsen Date: Wed, 1 Apr 2020 01:15:24 +0000 Subject: [PATCH 029/230] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 47.2% (1059 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 239 ++++++++++++++++++++++++++++++++++-- 1 file changed, 231 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index f16ff2a771..433c650de6 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -158,10 +158,10 @@ "Dec": "Des", "PM": "PM", "AM": "AM", - "%(weekDayName)s %(time)s": "%(weekDayName)s. %(time)s", - "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s,%(monthName)s,%(day)s,%(time)s", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", + "%(weekDayName)s %(time)s": "%(weekDayName)s kl. %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s %(day)s. %(monthName)s kl. %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s %(day)s. %(monthName)s %(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s %(day)s. %(monthName)s %(fullYear)s kl. %(time)s", "Who would you like to add to this community?": "Hvem ønsker du å legge til i dette samfunnet?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Advarsel: Enhver person som du legger til i et samfunn vil bli offentlig synlig til alle som kan samfunns IDen", "Invite new community members": "Inviter nye samfunnsmedlemmer", @@ -240,7 +240,7 @@ "Sets the room name": "Setter rommets navn", "Invites user with given id to current room": "Inviterer brukeren med gitt id til dette rommet", "Joins room with given alias": "Går inn i rommet med gitt alias", - "Leave room": "Forlate rom", + "Leave room": "Forlat rommet", "Unrecognised room alias:": "Ukjent rom alias:", "Kicks user with given id": "Sparker ut bruker med gitt id", "Bans user with given id": "Nekter tilgang til bruker med gitt id", @@ -364,7 +364,7 @@ "Composer": "Komposør", "Timeline": "Tidslinje", "Security & Privacy": "Sikkerhet og personvern", - "Sessions": "Sesjoner", + "Sessions": "Økter", "Camera": "Kamera", "Reset": "Nullstill", "Browse": "Bla", @@ -568,7 +568,7 @@ "Allow Peer-to-Peer for 1:1 calls": "Tillat P2P for samtaler under fire øyne", "Send analytics data": "Send analytiske data", "Enable inline URL previews by default": "Skru på URL-forhåndsvisninger inni meldinger som standard", - "Prompt before sending invites to potentially invalid matrix IDs": "Si ifra før det sendes invitasjoner til potensielt ugyldig Matrix-ID-er", + "Prompt before sending invites to potentially invalid matrix IDs": "Si ifra før det sendes invitasjoner til potensielt ugyldige Matrix-ID-er", "Show developer tools": "Vis utviklerverktøy", "Order rooms by name": "Sorter rom etter navn", "Show rooms with unread notifications first": "Vis rom med uleste varsler først", @@ -843,5 +843,228 @@ "Starting backup...": "Begynner sikkerhetskopieringen …", "Don't ask again": "Ikke spør igjen", "Space used:": "Plass brukt:", - "Indexed rooms:": "Indekserte rom:" + "Indexed rooms:": "Indekserte rom:", + "Verify this session": "Verifiser denne økten", + "Set up encryption": "Sett opp kryptering", + "Create Account": "Opprett konto", + "%(senderName)s set a profile picture.": "%(senderName)s ordnet seg et profilbilde.", + "%(targetName)s left the room.": "%(targetName)s forlot rommet.", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s endret rommets navn fra %(oldRoomName)s til %(newRoomName)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s endret rommets navn til %(roomName)s.", + "(not supported by this browser)": "(ikke støttet av denne nettleseren)", + "%(senderName)s ended the call.": "%(senderName)s avsluttet samtalen.", + "Not Trusted": "Ikke betrodd", + "%(items)s and %(count)s others|other": "%(items)s og %(count)s andre", + "%(items)s and %(count)s others|one": "%(items)s og én annen", + "%(items)s and %(lastItem)s": "%(items)s og %(lastItem)s", + "a few seconds ago": "noen sekunder siden", + "about a minute ago": "cirka 1 minutt siden", + "about an hour ago": "cirka 1 time siden", + "about a day ago": "cirka 1 dag siden", + "%(num)s days ago": "%(num)s dager siden", + "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", + "Never send encrypted messages to unverified sessions in this room from this session": "Aldri send krypterte meldinger til uverifiserte økter i dette rommet fra denne økten", + "Enable URL previews for this room (only affects you)": "Skru på URL-forhåndsvisninger for dette rommet (Påvirker bare deg)", + "Enable URL previews by default for participants in this room": "Skru på URL-forhåndsvisninger som standard for deltakerne i dette rommet", + "Room Colour": "Romfarge", + "Low bandwidth mode": "Modus for lav båndbredde", + "Manually verify all remote sessions": "Verifiser alle eksterne økter manuelt", + "Show more": "Vis mer", + "Warning!": "Advarsel!", + "Export E2E room keys": "Eksporter E2E-romnøkler", + "not found": "ikke funnet", + "exists": "finnes", + "Authentication": "Autentisering", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifiser hver brukerøkt individuelt for å stemple den som at du stoler på den, ikke stol på kryss-signerte enheter.", + "Connecting to integration manager...": "Kobler til integreringsbehandleren …", + "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Krypterte meldinger er sikret med punkt-til-punkt-kryptering. Bare du og mottakeren(e) har nøklene til å lese disse meldingene.", + "Your keys are not being backed up from this session.": "Dine nøkler har ikke blitt sikkerhetskopiert fra denne økten.", + "Back up your keys before signing out to avoid losing them.": "Ta sikkerhetskopi av nøklene dine før du logger av for å unngå å miste dem.", + "Start using Key Backup": "Begynn å bruke Nøkkelsikkerhetskopiering", + "Add an email address to configure email notifications": "Legg til en E-postadresse for å sette opp E-postvarsler", + "Identity Server (%(server)s)": "Identitetstjener (%(server)s)", + "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Hvis du ikke ønsker å bruke til å oppdage og bli oppdaget av eksisterende kontakter som du kjenner, skriv inn en annen identitetstjener nedenfor.", + "Enter a new identity server": "Skriv inn en ny identitetstjener", + "For help with using Riot, click here.": "For å få hjelp til å bruke Riot, klikk her.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Dersom du har sendt inn en feilrapport på GitHub, kan avlusingsloggbøker hjelpe oss med å finne frem til problemet. Avlusingsloggbøker inneholder programbruksdata inkl. ditt brukernavn, ID-ene eller aliasene til rommene eller gruppene du har besøkt, og brukernavnene til andre brukere. De inneholder ikke noen meldinger.", + "Submit debug logs": "Send inn avlusingsloggbøker", + "Clear cache and reload": "Tøm mellomlageret og last inn siden på nytt", + "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "For å rapportere inn et Matrix-relatert sikkerhetsproblem, vennligst less Matrix.org sine Retningslinjer for sikkerhetspublisering.", + "Keyboard Shortcuts": "Tastatursnarveier", + "Homeserver is": "Hjemmetjeneren er", + "Identity Server is": "Identitetstjeneren er", + "Access Token:": "Tilgangssjetong:", + "Import E2E room keys": "Importer E2E-romnøkler", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot samler inn anonyme statistikker for å hjelpe oss med å forbedre programmet.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privatlivet er viktig for oss, så vi samler ikke inn noe personlig eller identifiserbar data for våre analyser.", + "Internal room ID:": "Intern rom-ID:", + "Change room avatar": "Endre rommets avatar", + "Change room name": "Endre rommets navn", + "Change main address for the room": "Endre hovedadressen til rommet", + "Change history visibility": "Endre historikkens synlighet", + "Enable room encryption": "Skru på kryptering av rommet", + "Default role": "Forvalgt rolle", + "Privileged Users": "Priviligerte brukere", + "Send %(eventType)s events": "Send %(eventType)s-hendelser", + "Select the roles required to change various parts of the room": "Velg rollene som kreves for å endre på diverse deler av rommet", + "Only people who have been invited": "Kun folk som har blitt invitert", + "Anyone who knows the room's link, apart from guests": "Alle som kjenner til rommets lenke, bortsett fra gjester", + "Anyone who knows the room's link, including guests": "Alle som kjenner til rommets lenke, inkludert gjester", + "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Endringer for hvem som kan lese historikken, vil kun bli benyttet for fremtidige meldinger i dette rommet. Synligheten til den eksisterende historikken vil forbli uendret.", + "Members only (since the point in time of selecting this option)": "Kun medlemmer (f.o.m. da denne innstillingen ble valgt)", + "Members only (since they were invited)": "Kun medlemmer (f.o.m. da de ble invitert)", + "Members only (since they joined)": "Kun medlemmer (f.o.m. de ble med)", + "Once enabled, encryption cannot be disabled.": "Dersom dette først har blitt skrudd på, kan kryptering aldri bli skrudd av.", + "Who can access this room?": "Hvem kan gå inn i dette rommet?", + "Who can read history?": "Hvem kan lese historikken?", + "Scroll to most recent messages": "Hopp bort til de nyeste meldingene", + "Share Link to User": "Del en lenke til brukeren", + "User Options": "Brukerinnstillinger", + "Filter room members": "Filtrer rommets medlemmer", + "Send a reply…": "Send et svar …", + "Send a reply (unencrypted)…": "Send et svar (ukryptert) …", + "Code block": "Kodefelt", + "Replying": "Svarer på", + "Room %(name)s": "Rom %(name)s", + "Start chatting": "Begynn å chatte", + "%(count)s unread messages.|one": "1 ulest melding.", + "Unread mentions.": "Uleste nevninger.", + "Unread messages.": "Uleste meldinger.", + "Send as message": "Send som en melding", + "You don't currently have any stickerpacks enabled": "Du har ikke skrudd på noen klistremerkepakker for øyeblikket", + "Add some now": "Legg til noen nå", + "Hide Stickers": "Skjul klistremerker", + "Show Stickers": "Vis klistremerker", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Publiserte adresser kan brukes av alle på enhver tjener til å bli med i rommet ditt. For å publisere en adresse, må den bli satt til å være en lokal adresse først.", + "No other published addresses yet, add one below": "Det er ingen publiserte adresser enda, legg til en nedenfor", + "New published address (e.g. #alias:server)": "Ny publisert adresse (f.eks. #alias:tjener)", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Velg adresser for dette rommet slik at brukere kan finne dette rommet gjennom hjemmetjeneren din (%(localDomain)s)", + "This room is not showing flair for any communities": "Dette rommet viser ikke merkeskilter for noen samfunn", + "New community ID (e.g. +foo:%(localDomain)s)": "Ny samfunns-ID (f.eks. +foo:%(localDomain)s)", + "Room Name": "Rommets navn", + "Room Topic": "Rommets tema", + "Publish this room to the public in %(domain)s's room directory?": "Vil du publisere dette rommet til offentligheten i %(domain)s sitt rom-arkiv?", + "You have enabled URL previews by default.": "Du har skrudd på URL-forhåndsvisninger som standard.", + "You have disabled URL previews by default.": "Du har skrudd av URL-forhåndsvisninger som standard.", + "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Når noen legger til en URL i meldingene deres, kan en URL-forhåndsvisning bli vist for å gi mere informasjonen om den lenken, f.eks. tittelen, beskrivelsen, og et bilde fra nettstedet.", + "Trusted": "Betrodd", + "Not trusted": "Ikke betrodd", + "Direct message": "Direktemelding", + "Verified": "Verifisert", + "Compare emoji": "Sammenlign emojier", + "Encryption enabled": "Kryptering er skrudd på", + "Encryption not enabled": "Kryptering er ikke skrudd på", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s endret rommets avatar til ", + "Message removed": "Meldingen ble fjernet", + "Something went wrong!": "Noe gikk galt!", + "Visible to everyone": "Synlig for alle", + "Checking for an update...": "Leter etter en oppdatering …", + "No update available.": "Ingen oppdateringer er tilgjengelige.", + "Downloading update...": "Laster ned oppdatering …", + "Unknown Address": "Ukjent adresse", + "Your display name": "Ditt visningsnavn", + "Your avatar URL": "Din avatars URL", + "Widget added by": "Modulen ble lagt til av", + "Create new room": "Opprett et nytt rom", + "Unverify": "Av-verifiser", + "Verify...": "Verifiser …", + "Language Dropdown": "Språk-nedfallsmeny", + "Manage Integrations": "Behandle integreringer", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s ble med %(count)s ganger", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s ble med", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s ble med %(count)s ganger", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s ble med", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s forlot rommet %(count)s ganger", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s forlot rommet", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s forlot rommet %(count)s ganger", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s forlot rommet", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s endret navnene sine", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s endret navnet sitt", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s endret avatarene sine", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s endret avataren sin", + "Custom level": "Tilpasset nivå", + "Room alias": "Rom-alias", + "Please provide a room alias": "Vennligst skriv inn et rom-alias", + "And %(count)s more...|other": "Og %(count)s til...", + "Remove server": "Fjern tjeneren", + "Matrix": "Matrix", + "Add a new server...": "Legg til en ny tjener …", + "Logs sent": "Loggbøkene ble sendt", + "GitHub issue": "Github-saksrapport", + "Send logs": "Send loggbøker", + "Create Community": "Opprett et samfunn", + "Please enter a name for the room": "Vennligst skriv inn et navn for rommet", + "Set a room alias to easily share your room with other people.": "Velg et rom-alias for å dele rommet ditt enkelt med andre.", + "This room is private, and can only be joined by invitation.": "Dette rommet er privat, og man kan kun bli med etter invitasjon", + "Create a public room": "Opprett et offentlig rom", + "Create a private room": "Opprett et privat rom", + "Topic (optional)": "Tema (valgfritt)", + "Make this room public": "Gjør dette rommet offentlig", + "Hide advanced": "Skjul avansert", + "Show advanced": "Vis avansert", + "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Blokker brukere fra andre Matrix-hjemmetjenere fra å bli med i dette rommet (Denne innstillingen kan ikke bli endret på senere!)", + "To continue, please enter your password:": "For å gå videre, vennligst skriv inn passordet ditt:", + "Event Type": "Hendelsestype", + "Developer Tools": "Utviklerverktøy", + "Recent Conversations": "Nylige samtaler", + "Start a conversation with someone using their name, username (like ) or email address.": "Start en samtale med noen ut ifra deres navn, brukernavn (slik som ), eller E-postadresse.", + "Your account is not secure": "Kontoen din er ikke sikker", + "Your password": "Passordet ditt", + "Room Settings - %(roomName)s": "Rominnstillinger - %(roomName)s", + "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)", + "Please set a password!": "Vennligst velg et passord!", + "Integration Manager": "Integreringsbehandler", + "To continue you need to accept the terms of this service.": "For å gå videre må du akseptere brukervilkårene til denne tjenesten.", + "Private Chat": "Privat chat", + "Public Chat": "Offentlig chat", + "Pin Message": "Fest fast meldingen", + "Mentions only": "Kun nevninger", + "Set a new status...": "Velg en ny status …", + "View Community": "Vis samfunnet", + "Confirm your identity by entering your account password below.": "Bekreft identiteten din ved å skrive inn kontopassordet ditt nedenfor.", + "Use an email address to recover your account": "Bruk en E-postadresse til å gjenopprette kontoen din", + "Enter email address (required on this homeserver)": "Skriv inn en E-postadresse (Påkrevd på denne hjemmetjeneren)", + "Doesn't look like a valid email address": "Det ser ikke ut som en gyldig E-postadresse", + "Password is allowed, but unsafe": "Passordet er tillatt, men er ikke trygt", + "Nice, strong password!": "Strålende, passordet er sterkt!", + "Keep going...": "Fortsett sånn …", + "Doesn't look like a valid phone number": "Det ser ikke ut som et gyldig telefonnummer", + "Use lowercase letters, numbers, dashes and underscores only": "Bruk kun småbokstaver, numre, streker og understreker", + "You must join the room to see its files": "Du må bli med i rommet for å se filene dens", + "There are no visible files in this room": "Det er ingen synlig filer i dette rommet", + "Failed to upload image": "Mislyktes i å laste opp bildet", + "Featured Users:": "Fremhevede brukere:", + "Filter rooms…": "Filtrer rom …", + "Signed Out": "Avlogget", + "%(creator)s created and configured the room.": "%(creator)s opprettet og satte opp rommet.", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Opprett et samfunn for å samle sammen brukere og rom! Lag en tilpasset hjemmeside for å markere territoriet ditt i Matrix-universet.", + "You have no visible notifications": "Du har ingen synlige varsler", + "Find a room… (e.g. %(exampleRoom)s)": "Finn et rom… (f.eks. %(exampleRoom)s)", + "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Hvis du ikke finner rommet du leter etter, be om en invitasjon eller Opprett et nytt rom.", + "Active call": "Aktiv samtale", + "Send Reset Email": "Send tilbakestillings-E-post", + "Registration Successful": "Registreringen var vellykket", + "Create your account": "Opprett kontoen din", + "Forgotten your password?": "Har du glemt passordet ditt?", + "Blacklisted": "Svartelistet", + "Export room keys": "Eksporter romnøkler", + "Import room keys": "Importer romnøkler", + "Go to Settings": "Gå til Innstillinger", + "Indexed messages:": "Indekserte meldinger:", + "Navigation": "Navigering", + "Autocomplete": "Autofullfør", + "Alt": "Alt", + "Alt Gr": "Alt Gr", + "Shift": "Shift", + "Super": "Super", + "Ctrl": "Ctrl", + "New line": "Ny linje", + "Cancel replying to a message": "Avbryt å svare på en melding", + "Page Up": "Page Up", + "Page Down": "Page Down", + "Esc": "Esc", + "Enter": "Send", + "Space": "Mellomrom", + "End": "Slutt" } From 6b11ee56613448c066aa4521a46fb087dd093eab Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 09:43:04 +0000 Subject: [PATCH 030/230] Translated using Weblate (Russian) Currently translated at 79.2% (1777 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index c79be28838..9f06f614a0 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -43,8 +43,8 @@ "For security, this session has been signed out. Please sign in again.": "Для обеспечения безопасности ваша сессия была завершена. Пожалуйста, войдите снова.", "Hangup": "Повесить трубку", "Historical": "Архив", - "Homeserver is": "Домашний сервер:", - "Identity Server is": "Сервер идентификации:", + "Homeserver is": "Домашний сервер", + "Identity Server is": "Сервер идентификации", "I have verified my email address": "Я подтвердил свой email", "Import E2E room keys": "Импорт ключей шифрования", "Invalid Email Address": "Недопустимый email", @@ -752,7 +752,7 @@ "Messages in one-to-one chats": "Сообщения в 1:1 чатах", "Unavailable": "Недоступен", "Error saving email notification preferences": "Ошибка сохранения настроек email-уведомлений", - "View Decrypted Source": "Просмотр расшифрованного источника", + "View Decrypted Source": "Расшифрованный исходный код", "Failed to update keywords": "Не удалось обновить ключевые слова", "remove %(name)s from the directory.": "удалить %(name)s из каталога.", "Notifications on the following keywords follow rules which can’t be displayed here:": "Уведомления по этим ключевым словам соответствуют правилам, которые нельзя отобразить здесь:", @@ -772,7 +772,7 @@ "Enable notifications for this account": "Включить уведомления для этой учётной записи", "Invite to this community": "Пригласить в это сообщество", "Messages containing keywords": "Сообщения, содержащие определённые ключевые слова", - "View Source": "Просмотр источника", + "View Source": "Исходный код", "Tuesday": "Вторник", "Enter keywords separated by a comma:": "Введите ключевые слова, разделённые запятой:", "Search…": "Поиск…", @@ -896,8 +896,8 @@ "The password field must not be blank.": "Поле пароля не должно быть пустым.", "Call in Progress": "Выполнение вызова", "A call is already in progress!": "Вызов выполняется!", - "Share Room Message": "Обмен сообщениями в комнате", - "Share Message": "Обмен сообщениями", + "Share Room Message": "Поделиться сообщением", + "Share Message": "Поделиться сообщением", "You can't send any messages until you review and agree to our terms and conditions.": "Вы не можете отправлять сообщения до тех пор, пока вы не примете наши правила и положения.", "Demote": "Понижение", "Demote yourself?": "Понизить самого себя?", @@ -939,7 +939,7 @@ "%(names)s and %(lastPerson)s are typing …": "%(names)s и %(lastPerson)s печатают…", "This homeserver has hit its Monthly Active User limit.": "Сервер достиг ежемесячного ограничения активных пользователей.", "This homeserver has exceeded one of its resource limits.": "Превышен один из лимитов на ресурсы сервера.", - "Unable to connect to Homeserver. Retrying...": "Невозможно соединиться с домашним сервером. Повторить", + "Unable to connect to Homeserver. Retrying...": "Невозможно соединиться с домашним сервером. Пробуем снова...", "Unrecognised address": "Нераспознанный адрес", "You do not have permission to invite people to this room.": "У вас нет разрешения приглашать людей в эту комнату.", "User %(user_id)s may or may not exist": "Пользователя %(user_id)s не существует", @@ -992,7 +992,7 @@ "The other party cancelled the verification.": "Другая сторона отменила проверку.", "Verified!": "Верифицировано!", "You've successfully verified this user.": "Вы успешно верифицировали этого пользователя.", - "Got It": "Понял", + "Got It": "Понятно", "Verify this user by confirming the following number appears on their screen.": "Верифицируйте пользователя, убедившись, что на его экране отображается следующее число.", "Yes": "Да", "No": "Нет", @@ -1192,7 +1192,7 @@ "Verify this user by confirming the following emoji appear on their screen.": "Проверьте собеседника, убедившись, что на его экране отображаются следующие символы (смайлы).", "Unable to find a supported verification method.": "Невозможно определить поддерживаемый метод верификации.", "Scissors": "Ножницы", - "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Общение с этим пользователем зашифровано сквозным шифрованием и недоступно третьим лицам.", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Защищённые сообщения с этим пользователем зашифрованы сквозным шифрованием и недоступны третьим лицам.", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Мы отправили вам сообщение для подтверждения адреса электронной почты. Пожалуйста выполните указания данные в сообщении и нажмите кнопку внизу.", "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.": "Зашифрованные сообщения защищены сквозным шифрованием. Только вы и ваш собеседник имеете ключи для их расшифровки и чтения.", @@ -1624,7 +1624,7 @@ "Remove %(count)s messages|other": "Удалить %(count)s сообщений", "Remove %(count)s messages|one": "Удалить 1 сообщение", "Deactivate user?": "Деактивировать пользователя?", - "Deactivate user": "Пользователь деактивирован", + "Deactivate user": "Деактивировать пользователя", "Remove recent messages": "Удалить последние сообщения", "Bold": "Жирный", "Italics": "Курсив", @@ -1648,7 +1648,7 @@ "Command Help": "Помощь команды", "To continue you need to accept the terms of this service.": "Для продолжения Вам необходимо принять условия данного сервиса.", "Document": "Документ", - "Report Content": "Содержание отчета", + "Report Content": "Пожаловаться на сообщение", "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Деактивация этого пользователя приведет к его выходу из системы и запрету повторного входа. Кроме того, они оставит все комнаты, в которых он участник. Это действие безповоротно. Вы уверены, что хотите деактивировать этого пользователя?", "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "При попытке подтвердить приглашение была возвращена ошибка (%(errcode)s). Вы можете попробовать передать эту информацию администратору комнаты.", "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Это приглашение в %(roomName)s было отправлено на %(email)s, которое не связано с вашей учетной записью", @@ -1765,12 +1765,12 @@ "%(senderName)s placed a video call.": "%(senderName)s сделал видео вызов.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s сделал видео вызов. (не поддерживается этим браузером)", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s удалил правило, запрещающее пользователям соответствовать %(glob)s", - "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s removed the rule banning rooms matching %(glob)s", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s удалил правило, банящее комнаты по шаблону %(glob)s", "a few seconds ago": "несколько секунд назад", "about a minute ago": "около минуты назад", "%(num)s minutes ago": "%(num)s минут назад", "about an hour ago": "около часа назад", - "%(num)s hours ago": "%(num)s часов назад ", + "%(num)s hours ago": "%(num)s часов назад", "about a day ago": "около суток назад", "%(num)s days ago": "%(num)s дней назад", "a few seconds from now": "несколько секунд назад", @@ -1789,16 +1789,16 @@ "Keep secret storage passphrase in memory for this session": "Храните в памяти секретную парольную фразу для этого сеанса", "How fast should messages be downloaded.": "Как быстро сообщения должны быть загружены.", "This is your list of users/servers you have blocked - don't leave the room!": "Это список пользователей/серверов, которые вы заблокировали - не покидайте комнату!", - "Verify this session by completing one of the following:": "Проверить эту сессию, выполнив одно из следующих действий:", + "Verify this session by completing one of the following:": "Проверьте эту сессию, выполнив одно из следующих действий:", "Scan this unique code": "Отсканируйте этот уникальный код", "or": "или", "Compare unique emoji": "Сравнитe уникальныe эмодзи", - "Compare a unique set of emoji if you don't have a camera on either device": "Сравните уникальный набор смайликов, если у вас нет камеры ни на одном из устройств.", + "Compare a unique set of emoji if you don't have a camera on either device": "Сравните уникальный набор смайликов, если у вас нет камеры ни на одном из устройств", "Start": "Начать", "Confirm the emoji below are displayed on both devices, in the same order:": "Подтвердите, что смайлики, приведенные ниже, отображаются на обоих устройствах в одном и том же порядке:", "Verify this device by confirming the following number appears on its screen.": "Проверьте это устройство, подтвердив, что на его экране появляется следующий номер.", - "Waiting for %(displayName)s to verify…": "Ждите %(displayName)s, чтобы проверить...", - "Cancelling…": "Отменяется...", + "Waiting for %(displayName)s to verify…": "Ожидание %(displayName)s для проверки…", + "Cancelling…": "Отмена…", "They match": "Они совпадают", "They don't match": "Они не совпадают", "To be secure, do this in person or use a trusted way to communicate.": "Чтобы быть в безопасности, делайте это лично или используйте надежный способ связи.", @@ -1816,5 +1816,5 @@ "Channel: %(channelName)s": "Канал: %(channelName)s", "Show less": "Показать меньше", "Show more": "Показать больше", - "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved." + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Если вы не экспортируете ключи для этой комнаты и не импортируете их в будущем, смена пароля приведёт к сбросу всех ключей сквозного шифрования и сделает невозможным чтение истории чата. В будущем это будет улучшено." } From 7adc9429b5f02577d29680871bdc4e6df719068b Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 09:57:51 +0000 Subject: [PATCH 031/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 9f06f614a0..fbb6392c49 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -486,7 +486,7 @@ "Add to summary": "Добавить в сводку", "Failed to add the following users to the summary of %(groupId)s:": "Не удалось добавить следующих пользователей в сводку %(groupId)s:", "Which rooms would you like to add to this summary?": "Какие комнаты вы хотите добавить в эту сводку?", - "Room name or alias": "Название комнаты или псевдоним", + "Room name or alias": "Название или псевдоним комнаты", "Pinned Messages": "Закреплённые сообщения", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s изменил(а) закреплённые в этой комнате сообщения.", "Failed to add the following rooms to the summary of %(groupId)s:": "Не удалось добавить следующие комнаты в сводку %(groupId)s:", @@ -1175,7 +1175,7 @@ "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' превышает разрешённый предел для текущего сервера", + "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": "Читает или устанавливает тему комнаты", @@ -1743,7 +1743,7 @@ "Never send encrypted messages to unverified sessions from this session": "Никогда не отправляйте зашифрованные сообщения в непроверенные сессий из этой сессии", "Never send encrypted messages to unverified sessions in this room from this session": "Никогда не отправляйте зашифрованные сообщения в непроверенные сессии в эту комнату из этой сессии", "Your keys are not being backed up from this session.": "Ваши ключи не резервируются с этой сессии.", - "Server or user ID to ignore": "ID сервера или пользователя для игнорирования", + "Server or user ID to ignore": "Сервер или ID пользователя для игнорирования", "Subscribed lists": "Подписанные списки", "Subscribe": "Подписать", "A session's public name is visible to people you communicate with": "Публичное имя сессии видны людям, с которыми вы общаетесь", From d565c209c811438205cb69b01bee5d8de9f6750b Mon Sep 17 00:00:00 2001 From: Alexey Murz Korepov Date: Wed, 1 Apr 2020 10:14:12 +0000 Subject: [PATCH 032/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index fbb6392c49..a8185cef55 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1487,7 +1487,7 @@ "Log in to your new account.": "Войти в вашу новую учётную запись.", "You can now close this window or log in to your new account.": "Вы можете закрыть это окно или войти в вашу новую учётную запись.", "Registration Successful": "Регистрация успешно завершена", - "Changes your avatar in all rooms": "Изменить Ваш аватар во всех комнатах", + "Changes your avatar in all rooms": "Изменяет Ваш аватар во всех комнатах", "%(senderName)s made no change.": "%(senderName)s не внёс изменений.", "Loading room preview": "Загрузка предпросмотра комнаты", "Show all": "Показать все", From 07d817e8e0f2337a7bfe4e4c944b6e820e19db5f Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 10:14:22 +0000 Subject: [PATCH 033/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index a8185cef55..9f5b6aa6bd 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1245,7 +1245,7 @@ "No homeserver URL provided": "URL-адрес домашнего сервера не указан", "Unexpected error resolving homeserver configuration": "Неожиданная ошибка в настройках домашнего сервера", "The user's homeserver does not support the version of the room.": "Домашний сервер пользователя не поддерживает версию комнаты.", - "Show read receipts sent by other users": "Показать подтверждение прочтения, отправленные другими пользователями", + "Show read receipts sent by other users": "Показать отметки о прочтении, посылаемые другими пользователями", "Show hidden events in timeline": "Показать скрытые события в хронологии", "When rooms are upgraded": "При обновлении комнат", "Upgrade to your own domain": "Обновление до собственного домена", @@ -1254,7 +1254,7 @@ "Upgrade this room to the recommended room version": "Обновите комнату до рекомендованной версии", "this room": "эта комната", "View older messages in %(roomName)s.": "Просмотр старых сообщений в %(roomName)s.", - "Change history visibility": "Изменить отображения истории", + "Change history visibility": "Изменить видимость истории", "Change topic": "Изменить тему", "Modify widgets": "Изменить виджеты", "Invite users": "Пригласить пользователей", @@ -1487,7 +1487,7 @@ "Log in to your new account.": "Войти в вашу новую учётную запись.", "You can now close this window or log in to your new account.": "Вы можете закрыть это окно или войти в вашу новую учётную запись.", "Registration Successful": "Регистрация успешно завершена", - "Changes your avatar in all rooms": "Изменяет Ваш аватар во всех комнатах", + "Changes your avatar in all rooms": "Изменяет ваш аватар во всех комнатах", "%(senderName)s made no change.": "%(senderName)s не внёс изменений.", "Loading room preview": "Загрузка предпросмотра комнаты", "Show all": "Показать все", From 322b36771fa3c650a076cffe04be5bd25b6c4359 Mon Sep 17 00:00:00 2001 From: Vladimir Hodakov Date: Wed, 1 Apr 2020 10:14:54 +0000 Subject: [PATCH 034/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 9f5b6aa6bd..f54694150b 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -116,7 +116,7 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "для %(userId)s с %(fromPowerLevel)s на %(toPowerLevel)s", "click to reveal": "нажмите для открытия", "%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.", - "%(targetName)s joined the room.": "%(targetName)s вошел(-ла) в комнату.", + "%(targetName)s joined the room.": "К комнате присоединяется %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s выгнал(а) %(targetName)s.", "%(targetName)s left the room.": "%(targetName)s покинул комнату.", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников с момента их приглашения.", From 6f82149824057c8a6033664f99deb10226ff397e Mon Sep 17 00:00:00 2001 From: progserega Date: Wed, 1 Apr 2020 10:17:35 +0000 Subject: [PATCH 035/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index f54694150b..ae2bc23e53 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1261,7 +1261,7 @@ "Kick users": "Выгнать пользователей", "Ban users": "Запрет пользователей", "Send %(eventType)s events": "Отправить %(eventType)s события", - "Select the roles required to change various parts of the room": "Выбор ролей, необходимых для изменения различных частей комнат", + "Select the roles required to change various parts of the room": "Выберите роли, которые смогут изменять различные части комнаты", "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.": "Включенное шифрование комнаты не может быть отключено. Сообщения, отправленные в зашифрованном помещении, не могут быть просмотрены сервером, только участниками комнаты. Включение шифрования может помешать нормальной работе многих ботов и мостов. Узнайте больше о шифровании.", "To link to this room, please add an alias.": "Чтобы связаться с этой комнатой, пожалуйста, добавьте псевдоним.", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Изменения в том, кто может читать историю, будут применяться только к будущим сообщениям в этой комнате. Существующие истории останутся без изменений.", From f47f7a3ac1f9dd63da50be6ee4a981075920cb03 Mon Sep 17 00:00:00 2001 From: progserega Date: Wed, 1 Apr 2020 10:18:08 +0000 Subject: [PATCH 036/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index ae2bc23e53..899af017c2 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1262,7 +1262,7 @@ "Ban users": "Запрет пользователей", "Send %(eventType)s events": "Отправить %(eventType)s события", "Select the roles required to change various parts of the room": "Выберите роли, которые смогут изменять различные части комнаты", - "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.": "Включенное шифрование комнаты не может быть отключено. Сообщения, отправленные в зашифрованном помещении, не могут быть просмотрены сервером, только участниками комнаты. Включение шифрования может помешать нормальной работе многих ботов и мостов. Узнайте больше о шифровании.", + "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.": "После включения шифрования в комнате - оно не может быть отключено. Сообщения, отправленные в шифрованной комнате, смогут прочитать только участники комнаты, но не сервер. Включенное шифрование может помешать корректной работе многим ботам или мостам. Узнать больше о шифровании.\n", "To link to this room, please add an alias.": "Чтобы связаться с этой комнатой, пожалуйста, добавьте псевдоним.", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Изменения в том, кто может читать историю, будут применяться только к будущим сообщениям в этой комнате. Существующие истории останутся без изменений.", "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s включено для %(groups)s в этой комнате.", From e5bfa8a85b08dce55be5333edcd8dbf565e42041 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 10:18:51 +0000 Subject: [PATCH 037/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 899af017c2..5dd450a5c7 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1262,8 +1262,8 @@ "Ban users": "Запрет пользователей", "Send %(eventType)s events": "Отправить %(eventType)s события", "Select the roles required to change various parts of the room": "Выберите роли, которые смогут изменять различные части комнаты", - "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.": "После включения шифрования в комнате - оно не может быть отключено. Сообщения, отправленные в шифрованной комнате, смогут прочитать только участники комнаты, но не сервер. Включенное шифрование может помешать корректной работе многим ботам или мостам. Узнать больше о шифровании.\n", - "To link to this room, please add an alias.": "Чтобы связаться с этой комнатой, пожалуйста, добавьте псевдоним.", + "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.": "После включения шифрования в комнате оно не может быть отключено. Сообщения, отправленные в шифрованной комнате, смогут прочитать только участники комнаты, но не сервер. Включенное шифрование может помешать корректной работе многим ботам и мостам. Подробнее о шифровании.", + "To link to this room, please add an alias.": "Для ссылки на эту комнату, пожалуйста, добавьте псевдоним.", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Изменения в том, кто может читать историю, будут применяться только к будущим сообщениям в этой комнате. Существующие истории останутся без изменений.", "%(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 в этой комнате.", @@ -1295,7 +1295,7 @@ "Try again later, or ask a room admin to check if you have access.": "Повторите попытку позже или попросите администратора комнаты проверить, есть ли у вас доступ.", "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s был возвращен при попытке доступа в комнату. Если вы считаете, что видите это сообщение по ошибке, пожалуйста, отправьте отчет об ошибке .", "Never lose encrypted messages": "Никогда не теряйте зашифрованные сообщения", - "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Сообщения в этой комнате защищены сквозным шифрованием. Только вы и получатель(и) имеют ключи для чтения этих сообщений.", + "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Сообщения в этой комнате защищены сквозным шифрованием. Только у вас и получателя(ей) есть ключи для чтения этих сообщений.", "Securely back up your keys to avoid losing them. Learn more.": "Надежно сохраните резервную копию ключей, чтобы не потерять их. Подробнее", "Don't ask me again": "Не спрашивай меня больше", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Обновление этой комнаты отключит текущий экземпляр комнаты и создаст обновлённую комнату с тем же именем.", From 4d2efe213869add20ff9c178a25f77423054e40a Mon Sep 17 00:00:00 2001 From: i47320673 Date: Wed, 1 Apr 2020 10:21:34 +0000 Subject: [PATCH 038/230] Translated using Weblate (Russian) Currently translated at 79.3% (1779 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 5dd450a5c7..edc8397a8f 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1297,7 +1297,7 @@ "Never lose encrypted messages": "Никогда не теряйте зашифрованные сообщения", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Сообщения в этой комнате защищены сквозным шифрованием. Только у вас и получателя(ей) есть ключи для чтения этих сообщений.", "Securely back up your keys to avoid losing them. Learn more.": "Надежно сохраните резервную копию ключей, чтобы не потерять их. Подробнее", - "Don't ask me again": "Не спрашивай меня больше", + "Don't ask me again": "Больше не спрашивать", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Обновление этой комнаты отключит текущий экземпляр комнаты и создаст обновлённую комнату с тем же именем.", "This room has already been upgraded.": "Эта комната уже была обновлена.", "This room is running room version , which this homeserver has marked as unstable.": "Эта комната работает под управлением версии комнаты , которую этот сервер пометил как unstable.", From 7792cb8b9bc1d168a46717784984510c0a8ee98e Mon Sep 17 00:00:00 2001 From: Imre Kristoffer Eilertsen Date: Wed, 1 Apr 2020 10:15:10 +0000 Subject: [PATCH 039/230] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 47.3% (1062 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 433c650de6..e18dafdc5d 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1066,5 +1066,8 @@ "Esc": "Esc", "Enter": "Send", "Space": "Mellomrom", - "End": "Slutt" + "End": "Slutt", + "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Hvis du støter på noen programfeil eller har tilbakemeldinger som du vil dele, vennligst fortell oss om det på GitHub.", + "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "For å unngå å lage duplikatrapporter, vennligst sjekk gjennom de eksisterende sakene først (og gi en tommel opp), eller opprett en ny saksrapport dersom du ikke finner noen tilsvarende saker.", + "Report bugs & give feedback": "Meld ifra om feil og gi tilbakemeldinger" } From 91365a1e1a2792e7ee312aba0d4c9b005bda0e54 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 10:23:08 +0000 Subject: [PATCH 040/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 57 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index edc8397a8f..4c0f5ed19b 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1764,8 +1764,8 @@ "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s сделал голосовой вызов. (не поддерживается этим браузером)", "%(senderName)s placed a video call.": "%(senderName)s сделал видео вызов.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s сделал видео вызов. (не поддерживается этим браузером)", - "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s удалил правило, запрещающее пользователям соответствовать %(glob)s", - "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s удалил правило, банящее комнаты по шаблону %(glob)s", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s удалил(а) правило блокировки пользователей по шаблону %(glob)s", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s удалил правило блокировки комнат по шаблону %(glob)s", "a few seconds ago": "несколько секунд назад", "about a minute ago": "около минуты назад", "%(num)s minutes ago": "%(num)s минут назад", @@ -1816,5 +1816,56 @@ "Channel: %(channelName)s": "Канал: %(channelName)s", "Show less": "Показать меньше", "Show more": "Показать больше", - "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Если вы не экспортируете ключи для этой комнаты и не импортируете их в будущем, смена пароля приведёт к сбросу всех ключей сквозного шифрования и сделает невозможным чтение истории чата. В будущем это будет улучшено." + "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.": "Если вы не экспортируете ключи для этой комнаты и не импортируете их в будущем, смена пароля приведёт к сбросу всех ключей сквозного шифрования и сделает невозможным чтение истории чата. В будущем это будет улучшено.", + "Whether you're using Riot on a device where touch is the primary input mechanism": "Используете ли вы Riot на устройстве с тач-дисплеем в качестве основного способа ввода", + "Whether you're using Riot as an installed Progressive Web App": "Используете ли вы Riot в виде установленного прогрессивного веб-приложения", + "Your user agent": "Ваш юзер-агент", + "The information being sent to us to help make Riot better includes:": "Информация, которая отправляется нам для улучшения Riot, включает в себя:", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "В комнате присутствуют неизвестные сессии: если вы продолжите без подтверждения, возможно, кто-то сможет подслушать ваш звонок.", + "Review Sessions": "Просмотреть сессии", + "Unverified login. Was this you?": "Неподтверждённый вход. Это были вы?", + "Sign In or Create Account": "Войти или создать аккаунт", + "Use your account or create a new one to continue.": "Воспользуйтесь своим аккаунтом или создайте новый, чтобы продолжить.", + "Create Account": "Создать аккаунт", + "Sends a message as html, without interpreting it as markdown": "Отправить сообщение как html, не интерпретируя его как markdown", + "Displays information about a user": "Показать информацию о пользователе", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s изменил(а) название комнаты с %(oldRoomName)s на %(newRoomName)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 removed the rule banning servers matching %(glob)s": "%(senderName)s удалил(а) правило блокировки серверов по шаблону %(glob)s", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s удалил(а) правило блокировки по шаблону %(glob)s", + "%(senderName)s updated an invalid ban rule": "%(senderName)s обновил(а) неверное правило блокировки", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s обновил(а) правило блокировки пользователей по шаблону %(glob)s за %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s обновил(а) правило блокировки комнат по шаблону %(glob)s за %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s обновил(а) правило блокировки серверов по шаблону %(glob)s за %(reason)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s обновил(а) правило блокировки по шаблону %(glob)s за %(reason)s", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s создал(а) правило блокировки пользователей по шаблону %(glob)s за %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s создал(а) правило блокировки комнат по шаблону %(glob)s за %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s создал(а) правило блокировки серверов по шаблону %(glob)s за %(reason)s", + "%(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", + "Not Trusted": "Недоверенное", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) начал(а) новую сессию без её подтверждения:", + "Ask this user to verify their session, or manually verify it below.": "Попросите этого пользователя подтвердить сессию или подтвердите её вручную ниже.", + "Manually Verify by Text": "Ручная проверка с помощью текста", + "Interactively verify by Emoji": "Интерактивная проверка со смайлами", + "Done": "Готово", + "The message you are trying to send is too large.": "Ваше сообщение слишком большое.", + "Support adding custom themes": "Поддержка сторонних тем", + "Order rooms by name": "Сортировать комнаты по названию", + "Show rooms with unread notifications first": "Показывать в начале комнаты с непрочитанными уведомлениями", + "Show shortcuts to recently viewed rooms above the room list": "Показывать ссылки на недавние комнаты над списком комнат", + "Manually verify all remote sessions": "Подтверждать все удалённые сессии вручную", + "Update your secure storage": "Обновите ваше безопасное хранилище", + "Your homeserver does not support cross-signing.": "Ваш домашний сервер не поддерживает кросс-подпись.", + "Cross-signing and secret storage are enabled.": "Кросс-подпись и хранилище секретов разрешены.", + "Customise your experience with experimental labs features. Learn more.": "Попробуйте экспериментальные возможности. Подробнее." } From 666f4201dab7cf5c43ebca993f8d00888d6b7200 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 13:35:51 +0000 Subject: [PATCH 041/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 4c0f5ed19b..29d1f71809 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -861,7 +861,7 @@ "We encountered an error trying to restore your previous session.": "Произошла ошибка при попытке восстановить предыдущий сеанс.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Очистка хранилища вашего браузера может устранить проблему, но при этом ваша сессия будет завершена и зашифрованная история чата станет нечитаемой.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не удается загрузить событие, на которое был дан ответ. Либо оно не существует, либо у вас нет разрешения на его просмотр.", - "Enable widget screenshots on supported widgets": "Включить скриншоты виджета в поддерживаемых виджетах", + "Enable widget screenshots on supported widgets": "Включить скриншоты виджетов для поддерживаемых виджетов", "Collapse Reply Thread": "Ответить с цитированием", "Send analytics data": "Отправить данные аналитики", "Muted Users": "Приглушённые пользователи", @@ -1245,7 +1245,7 @@ "No homeserver URL provided": "URL-адрес домашнего сервера не указан", "Unexpected error resolving homeserver configuration": "Неожиданная ошибка в настройках домашнего сервера", "The user's homeserver does not support the version of the room.": "Домашний сервер пользователя не поддерживает версию комнаты.", - "Show read receipts sent by other users": "Показать отметки о прочтении, посылаемые другими пользователями", + "Show read receipts sent by other users": "Показывать отметки о прочтении, посылаемые другими пользователями", "Show hidden events in timeline": "Показать скрытые события в хронологии", "When rooms are upgraded": "При обновлении комнат", "Upgrade to your own domain": "Обновление до собственного домена", @@ -1261,7 +1261,7 @@ "Kick users": "Выгнать пользователей", "Ban users": "Запрет пользователей", "Send %(eventType)s events": "Отправить %(eventType)s события", - "Select the roles required to change various parts of the room": "Выберите роли, которые смогут изменять различные части комнаты", + "Select the roles required to change various parts of the room": "Выберите роли, которые смогут менять различные параметры комнаты", "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.": "После включения шифрования в комнате оно не может быть отключено. Сообщения, отправленные в шифрованной комнате, смогут прочитать только участники комнаты, но не сервер. Включенное шифрование может помешать корректной работе многим ботам и мостам. Подробнее о шифровании.", "To link to this room, please add an alias.": "Для ссылки на эту комнату, пожалуйста, добавьте псевдоним.", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Изменения в том, кто может читать историю, будут применяться только к будущим сообщениям в этой комнате. Существующие истории останутся без изменений.", @@ -1269,7 +1269,7 @@ "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s выключено для %(groups)s в этой комнате.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s включено для %(newGroups)s и отключено для %(oldGroups)s в этой комнате.", "Once enabled, encryption cannot be disabled.": "После включения, шифрование не может быть отключено.", - "This room has been replaced and is no longer active.": "Эта комната была заменена и больше не активна.", + "This room has been replaced and is no longer active.": "Эта комната была замещена и больше не активна.", "Joining room …": "Вступление в комнату …", "Loading …": "Загрузка…", "Rejecting invite …": "Отказ от приглашения …", @@ -1296,7 +1296,7 @@ "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s был возвращен при попытке доступа в комнату. Если вы считаете, что видите это сообщение по ошибке, пожалуйста, отправьте отчет об ошибке .", "Never lose encrypted messages": "Никогда не теряйте зашифрованные сообщения", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Сообщения в этой комнате защищены сквозным шифрованием. Только у вас и получателя(ей) есть ключи для чтения этих сообщений.", - "Securely back up your keys to avoid losing them. Learn more.": "Надежно сохраните резервную копию ключей, чтобы не потерять их. Подробнее", + "Securely back up your keys to avoid losing them. Learn more.": "Надежно сохраните резервную копию ваших ключей, чтобы избежать их потери. Подробнее", "Don't ask me again": "Больше не спрашивать", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Обновление этой комнаты отключит текущий экземпляр комнаты и создаст обновлённую комнату с тем же именем.", "This room has already been upgraded.": "Эта комната уже была обновлена.", @@ -1322,7 +1322,7 @@ "Rotate clockwise": "Повернуть по часовой стрелке", "Edit message": "Редактировать сообщение", "Power level": "Уровень прав", - "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Не удалось найти профили для Matrix ID, перечисленных ниже. Вы всё равно хотите их пригласить?", + "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Не удалось найти профили для перечисленных ниже Matrix ID. Вы всё равно хотите их пригласить?", "Invite anyway": "Пригласить в любом случае", "GitHub issue": "GitHub вопрос", "Notes": "Заметка", @@ -1569,7 +1569,7 @@ "Create a private room": "Создать приватную комнату", "Topic (optional)": "Тема (опционально)", "Make this room public": "Сделать комнату публичной", - "Send read receipts for messages (requires compatible homeserver to disable)": "Отправлять подтверждения о прочтении сообщений (требуется отключение совместимого домашнего сервера)", + "Send read receipts for messages (requires compatible homeserver to disable)": "Отправлять подтверждения о прочтении сообщений (требуется совместимый домашний сервер для отключения)", "Show previews/thumbnails for images": "Показать превью / миниатюры для изображений", "Disconnect from the identity server and connect to instead?": "Отключиться от сервера идентификации и вместо этого подключиться к ?", "Disconnect identity server": "Отключить идентификационный сервер", From e1bc7493a7d61fd2955f50c9f64349ae4c6c35cf Mon Sep 17 00:00:00 2001 From: Valex Date: Wed, 1 Apr 2020 13:42:49 +0000 Subject: [PATCH 042/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 29d1f71809..5d6383be2c 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1323,7 +1323,7 @@ "Edit message": "Редактировать сообщение", "Power level": "Уровень прав", "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Не удалось найти профили для перечисленных ниже Matrix ID. Вы всё равно хотите их пригласить?", - "Invite anyway": "Пригласить в любом случае", + "Invite anyway": "Все равно пригласить", "GitHub issue": "GitHub вопрос", "Notes": "Заметка", "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Если есть дополнительный контекст, который может помочь в анализе проблемы, такой как то, что вы делали в то время, ID комнат, ID пользователей и т. д., пожалуйста, включите эти данные.", From 6ced71443cc4437fc89b81c2ee90d80cc550bb9d Mon Sep 17 00:00:00 2001 From: call_xz Date: Wed, 1 Apr 2020 13:14:51 +0000 Subject: [PATCH 043/230] Translated using Weblate (Japanese) Currently translated at 54.6% (1225 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 46 +++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index bbc698b3ff..ea4bd0e2db 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -309,25 +309,25 @@ "Displays action": "アクションを表示", "Forces the current outbound group session in an encrypted room to be discarded": "暗号化されたルーム内の現在のアウトバウンドグループセッションを強制的に破棄します", "Reason": "理由", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s は %(displayName)s の招待を受け入れました。", - "%(targetName)s accepted an invitation.": "%(targetName)s は招待を受け入れました。", - "%(senderName)s requested a VoIP conference.": "%(senderName)s はVoIP会議を要求しました。", - "%(senderName)s invited %(targetName)s.": "%(senderName)s は %(targetName)s を招待しました。", - "%(senderName)s banned %(targetName)s.": "%(senderName)s は %(targetName)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 changed their profile picture.": "%(senderName)s はプロフィール画像を変更しました。", - "%(senderName)s set a profile picture.": "%(senderName)s はプロフィール画像を設定しました。", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s が %(displayName)s の招待を受け入れました。", + "%(targetName)s accepted an invitation.": "%(targetName)s が招待を受け入れました。", + "%(senderName)s requested a VoIP conference.": "%(senderName)s がVoIP会議を要求しました。", + "%(senderName)s invited %(targetName)s.": "%(senderName)s が %(targetName)s を招待しました。", + "%(senderName)s banned %(targetName)s.": "%(senderName)s が %(targetName)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 changed their profile picture.": "%(senderName)s がプロフィール画像を変更しました。", + "%(senderName)s set a profile picture.": "%(senderName)s がプロフィール画像を設定しました。", "VoIP conference started.": "VoIP会議が開始されました。", "VoIP conference finished.": "VoIP会議が終了しました。", - "%(targetName)s rejected the invitation.": "%(targetName)s は招待を拒否しました。", - "%(targetName)s left the room.": "%(targetName)s は部屋を退出しました。", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s は %(targetName)s をブロック解除しました。", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s は %(targetName)s を追放しました。", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s は %(targetName)s の招待を撤回しました。", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s はトピックを \"%(topic)s\" に変更しました。", + "%(targetName)s rejected the invitation.": "%(targetName)s が招待を拒否しました。", + "%(targetName)s left the room.": "%(targetName)s が部屋を退出しました。", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s が %(targetName)s のブロックを解除しました。", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s が %(targetName)s を追放しました。", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s が %(targetName)s の招待を撤回しました。", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s がトピックを \"%(topic)s\" に変更しました。", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s は部屋名を削除しました。", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s は部屋名を %(roomName)s に変更しました。", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s はイメージを送信しました。", @@ -544,7 +544,7 @@ "You have disabled URL previews by default.": "デフォルトでURLプレビューが無効です。", "URL previews are enabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが有効です。", "URL previews are disabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが無効です。", - "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "このような暗号化された部屋では、URLプレビューはデフォルトで無効になっており、あなたのホームサーバー(プレビューが生成された場所)がこの部屋に表示されているリンクに関する情報を収集できないようにしています。", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "このような暗号化された部屋では、URLプレビューはデフォルトで無効になっており、あなたのホームサーバー(プレビューを作成する場所)がこの部屋に表示されているリンクに関する情報を収集できないようにしています。", "URL Previews": "URLプレビュー", "Historical": "履歴のある", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "メッセージにURLを入力すると、URLプレビューが表示され、タイトル、説明、ウェブサイトからの画像など、そのリンクに関する詳細情報が表示されます。", @@ -1245,5 +1245,13 @@ "Italics": "イタリック体", "React": "リアクション", "Quick Reactions": "一般的なリアクション", - "Share Permalink": "パーマリンクを共有" + "Share Permalink": "パーマリンクを共有", + "Keyboard Shortcuts": "キーボードショートカット", + "Local address": "ローカルアドレス", + "Calls": "通話", + "Alt": "Alt", + "Shift": "Shift", + "Ctrl": "Ctrl", + "Toggle microphone mute": "マイクのミュート切り替え", + "Toggle video on/off": "ビデオのオンオフ切り替え" } From 53987b093e0fd333fcb8a1fafcd0fc9236d79775 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 13:42:54 +0000 Subject: [PATCH 044/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 5d6383be2c..5fb147aa35 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1323,7 +1323,7 @@ "Edit message": "Редактировать сообщение", "Power level": "Уровень прав", "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Не удалось найти профили для перечисленных ниже Matrix ID. Вы всё равно хотите их пригласить?", - "Invite anyway": "Все равно пригласить", + "Invite anyway": "Всё равно пригласить", "GitHub issue": "GitHub вопрос", "Notes": "Заметка", "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Если есть дополнительный контекст, который может помочь в анализе проблемы, такой как то, что вы делали в то время, ID комнат, ID пользователей и т. д., пожалуйста, включите эти данные.", From 46aa0229421783d9a1a169006e012117908ec093 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 13:44:32 +0000 Subject: [PATCH 045/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 5fb147aa35..d1393b0d48 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1328,7 +1328,7 @@ "Notes": "Заметка", "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Если есть дополнительный контекст, который может помочь в анализе проблемы, такой как то, что вы делали в то время, ID комнат, ID пользователей и т. д., пожалуйста, включите эти данные.", "Unable to load commit detail: %(msg)s": "Невозможно загрузить детали: %(msg)s", - "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Чтобы не потерять историю чата, вы должны экспортировать ключи от комнаты перед выходом из системы. Вам нужно будет вернуться к более новой версии Riot, чтобы сделать это", + "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 Riot to do this": "Чтобы не потерять историю чата, вы должны экспортировать ключи от комнаты перед выходом из системы. Для этого вам нужно будет вернуться к более новой версии Riot", "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Ранее вы использовали более новую версию Riot на %(host)s. Чтобы снова использовать эту версию с сквозным шифрованием, вам нужно выйти и снова войти. ", "Waiting for partner to accept...": "В ожидании партнера, чтобы принять ...", "Nothing appearing? Not all clients support interactive verification yet. .": "Ничего не появляется? Еще не все клиенты поддерживают интерактивную верификацию. .", From 436126362f260bd4ccac24f1d6e7cfd1d93e4108 Mon Sep 17 00:00:00 2001 From: i47320673 Date: Wed, 1 Apr 2020 13:45:28 +0000 Subject: [PATCH 046/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index d1393b0d48..26a5e5bf8a 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1330,7 +1330,7 @@ "Unable to load commit detail: %(msg)s": "Невозможно загрузить детали: %(msg)s", "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Чтобы не потерять историю чата, вы должны экспортировать ключи от комнаты перед выходом из системы. Для этого вам нужно будет вернуться к более новой версии Riot", "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Ранее вы использовали более новую версию Riot на %(host)s. Чтобы снова использовать эту версию с сквозным шифрованием, вам нужно выйти и снова войти. ", - "Waiting for partner to accept...": "В ожидании партнера, чтобы принять ...", + "Waiting for partner to accept...": "Ожидание подтверждения партнера", "Nothing appearing? Not all clients support interactive verification yet. .": "Ничего не появляется? Еще не все клиенты поддерживают интерактивную верификацию. .", "Waiting for %(userId)s to confirm...": "Ожидание %(userId)s для подтверждения ...", "Use two-way text verification": "Использовать двустороннюю проверку текста", From 1f35343d90e04c68f8400bbc73a7321989534493 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 13:45:35 +0000 Subject: [PATCH 047/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 26a5e5bf8a..cfe712f47f 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1330,8 +1330,8 @@ "Unable to load commit detail: %(msg)s": "Невозможно загрузить детали: %(msg)s", "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Чтобы не потерять историю чата, вы должны экспортировать ключи от комнаты перед выходом из системы. Для этого вам нужно будет вернуться к более новой версии Riot", "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Ранее вы использовали более новую версию Riot на %(host)s. Чтобы снова использовать эту версию с сквозным шифрованием, вам нужно выйти и снова войти. ", - "Waiting for partner to accept...": "Ожидание подтверждения партнера", - "Nothing appearing? Not all clients support interactive verification yet. .": "Ничего не появляется? Еще не все клиенты поддерживают интерактивную верификацию. .", + "Waiting for partner to accept...": "Ожидание подтверждения партнера...", + "Nothing appearing? Not all clients support interactive verification yet. .": "Ничего не появляется? Еще не все клиенты поддерживают интерактивную проверку. .", "Waiting for %(userId)s to confirm...": "Ожидание %(userId)s для подтверждения ...", "Use two-way text verification": "Использовать двустороннюю проверку текста", "View Servers in Room": "Просмотр серверов в комнате", From 814adb8d5d4974a27fbc66896807debf2c906288 Mon Sep 17 00:00:00 2001 From: i47320673 Date: Wed, 1 Apr 2020 13:46:01 +0000 Subject: [PATCH 048/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index cfe712f47f..65a036d992 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1332,7 +1332,7 @@ "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Ранее вы использовали более новую версию Riot на %(host)s. Чтобы снова использовать эту версию с сквозным шифрованием, вам нужно выйти и снова войти. ", "Waiting for partner to accept...": "Ожидание подтверждения партнера...", "Nothing appearing? Not all clients support interactive verification yet. .": "Ничего не появляется? Еще не все клиенты поддерживают интерактивную проверку. .", - "Waiting for %(userId)s to confirm...": "Ожидание %(userId)s для подтверждения ...", + "Waiting for %(userId)s to confirm...": "Ожидание подтверждения от %(userId)s ...", "Use two-way text verification": "Использовать двустороннюю проверку текста", "View Servers in Room": "Просмотр серверов в комнате", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Проверьте этого пользователя, чтобы отметить его как доверенного. Доверенные пользователи дают вам дополнительное спокойствие при использовании сквозного шифрования сообщений.", From b9d07738b49ec97b5d0a246d61262c03a850554e Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 13:46:15 +0000 Subject: [PATCH 049/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 65a036d992..b0e7336be8 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1332,10 +1332,10 @@ "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Ранее вы использовали более новую версию Riot на %(host)s. Чтобы снова использовать эту версию с сквозным шифрованием, вам нужно выйти и снова войти. ", "Waiting for partner to accept...": "Ожидание подтверждения партнера...", "Nothing appearing? Not all clients support interactive verification yet. .": "Ничего не появляется? Еще не все клиенты поддерживают интерактивную проверку. .", - "Waiting for %(userId)s to confirm...": "Ожидание подтверждения от %(userId)s ...", + "Waiting for %(userId)s to confirm...": "Ожидание подтверждения от %(userId)s...", "Use two-way text verification": "Использовать двустороннюю проверку текста", "View Servers in Room": "Просмотр серверов в комнате", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Проверьте этого пользователя, чтобы отметить его как доверенного. Доверенные пользователи дают вам дополнительное спокойствие при использовании сквозного шифрования сообщений.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Проверьте этого пользователя, чтобы отметить его как доверенного. Доверенные пользователи дают вам больше уверенности при использовании шифрованных сообщений.", "Waiting for partner to confirm...": "В ожидании партнера, чтобы подтвердить ...", "You've previously used Riot on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, Riot needs to resync your account.": "Ранее вы использовали Riot на %(host)s с отложенной загрузкой участников. В этой версии отложенная загрузка отключена. Поскольку локальный кеш не совместим между этими двумя настройками, Riot необходимо повторно синхронизировать вашу учётную запись.", "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Если другая версия Riot все еще открыта на другой вкладке, закройте ее, так как использование Riot на том же хосте с включенной и отключенной ленивой загрузкой одновременно вызовет проблемы.", From 3e09c8b32f5ac6205c5204ea68a88b09d223d57f Mon Sep 17 00:00:00 2001 From: i47320673 Date: Wed, 1 Apr 2020 13:49:51 +0000 Subject: [PATCH 050/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index b0e7336be8..6418949432 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1336,7 +1336,7 @@ "Use two-way text verification": "Использовать двустороннюю проверку текста", "View Servers in Room": "Просмотр серверов в комнате", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Проверьте этого пользователя, чтобы отметить его как доверенного. Доверенные пользователи дают вам больше уверенности при использовании шифрованных сообщений.", - "Waiting for partner to confirm...": "В ожидании партнера, чтобы подтвердить ...", + "Waiting for partner to confirm...": "Ожидание подтверждения партнера...", "You've previously used Riot on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, Riot needs to resync your account.": "Ранее вы использовали Riot на %(host)s с отложенной загрузкой участников. В этой версии отложенная загрузка отключена. Поскольку локальный кеш не совместим между этими двумя настройками, Riot необходимо повторно синхронизировать вашу учётную запись.", "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Если другая версия Riot все еще открыта на другой вкладке, закройте ее, так как использование Riot на том же хосте с включенной и отключенной ленивой загрузкой одновременно вызовет проблемы.", "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot теперь использует в 3-5 раз меньше памяти, загружая информацию только о других пользователях, когда это необходимо. Пожалуйста, подождите, пока мы ресинхронизируемся с сервером!", From 66bf5b6fc4992d74d202b9eb3ab1b64d987c0136 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 13:50:51 +0000 Subject: [PATCH 051/230] Translated using Weblate (Russian) Currently translated at 81.6% (1830 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 6418949432..eb18a346b4 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -195,7 +195,7 @@ "Ban": "Заблокировать", "Change Password": "Сменить пароль", "Command error": "Ошибка команды", - "Confirm password": "Подтвердите новый пароль", + "Confirm password": "Подтвердите пароль", "Current password": "Текущий пароль", "Email": "Электронная почта", "Failed to kick": "Не удалось выгнать", @@ -1339,11 +1339,11 @@ "Waiting for partner to confirm...": "Ожидание подтверждения партнера...", "You've previously used Riot on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, Riot needs to resync your account.": "Ранее вы использовали Riot на %(host)s с отложенной загрузкой участников. В этой версии отложенная загрузка отключена. Поскольку локальный кеш не совместим между этими двумя настройками, Riot необходимо повторно синхронизировать вашу учётную запись.", "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Если другая версия Riot все еще открыта на другой вкладке, закройте ее, так как использование Riot на том же хосте с включенной и отключенной ленивой загрузкой одновременно вызовет проблемы.", - "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot теперь использует в 3-5 раз меньше памяти, загружая информацию только о других пользователях, когда это необходимо. Пожалуйста, подождите, пока мы ресинхронизируемся с сервером!", - "I don't want my encrypted messages": "Продолжить выход, мне не нужны мои зашифрованные сообщения", - "Manually export keys": "Ручной экспорт ключей", - "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Если вы столкнулись с какими-либо ошибками или хотите оставить отзыв, которым хотите поделиться, сообщите нам об этом на GitHub.", - "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Чтобы избежать повторяющихся проблем, сначала просмотрите существующие проблемы (и добавьте +1), либо создайте новую проблему , если вы не можете ее найти.", + "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot теперь использует в 3-5 раз меньше памяти, загружая информацию о других пользователях только когда это необходимо. Пожалуйста, подождите, пока мы ресинхронизируемся с сервером!", + "I don't want my encrypted messages": "Мне не нужны мои зашифрованные сообщения", + "Manually export keys": "Экспортировать ключи вручную", + "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Если вы заметили ошибку или хотите оставить отзыв, пожалуйста, сообщите нам на GitHub.", + "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Чтобы избежать повторяющихся проблем, сначала просмотрите существующие задачи (и добавьте +1), либо создайте новую задачу, если вы не можете ее найти.", "Sign out and remove encryption keys?": "Выйти и удалить ключи шифрования?", "Low bandwidth mode": "Режим низкой пропускной способности", "To help us prevent this in future, please send us logs.": "Чтобы помочь нам предотвратить это в будущем, пожалуйста, отправьте нам логи.", From 2ae83526dc949cb1e1cca05770aaa03fce5b4e5c Mon Sep 17 00:00:00 2001 From: call_xz Date: Wed, 1 Apr 2020 13:45:09 +0000 Subject: [PATCH 052/230] Translated using Weblate (Japanese) Currently translated at 54.8% (1229 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index ea4bd0e2db..23eaaf9f0f 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -328,8 +328,8 @@ "%(senderName)s kicked %(targetName)s.": "%(senderName)s が %(targetName)s を追放しました。", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s が %(targetName)s の招待を撤回しました。", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s がトピックを \"%(topic)s\" に変更しました。", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)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 room name to %(roomName)s.": "%(senderDisplayName)s が部屋名を %(roomName)s に変更しました。", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s はイメージを送信しました。", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加しました。", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加しました。", @@ -1015,15 +1015,15 @@ "Sends the given emote coloured as a rainbow": "与えられたエモートを虹色で送信する", "Displays list of commands with usages and descriptions": "使い方と説明付きのコマンド一覧を表示する", "%(senderName)s made no change.": "%(senderName)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 has allowed guests to join the room.": "%(senderDisplayName)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 has allowed guests to join the room.": "%(senderDisplayName)s がこの部屋へのゲストによる参加を許可しました。", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "「パンくずリスト」機能(部屋リストの上のアバター)を使っているかどうか", "Only continue if you trust the owner of the server.": "そのサーバーの所有者を信頼する場合のみ続ける。", "Trust": "信頼", "Use an identity server to invite by email. Manage in Settings.": "メールによる招待のためにIDサーバーを用いる。設定画面で管理する。", - "%(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 prevented guests from joining the room.": "%(senderDisplayName)s はゲストの部屋への参加を差し止めています。", "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s はゲストのアクセスを %(rule)s に変更しました", "%(displayName)s is typing …": "%(displayName)s が入力中 …", @@ -1253,5 +1253,9 @@ "Shift": "Shift", "Ctrl": "Ctrl", "Toggle microphone mute": "マイクのミュート切り替え", - "Toggle video on/off": "ビデオのオンオフ切り替え" + "Toggle video on/off": "ビデオのオンオフ切り替え", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s が部屋名を %(oldRoomName)s から %(newRoomName)s に変更しました。", + "Unknown Command": "不明なコマンド", + "Unrecognised command: %(commandText)s": "認識されていないコマンド: %(commandText)s", + "Send as message": "メッセージとして送信" } From 430a9ef9484caaff26fc4f20ccf8d7e1f0b0e023 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 1 Apr 2020 15:09:19 +0100 Subject: [PATCH 053/230] tweak e2e icon margins Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/right_panel/_UserInfo.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index d2753f5825..1d1374cf1f 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -153,7 +153,8 @@ limitations under the License. } .mx_E2EIcon { - margin: 4px 4px 4px 0; // no left-margin to improve visual centering + margin-top: 3px; // visual vertical centering to the top line of text + margin-right: 4px; // margin from displyname min-width: 18px; // convince flexbox to not collapse it } } From d520af255eee4342219ab6297ccffa69c39733e2 Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 15:30:53 +0000 Subject: [PATCH 054/230] Translated using Weblate (Russian) Currently translated at 84.4% (1893 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 80 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index eb18a346b4..94b21fa76e 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -450,7 +450,7 @@ "Create": "Создать", "Featured Rooms:": "Рекомендуемые комнаты:", "Featured Users:": "Избранные пользователи:", - "Automatically replace plain text Emoji": "Автоматически заменять текстовые смайлики на Emoji", + "Automatically replace plain text Emoji": "Автоматически заменять текстовые смайлики на графические", "Failed to upload image": "Не удалось загрузить изображение", "%(widgetName)s widget added by %(senderName)s": "Виджет %(widgetName)s был добавлен %(senderName)s", "%(widgetName)s widget removed by %(senderName)s": "Виджет %(widgetName)s был удален %(senderName)s", @@ -975,7 +975,7 @@ "Sorry, your homeserver is too old to participate in this room.": "Извините, ваш сервер слишком старый, для участия в этой комнате.", "Please contact your homeserver administrator.": "Пожалуйста, свяжитесь с администратором вашего сервера.", "Render simple counters in room header": "Отображать простые счетчики в заголовке комнаты", - "Enable Emoji suggestions while typing": "Включить предложения эмоджи при наборе", + "Enable Emoji suggestions while typing": "Включить предложения смайликов при наборе", "Show a placeholder for removed messages": "Показывать плашки вместо удалённых сообщений", "Show join/leave messages (invites/kicks/bans unaffected)": "Показывать сообщения о вступлении | выходе (не влияет на приглашения, исключения и запреты)", "Show avatar changes": "Показывать изменения аватара", @@ -1680,7 +1680,7 @@ "Command Autocomplete": "Автозаполнение команды", "Community Autocomplete": "Автозаполнение сообщества", "DuckDuckGo Results": "DuckDuckGo результаты", - "Emoji Autocomplete": "Emoji Автозаполнение", + "Emoji Autocomplete": "Автодополнение смайлов", "Notification Autocomplete": "Автозаполнение уведомлений", "Room Autocomplete": "Автозаполнение комнаты", "User Autocomplete": "Автозаполнение пользователя", @@ -1745,7 +1745,7 @@ "Your keys are not being backed up from this session.": "Ваши ключи не резервируются с этой сессии.", "Server or user ID to ignore": "Сервер или ID пользователя для игнорирования", "Subscribed lists": "Подписанные списки", - "Subscribe": "Подписать", + "Subscribe": "Подписаться", "A session's public name is visible to people you communicate with": "Публичное имя сессии видны людям, с которыми вы общаетесь", "If you cancel now, you won't complete verifying the other user.": "Если вы сейчас отмените, у вас не будет завершена проверка других пользователей.", "If you cancel now, you won't complete your secret storage operation.": "Если вы сейчас отмените, вы не завершите операцию секретного хранения.", @@ -1792,7 +1792,7 @@ "Verify this session by completing one of the following:": "Проверьте эту сессию, выполнив одно из следующих действий:", "Scan this unique code": "Отсканируйте этот уникальный код", "or": "или", - "Compare unique emoji": "Сравнитe уникальныe эмодзи", + "Compare unique emoji": "Сравнитe уникальныe смайлики", "Compare a unique set of emoji if you don't have a camera on either device": "Сравните уникальный набор смайликов, если у вас нет камеры ни на одном из устройств", "Start": "Начать", "Confirm the emoji below are displayed on both devices, in the same order:": "Подтвердите, что смайлики, приведенные ниже, отображаются на обоих устройствах в одном и том же порядке:", @@ -1856,7 +1856,7 @@ "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) начал(а) новую сессию без её подтверждения:", "Ask this user to verify their session, or manually verify it below.": "Попросите этого пользователя подтвердить сессию или подтвердите её вручную ниже.", "Manually Verify by Text": "Ручная проверка с помощью текста", - "Interactively verify by Emoji": "Интерактивная проверка со смайлами", + "Interactively verify by Emoji": "Интерактивная проверка со смайликами", "Done": "Готово", "The message you are trying to send is too large.": "Ваше сообщение слишком большое.", "Support adding custom themes": "Поддержка сторонних тем", @@ -1867,5 +1867,71 @@ "Update your secure storage": "Обновите ваше безопасное хранилище", "Your homeserver does not support cross-signing.": "Ваш домашний сервер не поддерживает кросс-подпись.", "Cross-signing and secret storage are enabled.": "Кросс-подпись и хранилище секретов разрешены.", - "Customise your experience with experimental labs features. Learn more.": "Попробуйте экспериментальные возможности. Подробнее." + "Customise your experience with experimental labs features. Learn more.": "Попробуйте экспериментальные возможности. Подробнее.", + "Cross-signing and secret storage are not yet set up.": "Кросс-подпись и хранилище секретов ещё не настроены.", + "Reset cross-signing and secret storage": "Сбросить кросс-подпись и хранилище секретов", + "Cross-signing public keys:": "Публичные ключи для кросс-подписи:", + "in memory": "в памяти", + "not found": "не найдено", + "Cross-signing private keys:": "Приватные ключи для кросс-подписи:", + "in secret storage": "в хранилище секретов", + "cached locally": "сохранено локально", + "not found locally": "не найдено локально", + "User signing private key:": "Приватный ключ подписи пользователей:", + "Session backup key:": "Резервная копия сессионного ключа:", + "Secret storage public key:": "Публичный ключ хранилища секретов:", + "in account data": "в данных аккаунта", + "Homeserver feature support:": "Возможности домашнего сервера:", + "exists": "существует", + "Secret Storage key format:": "Формат ключа хранилища секретов:", + "outdated": "устарел", + "up to date": "свежий", + "Your homeserver does not support session management.": "Ваш домашний сервер не поддерживает управление сессиями.", + "Unable to load session list": "Не удалось загрузить список сессий", + "Enable": "Разрешить", + "Connecting to integration manager...": "Подключение к менеджеру интеграций...", + "Cannot connect to integration manager": "Не удалось подключиться к менеджеру интеграций", + "The integration manager is offline or it cannot reach your homeserver.": "Менеджер интеграций не работает или не может подключиться к вашему домашнему серверу.", + "This session is backing up your keys. ": "Эта сессия сохраняет ваши ключи. ", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Эта сессия не сохраняет ваши ключи, но у вас есть резервная копия, из которой вы можете их восстановить.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Подключите эту сессию к резервированию ключей до выхода, чтобы избежать утраты ключей, которые могут быть доступны только в этой сессии.", + "Connect this session to Key Backup": "Подключить эту сессию к резервированию ключей", + "Backup is not signed by any of your sessions": "Резервная копия не подписана ни одной из ваших сессий", + "This backup is trusted because it has been restored on this session": "Эта резервная копия является доверенной, потому что она была восстановлена в этой сессии", + "Clear notifications": "Убрать уведомления", + "Invalid theme schema.": "Неверная схема темы.", + "Error downloading theme information.": "Ошибка при загрузке информации темы.", + "Theme added!": "Тема добавлена!", + "Add theme": "Добавить тему", + "Keyboard Shortcuts": "Горячие клавиши", + "Something went wrong. Please try again or view your console for hints.": "Что-то пошло не так. Попробуйте снова или поищите подсказки в консоли.", + "Error unsubscribing from list": "Не удалось отписаться от списка", + "None": "Нет", + "Server rules": "Правила сервера", + "User rules": "Правила пользователей", + "You have not ignored anyone.": "Вы никого не игнорируете.", + "You are currently ignoring:": "Вы игнорируете:", + "You are not subscribed to any lists": "Вы не подписаны ни на один список", + "Unsubscribe": "Отписаться", + "View rules": "Посмотреть правила", + "You are currently subscribed to:": "", + "Security": "Безопасность", + "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "Сессия, которую вы подтверждаете, не поддерживает проверку с помощью сканирования QR-кодов или смайлов, как в Riot. Попробуйте другой клиент.", + "Verify by scanning": "Подтверждение сканированием", + "Ask %(displayName)s to scan your code:": "Попросите %(displayName)s отсканировать ваш код:", + "Verify by emoji": "Подтверждение с помощью смайлов", + "If you can't scan the code above, verify by comparing unique emoji.": "Если вы не можете отсканировать код выше, попробуйте сравнить уникальные смайлы.", + "Verify by comparing unique emoji.": "Подтверждение сравнением уникальных смайлов.", + "Verify all users in a room to ensure it's secure.": "Подтвердите всех пользователей в комнате, чтобы обеспечить безопасность.", + "In encrypted rooms, verify all users to ensure it’s secure.": "В зашифрованных комнатах проверьте всех пользователей, чтобы обеспечить безопасность.", + "Verified": "Подтверждено", + "You've successfully verified %(displayName)s!": "Вы успешно подтвердили %(displayName)s!", + "Got it": "Понятно", + "Compare emoji": "Сравните смайлы", + "Activate selected button": "Активировать выбранную кнопку", + "Toggle right panel": "Переключить правую панель", + "Toggle this dialog": "Переключить этот диалог", + "Cancel autocomplete": "Отменить автодополнение", + "Esc": "", + "Enter": "" } From dabf8f3870790c7b4b1083716f4b53289d4ad2d3 Mon Sep 17 00:00:00 2001 From: call_xz Date: Wed, 1 Apr 2020 14:01:16 +0000 Subject: [PATCH 055/230] Translated using Weblate (Japanese) Currently translated at 54.8% (1229 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 23eaaf9f0f..8254426ce3 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -330,14 +330,14 @@ "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s がトピックを \"%(topic)s\" に変更しました。", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s が部屋名を削除しました。", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s が部屋名を %(roomName)s に変更しました。", - "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s はイメージを送信しました。", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s が画像を送信しました。", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加しました。", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加しました。", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s はこの部屋のアドレスとして %(removedAddresses)s を削除しました。", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s はこの部屋のアドレスとして %(removedAddresses)s を削除しました。", "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加し、%(removedAddresses)s を削除しました。", - "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s は、この部屋の主アドレスを %(address)s に設定しました。", - "%(senderName)s removed the main address for this room.": "%(senderName)s はこの部屋の主アドレスを削除しました。", + "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s が、この部屋のメインアドレスを %(address)s に設定しました。", + "%(senderName)s removed the main address for this room.": "%(senderName)s がこの部屋のメインアドレスを削除しました。", "Someone": "誰か", "(not supported by this browser)": "(このブラウザではサポートされていません)", "%(senderName)s answered the call.": "%(senderName)s が応答しました。", @@ -1024,8 +1024,8 @@ "Trust": "信頼", "Use an identity server to invite by email. Manage in Settings.": "メールによる招待のためにIDサーバーを用いる。設定画面で管理する。", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s が参加ルールを「%(rule)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 has prevented guests from joining the room.": "%(senderDisplayName)s がこの部屋へのゲストによる参加を拒否しました。", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s はゲストによるアクセスを %(rule)s に変更しました。", "%(displayName)s is typing …": "%(displayName)s が入力中 …", "%(names)s and %(count)s others are typing …|other": "%(names)s と他 %(count)s 名が入力中 …", "%(names)s and %(count)s others are typing …|one": "%(names)s ともう一人が入力中 …", @@ -1144,9 +1144,9 @@ "Remove recent messages": "最近のメッセージを削除する", "%(creator)s created and configured the room.": "%(creator)s が部屋を作成して構成しました。", "Add room": "部屋を追加", - "%(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のバッジを削除しました。", - "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)sが%(newGroups)sのバッジを追加し、%(oldGroups)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 のバッジを削除しました。", + "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s が %(newGroups)s のバッジを追加し、 %(oldGroups)s のバッジを削除しました。", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "キーが正常にバックアップされていない場合、暗号化されたメッセージにアクセスできなくなります。本当によろしいですか?", "not stored": "保存されていません", "All keys backed up": "すべてのキーがバックアップされました", From 0d8fd83e4d8622e59142b2b05d4e8389cf15dffd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 1 Apr 2020 17:16:28 +0100 Subject: [PATCH 056/230] move aria-label and title so that it doesn't wrap the e2e icon Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/right_panel/UserInfo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 82e410b361..abe54b355e 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1444,9 +1444,9 @@ const UserInfoHeader = ({onClose, member, e2eStatus}) => {
-

+

{ e2eIcon } - + { displayName }

From f295bb6c12e07e883ee13dfa49f4388588cff10c Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 16:04:03 +0000 Subject: [PATCH 057/230] Translated using Weblate (Russian) Currently translated at 84.5% (1896 of 2244 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 94b21fa76e..56754f84ba 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -19,7 +19,7 @@ "Create Room": "Создать комнату", "Cryptography": "Криптография", "Curve25519 identity key": "Ключ идентификации Curve25519", - "Deactivate Account": "Закрыть аккаунт", + "Deactivate Account": "Деактивировать аккаунт", "Decryption error": "Ошибка расшифровки", "Default": "По умолчанию", "Deops user with given id": "Снимает полномочия оператора с пользователя с заданным ID", @@ -257,7 +257,7 @@ "Make Moderator": "Сделать модератором", "Room": "Комната", "Cancel": "Отмена", - "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Не удается подключиться к домашнему серверу через HTTP, так как в адресной строке браузера указан URL HTTPS. Используйте HTTPS или либо включите небезопасные сценарии.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Не удается подключиться к домашнему серверу через HTTP, так как в адресной строке браузера указан адрес HTTPS. Используйте HTTPS или включите небезопасные скрипты.", "Dismiss": "Отклонить", "Custom Server Options": "Параметры другого сервера", "Mute": "Приглушить", @@ -1546,7 +1546,7 @@ "Disconnect from the identity server ?": "Отсоединиться от сервера идентификации ?", "Disconnect": "Отключить", "Identity Server (%(server)s)": "Сервер идентификации (%(server)s)", - "Do not use an identity server": "Не используйте сервер идентификации", + "Do not use an identity server": "Не использовать сервер идентификации", "Enter a new identity server": "Введите новый идентификационный сервер", "Integration Manager": "Менеджер интеграции", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Кроме того, вы можете попытаться использовать общедоступный сервер по адресу turn.matrix.org , но это не будет настолько надежным, и он предоставит ваш IP-адрес этому серверу. Вы также можете управлять этим в настройках.", @@ -1578,11 +1578,11 @@ "Disconnect anyway": "Отключить в любом случае", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "В настоящее время вы используете для поиска вами ваших контактов а также вас вашими оппонентами. Вы можете изменить ваш сервер идентификации ниже.", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Если вы не хотите использовать для обнаружения вас и быть обнаруженным вашими существующими контактами, введите другой идентификационный сервер ниже.", - "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Вы в настоящее время не используете идентификационный сервер. Чтобы найти и быть найденным существующими контактами, которые вы знаете, добавьте один ниже.", + "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Вы в настоящее время не используете сервер идентификации. Чтобы найти известные вам контакты, и чтобы они могли найти вас, укажите сервер ниже.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Отключение от сервера идентификации будет означать, что другие пользователи не смогут вас обнаружить, и вы не сможете приглашать других по электронной почте или по телефону.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Использование сервера идентификации не обязательно. Если вы решите не использовать сервер идентификации, другие пользователи не смогут обнаружить вас, и вы не сможете пригласить других по электронной почте или телефону.", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Подтвердите условия предоставления услуг сервера идентификации (%(serverName)s), чтобы вас можно было обнаружить по адресу электронной почты или номеру телефона.", - "Discovery": "Поиск", + "Discovery": "Обнаружение", "Deactivate account": "Деактивировать аккаунт", "Clear cache and reload": "Очистить кэш и перезагрузить", "Always show the window menu bar": "Всегда показывать строку меню", @@ -1723,7 +1723,7 @@ "Delete %(count)s sessions|other": "Удалить %(count)s сессию", "Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии", "Enable audible notifications for this session": "Включить звуковые уведомления для этой сессии", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями %(serverName)s для управления ботами, виджетами и стикерами.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Используйте менеджер интеграций %(serverName)s для управления ботами, виджетами и стикерами.", "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Используйте Менеджер интеграциями для управления ботами, виджетами и стикерами.", "Manage integrations": "Управление интеграциями", "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджеры интеграции получают данные конфигурации и могут изменять виджеты, отправлять приглашения в комнаты и устанавливать уровни доступа от вашего имени.", @@ -1914,7 +1914,7 @@ "You are not subscribed to any lists": "Вы не подписаны ни на один список", "Unsubscribe": "Отписаться", "View rules": "Посмотреть правила", - "You are currently subscribed to:": "", + "You are currently subscribed to:": "Вы подписаны на:", "Security": "Безопасность", "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "Сессия, которую вы подтверждаете, не поддерживает проверку с помощью сканирования QR-кодов или смайлов, как в Riot. Попробуйте другой клиент.", "Verify by scanning": "Подтверждение сканированием", @@ -1933,5 +1933,6 @@ "Toggle this dialog": "Переключить этот диалог", "Cancel autocomplete": "Отменить автодополнение", "Esc": "", - "Enter": "" + "Enter": "Enter", + "Delete %(count)s sessions|one": "Удалить %(count)s сессий" } From 72badf3b6ace1d2ea4d92e22d8b79f0488c95f4b Mon Sep 17 00:00:00 2001 From: rkfg Date: Wed, 1 Apr 2020 16:56:53 +0000 Subject: [PATCH 058/230] Translated using Weblate (Russian) Currently translated at 84.0% (1896 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 56754f84ba..41cd901692 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -706,7 +706,7 @@ "Key request sent.": "Запрос ключа отправлен.", "Code": "Код", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Если вы отправили ошибку через GitHub, журналы отладки могут помочь нам выявить проблему. Журналы отладки содержат данные об использовании приложения, включая ваше имя пользователя, идентификаторы или псевдонимы комнат или групп, которые вы посетили, а также имена других пользователей. Они не содержат сообщений.", - "Submit debug logs": "Отправка журналов отладки", + "Submit debug logs": "Отправить отладочные журналы", "Opens the Developer Tools dialog": "Открывает Инструменты разработчика", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Прочитано %(displayName)s (%(userName)s) в %(dateTime)s", "Unable to join community": "Не удалось присоединиться к сообществу", @@ -797,7 +797,7 @@ "You must specify an event type!": "Необходимо указать тип мероприятия!", "(HTTP status %(httpStatus)s)": "(статус HTTP %(httpStatus)s)", "Invite to this room": "Пригласить в комнату", - "Send logs": "Отправка журналов", + "Send logs": "Отправить журналы", "All messages": "Все сообщения", "Call invitation": "Звонки", "Downloading update...": "Загрузка обновления…", From 4402398d9074b7bddebfc707da31576b83e433d0 Mon Sep 17 00:00:00 2001 From: "J. A. Durieux" Date: Wed, 1 Apr 2020 21:24:27 +0000 Subject: [PATCH 059/230] Translated using Weblate (Dutch) Currently translated at 94.1% (2123 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 874ae9bf3a..95a49bce8c 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -254,7 +254,7 @@ "Room Colour": "Gesprekskleur", "%(roomName)s does not exist.": "%(roomName)s bestaat niet.", "%(roomName)s is not accessible at this time.": "%(roomName)s is op dit moment niet toegankelijk.", - "Rooms": "Gesprekken", + "Rooms": "Groepsgesprekken", "Save": "Opslaan", "Scroll to bottom of page": "Scroll naar de onderkant van de pagina", "Search failed": "Zoeken mislukt", From 9d33d16104e7aa236fd98c737b53541dc559f132 Mon Sep 17 00:00:00 2001 From: "Nils J. Haugen" Date: Wed, 1 Apr 2020 20:59:44 +0000 Subject: [PATCH 060/230] Translated using Weblate (Norwegian Nynorsk) Currently translated at 52.9% (1194 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 338 ++++++++++++++++++++++++++------------- 1 file changed, 229 insertions(+), 109 deletions(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index bb2e51a5af..bae0f650b3 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -58,7 +58,7 @@ "Add to community": "Legg til i fellesskapet", "Failed to invite the following users to %(groupId)s:": "Fekk ikkje til å invitera følgjande brukarar i %(groupId)s:", "Failed to invite users to community": "Fekk ikkje til å invitera brukarar til fellesskapet.", - "Failed to invite users to %(groupId)s": "Fekk ikkje til å byda brukarar inn til %(groupId)s", + "Failed to invite users to %(groupId)s": "Fekk ikkje til å invitera brukarar til %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Fekk ikkje til å invitera følgjande rom til %(groupId)s:", "Riot does not have permission to send you notifications - please check your browser settings": "Riot har ikkje tillating til å senda deg varsel - ver venleg og sjekk nettlesarinnstillingane dine", "Riot was not given permission to send notifications - please try again": "Riot fekk ikkje tillating til å senda varsel - ver venleg og prøv igjen", @@ -69,17 +69,17 @@ "Restricted": "Avgrensa", "Moderator": "Moderator", "Admin": "Administrator", - "Start a chat": "Start ei samtale", + "Start a chat": "Start ein samtale", "Operation failed": "Handling mislukkast", - "Failed to invite": "Fekk ikkje til å byda inn", - "Failed to invite the following users to the %(roomName)s room:": "Dei fylgjande brukarane lét seg ikkje byda inn til %(roomName)s:", + "Failed to invite": "Fekk ikkje til å invitera", + "Failed to invite the following users to the %(roomName)s room:": "Fekk ikkje til å invitera følgjande brukarar til %(roomName)s:", "You need to be logged in.": "Du må vera logga inn.", - "You need to be able to invite users to do that.": "Du må kunna byda brukarar inn for å gjera det.", + "You need to be able to invite users to do that.": "Du må ha lov til å invitera brukarar for å gjera det.", "Unable to create widget.": "Klarte ikkje å laga widget.", "Missing roomId.": "Manglande roomId.", "Failed to send request.": "Fekk ikkje til å senda førespurnad.", "This room is not recognised.": "Rommet er ikkje attkjend.", - "Power level must be positive integer.": "Makthøgda må vera eit positivt heiltal.", + "Power level must be positive integer.": "Tilgangsnivået må vera eit positivt heiltal.", "You are not in this room.": "Du er ikkje i dette rommet.", "You do not have permission to do that in this room.": "Du har ikkje lov til å gjera det i dette rommet.", "Missing room_id in request": "Manglande room_Id i førespurnad", @@ -91,7 +91,7 @@ "e.g. %(exampleValue)s": "t.d. %(exampleValue)s", "/ddg is not a command": "/ddg er ikkje ein kommando", "Changes your display nickname": "Forandrar kallenamnet ditt", - "Invites user with given id to current room": "Byd brukarar med den gjevne IDen inn til det noverande rommet", + "Invites user with given id to current room": "Inviter brukarar med fylgjande ID inn i gjeldande rom", "Joins room with given alias": "Gjeng inn i eit rom med det gjevne aliaset", "Leave room": "Far frå rommet", "Unrecognised room alias:": "Ukjend romalias:", @@ -103,12 +103,12 @@ "Stops ignoring a user, showing their messages going forward": "Sluttar å oversjå ein brukar, slik at meldingane deira no kan sjåast", "Unignored user": "Avoversedd brukar", "You are no longer ignoring %(userId)s": "Du overser ikkje %(userId)s no lenger", - "Define the power level of a user": "Set ein brukar si makthøgd", + "Define the power level of a user": "Sett tilgangsnivået til ein brukar", "This email address is already in use": "Denne e-postadressa er allereie i bruk", "The platform you're on": "Platformen du er på", "Failed to verify email address: make sure you clicked the link in the email": "Fekk ikkje til å stadfesta e-postadressa: sjå til at du klikka på den rette lenkja i e-posten", "Your identity server's URL": "Din identitetstenar si nettadresse", - "Every page you use in the app": "Alle sider du brukar i æppen", + "Every page you use in the app": "Alle sider du brukar i programmet", "e.g. ": "t.d. ", "Your User Agent": "Din Brukaragent", "Analytics": "Statistikk", @@ -155,13 +155,13 @@ "(unknown failure: %(reason)s)": "(ukjend feil: %(reason)s)", "%(senderName)s ended the call.": "%(senderName)s avslutta samtalen.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterte %(targetDisplayName)s til å bli med i rommet.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde slik at den framtidige romhistoria er tilgjengeleg for alle rommedlemar frå då dei vart invitert.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde slik at den framtidige romhistoria er tilgjengeleg for alle rommedlemer frå då dei kom inn.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde den framtidige romhistoria tilgjengeleg for alle rommedlemer.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde slik at den framtidige romhistoria er tilgjengeleg for alle rommedlemmar frå då dei vart invitert.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde slik at framtidig romhistorie er tilgjengeleg for alle rommedlemmar frå då dei kom inn.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde framtidig romhistorie tilgjengeleg for alle rommedlemmar.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde den framtidige romhistoria tilgjengelg for kven som helst.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde den framtidige romhistoria tilgjengeleg til ukjende (%(visibility)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s frå %(fromPowerLevel)s til %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s endra makthøgda til %(powerLevelDiffText)s.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s endra tilgangsnivået til %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s endra dei festa meldingane i rommet.", "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget endra av %(senderName)s", "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget lagt til av %(senderName)s", @@ -190,19 +190,19 @@ "Enable URL previews by default for participants in this room": "Skru URL-førehandsvisingar på som utgangspunkt for deltakarar i dette rommet", "Room Colour": "Romfarge", "Enable widget screenshots on supported widgets": "Skru widget-skjermbilete på for støtta widgetar", - "Collecting app version information": "Samlar æppversjoninfo", + "Collecting app version information": "Samlar versjonsinfo for programmet", "Collecting logs": "Samlar loggar", "Uploading report": "Lastar rapport opp", "Waiting for response from server": "Ventar på svar frå tenaren", "Messages containing my display name": "Meldingar som inneheld visingsnamnet mitt", "Messages in one-to-one chats": "Meldingar i ein-til-ein-samtaler", "Messages in group chats": "Meldingar i gruppesamtaler", - "When I'm invited to a room": "Når eg er boden inn til eit rom", + "When I'm invited to a room": "Når eg blir invitert til eit rom", "Call invitation": "Samtaleinnbydingar", "Messages sent by bot": "Meldingar sendt frå ein bot", "Active call (%(roomName)s)": "Pågåande samtale (%(roomName)s)", "unknown caller": "ukjend ringar", - "Incoming voice call from %(name)s": "%(name)s ynskjer ei røystsamtale", + "Incoming voice call from %(name)s": "Innkommande talesamtale frå %(name)s", "Incoming video call from %(name)s": "%(name)s ynskjer ei videosamtale", "Incoming call from %(name)s": "%(name)s ynskjer ei samtale", "Decline": "Sei nei", @@ -246,8 +246,8 @@ "Notifications on the following keywords follow rules which can’t be displayed here:": "Varsel på fylgjande nykelord følgjer reglar som ikkje kan visast her:", "Unable to fetch notification target list": "Klarte ikkje å henta varselmållista", "Notification targets": "Varselmål", - "Advanced notification settings": "Omfattande varselinnstillingar", - "There are advanced notifications which are not shown here": "Det er omfattande varsel som ikkje er vist her", + "Advanced notification settings": "Avanserte varslingsinnstillingar", + "There are advanced notifications which are not shown here": "Det finst avanserte varslingar som ikkje er synlege her", "Show message in desktop notification": "Vis meldinga i eit skriverbordsvarsel", "Off": "Av", "On": "På", @@ -257,7 +257,7 @@ "Drop File Here": "Slepp Fila Her", "Drop file here to upload": "Slipp ein fil her for å lasta opp", " (unsupported)": " (ustøtta)", - "Join as voice or video.": "Gå inn som røyst eller video.", + "Join as voice or video.": "Gå inn med tale eller video.", "Ongoing conference call%(supportedText)s.": "Ein gruppesamtale er i gang%(supportedText)s.", "This event could not be displayed": "Denne hendingen kunne ikkje visast", "%(senderName)s sent an image": "%(senderName)s sende eit bilete", @@ -265,63 +265,63 @@ "%(senderName)s uploaded a file": "%(senderName)s lasta ei fil opp", "Options": "Innstillingar", "Key request sent.": "Nykelforespurnad er send.", - "Please select the destination room for this message": "Ver venleg og vel målrommet for denne meldinga", + "Please select the destination room for this message": "Vel kva rom som skal få denne meldinga", "Blacklisted": "Svartelista", "device id: ": "einingsID: ", - "Disinvite": "Fjern innbyding", + "Disinvite": "Fjern invitasjon", "Kick": "Spark ut", - "Disinvite this user?": "Fjern innbydinga til denne brukaren?", + "Disinvite this user?": "Fjern invitasjonen for denne brukaren?", "Kick this user?": "Spark denne brukaren ut?", "Failed to kick": "Fekk ikkje til å sparka ut", "Unban": "Slepp inn att", "Ban": "Steng ute", "Unban this user?": "Slepp denne brukaren inn att?", "Ban this user?": "Steng denne brukaren ute?", - "Failed to ban user": "Fekk ikkje til å utestenga brukar", - "Demote yourself?": "Senk høgda di?", - "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Du kan ikkje gjera om på denne endringa sidan du senkar høgda di. Viss du er den siste opphøgda brukaren i rommet vert det umogeleg å få høgda att.", - "Demote": "Senk høgda", - "Failed to mute user": "Fekk ikkje til å stilne brukar", - "Failed to toggle moderator status": "Fekk ikkje til å veksla moderatorhøgd", - "Failed to change power level": "Fekk ikkje til å endra makthøgda", - "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du kjem ikkje til å kunna gjera om på denne endringa sidan du set brukaren si høgd opp til di eiga.", + "Failed to ban user": "Fekk ikkje til å stenge ute brukaren", + "Demote yourself?": "Senke ditt eige tilgangsnivå?", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Du kan ikkje gjera om på denne endringa sidan du senkar tilgangsnivået ditt. Viss du er den siste privilegerte brukaren i rommet vil det bli umogleg å få tilbake tilgangsrettane.", + "Demote": "Degrader", + "Failed to mute user": "Fekk ikkje til å dempe brukaren", + "Failed to toggle moderator status": "Fekk ikkje til å skifte moderatorstatus", + "Failed to change power level": "Fekk ikkje til å endra tilgangsnivået", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du kan ikkje angre denne endringa, fordi brukaren du forfremmar vil få same tilgangsnivå som du har no.", "Are you sure?": "Er du sikker?", "Unignore": "Slutt å oversjå", "Ignore": "Oversjå", "Mention": "Nemn", - "Invite": "Byd inn", + "Invite": "Inviter", "Enable inline URL previews by default": "Skru URL-førehandsvising i tekstfeltet på", - "Share Link to User": "Del Brukarlenkje", + "Share Link to User": "Del ei lenke til brukaren", "User Options": "Brukarinnstillingar", - "Direct chats": "Direktesamtaler", - "Unmute": "Fjern stilning", - "Mute": "Stiln", - "Revoke Moderator": "Fjern Moderatorrett", + "Direct chats": "Direktesamtalar", + "Unmute": "Fjern demping", + "Mute": "Demp", + "Revoke Moderator": "Fjern Moderatorrettigheit", "Make Moderator": "Gjer til Moderator", "Admin Tools": "Administratorverktøy", - "and %(count)s others...|other": "og %(count)s til...", - "and %(count)s others...|one": "og ein til...", - "Invited": "Innboden", - "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (makthøgd %(powerLevelNumber)s)", + "and %(count)s others...|other": "og %(count)s andre...", + "and %(count)s others...|one": "og ein annan...", + "Invited": "Invitert", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (tilgangsnivå %(powerLevelNumber)s)", "Attachment": "Vedlegg", "Hangup": "Legg på", - "Voice call": "Røystesamtale", + "Voice call": "Taleanrop", "Video call": "Videosamtale", - "Upload file": "Last ei fil opp", + "Upload file": "Last opp fil", "Send an encrypted reply…": "Send eit kryptert svar…", - "Send a reply (unencrypted)…": "Send eit svar (ikkje-kryptert)…", + "Send a reply (unencrypted)…": "Send eit svar (ukryptert)…", "Send an encrypted message…": "Send ei kryptert melding…", - "Send a message (unencrypted)…": "Send ei melding (ikkje-kryptert)…", - "You do not have permission to post to this room": "Du har ikkje tillating til å senda meldingar i dette rommet", + "Send a message (unencrypted)…": "Send ei melding (ukryptert)…", + "You do not have permission to post to this room": "Du har ikkje lov til å senda meldingar i dette rommet", "Server error": "Noko gjekk gale med tenaren", - "Server unavailable, overloaded, or something else went wrong.": "tenaren var utilgjengeleg, overlasta, elles so gjekk noko anna galt.", - "Command error": "Noko gjekk gale med påbodet", + "Server unavailable, overloaded, or something else went wrong.": "Tenar utilgjengeleg, overlasta eller har eit anna problem.", + "Command error": "Noko gjekk gale med kommandoen", "The maximum permitted number of widgets have already been added to this room.": "Det største mogelege talet widgets finst allereie på dette rommet.", - "Unpin Message": "Tak ned festa Melding", + "Unpin Message": "Fjern festa melding", "Jump to message": "Hopp til melding", - "No pinned messages.": "Inga festa meldingar.", + "No pinned messages.": "Ingen festa meldingar.", "Loading...": "Lastar...", - "Pinned Messages": "Festa Meldingar", + "Pinned Messages": "Festa meldingar", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)st", @@ -334,74 +334,74 @@ "Idle": "Fråverande", "Offline": "Fråkopla", "Unknown": "Ukjend", - "Seen by %(userName)s at %(dateTime)s": "%(userName)s såg dette %(dateTime)s", - "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s %(userName)s såg dette %(dateTime)s", + "Seen by %(userName)s at %(dateTime)s": "Sett av %(userName)s %(dateTime)s", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Sett av %(displayName)s %(userName)s %(dateTime)s", "Replying": "Svarar", "No rooms to show": "Ingen rom å visa", "Unnamed room": "Rom utan namn", - "Guests can join": "Gjester kan koma inn", + "Guests can join": "Gjester kan bli med", "Save": "Lagr", "(~%(count)s results)|other": "(~%(count)s resultat)", "(~%(count)s results)|one": "(~%(count)s resultat)", - "Join Room": "Far inn i Rom", + "Join Room": "Bli med i rom", "Upload avatar": "Last avatar opp", "Settings": "Innstillingar", "Forget room": "Gløym rom", "Search": "Søk", "Share room": "Del rom", "Community Invites": "Fellesskapsinvitasjonar", - "Invites": "Innbydingar", - "Favourites": "Yndlingar", + "Invites": "Invitasjonar", + "Favourites": "Favorittar", "Rooms": "Rom", - "Low priority": "Lågrett", + "Low priority": "Låg prioritet", "System Alerts": "Systemvarsel", "Historical": "Historiske", "This room": "Dette rommet", - "%(roomName)s does not exist.": "%(roomName)s finst ikkje.", + "%(roomName)s does not exist.": "%(roomName)s eksisterar ikkje.", "%(roomName)s is not accessible at this time.": "%(roomName)s er ikkje tilgjengeleg no.", "Failed to unban": "Fekk ikkje til å lata inn att", "Banned by %(displayName)s": "Stengd ute av %(displayName)s", - "unknown error code": "ukjend errorkode", + "unknown error code": "ukjend feilkode", "Failed to forget room %(errCode)s": "Fekk ikkje til å gløyma rommet %(errCode)s", "No users have specific privileges in this room": "Ingen brukarar har særeigne rettar i dette rommet", "Privileged Users": "Brukarar med Særrett", "Muted Users": "Stilna Brukarar", "Banned users": "Utestengde Brukarar", "Favourite": "Yndling", - "Guests cannot join this room even if explicitly invited.": "Gjester kan ikkje koma inn i dette rommet sjølv viss dei er tydeleg innbodne.", + "Guests cannot join this room even if explicitly invited.": "Gjester kan ikkje bli med i dette rommet, sjølv om dei vart spesifikt invitert.", "Click here to fix": "Klikk her for å retta opp i det", "Who can access this room?": "Kven har tilgang til rommet?", - "Only people who have been invited": "Berre dei som er bodne inn", + "Only people who have been invited": "Berre dei som har vorte inviterte", "Anyone who knows the room's link, apart from guests": "Dei som kjenner lenkja til rommet, sett vekk frå gjester", "Anyone who knows the room's link, including guests": "Dei som kjenner lenkja til rommet, gjester òg", "Publish this room to the public in %(domain)s's room directory?": "Gjer dette rommet offentleg i %(domain)s sitt romutval?", "Who can read history?": "Kven kan lesa historia?", "Anyone": "Kven som helst", - "Members only (since the point in time of selecting this option)": "Berre medlemer (frå då denne innstillinga vert skrudd på)", - "Members only (since they were invited)": "Berre medlemmer (frå då dei vart bodne inn)", - "Members only (since they joined)": "Berre medlemer (frå då dei kom inn)", + "Members only (since the point in time of selecting this option)": "Berre medlemmar (frå då denne innstillinga vart skrudd på)", + "Members only (since they were invited)": "Berre medlemmar (frå då dei vart inviterte inn)", + "Members only (since they joined)": "Berre medlemmar (frå då dei kom inn)", "Permissions": "Tillatinger", - "Advanced": "Omfattande", - "Add a topic": "Legg eit emne til", + "Advanced": "Avansert", + "Add a topic": "Legg til eit emne", "Search…": "Søk…", - "This Room": "Dette Rommet", - "All Rooms": "Alle Rom", + "This Room": "Dette rommet", + "All Rooms": "Alle rom", "Cancel": "Bryt av", "You don't currently have any stickerpacks enabled": "Du har for tida ikkje skrudd nokre klistremerkepakkar på", "Stickerpack": "Klistremerkepakke", - "Hide Stickers": "Gøym Klistremerkar", - "Show Stickers": "Vis Klistremerkar", - "Jump to first unread message.": "Hopp til den fyrste ulesne meldinga.", + "Hide Stickers": "Gøym klistremerker", + "Show Stickers": "Vis klistremerker", + "Jump to first unread message.": "Hopp til den fyrste uleste meldinga.", "Close": "Lukk", "Remote addresses for this room:": "Fjernadresser for dette rommet:", "Local addresses for this room:": "Lokaladresser for dette rommet:", - "This room has no local addresses": "Dette rommet har ingen lokaladresser", + "This room has no local addresses": "Dette rommet har ingen lokale adresser", "New address (e.g. #foo:%(localDomain)s)": "Ny adresse (t.d. #foo:%(localDomain)s)", "Invalid community ID": "Ugyldig fellesskaps-ID", "'%(groupId)s' is not a valid community ID": "'%(groupId)s' er ikkje ein gyldig fellesskaps-ID", - "Flair": "Særpreg", - "Showing flair for these communities:": "Viser særpreg for desse samfunna:", - "This room is not showing flair for any communities": "Dette rommet viser ikkje særpreg for nokre samfunn", + "Flair": "Etikett", + "Showing flair for these communities:": "Viser etikettar for desse fellesskapa:", + "This room is not showing flair for any communities": "Dette rommet viser ikkje etikettar for nokre fellesskap", "New community ID (e.g. +foo:%(localDomain)s)": "Ny fellesskaps-ID (t.d. +foo:%(localDomain)s)", "You have enabled URL previews by default.": "Du har skrudd URL-førehandsvisingar på i utgangspunktet.", "You have disabled URL previews by default.": "Du har skrudd URL-førehandsvisingar av i utgangspunktet.", @@ -464,17 +464,17 @@ "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Kunne ikkje oppdatera synligheita til '%(roomName)s' i %(groupId)s.", "Visibility in Room List": "Synligheit i Romlista", "Visible to everyone": "Synleg for alle", - "Only visible to community members": "Berre synleg for medlemar av fellesskapet", - "Something went wrong when trying to get your communities.": "Noko gjekk gale med framhentinga av samfunna dine.", - "Display your community flair in rooms configured to show it.": "Vis fellesskapsetiketten din i rom som er stilt inn til å visa det.", - "You're not currently a member of any communities.": "Du er for augeblunket ikkje medlem i nokre samfunn.", + "Only visible to community members": "Berre synleg for medlemmar av fellesskapet", + "Something went wrong when trying to get your communities.": "Noko gjekk gale under innlasting av fellesskapa du er med i.", + "Display your community flair in rooms configured to show it.": "Vis fellesskaps-etiketten din i rom som er stilt inn til å visa det.", + "You're not currently a member of any communities.": "Du er for tida ikkje medlem i nokon fellesskap.", "Yes, I want to help!": "Ja, eg vil vera til nytte!", "You are not receiving desktop notifications": "Du fær ikkje skrivebordsvarsel", "Enable them now": "Skru dei på no", "What's New": "Kva er nytt", "Update": "Oppdatering", "What's new?": "Kva er nytt?", - "A new version of Riot is available.": "Ei ny utgåve av Riot er tilgjengeleg.", + "A new version of Riot is available.": "Ein ny versjon av Riot er tilgjengeleg.", "To return to your account in future you need to set a password": "For å gå tilbake til brukaren din i framtida må du setja eit passord", "Set Password": "Set Passord", "Error encountered (%(errorDetail)s).": "Noko gjekk gale (%(errorDetail)s).", @@ -494,7 +494,7 @@ "Unblacklist": "Fjern frå svartelista", "Blacklist": "Legg til i svartelista", "No results": "Ingen resultat", - "Communities": "Samfunn", + "Communities": "Fellesskap", "Home": "Heim", "You cannot delete this image. (%(code)s)": "Du kan ikkje sletta dette biletet. (%(code)s)", "Uploaded on %(date)s by %(user)s": "Lasta opp %(date)s av %(user)s", @@ -554,7 +554,7 @@ "expand": "Utvid", "In reply to ": "Som svar til ", "Room directory": "Romutval", - "Start chat": "Byrj samtale", + "Start chat": "Start samtale", "And %(count)s more...|other": "Og %(count)s til...", "ex. @bob:example.com": "t.d. @ivar:eksempel.no", "Add User": "Legg Brukar til", @@ -567,7 +567,7 @@ "Logs sent": "Loggar sende", "Thank you!": "Takk skal du ha!", "Failed to send logs: ": "Fekk ikkje til å senda loggar: ", - "Submit debug logs": "Send debøgg-loggar inn", + "Submit debug logs": "Send inn feil-logg", "Send logs": "Send loggar inn", "Unavailable": "Utilgjengeleg", "Changelog": "Endringslogg", @@ -580,8 +580,8 @@ "Create": "Lag", "Create Room": "Lag eit Rom", "World readable": "Kan lesast av alle", - "not specified": "Ikkje oppgjeven", - "Minimize apps": "Legg æppar ned", + "not specified": "Ikkje spesifisert", + "Minimize apps": "Minimer applikasjonar", "Confirm Removal": "Godkjenn Fjerning", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Er du sikker på at du vil fjerna (sletta) denne hendingen? Merk deg at vis du slettar eit romnamn eller ei emneendring kan det gjera om på endringa.", "Community IDs cannot be empty.": "Feltet Fellesskap-ID kan ikkje vera tomt.", @@ -615,7 +615,7 @@ "Refresh": "Hent fram på nytt", "Unable to restore session": "Kunne ikkje henta øykta fram att", "We encountered an error trying to restore your previous session.": "Noko gjekk gale med framhentinga av den førre øykta di.", - "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Viss du har bruka ei nyare utgåve av Riot før, kan det henda at øykta di ikkje passar inn i denne utgåva. Lukk dette vindauget og gå attende til den nyare utgåva.", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Viss du har tidligare brukt ein nyare versjon av Riot, kan sesjons-data vere inkompatibel med denne versjonen. Lukk dette vindauget og bytt til ein nyare versjon.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Det kan henda at å tømma nettlesarlageret rettar opp i det, men det loggar deg ut og kan gjera den krypterte pratehistoria uleseleg.", "Invalid Email Address": "Ugangbar Epostadresse", "This doesn't appear to be a valid email address": "Det ser ikkje ut til at epostadressa er gangbar", @@ -652,7 +652,7 @@ "Reject invitation": "Sei nei til innbyding", "Are you sure you want to reject the invitation?": "Er du sikker på at du vil seia nei til innbydinga?", "Unable to reject invite": "Klarte ikkje å seia nei til innbydinga", - "Reject": "Sei nei", + "Reject": "Avslå", "You cannot delete this message. (%(code)s)": "Du kan ikkje sletta meldinga. (%(code)s)", "Resend": "Send på nytt", "Cancel Sending": "Bryt Sending av", @@ -675,14 +675,14 @@ "Direct Chat": "Direktesamtale", "View Community": "Sjå Fellesskap", "Sorry, your browser is not able to run Riot.": "Orsak, nettlesaren din klarer ikkje å køyra Riot.", - "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot brukar mange omfattande nettlesarfunksjonar, og nokre av dei er ikkje tilgjengelege eller i utprøving i nettlesaren din.", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot brukar mange avanserte nettlesarfunksjonar, og nokre av dei er ikkje tilgjengelege eller under utprøving i nettlesaren din.", "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Med denne nettlesaren, er det mogleg at synet og kjensla av applikasjonen er fullstendig gale, og nokre eller alle funksjonar verkar kanskje ikkje. Viss du vil prøva likevel kan du gå fram, men då du må sjølv handtera alle vanskar du møter på!", "I understand the risks and wish to continue": "Eg forstår farane og vil gå fram", "Name": "Namn", "You must register to use this functionality": "Du må melda deg inn for å bruka denne funksjonen", "You must join the room to see its files": "Du må fare inn i rommet for å sjå filene dets", "There are no visible files in this room": "Det er ingen synlege filer i dette rommet", - "

HTML for your community's page

\n

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

\n

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

\n": "

HTML for samfunnssida di

\n

\n Bruk den Lange Skildringa for å ynskja nye medlemer velkomen, eller gje ut viktige lenkjer\n

\n

\n Du kan til og med bruka 'img' HTML-taggar!\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 use 'img' tags\n

\n": "

HTML for fellesskapssida di

\n

\n Bruk den Lange Skildringa for å ynskja nye medlemmar velkomen, eller gje ut viktige lenkjer\n

\n

\n Du kan til og med bruka 'img' HTML-taggar!\n

\n", "Add rooms to the community summary": "Legg rom til i samandraget for fellesskapet", "Which rooms would you like to add to this summary?": "Kva rom ynskjer du å leggja til i samanfattinga?", "Add to summary": "Legg til i samanfattinga", @@ -705,7 +705,7 @@ "Unable to leave community": "Fekk ikkje til å forlate fellesskapet", "Community Settings": "Fellesskapsinnstillingar", "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Endringar gjort på felleskapsnamn og felleskapsavatar blir kanskje ikkje synleg for andre før etter 30 minutt.", - "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Desse romma vert viste for medlem i felleskapet på felleskapssida. Felleskapsmedlemar kan bli med i romma ved å klikke på dei.", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Desse romma vert viste for medlem i felleskapet på felleskapssida. Felleskapsmedlemmar kan bli med i romma ved å klikka på dei.", "Add rooms to this community": "Legg rom til i fellesskapet", "Featured Rooms:": "Utvalde Rom:", "Featured Users:": "Utvalde Brukarar:", @@ -733,14 +733,14 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "For å framleis bruka %(homeserverDomain)s sin heimtenar må du sjå over og seia deg einig i våre Vilkår og Føresetnader.", "Review terms and conditions": "Sjå over Vilkår og Føresetnader", "Old cryptography data detected": "Gamal kryptografidata vart oppdagen", - "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data frå ei eldre utgåve av Riot vart oppdagen. I den eldre utgåva hadde dette gjort at ende-til-ende-kryptografi ikkje verkar som det skal. Ende-til-ende-krypterte meldingar som vert utveksla nyleg med den gamle utgåva er det kanskje ikkje mogeleg å dekryptera i denne utgåva. Dette fører kanskje òg til at meldingar som vart utveksla med denne utgåva ikkje verkar. Viss du opplever vansker, logg ut og inn att. For å spara på meldingshistoria, hent nyklane dine ut og inn at.", + "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data frå ein eldre versjon av Riot er oppdaga. Dette kan ha gjort at ende-til-ende kryptering feilar i den eldre versjonen. Krypterte meldingar som er utveksla med den gamle versjonen er kanskje ikkje dekrypterbare i denne versjonen. Dette kan forårsake at meldingar utveksla mot denne versjonen vil feile. Opplever du problem med dette, kan du logge inn og ut igjen. For å behalde meldingshistorikk, eksporter og importer nøklane dine på nytt.", "Logout": "Loggar ut", - "Your Communities": "Dine Samfunn", - "Error whilst fetching joined communities": "Noko gjekk gale med innhentinga av samfunna du er i", + "Your Communities": "Dine fellesskap", + "Error whilst fetching joined communities": "Noko gjekk gale under innlasting av fellesskapa du med er i", "Create a new community": "Lag eit nytt fellesskap", "You have no visible notifications": "Du har ingen synlege varsel", "Members": "Medlemer", - "Invite to this room": "Byd inn til rommet", + "Invite to this room": "Inviter til dette rommet", "Files": "Filer", "Notifications": "Varsel", "Invite to this community": "Inviter til dette fellesskapet", @@ -785,18 +785,18 @@ "Uploading %(filename)s and %(count)s others|one": "Lastar opp %(filename)s og %(count)s andre", "Light theme": "Ljost preg", "Dark theme": "Dimt preg", - "Success": "Det gjekk", + "Success": "Suksess", "Unable to remove contact information": "Klarte ikkje å fjerna kontaktinfo", "": "", "Import E2E room keys": "Hent E2E-romnyklar inn", "Cryptography": "Kryptografi", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Viss du har sendt inn ein bøgg gjennom GitHub, kan debøgg-loggar hjelpa oss med å finna problemet. Debøgg-loggar inneheld data om æpp-bruk, b.a. Brukarnamnet ditt, IDane eller aliasa på romma eller gruppene du har vitja og brukarnamna til andre brukarar. Dei inneheld ikkje meldingar.", - "Riot collects anonymous analytics to allow us to improve the application.": "Riot samlar anonym statistikk inn slik at vi kan forbetre æppen.", - "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Personvern er viktig for oss, so vi samlar ikkje på personleg eller attkjenneleg data for statistikken vår.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Viss du har rapportert inn feil via GitHub, kan feil-loggar hjelpa oss med å finna problemet. Feil-loggar inneheld data om applikasjonsbruk som; brukarnamn, ID-ar, alias på rom eller grupper du har besøkt og brukarnamn for andre brukarar. Loggane inneheld ikkje meldingar.", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot samlar anonym statistikk inn slik at ein kan forbetre applikasjonen.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Personvern er viktig for oss, så vi samlar ikkje personlege eller identifiserbare data for statistikken vår.", "Learn more about how we use analytics.": "Finn ut meir om korleis vi brukar statistikk.", "Labs": "Labben", "Check for update": "Sjå etter oppdateringar", - "Reject all %(invitedRooms)s invites": "Sei nei til alle innbydingar frå %(invitedRooms)s", + "Reject all %(invitedRooms)s invites": "Kanseller alle invitasjonar frå %(invitedRooms)s", "Start automatically after system login": "Byrj av seg sjølv etter systeminnlogging", "No media permissions": "Ingen mediatilgang", "You may need to manually permit Riot to access your microphone/webcam": "Det kan henda at du må gje Riot tilgang til mikrofonen/nettkameraet for hand", @@ -812,8 +812,8 @@ "click to reveal": "klikk for å visa", "Homeserver is": "Heimtenaren er", "Identity Server is": "Identitetstenaren er", - "riot-web version:": "riot-web-utgåve:", - "olm version:": "olm-utgåve:", + "riot-web version:": "riot-web versjon:", + "olm version:": "olm versjon:", "Failed to send email": "Fekk ikkje til å senda eposten", "The email address linked to your account must be entered.": "Du må skriva epostadressa som er tilknytta brukaren din inn.", "A new password must be entered.": "Du må skriva eit nytt passord inn.", @@ -862,11 +862,11 @@ "Export E2E room keys": "Hent E2E-romnyklar ut", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Det kan henda at du stilte dei inn på ein annan klient enn Riot. Du kan ikkje stilla på dei i Riot men dei gjeld framleis", "Jump to read receipt": "Hopp til lesen-lappen", - "Filter room members": "Filtrer rommedlemer", + "Filter room members": "Filtrer rommedlemmar", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Når nokon legg ein URL med i meldinga si, kan ei URL-førehandsvising visast for å gje meir info om lenkja slik som tittelen, skildringa, og eit bilete frå nettsida.", "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?": "Du held på å verta teken til ei tredje-partisside so du kan godkjenna brukaren din til bruk med %(integrationsUrl)s. Vil du gå fram?", "Token incorrect": "Teiknet er gale", - "Filter community members": "Filtrer fellesskapssmedlemar", + "Filter community members": "Filtrer fellesskapssmedlemmar", "Custom Server Options": "Tilpassa tenar-innstillingar", "Filter community rooms": "Filtrer rom i fellesskapet", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Ver venleg og hjelp oss å forbetra Riot.im ved å senda anonym brukardata. Dette brukar ei datakake (ver venleg og sjå på Datakakeretningslinene våre).", @@ -877,16 +877,16 @@ "Popout widget": "Popp widget ut", "Manage Integrations": "Sjå over Innlegg", "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", - "Custom level": "Sjølvsett høgd", + "Custom level": "Tilpassa nivå", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Klarte ikkje å lasta handlinga som vert svara til. Anten finst ho ikkje elles har du ikkje tilgang til å sjå ho.", - "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.": "Debøgg-loggar inneheld æppbrukdata slik som brukarnamnet ditt, IDane eller aliasane på romma eller gruppene du har vore i og brukarnamna til andre brukarar. Dei inneheld ikkje meldingar.", + "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.": "Feil-loggar inneheld data om applikasjonsbruk som; brukarnamn, ID-ar, alias på rom eller grupper du har besøkt og brukarnamn for andre brukarar. Loggane inneheld ikkje meldingar.", "Send Custom Event": "Send Sjølvsett Hending", "Failed to send custom event.": "Fekk ikkje til å senda sjølvsett hending.", "State Key": "Tilstandsnykel", "Filter results": "Filtrer resultat", "Custom": "Sjølvsett", "Failed to set Direct Message status of room": "Fekk ikkje til å setja Direktemelding-tilstanden til rommet", - "Did you know: you can use communities to filter your Riot.im experience!": "Visste du at: du kan bruka samfunn for å filtrera Riot.im-opplevinga di!", + "Did you know: you can use communities to filter your Riot.im experience!": "Visste du at: du kan bruka fellesskap for å filtrera Riot.im-opplevinga di!", "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.": "For å setja opp eit filter, dra ein fellesskapsavatar bort til filterpanelet til venstre på skjermen. Du kan klikka på ein avatar i filterpanelet når som helst for å sjå berre romma og folka tilknytta det fellesskapet.", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Lag eit fellesskap for å føra saman brukarar og rom! Bygg di eiga heimeside for å kreva din del av Matrix-verda.", "Unable to look up room ID from server": "Klarte ikkje å henta rom-ID frå tenaren", @@ -908,7 +908,7 @@ "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Å henta filen ut tillèt kven som helst som kan lesa ho å dekryptera alle krypterte meldingar du kan sjå, so du bør passa på å halda ho trygg. For å hjelpa til med dette bør du skriva ei passetning inn i feltet under, som vil brukast til å kryptere den uthenta dataen. Det vil berre vera mogeleg å henta dataen inn med den same passetninga.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Dette tillèt deg å importere krypteringsnøklar som du tidlegare har eksportert frå ein annan Matrix-klient. Du har deretter moglegheit for å dekryptere alle meldingane som den andre klienten kunne dekryptere.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Den eksporterte fila vil bli verna med ein passfrase. Du bør skriva passfrasen her, for å dekryptere fila.", - "Only room administrators will see this warning": "Berre romadministratorar vil sjå denne åtvaringa", + "Only room administrators will see this warning": "Berre rom-administratorar vil sjå denne åtvaringa", "Please contact your service administrator to continue using the service.": "Ver venleg og tak kontakt med tenesteadministratoren for å halda fram med å bruka tenesten.", "This homeserver has hit its Monthly Active User limit.": "Heimtenaren har truffe den Månadlege Grensa si for Aktive Brukarar.", "This homeserver has exceeded one of its resource limits.": "Heimtenaren har gått over ei av ressursgrensene sine.", @@ -1026,7 +1026,7 @@ "Sends a message as plain text, without interpreting it as markdown": "Sender ein melding som rein-tekst, utan å tolka den som markdown", "Upgrades a room to a new version": "Oppgraderer eit rom til ein ny versjon", "You do not have the required permissions to use this command.": "Du har ikkje tilgang til å utføra denne kommandoen.", - "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Åtvaring: Oppgradering av eit rom vil ikkje automatisk overføre rom-medlemane til den nye versjonen av rommet. Vi vil leggje ut ein link til det nye romme i den gamle utgåva av rommet - rom-medlemane må då klikka på denne linken for å medlem av det nye rommet.", + "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Åtvaring: Oppgradering av eit rom vil ikkje automatisk overføre rom-medlemmane til den nye versjonen av rommet. Vi vil leggje ut ein link til det nye romme i den gamle utgåva av rommet - rom-medlemmane må då klikka på denne linken for å medlem av det nye rommet.", "Changes your display nickname in the current room only": "Endrar kallenamnet ditt som er synleg i det gjeldande rommet", "Changes the avatar of the current room": "Endrar avataren for det gjeldande rommet", "Changes your avatar in this current room only": "Endrar din avatar for det gjeldande rommet", @@ -1103,5 +1103,125 @@ "Want more than a community? Get your own server": "Treng du meir enn eit fellesskap? Skaff din eigen server", "Sign In or Create Account": "Logg inn eller opprett konto", "Create Account": "Opprett konto", - "Sends the given emote coloured as a rainbow": "Sendar emojien med regnbogefargar" + "Sends the given emote coloured as a rainbow": "Sendar emojien med regnbogefargar", + "You do not have permission to invite people to this room.": "Du har ikkje lov til å invitera andre til dette rommet.", + "The user must be unbanned before they can be invited.": "Blokkeringa av brukaren må fjernast før dei kan bli inviterte.", + "Show padlocks on invite only rooms": "Vis hengelås på lukka rom (invite-only)", + "Show join/leave messages (invites/kicks/bans unaffected)": "Vis bli-med/forlat meldingar (ekskluderer invitasjonar/utkasting/blokkeringar)", + "Prompt before sending invites to potentially invalid matrix IDs": "Spør før utsending av invitasjonar til potensielle ugyldige Matrix-IDar", + "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ved å fjerne koplinga mot din identitetstenar, vil ikkje brukaren din bli oppdaga av andre brukarar, og du kan heller ikkje invitera andre med e-post eller telefonnummer.", + "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Å bruke ein identitetstenar er frivillig. Om du vel å ikkje bruke dette, vil ikkje brukaren din bli oppdaga av andre brukarar, og du kan ikkje invitera andre med e-post eller telefonnummer.", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Passordet ditt vart endra. Du vil ikkje motta push-varslingar på andre sesjonar, før etter til at du har logga inn på nytt der", + "Error downloading theme information.": "Feil under nedlasting av temainformasjon.", + "Theme added!": "Tema lagt til!", + "Email addresses": "E-postadresser", + "Phone numbers": "Telefonnummer", + "Set a new account password...": "Lag nytt kontopassord...", + "Help & About": "Hjelp & Om", + "Bug reporting": "Feilrapportering", + "Accept all %(invitedRooms)s invites": "Aksepter alle invitasjonar frå %(invitedRooms)s", + "Security & Privacy": "Sikkerheit og personvern", + "Error changing power level requirement": "Feil under endring av krav for tilgangsnivå", + "Error changing power level": "Feil under endring av tilgangsnivå", + "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Ein feil skjedde under endring av tilgangsnivå. Sjekk at du har lov til dette, deretter prøv på nytt.", + "Invite users": "Inviter brukarar", + "Invite only": "Berre invitasjonar", + "Scroll to most recent messages": "Gå til dei nyaste meldingane", + "Close preview": "Lukk førehandsvisninga", + "No recent messages by %(user)s found": "Fann ingen nyare meldingar frå %(user)s", + "Try scrolling up in the timeline to see if there are any earlier ones.": "Prøv å rulle oppover i historikken for å sjå om det finst nokon eldre.", + "Remove recent messages by %(user)s": "Fjern nyare meldingar frå %(user)s", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "Du prøver å fjerna %(count)s meldingar frå %(user)s. Dette kan ikkje angrast. Ynskjer du å gå vidare?", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Du prøver å fjerna 1 melding frå %(user)s. Dette kan ikkje angrast. Ynskjer du å gå vidare?", + "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "Ved store mengder meldingar kan dette ta tid. Ver venleg å ikkje last om klienten din mens dette pågår.", + "Remove %(count)s messages|other": "Fjern %(count)s meldingar", + "Remove %(count)s messages|one": "Fjern 1 melding", + "Deactivate user?": "Deaktivere brukar?", + "Deactivate user": "Deaktiver brukar", + "Failed to deactivate user": "Fekk ikkje til å deaktivere brukaren", + "No sessions with registered encryption keys": "Ingen sesjonar med registrerte krypteringsnøklar", + "Remove recent messages": "Fjern nyare meldingar", + "Send a reply…": "Send eit svar…", + "Send a message…": "Send melding…", + "The conversation continues here.": "Samtalen held fram her.", + "This room has been replaced and is no longer active.": "Dette rommet er erstatta og er ikkje lenger aktivt.", + "Bold": "Feit", + "Italics": "Kursiv", + "Strikethrough": "Gjennomstreka", + "Code block": "Kodeblokk", + "Room %(name)s": "Rom %(name)s", + "Recent rooms": "Siste rom", + "Direct Messages": "Direktemeldingar", + "Joining room …": "Blir med i rommet…", + "Loading …": "Lastar…", + "Rejecting invite …": "Avviser invitasjon…", + "Join the conversation with an account": "Bli med i samtalen med ein konto", + "Sign Up": "Registrer deg", + "Loading room preview": "Lastar førehandsvisning av rommet", + "You were kicked from %(roomName)s by %(memberName)s": "Du vart sparka frå %(roomName)s av %(memberName)s", + "Reason: %(reason)s": "Grunn: %(reason)s", + "Forget this room": "Gløym dette rommet", + "Re-join": "Bli med på nytt", + "You were banned from %(roomName)s by %(memberName)s": "Du vart blokkert frå %(roomName)s av %(memberName)s", + "Something went wrong with your invite to %(roomName)s": "Noko gjekk gale med invitasjonen din for %(roomName)s", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Ein feilkode %(errcode)s vart returnert under validering av invitasjonen din. Send gjerne denne informasjonen til ein rom-administrator.", + "You can only join it with a working invite.": "Du kan berre bli med med ein fungerande invitasjon.", + "Try to join anyway": "Prøv å bli med likevel", + "You can still join it because this is a public room.": "Du kan fortsatt bli med fordi dette er eit offentleg rom.", + "Join the discussion": "Bli med i diskusjonen", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Invitasjonen til %(roomName)s vart sendt til %(email)s, som ikkje er tilknytta din konto", + "Link this email with your account in Settings to receive invites directly in Riot.": "Knytt denne e-posten opp til kontoen din under Innstillingar, for å direkte ta i mot invitasjonar i Riot.", + "This invite to %(roomName)s was sent to %(email)s": "Denne invitasjonen for %(roomName)s vart sendt til %(email)s", + "Use an identity server in Settings to receive invites directly in Riot.": "Bruk ein identitetstenar under Innstillingar, for å direkte ta i mot invitasjonar i Riot.", + "Share this email in Settings to receive invites directly in Riot.": "Del denne e-postadresa i Innstillingar, for å direkte ta i mot invitasjonar i Riot.", + "Do you want to chat with %(user)s?": "Ynskjer du å chatte med %(user)s?", + " wants to chat": " vil chatte med deg", + "Start chatting": "Start chatting", + "Do you want to join %(roomName)s?": "Ynskjer du å bli med i %(roomName)s?", + " invited you": " inviterte deg", + "Reject & Ignore user": "Avslå og ignorer brukar", + "You're previewing %(roomName)s. Want to join it?": "Du førehandsviser %(roomName)s. Ynskjer du å bli med ?", + "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s kan ikkje førehandsvisast. Ynskjer du å bli med ?", + "This room doesn't exist. Are you sure you're at the right place?": "Dette rommet eksisterar ikkje. Er du sikker på at du er på rett plass?", + "Try again later, or ask a room admin to check if you have access.": "Prøv igjen seinare, eller spør ein rom-administrator om du har tilgang.", + "Never lose encrypted messages": "Aldri la krypterte meldingar gå tapt", + "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Meldingane i rommet er sikra med ende-til-ende kryptering. Berre du og mottakarane har krypteringsnøklane for desse meldingane.", + "Securely back up your keys to avoid losing them. Learn more.": "Kopier nøklane dine for å unngå i miste dei. Les meir.", + "Not now": "Ikkje no", + "Don't ask me again": "Ikkje spør meg igjen", + "%(count)s unread messages.|other": "%(count)s uleste meldingar.", + "%(count)s unread messages.|one": "1 ulesen melding.", + "Unread messages.": "Uleste meldingar.", + "Unknown Command": "Ukjend kommando", + "You can use /help to list available commands. Did you mean to send this as a message?": "Du kan bruke /help for å liste kommandoar. Meinte du å sende dette som ein melding ?", + "Hint: Begin your message with // to start it with a slash.": "Hint: Start meldinga med // for å starte den med skråstrek.", + "Send as message": "Send som melding", + "Failed to revoke invite": "Fekk ikkje til å trekke invitasjonen", + "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "Fekk ikkje til å trekke invitasjonen. Det kan ha oppstått eit midlertidig problem på serveren, eller så har ikkje du tilstrekkelege rettigheiter for å trekke invitasjonen.", + "Revoke invite": "Trekk invitasjon", + "Invited by %(sender)s": "Invitert av %(sender)s", + "Mark all as read": "Merk alle som lesne", + "Error updating main address": "Feil under oppdatering av hovedadresse", + "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Det skjedde ein feil under oppdatering av hovedadressa for rommet. Det kan hende at dette er midlertidig, eller at det ikkje er tillate på serveren.", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Feil under oppdatering av sekundæradresse. Det kan hende at dette er midlertidig, eller at det ikkje er tillate på serveren.", + "Error creating alias": "Feil under oppretting av alias", + "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.": "Det skjedde ein feil under oppretting av dette aliaset. Det kan hende at dette er midlertidig, eller at det ikkje er tillate på serveren.", + "You don't have permission to delete the alias.": "Du har ikkje lov å slette aliaset.", + "There was an error removing that alias. It may no longer exist or a temporary error occurred.": "Det skjedde ein feil under fjerning av aliaset. Det kan hende at dette er midlertidig, eller at det ikkje eksisterar lengre.", + "Error removing alias": "Feil ved fjerning av alias", + "Main address": "Hovudadresse", + "Local address": "Lokal adresse", + "Published Addresses": "Publisert adresse", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Publiserte adresser kan bli brukt av alle uansett server for å bli med i rommet. For å publisere ei adresse, må den vere sett som ei lokal adresse fyrst.", + "Other published addresses:": "Andre publiserte adresser:", + "No other published addresses yet, add one below": "Ingen publiserte adresser til no, legg til ei under", + "New published address (e.g. #alias:server)": "Ny publisert adresse (t.d. #alias:server)", + "Local Addresses": "Lokale adresser", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Sett adresse for dette rommet, slik at brukarar kan finne rommet på din heimeserver (%(localDomain)s)", + "Error updating flair": "Oppdatering av etikett gjekk gale", + "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Feil under oppdatering av etikett for dette rommet. Dette kan vere deaktivert på server , eller så oppstod det ein feil.", + "Room Name": "Romnamn", + "Room Topic": "Rom-emne", + "Room avatar": "Rom-avatar", + "Power level": "Tilgangsnivå" } From ec49dccadc1e132ff4db4ab1e4c35fe50ec2712c Mon Sep 17 00:00:00 2001 From: "Nils J. Haugen" Date: Wed, 1 Apr 2020 23:51:05 +0000 Subject: [PATCH 061/230] Translated using Weblate (Norwegian Nynorsk) Currently translated at 52.9% (1194 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index bae0f650b3..f44cf1e7e7 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -1223,5 +1223,6 @@ "Room Name": "Romnamn", "Room Topic": "Rom-emne", "Room avatar": "Rom-avatar", - "Power level": "Tilgangsnivå" + "Power level": "Tilgangsnivå", + "Voice & Video": "Tale & Video" } From d19ef7cddd7314b307e83884d4c03b07447367c2 Mon Sep 17 00:00:00 2001 From: "Nils J. Haugen" Date: Wed, 1 Apr 2020 23:51:42 +0000 Subject: [PATCH 062/230] Translated using Weblate (Norwegian Nynorsk) Currently translated at 55.4% (1250 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 150 +++++++++++++++++++++++++++------------ 1 file changed, 104 insertions(+), 46 deletions(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index f44cf1e7e7..e4cba0347f 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -13,7 +13,7 @@ "Answer": "Svar", "You are already in a call.": "Du er allereie i ei samtale.", "VoIP is unsupported": "VoIP er ikkje støtta", - "You cannot place VoIP calls in this browser.": "Du kan ikkje samtala med VoIP i denne nettlesaren.", + "You cannot place VoIP calls in this browser.": "Du kan ikkje utføre med anrop med VoIP i denne nettlesaren.", "You cannot place a call with yourself.": "Du kan ikkje samtala med deg sjølv.", "Could not connect to the integration server": "Kunne ikkje kopla til integreringstenaren", "Call in Progress": "Ei Samtale er i Gang", @@ -21,7 +21,7 @@ "A call is already in progress!": "Ei samtale er i gang allereie!", "Permission Required": "Tillating er Naudsynt", "You do not have permission to start a conference call in this room": "Du har ikkje tillating til å starta ei gruppesamtale i dette rommet", - "Upload Failed": "Opplasting Mislukkast", + "Upload Failed": "Opplasting mislukkast", "Sun": "sø", "Mon": "må", "Tue": "ty", @@ -52,7 +52,7 @@ "Invite new community members": "Inviter nye fellesskapsmedlem", "Invite to Community": "Inviter til Felleskapet", "Which rooms would you like to add to this community?": "Kva rom vil du leggja til i dette fellesskapet?", - "Show these rooms to non-members on the community page and room list?": "Vise desse romma til ikkje-medlem på fellesskapssida og romkatalogen?", + "Show these rooms to non-members on the community page and room list?": "Vis desse romma til ikkje-medlem på fellesskapssida og romkatalogen?", "Add rooms to the community": "Legg til rom i fellesskapet", "Room name or alias": "Romnamn eller alias", "Add to community": "Legg til i fellesskapet", @@ -60,7 +60,7 @@ "Failed to invite users to community": "Fekk ikkje til å invitera brukarar til fellesskapet.", "Failed to invite users to %(groupId)s": "Fekk ikkje til å invitera brukarar til %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Fekk ikkje til å invitera følgjande rom til %(groupId)s:", - "Riot does not have permission to send you notifications - please check your browser settings": "Riot har ikkje tillating til å senda deg varsel - ver venleg og sjekk nettlesarinnstillingane dine", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot har ikkje lov til å senda deg varsel - sjekk nettlesarinnstillingane dine", "Riot was not given permission to send notifications - please try again": "Riot fekk ikkje tillating til å senda varsel - ver venleg og prøv igjen", "Unable to enable Notifications": "Klarte ikkje å skru på Varsel", "This email address was not found": "Denne epostadressa var ikkje funnen", @@ -93,7 +93,7 @@ "Changes your display nickname": "Forandrar kallenamnet ditt", "Invites user with given id to current room": "Inviter brukarar med fylgjande ID inn i gjeldande rom", "Joins room with given alias": "Gjeng inn i eit rom med det gjevne aliaset", - "Leave room": "Far frå rommet", + "Leave room": "Forlat rommet", "Unrecognised room alias:": "Ukjend romalias:", "Kicks user with given id": "Sparkar brukarar med gjeven ID", "Bans user with given id": "Stengjer brukarar med den gjevne IDen ute", @@ -117,7 +117,7 @@ "To use it, just wait for autocomplete results to load and tab through them.": "For å bruka den, vent på at resultata fyller seg ut og tab gjennom dei.", "Deops user with given id": "AvOPar brukarar med den gjevne IDen", "Opens the Developer Tools dialog": "Opnar Utviklarverktøy-tekstboksen", - "Unverify": "Fjern godkjenning", + "Unverify": "Fjern verifikasjon", "Verify...": "Godkjenn...", "Which officially provided instance you are using, if any": "Kva offisielt gjevne instanse du brukar, viss nokon", "The remote side failed to pick up": "Den andre sida tok ikkje røret", @@ -130,8 +130,8 @@ "%(senderName)s invited %(targetName)s.": "%(senderName)s inviterte %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s stengde %(targetName)s ute.", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s endra visingsnamnet sitt til %(displayName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s sette visingsnamnet sitt som %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s fjerna visingsnamnet sitt (%(oldDisplayName)s).", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s sette visningsnamnet sitt som %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s fjerna visningsnamnet sitt (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s fjerna profilbiletet sitt.", "%(senderName)s changed their profile picture.": "%(senderName)s endra profilbiletet sitt.", "%(senderName)s set a profile picture.": "%(senderName)s sette seg eit profilbilete.", @@ -173,10 +173,10 @@ "Unnamed Room": "Rom utan namn", "Your browser does not support the required cryptography extensions": "Nettlesaren din støttar ikkje dei naudsynte kryptografiske utvidingane", "Not a valid Riot keyfile": "Ikkje ei gyldig Riot-nykelfil", - "Authentication check failed: incorrect password?": "Godkjenningssjekk mislukkast: urett passord?", + "Authentication check failed: incorrect password?": "Authentiseringsforsøk mislukkast: feil passord?", "Failed to join room": "Fekk ikkje til å gå inn i rom", "Message Pinning": "Meldingsfesting", - "Use compact timeline layout": "Bruk smal tidslinjeutforming", + "Use compact timeline layout": "Bruk kompakt utforming for historikk", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Vis tidspunkt i 12-timarsform (t.d. 2:30pm)", "Always show message timestamps": "Vis alltid meldingstidspunkt", "Autoplay GIFs and videos": "Spel av GIFar og videoar med ein gong", @@ -214,7 +214,7 @@ "Add": "Legg til", "Failed to upload profile picture!": "Fekk ikkje til å lasta opp profilbilete!", "Upload new:": "Last opp ny:", - "No display name": "Ingen visingsnamn", + "No display name": "Ingen visningsnamn", "New passwords don't match": "Dei nye passorda samsvarar ikkje", "Passwords can't be empty": "Passordsfelta kan ikkje vera tomme", "Warning!": "Åtvaring!", @@ -225,12 +225,12 @@ "New Password": "Nytt Passord", "Confirm password": "Stadfest passord", "Change Password": "Endra Passord", - "Authentication": "Godkjenning", + "Authentication": "Authentisering", "Device ID": "EiningsID", "Last seen": "Sist sedd", - "Failed to set display name": "Fekk ikkje til å setja visingsnamn", - "Error saving email notification preferences": "Klarte ikkje å lagra foretrukne epostvarselinnstillingar", - "An error occurred whilst saving your email notification preferences.": "Noko gjekk gale med lagringa av dine foretrukne epostvarselinstillingar.", + "Failed to set display name": "Fekk ikkje til å setja visningsnamn", + "Error saving email notification preferences": "Klarte ikkje å lagra varslingsinnstillingar for e-post", + "An error occurred whilst saving your email notification preferences.": "Noko gjekk gale med lagringa av varslingsinnstillingar for e-post.", "Keywords": "Nykelord", "Enter keywords separated by a comma:": "Skriv inn nykelord med komma imellom:", "OK": "Greitt", @@ -241,7 +241,7 @@ "Notify for all other messages/rooms": "Varsl for alle andre meldingar/rom", "Notify me for anything else": "Varsl meg for kva som helst anna", "Enable notifications for this account": "Skru varsel på for denne brukaren", - "All notifications are currently disabled for all targets.": "Alle varsel er for augeblunket skrudd av for alle mål.", + "All notifications are currently disabled for all targets.": "Alle varsel er for akkurat no skrudd av for alle mål.", "Enable email notifications": "Skru epostvarsel på", "Notifications on the following keywords follow rules which can’t be displayed here:": "Varsel på fylgjande nykelord følgjer reglar som ikkje kan visast her:", "Unable to fetch notification target list": "Klarte ikkje å henta varselmållista", @@ -340,7 +340,7 @@ "No rooms to show": "Ingen rom å visa", "Unnamed room": "Rom utan namn", "Guests can join": "Gjester kan bli med", - "Save": "Lagr", + "Save": "Lagre", "(~%(count)s results)|other": "(~%(count)s resultat)", "(~%(count)s results)|one": "(~%(count)s resultat)", "Join Room": "Bli med i rom", @@ -363,10 +363,10 @@ "Banned by %(displayName)s": "Stengd ute av %(displayName)s", "unknown error code": "ukjend feilkode", "Failed to forget room %(errCode)s": "Fekk ikkje til å gløyma rommet %(errCode)s", - "No users have specific privileges in this room": "Ingen brukarar har særeigne rettar i dette rommet", - "Privileged Users": "Brukarar med Særrett", - "Muted Users": "Stilna Brukarar", - "Banned users": "Utestengde Brukarar", + "No users have specific privileges in this room": "Ingen brukarar har spesifikke rettigheiter i dette rommet", + "Privileged Users": "Privilegerte brukarar", + "Muted Users": "Dempa brukarar", + "Banned users": "Utestengde brukarar", "Favourite": "Yndling", "Guests cannot join this room even if explicitly invited.": "Gjester kan ikkje bli med i dette rommet, sjølv om dei vart spesifikt invitert.", "Click here to fix": "Klikk her for å retta opp i det", @@ -374,13 +374,13 @@ "Only people who have been invited": "Berre dei som har vorte inviterte", "Anyone who knows the room's link, apart from guests": "Dei som kjenner lenkja til rommet, sett vekk frå gjester", "Anyone who knows the room's link, including guests": "Dei som kjenner lenkja til rommet, gjester òg", - "Publish this room to the public in %(domain)s's room directory?": "Gjer dette rommet offentleg i %(domain)s sitt romutval?", + "Publish this room to the public in %(domain)s's room directory?": "Gjer dette rommet offentleg i %(domain)s sitt romkatalog?", "Who can read history?": "Kven kan lesa historia?", "Anyone": "Kven som helst", "Members only (since the point in time of selecting this option)": "Berre medlemmar (frå då denne innstillinga vart skrudd på)", "Members only (since they were invited)": "Berre medlemmar (frå då dei vart inviterte inn)", "Members only (since they joined)": "Berre medlemmar (frå då dei kom inn)", - "Permissions": "Tillatinger", + "Permissions": "Tillatelsar", "Advanced": "Avansert", "Add a topic": "Legg til eit emne", "Search…": "Søk…", @@ -440,7 +440,7 @@ "A text message has been sent to %(msisdn)s": "Ei tekstmelding vart send til %(msisdn)s", "Please enter the code it contains:": "Ver venleg og skriv koden den inneheld inn:", "Code": "Kode", - "Start authentication": "Byrj godkjenning", + "Start authentication": "Start authentisering", "powered by Matrix": "Matrixdriven", "The email field must not be blank.": "Epostfeltet kan ikkje vera tomt.", "The phone number field must not be blank.": "Telefonnummerfeltet kan ikkje vera tomt.", @@ -462,7 +462,7 @@ "Failed to remove '%(roomName)s' from %(groupId)s": "Fekk ikkje til å fjerna '%(roomName)s' frå %(groupId)s", "Something went wrong!": "Noko gjekk gale!", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Kunne ikkje oppdatera synligheita til '%(roomName)s' i %(groupId)s.", - "Visibility in Room List": "Synligheit i Romlista", + "Visibility in Room List": "Synllegheit i romkatalogen", "Visible to everyone": "Synleg for alle", "Only visible to community members": "Berre synleg for medlemmar av fellesskapet", "Something went wrong when trying to get your communities.": "Noko gjekk gale under innlasting av fellesskapa du er med i.", @@ -553,7 +553,7 @@ "collapse": "Slå saman", "expand": "Utvid", "In reply to ": "Som svar til ", - "Room directory": "Romutval", + "Room directory": "Romkatalog", "Start chat": "Start samtale", "And %(count)s more...|other": "Og %(count)s til...", "ex. @bob:example.com": "t.d. @ivar:eksempel.no", @@ -605,7 +605,7 @@ "Toolbox": "Verktøykasse", "Developer Tools": "Utviklarverktøy", "An error has occurred.": "Noko gjekk gale.", - "Start verification": "Byrj godkjenning", + "Start verification": "Start verifikasjon", "Share without verifying": "Del utan å godkjenna", "Ignore request": "Oversjå førespurnad", "Encryption key request": "Krypteringsnykel-førespurnad", @@ -619,7 +619,7 @@ "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Det kan henda at å tømma nettlesarlageret rettar opp i det, men det loggar deg ut og kan gjera den krypterte pratehistoria uleseleg.", "Invalid Email Address": "Ugangbar Epostadresse", "This doesn't appear to be a valid email address": "Det ser ikkje ut til at epostadressa er gangbar", - "Verification Pending": "Ventar på Godkjenning", + "Verification Pending": "Ventar på verifikasjon", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ver venleg og sjekk eposten din og klikk på lenkja du har fått. Når det er gjort, klikk gå fram.", "Unable to add email address": "Klarte ikkje å leggja epostadressa til", "Unable to verify email address.": "Klarte ikkje å stadfesta epostadressa.", @@ -669,12 +669,12 @@ "All messages (noisy)": "Alle meldingar (bråket)", "All messages": "Alle meldingar", "Mentions only": "Berre når eg vert nemnd", - "Leave": "Far frå", + "Leave": "Forlat", "Forget": "Gløym", "Low Priority": "Lågrett", "Direct Chat": "Direktesamtale", "View Community": "Sjå Fellesskap", - "Sorry, your browser is not able to run Riot.": "Orsak, nettlesaren din klarer ikkje å køyra Riot.", + "Sorry, your browser is not able to run Riot.": "Beklagar, nettlesaren din klarer ikkje å køyra Riot.", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot brukar mange avanserte nettlesarfunksjonar, og nokre av dei er ikkje tilgjengelege eller under utprøving i nettlesaren din.", "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Med denne nettlesaren, er det mogleg at synet og kjensla av applikasjonen er fullstendig gale, og nokre eller alle funksjonar verkar kanskje ikkje. Viss du vil prøva likevel kan du gå fram, men då du må sjølv handtera alle vanskar du møter på!", "I understand the risks and wish to continue": "Eg forstår farane og vil gå fram", @@ -701,7 +701,7 @@ "Unable to accept invite": "Fekk ikkje til å seia ja til innbydinga", "Unable to join community": "Fekk ikkje til å bli med i fellesskapet", "Leave Community": "Forlat fellesskapet", - "Leave %(groupName)s?": "Far frå %(groupName)s?", + "Leave %(groupName)s?": "Forlat %(groupName)s?", "Unable to leave community": "Fekk ikkje til å forlate fellesskapet", "Community Settings": "Fellesskapsinnstillingar", "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Endringar gjort på felleskapsnamn og felleskapsavatar blir kanskje ikkje synleg for andre før etter 30 minutt.", @@ -723,10 +723,10 @@ "Failed to load %(groupId)s": "Fekk ikkje til å lasta %(groupId)s", "Failed to reject invitation": "Fekk ikkje til å seia nei til innbyding", "This room is not public. You will not be able to rejoin without an invite.": "Dette rommet er ikkje offentleg. Du kjem ikkje til å kunna koma inn att utan ei innbyding.", - "Are you sure you want to leave the room '%(roomName)s'?": "Er du sikker på at du vil fara frå rommet '%(roomName)s'?", - "Failed to leave room": "Fekk ikkje til å fara frå rommet", - "Can't leave Server Notices room": "Kan ikkje fara frå Tenarvarsel-rommet", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "Dette rommet er for viktige meldingar frå Heimtenaren, so du kan ikkje fara frå det.", + "Are you sure you want to leave the room '%(roomName)s'?": "Er du sikker på at du vil forlate rommet '%(roomName)s'?", + "Failed to leave room": "Fekk ikkje til å forlate rommet", + "Can't leave Server Notices room": "Kan ikkje forlate Systemvarsel-rommet", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Dette rommet er for viktige meldingar frå Heimtenaren, så du kan ikkje forlate det.", "Signed Out": "Logga Ut", "For security, this session has been signed out. Please sign in again.": "Av sikkerheitsgrunnar har denne øykta vorte logga ut. Ver venleg og logg inn att.", "Terms and Conditions": "Vilkår og Føresetnader", @@ -762,7 +762,7 @@ "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Send alle på nytt eller avbryt alle. Du kan ogso velja enkelte meldingar til sending på nytt eller avbryting.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Send melding på nytt eller avbryt.", "Connectivity to the server has been lost.": "Tilkoplinga til tenaren vart tapt.", - "Sent messages will be stored until your connection has returned.": "Sende meldingar lagrast ikkje før tilkoplinga di er attende.", + "Sent messages will be stored until your connection has returned.": "Sendte meldingar lagrast ikkje før tilkoplinga di er tilbake.", "Active call": "Pågåande samtale", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Det er ingen andre her! Vil du byda andre inn eller enda åtvaringa om det tomme rommet??", "You seem to be uploading files, are you sure you want to quit?": "Det ser ut til at du lastar opp filer, er du sikker på at du vil avslutte?", @@ -777,14 +777,14 @@ "Click to mute video": "Klikk for å stilna videoen", "Click to unmute audio": "Klikk for å avstilna ljoden", "Click to mute audio": "Klikk for å dempe lyden", - "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Prøvde å laste eit bestemt punkt i rommet si tidslinje, men du har ikkje lov til å sjå den spesifike meldingen.", - "Tried to load a specific point in this room's timeline, but was unable to find it.": "Prøvde å lasta eit bestemt punkt i rommet si tidslinje, men klarde ikkje å finna det.", - "Failed to load timeline position": "Fekk ikkje til å lasta tidslinjestillinga", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Prøvde å laste eit bestemt punkt i rommet sin historikk, men du har ikkje lov til å sjå den spesifike meldingen.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Prøvde å lasta eit bestemt punkt i rommet sin historikk, men klarde ikkje å finna det.", + "Failed to load timeline position": "Innlasting av punkt i historikken feila.", "Uploading %(filename)s and %(count)s others|other": "Lastar opp %(filename)s og %(count)s andre", "Uploading %(filename)s and %(count)s others|zero": "Lastar opp %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Lastar opp %(filename)s og %(count)s andre", - "Light theme": "Ljost preg", - "Dark theme": "Dimt preg", + "Light theme": "Lyst tema", + "Dark theme": "Mørkt tema", "Success": "Suksess", "Unable to remove contact information": "Klarte ikkje å fjerna kontaktinfo", "": "", @@ -797,7 +797,7 @@ "Labs": "Labben", "Check for update": "Sjå etter oppdateringar", "Reject all %(invitedRooms)s invites": "Kanseller alle invitasjonar frå %(invitedRooms)s", - "Start automatically after system login": "Byrj av seg sjølv etter systeminnlogging", + "Start automatically after system login": "Start automagisk etter systeminnlogging", "No media permissions": "Ingen mediatilgang", "You may need to manually permit Riot to access your microphone/webcam": "Det kan henda at du må gje Riot tilgang til mikrofonen/nettkameraet for hand", "No Audio Outputs detected": "Ingen ljodavspelingseiningar funne", @@ -829,7 +829,7 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Kan ikkje koble til heimeserveren via HTTP fordi URL-adressa i nettlesaren er HTTPS. Bruk HTTPS, eller aktiver usikre skript.", "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.": "Kan ikkje kopla til heimtenaren - ver venleg og sjekk tilkoplinga di, og sjå til at heimtenaren din sitt CCL-sertifikat er stolt på og at ein nettlesartillegg ikkje hindrar førespurnader.", "Failed to fetch avatar URL": "Klarte ikkje å henta avatar-URLen", - "Set a display name:": "Set eit visingsnamn:", + "Set a display name:": "Set eit visningsnamn:", "Upload an avatar:": "Last opp ein avatar:", "This server does not support authentication with a phone number.": "Denne tenaren støttar ikkje stadfesting gjennom telefonnummer.", "Commands": "Kommandoar", @@ -841,7 +841,7 @@ "unknown device": "ukjend eining", "NOT verified": "IKKJE godkjend", "verified": "godkjend", - "Verification": "Godkjenning", + "Verification": "Verifikasjon", "Ed25519 fingerprint": "Ed25519-fingeravtrykk", "User ID": "Brukar-ID", "Curve25519 identity key": "Curve25519-identitetsnøkkel", @@ -912,7 +912,7 @@ "Please contact your service administrator to continue using the service.": "Ver venleg og tak kontakt med tenesteadministratoren for å halda fram med å bruka tenesten.", "This homeserver has hit its Monthly Active User limit.": "Heimtenaren har truffe den Månadlege Grensa si for Aktive Brukarar.", "This homeserver has exceeded one of its resource limits.": "Heimtenaren har gått over ei av ressursgrensene sine.", - "Whether or not you're logged in (we don't record your username)": "Anten du er innlogga eller ikkje ( lagrar vi ikkje brukarnamnet ditt)", + "Whether or not you're logged in (we don't record your username)": "Uansett om du er innlogga eller ikkje (så lagrar vi ikkje brukarnamnet ditt)", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Fila %(fileName)s er større enn heimetenaren si grense for opplastningar", "Unable to load! Check your network connectivity and try again.": "Klarte ikkje lasta! Sjå på nettilkoplinga di og prøv igjen.", "Your Riot is misconfigured": "Riot-klienten din er feilkonfiguert", @@ -1224,5 +1224,63 @@ "Room Topic": "Rom-emne", "Room avatar": "Rom-avatar", "Power level": "Tilgangsnivå", - "Voice & Video": "Tale & Video" + "Voice & Video": "Tale & Video", + "Show a presence dot next to DMs in the room list": "Vis ein status-dot ved sida av DM-ar i romkatalogen", + "Show info about bridges in room settings": "Vis info om bruer under rominnstillingar", + "Show display name changes": "Vis endringar for visningsnamn", + "Match system theme": "Følg systemtema", + "Show shortcuts to recently viewed rooms above the room list": "Vis snarvegar til sist synte rom over romkatalogen", + "Show hidden events in timeline": "Vis skjulte hendelsar i historikken", + "This is your list of users/servers you have blocked - don't leave the room!": "Dette er di liste over brukarar/serverar du har blokkert - ikkje forlat rommet!", + "Upload": "Last opp", + "Show less": "Vis mindre", + "Show more": "Vis meir", + "Display Name": "Visningsnamn", + "Invalid theme schema.": "", + "Language and region": "Språk og region", + "General": "Generelt", + "Preferences": "Innstillingar", + "Room list": "Romkatalog", + "Timeline": "Historikk", + "Autocomplete delay (ms)": "Forsinkelse på autofullfør (ms)", + "Room information": "Rominformasjon", + "Developer options": "Utviklaralternativ", + "Open Devtools": "Opne Utviklingsverktøy", + "Room Addresses": "Romadresser", + "Sounds": "Lydar", + "Browse": "Bla gjennom", + "Change room avatar": "Endre rom-avatar", + "Change room name": "Endre romnamn", + "Change main address for the room": "Endre hovudadresse for rommet", + "Change history visibility": "Endre synlegheit for historikk", + "Change permissions": "Endre rettigheiter", + "Change topic": "Endre emne", + "Upgrade the room": "Oppgradere rommet", + "Enable room encryption": "Aktivere romkryptering", + "Modify widgets": "Endre programtillegg (widgets)", + "Default role": "Standard-rolle", + "Send messages": "Sende melding", + "Change settings": "Endre innstillingar", + "Kick users": "Sparke brukarar", + "Ban users": "Stenge ute brukarar", + "Remove messages": "Fjerne meldingar", + "Notify everyone": "Varsle alle", + "Send %(eventType)s events": "Sende %(eventType)s hendelsar", + "Roles & Permissions": "Roller & Tilgangsrettar", + "Select the roles required to change various parts of the room": "Juster roller som er påkrevd for å endre ulike deler av rommet", + "Once enabled, encryption cannot be disabled.": "Etter aktivering, kan ikkje kryptering bli deaktivert.", + "Your display name": "Ditt visningsnamn", + "Can't find this server or its room list": "Klarde ikkje å finne serveren eller romkatalogen til den", + "Upload completed": "Opplasting fullført", + "Cancelled signature upload": "Kansellerte opplasting av signatur", + "Unabled to upload": "Klarte ikkje å laste opp", + "Room Settings - %(roomName)s": "Rominnstillingar - %(roomName)s", + "Riot failed to get the public room list.": "Riot fekk ikkje til å hente offentleg romkatalog.", + "Room List": "Romkatalog", + "Navigate up/down in the room list": "Naviger opp/ned i romkatalogen", + "Select room from the room list": "Vel rom frå romkatalogen", + "Collapse room list section": "Minimer romkatalog-seksjonen", + "Expand room list section": "Utvid romkatalog-seksjonen", + "Clear room list filter field": "Nullstill filteret for romkatalogen", + "Scroll up/down in the timeline": "Rull opp/ned i historikken" } From 87ba5f4c8a7852eaceea496e6972485a75bcc376 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 2 Apr 2020 03:16:02 +0000 Subject: [PATCH 063/230] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2256 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 32dc7532f4..e7c0e118d6 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2308,5 +2308,17 @@ "Session backup key:": "工作階段備份金鑰:", "Sends a message as html, without interpreting it as markdown": "以 html 形式傳送訊息,不將其翻譯為 markdown", "Cancel replying to a message": "取消回覆訊息", - "Sign in with SSO": "使用單一登入系統登入" + "Sign in with SSO": "使用單一登入系統登入", + "Use Single Sign On to continue": "使用單一登入繼續", + "Confirm adding this email address by using Single Sign On to prove your identity.": "透過使用單一登入來證明您的身份以確認新增此電子郵件地址。", + "Single Sign On": "單一登入", + "Confirm adding email": "確任新增電子郵件", + "Click the button below to confirm adding this email address.": "點擊下方按鈕以確認新增此電子郵件地址。", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "透過使用單一登入來證明您的身份以確認新增此電話號碼。", + "Confirm adding phone number": "確任新增電話號碼", + "Click the button below to confirm adding this phone number.": "點擊下方按鈕以確認新增此電話號碼。", + "Confirm deleting these sessions by using Single Sign On to prove your identity.": "透過使用單一登入來證明您的身份以確認刪除這些工作階段。", + "Confirm deleting these sessions": "確認刪除這些工作階段", + "Click the button below to confirm deleting these sessions.": "點擊下方按鈕以確認刪除這些工作階段。", + "Delete sessions": "刪除工作階段" } From 0f1ebb01072e0bb99e5f43a1a2f892c3ef6a398a Mon Sep 17 00:00:00 2001 From: "Nils J. Haugen" Date: Thu, 2 Apr 2020 00:56:47 +0000 Subject: [PATCH 064/230] Translated using Weblate (Norwegian Nynorsk) Currently translated at 57.0% (1287 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 71 ++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index e4cba0347f..f71ab4fa94 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -183,7 +183,7 @@ "Always show encryption icons": "Vis alltid krypteringsikon", "Disable Notifications": "Skru Varsel av", "Enable Notifications": "Skru Varsel på", - "Automatically replace plain text Emoji": "Erstatt Emojiar i plaintekst av seg sjølv", + "Automatically replace plain text Emoji": "Erstatt Emojiar i klartekst av seg sjølv", "Mirror local video feed": "Spegl den lokale videofeeden", "Send analytics data": "Send statistikkdata", "Enable URL previews for this room (only affects you)": "Skru URL-førehandsvisingar på for dette rommet (påverkar deg åleine)", @@ -195,10 +195,10 @@ "Uploading report": "Lastar rapport opp", "Waiting for response from server": "Ventar på svar frå tenaren", "Messages containing my display name": "Meldingar som inneheld visingsnamnet mitt", - "Messages in one-to-one chats": "Meldingar i ein-til-ein-samtaler", - "Messages in group chats": "Meldingar i gruppesamtaler", + "Messages in one-to-one chats": "Meldingar i ein-til-ein-samtalar", + "Messages in group chats": "Meldingar i gruppesamtalar", "When I'm invited to a room": "Når eg blir invitert til eit rom", - "Call invitation": "Samtaleinnbydingar", + "Call invitation": "Samtaleinvitasjonar", "Messages sent by bot": "Meldingar sendt frå ein bot", "Active call (%(roomName)s)": "Pågåande samtale (%(roomName)s)", "unknown caller": "ukjend ringar", @@ -220,7 +220,7 @@ "Warning!": "Åtvaring!", "Continue": "Gå fram", "Do you want to set an email address?": "Vil du setja ei epostadresse?", - "Current password": "Noverande passord", + "Current password": "Gjeldande passord", "Password": "Passord", "New Password": "Nytt Passord", "Confirm password": "Stadfest passord", @@ -231,19 +231,19 @@ "Failed to set display name": "Fekk ikkje til å setja visningsnamn", "Error saving email notification preferences": "Klarte ikkje å lagra varslingsinnstillingar for e-post", "An error occurred whilst saving your email notification preferences.": "Noko gjekk gale med lagringa av varslingsinnstillingar for e-post.", - "Keywords": "Nykelord", - "Enter keywords separated by a comma:": "Skriv inn nykelord med komma imellom:", + "Keywords": "Nøkkelord", + "Enter keywords separated by a comma:": "Skriv inn nøkkelord med komma imellom:", "OK": "Greitt", "Failed to change settings": "Klarte ikkje å endra innstillingar", "Can't update user notification settings": "Kan ikkje oppdatera brukarvarselinstillingar", - "Failed to update keywords": "Fekk ikkje til å oppdatera nykelord", - "Messages containing keywords": "Meldingar som inneheld nykelord", + "Failed to update keywords": "Fekk ikkje til å oppdatera nøkkelord", + "Messages containing keywords": "Meldingar som inneheld nøkkelord", "Notify for all other messages/rooms": "Varsl for alle andre meldingar/rom", "Notify me for anything else": "Varsl meg for kva som helst anna", - "Enable notifications for this account": "Skru varsel på for denne brukaren", + "Enable notifications for this account": "Aktiver varslingar for denne kontoen", "All notifications are currently disabled for all targets.": "Alle varsel er for akkurat no skrudd av for alle mål.", "Enable email notifications": "Skru epostvarsel på", - "Notifications on the following keywords follow rules which can’t be displayed here:": "Varsel på fylgjande nykelord følgjer reglar som ikkje kan visast her:", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Varsel på fylgjande nøkkelord følgjer reglar som ikkje kan visast her:", "Unable to fetch notification target list": "Klarte ikkje å henta varselmållista", "Notification targets": "Varselmål", "Advanced notification settings": "Avanserte varslingsinnstillingar", @@ -251,7 +251,7 @@ "Show message in desktop notification": "Vis meldinga i eit skriverbordsvarsel", "Off": "Av", "On": "På", - "Noisy": "Bråket", + "Noisy": "Bråkete", "Cannot add any more widgets": "Kan ikkje leggja fleire widgets til", "Add a widget": "Legg til ein widget", "Drop File Here": "Slepp Fila Her", @@ -666,7 +666,7 @@ "Quote": "Sitat", "Source URL": "Kjelde-URL", "Collapse Reply Thread": "Slå Svartråden saman", - "All messages (noisy)": "Alle meldingar (bråket)", + "All messages (noisy)": "Alle meldingar (bråkete)", "All messages": "Alle meldingar", "Mentions only": "Berre når eg vert nemnd", "Leave": "Forlat", @@ -788,7 +788,7 @@ "Success": "Suksess", "Unable to remove contact information": "Klarte ikkje å fjerna kontaktinfo", "": "", - "Import E2E room keys": "Hent E2E-romnyklar inn", + "Import E2E room keys": "Hent E2E-romnøklar inn", "Cryptography": "Kryptografi", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Viss du har rapportert inn feil via GitHub, kan feil-loggar hjelpa oss med å finna problemet. Feil-loggar inneheld data om applikasjonsbruk som; brukarnamn, ID-ar, alias på rom eller grupper du har besøkt og brukarnamn for andre brukarar. Loggane inneheld ikkje meldingar.", "Riot collects anonymous analytics to allow us to improve the application.": "Riot samlar anonym statistikk inn slik at ein kan forbetre applikasjonen.", @@ -859,7 +859,7 @@ "You must specify an event type!": "Du må oppgje ein handlingssort!", "Call Timeout": "Tidsavbrot i Samtala", "Enable automatic language detection for syntax highlighting": "Skru automatisk måloppdaging på for syntax-understreking", - "Export E2E room keys": "Hent E2E-romnyklar ut", + "Export E2E room keys": "Hent E2E-romnøklar ut", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Det kan henda at du stilte dei inn på ein annan klient enn Riot. Du kan ikkje stilla på dei i Riot men dei gjeld framleis", "Jump to read receipt": "Hopp til lesen-lappen", "Filter room members": "Filtrer rommedlemmar", @@ -893,7 +893,7 @@ "Server may be unavailable, overloaded, or search timed out :(": "Tenaren er kanskje utilgjengeleg, overlasta, elles så vart søket tidsavbrote :(", "Clear filter": "Tøm filter", "Profile": "Brukar", - "Access Token:": "Tilgangs-Teikn:", + "Access Token:": "Tilgangs-token:", "This homeserver doesn't offer any login flows which are supported by this client.": "Heimeserveren tilbyr ingen påloggingsmetodar som er støtta av denne klienten.", "Claimed Ed25519 fingerprint key": "Gjorde krav på Ed25519-fingeravtrykksnøkkel", "Export room keys": "Eksporter romnøklar", @@ -1282,5 +1282,42 @@ "Collapse room list section": "Minimer romkatalog-seksjonen", "Expand room list section": "Utvid romkatalog-seksjonen", "Clear room list filter field": "Nullstill filteret for romkatalogen", - "Scroll up/down in the timeline": "Rull opp/ned i historikken" + "Scroll up/down in the timeline": "Rull opp/ned i historikken", + "%(displayName)s is typing …": "%(displayName)s skriv…", + "%(names)s and %(count)s others are typing …|other": "%(names)s og %(count)s andre skriv…", + "%(names)s and %(count)s others are typing …|one": "%(names)s og ein annan skriv…", + "%(names)s and %(lastPerson)s are typing …": "%(names)s og %(lastPerson)s skriv…", + "Enable Emoji suggestions while typing": "Aktiver Emoji-forslag under skriving", + "Show a placeholder for removed messages": "Vis ein plassholdar for sletta meldingar", + "Show avatar changes": "Vis avatar-endringar", + "Show read receipts sent by other users": "Vis lest-rapportar sendt av andre brukarar", + "Enable big emoji in chat": "Aktiver store emolji-ar i samtalen", + "Send typing notifications": "Kringkast \"skriv...\"-status til andre", + "Show typing notifications": "Vis \"skriv...\"-status frå andre", + "Show previews/thumbnails for images": "Vis førehandsvisningar/thumbnails for bilete", + "Manually verify all remote sessions": "Manuelt verifiser alle eksterne sesjonar", + "Messages containing my username": "Meldingar som inneheld mitt brukarnamn", + "Messages containing @room": "Meldingar som inneheld @room", + "Encrypted messages in one-to-one chats": "Krypterte meldingar i ein-til-ein-samtalar", + "Encrypted messages in group chats": "Krypterte meldingar i gruppesamtalar", + "When rooms are upgraded": "Når rom blir oppgraderte", + "My Ban List": "Mi blokkeringsliste", + "Upgrade": "Oppgrader", + "Add an email address to configure email notifications": "Legg til ei e-postadresse for å sette opp e-postvarslingar", + "Enable desktop notifications for this session": "Aktiver skrivebordsvarslingar for denne øka", + "Enable audible notifications for this session": "Aktiver høyrbare varslingar for denne økta", + "Upgrade to your own domain": "Oppgrader til ditt eige domene", + "Custom theme URL": "Tilpassa tema-URL", + "Add theme": "Legg til tema", + "Theme": "Tema", + "Credits": "Bidragsytarar", + "For help with using Riot, click here.": "For hjelp med å bruke Riot, klikk her.", + "For help with using Riot, click here or start a chat with our bot using the button below.": "For hjelp med å bruke Riot, klikk her, eller start ein samtale med vår bot ved å bruke knappen under.", + "Clear cache and reload": "Tøm buffer og last inn på nytt", + "Composer": "Teksteditor", + "Upgrade this room to the recommended room version": "Oppgrader dette rommet til anbefalt romversjon", + "Your theme": "Ditt tema", + "Failed to upgrade room": "Fekk ikkje til å oppgradere rom", + "Jump to start/end of the composer": "Hopp til start/slutt av teksteditoren", + "Navigate composer history": "Naviger historikk for teksteditor" } From 43bfa3127e9caa08a8416251d28eab3ebfc10a88 Mon Sep 17 00:00:00 2001 From: random Date: Thu, 2 Apr 2020 09:01:54 +0000 Subject: [PATCH 065/230] Translated using Weblate (Italian) Currently translated at 100.0% (2256 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 628c857d6e..fbb3b2f210 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2306,5 +2306,17 @@ "Compare emoji": "Confronta emoji", "Cancel replying to a message": "Annulla la risposta a un messaggio", "Sends a message as html, without interpreting it as markdown": "Invia un messaggio come html, senza interpretarlo come markdown", - "Sign in with SSO": "Accedi con SSO" + "Sign in with SSO": "Accedi con SSO", + "Use Single Sign On to continue": "Usa Single Sign On per continuare", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Conferma aggiungendo questa email usando Single Sign On per provare la tua identità.", + "Single Sign On": "Single Sign On", + "Confirm adding email": "Conferma aggiungendo email", + "Click the button below to confirm adding this email address.": "Clicca il pulsante sotto per confermare l'aggiunta di questa email.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Conferma aggiungendo questo numero di telefono usando Single Sign On per provare la tua identità.", + "Confirm adding phone number": "Conferma aggiungendo un numero di telefono", + "Click the button below to confirm adding this phone number.": "Clicca il pulsante sotto per confermare l'aggiunta di questo numero di telefono.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Conferma eliminando queste sessioni usando Single Sign On per provare la tua identità.", + "Confirm deleting these sessions": "Conferma eliminando queste sessioni", + "Click the button below to confirm deleting these sessions.": "Clicca il pulsante sotto per confermare l'eliminazione di queste sessioni.", + "Delete sessions": "Elimina sessioni" } From a327cf9d604e54a8972676e704930ab7c1e958ad Mon Sep 17 00:00:00 2001 From: call_xz Date: Thu, 2 Apr 2020 09:49:46 +0000 Subject: [PATCH 066/230] Translated using Weblate (Japanese) Currently translated at 55.1% (1244 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 8254426ce3..79950ab4fc 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1257,5 +1257,20 @@ "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s が部屋名を %(oldRoomName)s から %(newRoomName)s に変更しました。", "Unknown Command": "不明なコマンド", "Unrecognised command: %(commandText)s": "認識されていないコマンド: %(commandText)s", - "Send as message": "メッセージとして送信" + "Send as message": "メッセージとして送信", + "Confirm": "確認", + "Enable audible notifications for this session": "このセッションでは音声通知を有効にする", + "Enable encryption?": "暗号化を有効にしますか?", + "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.": "一度有効にした部屋の暗号化は無効にすることはできません。暗号化された部屋で送信されたメッセージは、サーバーからは見ることができず、その部屋の参加者だけが見ることができます。暗号化を有効にすると、多くのボットやブリッジが正常に動作しなくなる場合があります。暗号化についての詳細はこちらをご覧ください。", + "Enter username": "ユーザー名を入力", + "Email (optional)": "メールアドレス (任意)", + "Phone (optional)": "電話番号 (任意)", + "Create your Matrix account on %(serverName)s": "あなたの Matrix アカウントを %(serverName)s に作成", + "Create your Matrix account on ": "あなたの Matrix アカウントを に作成", + "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "アカウント回復のためのメールアドレスを設定できます。また、メールアドレスや電話番号を既存の知り合いにこのアカウントを発見してもらうために使うこともできます。", + "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "アカウント回復のためのメールアドレスを設定できます。また、メールアドレスを既存の知り合いにこのアカウントを発見してもらうために使うこともできます。", + "Enter your custom homeserver URL What does this mean?": "独自のホームサーバー URL を入力 詳細情報", + "Homeserver URL": "ホームサーバー URL", + "Sign in instead": "サインインする", + "Create your account": "アカウントの作成" } From 1353ddaa96a20514a697cd11d514ba2e99bd241f Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 31 Mar 2020 15:46:11 +0200 Subject: [PATCH 067/230] move qr code data generation to js-sdk --- .../elements/crypto/VerificationQRCode.js | 113 +----------------- .../views/right_panel/VerificationPanel.js | 32 +---- 2 files changed, 8 insertions(+), 137 deletions(-) diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js index 3838aa61ff..5848107b61 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -17,95 +17,17 @@ limitations under the License. import React from "react"; import PropTypes from "prop-types"; import {replaceableComponent} from "../../../../utils/replaceableComponent"; -import {MatrixClientPeg} from "../../../../MatrixClientPeg"; -import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; -import {ToDeviceChannel} from "matrix-js-sdk/src/crypto/verification/request/ToDeviceChannel"; -import {decodeBase64} from "matrix-js-sdk/src/crypto/olmlib"; import Spinner from "../Spinner"; import * as QRCode from "qrcode"; -const CODE_VERSION = 0x02; // the version of binary QR codes we support -const BINARY_PREFIX = "MATRIX"; // ASCII, used to prefix the binary format -const MODE_VERIFY_OTHER_USER = 0x00; // Verifying someone who isn't us -const MODE_VERIFY_SELF_TRUSTED = 0x01; // We trust the master key -const MODE_VERIFY_SELF_UNTRUSTED = 0x02; // We do not trust the master key - @replaceableComponent("views.elements.crypto.VerificationQRCode") export default class VerificationQRCode extends React.PureComponent { static propTypes = { - prefix: PropTypes.string.isRequired, - version: PropTypes.number.isRequired, - mode: PropTypes.number.isRequired, - transactionId: PropTypes.string.isRequired, // or requestEventId - firstKeyB64: PropTypes.string.isRequired, - secondKeyB64: PropTypes.string.isRequired, - secretB64: PropTypes.string.isRequired, + qrCodeData: PropTypes.Object.isRequired, }; - static async getPropsForRequest(verificationRequest: VerificationRequest) { - const cli = MatrixClientPeg.get(); - const myUserId = cli.getUserId(); - const otherUserId = verificationRequest.otherUserId; - - let mode = MODE_VERIFY_OTHER_USER; - if (myUserId === otherUserId) { - // Mode changes depending on whether or not we trust the master cross signing key - const myTrust = cli.checkUserTrust(myUserId); - if (myTrust.isCrossSigningVerified()) { - mode = MODE_VERIFY_SELF_TRUSTED; - } else { - mode = MODE_VERIFY_SELF_UNTRUSTED; - } - } - - const requestEvent = verificationRequest.requestEvent; - const transactionId = requestEvent.getId() - ? requestEvent.getId() - : ToDeviceChannel.getTransactionId(requestEvent); - - const qrProps = { - prefix: BINARY_PREFIX, - version: CODE_VERSION, - mode, - transactionId, - firstKeyB64: '', // worked out shortly - secondKeyB64: '', // worked out shortly - secretB64: verificationRequest.encodedSharedSecret, - }; - - const myCrossSigningInfo = cli.getStoredCrossSigningForUser(myUserId); - const myDevices = (await cli.getStoredDevicesForUser(myUserId)) || []; - - if (mode === MODE_VERIFY_OTHER_USER) { - // First key is our master cross signing key - qrProps.firstKeyB64 = myCrossSigningInfo.getId("master"); - - // Second key is the other user's master cross signing key - const otherUserCrossSigningInfo = cli.getStoredCrossSigningForUser(otherUserId); - qrProps.secondKeyB64 = otherUserCrossSigningInfo.getId("master"); - } else if (mode === MODE_VERIFY_SELF_TRUSTED) { - // First key is our master cross signing key - qrProps.firstKeyB64 = myCrossSigningInfo.getId("master"); - - // Second key is the other device's device key - const otherDevice = verificationRequest.targetDevice; - const otherDeviceId = otherDevice ? otherDevice.deviceId : null; - const device = myDevices.find(d => d.deviceId === otherDeviceId); - qrProps.secondKeyB64 = device.getFingerprint(); - } else if (mode === MODE_VERIFY_SELF_UNTRUSTED) { - // First key is our device's key - qrProps.firstKeyB64 = cli.getDeviceEd25519Key(); - - // Second key is what we think our master cross signing key is - qrProps.secondKeyB64 = myCrossSigningInfo.getId("master"); - } - - return qrProps; - } - constructor(props) { super(props); - this.state = { dataUri: null, }; @@ -119,39 +41,8 @@ export default class VerificationQRCode extends React.PureComponent { } async generateQrCode() { - let buf = Buffer.alloc(0); // we'll concat our way through life - - const appendByte = (b: number) => { - const tmpBuf = Buffer.from([b]); - buf = Buffer.concat([buf, tmpBuf]); - }; - const appendInt = (i: number) => { - const tmpBuf = Buffer.alloc(2); - tmpBuf.writeInt16BE(i, 0); - buf = Buffer.concat([buf, tmpBuf]); - }; - const appendStr = (s: string, enc: string, withLengthPrefix = true) => { - const tmpBuf = Buffer.from(s, enc); - if (withLengthPrefix) appendInt(tmpBuf.byteLength); - buf = Buffer.concat([buf, tmpBuf]); - }; - const appendEncBase64 = (b64: string) => { - const b = decodeBase64(b64); - const tmpBuf = Buffer.from(b); - buf = Buffer.concat([buf, tmpBuf]); - }; - - // Actually build the buffer for the QR code - appendStr(this.props.prefix, "ascii", false); - appendByte(this.props.version); - appendByte(this.props.mode); - appendStr(this.props.transactionId, "utf-8"); - appendEncBase64(this.props.firstKeyB64); - appendEncBase64(this.props.secondKeyB64); - appendEncBase64(this.props.secretB64); - // Now actually assemble the QR code's data URI - const uri = await QRCode.toDataURL([{data: buf, mode: 'byte'}], { + const uri = await QRCode.toDataURL([{data: this.props.qrCodeData.buffer, mode: 'byte'}], { errorCorrectionLevel: 'L', // we want it as trivial-looking as possible }); this.setState({dataUri: uri}); diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 7ba1fb829a..62a552e9a4 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -30,7 +30,7 @@ import { PHASE_READY, PHASE_DONE, PHASE_STARTED, - PHASE_CANCELLED, VerificationRequest, + PHASE_CANCELLED, } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import Spinner from "../elements/Spinner"; @@ -53,22 +53,8 @@ export default class VerificationPanel extends React.PureComponent { constructor(props) { super(props); - this.state = { - qrCodeProps: null, // generated by the VerificationQRCode component itself - }; + this.state = {}; this._hasVerifier = false; - if (this.props.request.otherPartySupportsMethod(SCAN_QR_CODE_METHOD)) { - this._generateQRCodeProps(props.request); - } - } - - async _generateQRCodeProps(verificationRequest: VerificationRequest) { - try { - this.setState({qrCodeProps: await VerificationQRCode.getPropsForRequest(verificationRequest)}); - } catch (e) { - console.error(e); - // Do nothing - we won't render a QR code. - } } renderQRPhase(pending) { @@ -86,16 +72,10 @@ export default class VerificationPanel extends React.PureComponent { let qrBlock; let sasBlock; if (showQR) { - let qrCode; - if (this.state.qrCodeProps) { - qrCode = ; - } else { - qrCode =
; - } qrBlock =

{_t("Scan this unique code")}

- {qrCode} +
; } if (showSAS) { @@ -124,7 +104,7 @@ export default class VerificationPanel extends React.PureComponent { } let qrBlock; - if (this.state.qrCodeProps) { + if (showQR) { qrBlock =

{_t("Verify by scanning")}

{_t("Ask %(displayName)s to scan your code:", { @@ -132,7 +112,7 @@ export default class VerificationPanel extends React.PureComponent { })}

- +
; } @@ -150,7 +130,7 @@ export default class VerificationPanel extends React.PureComponent { ); } - const sasLabel = this.state.qrCodeProps ? + const sasLabel = showQR ? _t("If you can't scan the code above, verify by comparing unique emoji.") : _t("Verify by comparing unique emoji."); sasBlock =
From 00b1afe0fa88a1fa53b743bdc3f6919c54682a95 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 31 Mar 2020 15:46:41 +0200 Subject: [PATCH 068/230] first go at reciprocate UX --- .../views/right_panel/VerificationPanel.js | 96 ++++++++++++------- 1 file changed, 62 insertions(+), 34 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 62a552e9a4..58d07e318c 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -57,7 +57,7 @@ export default class VerificationPanel extends React.PureComponent { this._hasVerifier = false; } - renderQRPhase(pending) { + renderQRPhase() { const {member, request} = this.props; const showSAS = request.otherPartySupportsMethod(verificationMethods.SAS); const showQR = request.otherPartySupportsMethod(SCAN_QR_CODE_METHOD); @@ -119,24 +119,16 @@ export default class VerificationPanel extends React.PureComponent { let sasBlock; if (showSAS) { - let button; - if (pending) { - button = ; - } else { - const disabled = this.state.emojiButtonClicked; - button = ( - - {_t("Verify by emoji")} - - ); - } + const disabled = this.state.emojiButtonClicked; const sasLabel = showQR ? _t("If you can't scan the code above, verify by comparing unique emoji.") : _t("Verify by comparing unique emoji."); sasBlock =

{_t("Verify by emoji")}

{sasLabel}

- { button } + + {_t("Verify by emoji")} +
; } @@ -152,6 +144,30 @@ export default class VerificationPanel extends React.PureComponent { ; } + renderQRReciprocatePhase() { + const {member} = this.props; + const FormButton = sdk.getComponent("elements.FormButton"); + + let body; + if (this.state.reciprocateQREvent) { + // riot web doesn't support scanning yet, so assume here we're the client being scanned. + body = +

{_t("Almost there! Is %(displayName)s show the same shield?", { + displayName: member.displayName || member.name || member.userId, + })}

+ +

+

+
; + } else { + body =

; + } + return
+

{_t("Verify by scanning")}

+ { body } +
; + } + renderVerifiedPhase() { const {member} = this.props; @@ -208,7 +224,7 @@ export default class VerificationPanel extends React.PureComponent { } render() { - const {member, phase} = this.props; + const {member, phase, request} = this.props; const displayName = member.displayName || member.name || member.userId; @@ -216,20 +232,26 @@ export default class VerificationPanel extends React.PureComponent { case PHASE_READY: return this.renderQRPhase(); case PHASE_STARTED: - if (this.state.sasEvent) { - const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); - return
-

{_t("Compare emoji")}

- -
; - } else { - return this.renderQRPhase(true); // keep showing same phase but with a spinner + switch (request.chosenMethod) { + case verificationMethods.RECIPROCATE_QR_CODE: + return this.renderQRReciprocatePhase(); + case verificationMethods.SAS: { + const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); + const emojis = this.state.sasEvent ? + : ; + return
+

{_t("Compare emoji")}

+ { emojis } +
; + } + default: + return null; } case PHASE_DONE: return this.renderVerifiedPhase(); @@ -258,10 +280,12 @@ export default class VerificationPanel extends React.PureComponent { this.state.sasEvent.mismatch(); }; - _onVerifierShowSas = (sasEvent) => { + _updateVerifierState = () => { const {request} = this.props; - request.verifier.off('show_sas', this._onVerifierShowSas); - this.setState({sasEvent}); + const {sasEvent, reciprocateQREvent} = request; + request.verifier.off('show_sas', this._updateVerifierState); + request.verifier.off('show_reciprocate_qr', this._updateVerifierState); + this.setState({sasEvent, reciprocateQREvent}); }; _onRequestChange = async () => { @@ -269,7 +293,8 @@ export default class VerificationPanel extends React.PureComponent { const hadVerifier = this._hasVerifier; this._hasVerifier = !!request.verifier; if (!hadVerifier && this._hasVerifier) { - request.verifier.on('show_sas', this._onVerifierShowSas); + request.verifier.on('show_sas', this._updateVerifierState); + request.verifier.on('show_reciprocate_qr', this._updateVerifierState); try { // on the requester side, this is also awaited in _startSAS, // but that's ok as verify should return the same promise. @@ -284,7 +309,9 @@ export default class VerificationPanel extends React.PureComponent { const {request} = this.props; request.on("change", this._onRequestChange); if (request.verifier) { - this.setState({sasEvent: request.verifier.sasEvent}); + const {request} = this.props; + const {sasEvent, reciprocateQREvent} = request; + this.setState({sasEvent, reciprocateQREvent}); } this._onRequestChange(); } @@ -292,7 +319,8 @@ export default class VerificationPanel extends React.PureComponent { componentWillUnmount() { const {request} = this.props; if (request.verifier) { - request.verifier.off('show_sas', this._onVerifierShowSas); + request.verifier.off('show_sas', this._updateVerifierState); + request.verifier.off('show_reciprocate_qr', this._updateVerifierState); } request.off("change", this._onRequestChange); } From fd04f248c43e645eb95ef9aed759083b09392e84 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 1 Apr 2020 09:42:24 +0200 Subject: [PATCH 069/230] fix proptype typo --- src/components/views/elements/crypto/VerificationQRCode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js index 5848107b61..08cd0c772e 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -23,7 +23,7 @@ import * as QRCode from "qrcode"; @replaceableComponent("views.elements.crypto.VerificationQRCode") export default class VerificationQRCode extends React.PureComponent { static propTypes = { - qrCodeData: PropTypes.Object.isRequired, + qrCodeData: PropTypes.object.isRequired, }; constructor(props) { From 119fd2f5191a039314ad64b7db6e9e277dd267d4 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 11:27:00 +0200 Subject: [PATCH 070/230] fixup: these are actually on the verifier --- src/components/views/right_panel/VerificationPanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 58d07e318c..c640c73055 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -282,7 +282,7 @@ export default class VerificationPanel extends React.PureComponent { _updateVerifierState = () => { const {request} = this.props; - const {sasEvent, reciprocateQREvent} = request; + const {sasEvent, reciprocateQREvent} = request.verifier; request.verifier.off('show_sas', this._updateVerifierState); request.verifier.off('show_reciprocate_qr', this._updateVerifierState); this.setState({sasEvent, reciprocateQREvent}); @@ -310,7 +310,7 @@ export default class VerificationPanel extends React.PureComponent { request.on("change", this._onRequestChange); if (request.verifier) { const {request} = this.props; - const {sasEvent, reciprocateQREvent} = request; + const {sasEvent, reciprocateQREvent} = request.verifier; this.setState({sasEvent, reciprocateQREvent}); } this._onRequestChange(); From a4f448d4ca34512c00ae2cda5cf63c59e6bffdfe Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 11:36:05 +0200 Subject: [PATCH 071/230] update i18n --- src/i18n/strings/en_EN.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 24a6568d82..50dc06ce8b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1249,9 +1249,12 @@ "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.": "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what Riot supports. Try with a different client.", "Verify by scanning": "Verify by scanning", "Ask %(displayName)s to scan your code:": "Ask %(displayName)s to scan your code:", - "Verify by emoji": "Verify by emoji", "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", + "Verify by emoji": "Verify by emoji", + "Almost there! Is %(displayName)s show the same shield?": "Almost there! Is %(displayName)s show the same shield?", + "No": "No", + "Yes": "Yes", "Verify all users in a room to ensure it's secure.": "Verify all users in a room to ensure it's secure.", "In encrypted rooms, verify all users to ensure it’s secure.": "In encrypted rooms, verify all users to ensure it’s secure.", "Verified": "Verified", @@ -1397,8 +1400,6 @@ "Verify...": "Verify...", "Join": "Join", "No results": "No results", - "Yes": "Yes", - "No": "No", "Please create a new issue on GitHub so that we can investigate this bug.": "Please create a new issue on GitHub so that we can investigate this bug.", "collapse": "collapse", "expand": "expand", From ccf6c9efdc407b9562ccd26704fbe72fdd255acb Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 12:54:14 +0200 Subject: [PATCH 072/230] fixup: more i18n --- .../views/right_panel/_VerificationPanel.scss | 20 ++++++++++++++++--- .../views/right_panel/VerificationPanel.js | 6 +++--- src/i18n/strings/en_EN.json | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 459622b277..ba74d46eaf 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -30,11 +30,15 @@ limitations under the License. right: 14px; } - .mx_VerificationPanel_verified_section .mx_E2EIcon { - // Override general user info margin - margin: 0 auto !important; + .mx_VerificationPanel_verified_section, + .mx_VerificationPanel_reciprocate_section { + .mx_E2EIcon { + // Override general user info margin + margin: 20px auto !important; + } } + .mx_VerificationPanel_qrCode { padding: 4px 4px 0 4px; background: white; @@ -51,6 +55,16 @@ limitations under the License. max-width: 240px; } } + + .mx_VerificationPanel_reciprocate_section { + .mx_FormButton { + width: 100%; + box-sizing: border-box; + padding: 10px; + display: block; + margin: 10px 0; + } + } } // Special case styling for EncryptionPanel in a Modal dialog diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index c640c73055..e2dd1f0408 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -156,13 +156,13 @@ export default class VerificationPanel extends React.PureComponent { displayName: member.displayName || member.name || member.userId, })}

-

-

+ + ; } else { body =

; } - return
+ return

{_t("Verify by scanning")}

{ body }
; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 50dc06ce8b..26dcfb7ee8 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1252,7 +1252,7 @@ "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", "Verify by emoji": "Verify by emoji", - "Almost there! Is %(displayName)s show the same shield?": "Almost there! Is %(displayName)s show the same shield?", + "Almost there! Is %(displayName)s showing the same shield?": "Almost there! Is %(displayName)s showing the same shield?", "No": "No", "Yes": "Yes", "Verify all users in a room to ensure it's secure.": "Verify all users in a room to ensure it's secure.", From 1f65cfb7f69934a06161060e9a205742f47aa93a Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 13:00:45 +0200 Subject: [PATCH 073/230] polish design and disable buttons after click --- .../views/right_panel/_VerificationPanel.scss | 15 ++++++++++ .../views/right_panel/VerificationPanel.js | 28 ++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index ba74d46eaf..3313e47c66 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -132,4 +132,19 @@ limitations under the License. float: right; } } + + .mx_VerificationPanel_reciprocate_section { + .mx_FormButton { + margin: 0 10px; + padding: 10px; + flex: 1; + } + + // show Yes/No buttons next to each other + .mx_VerificationPanel_reciprocateButtons { + display: flex; + flex-direction: row; + } + } + } diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index e2dd1f0408..103497169f 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -144,6 +144,16 @@ export default class VerificationPanel extends React.PureComponent { ; } + _onReciprocateYesClick = () => { + this.setState({reciprocateButtonClicked: true}); + this.state.reciprocateQREvent.confirm(); + }; + + _onReciprocateNoClick = () => { + this.setState({reciprocateButtonClicked: true}); + this.state.reciprocateQREvent.cancel(); + }; + renderQRReciprocatePhase() { const {member} = this.props; const FormButton = sdk.getComponent("elements.FormButton"); @@ -152,15 +162,25 @@ export default class VerificationPanel extends React.PureComponent { if (this.state.reciprocateQREvent) { // riot web doesn't support scanning yet, so assume here we're the client being scanned. body = -

{_t("Almost there! Is %(displayName)s show the same shield?", { +

{_t("Almost there! Is %(displayName)s showing the same shield?", { displayName: member.displayName || member.name || member.userId, })}

- - +
+ + +
; } else { - body =

; + body =

; } return

{_t("Verify by scanning")}

From 31ca52dedec20eeedbfac1b8f4e0cf88e75b84bd Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 13:10:04 +0200 Subject: [PATCH 074/230] fix stylelint --- res/css/views/right_panel/_VerificationPanel.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 3313e47c66..e4e7e2dddc 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -146,5 +146,4 @@ limitations under the License. flex-direction: row; } } - } From df1a8b288bca47ce209689af7fae3430a71b7ce8 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Thu, 2 Apr 2020 13:35:12 +0100 Subject: [PATCH 075/230] Change copyright --- res/css/_font-sizes.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/_font-sizes.scss b/res/css/_font-sizes.scss index be6d43d3a8..ad9e2e7103 100644 --- a/res/css/_font-sizes.scss +++ b/res/css/_font-sizes.scss @@ -1,5 +1,5 @@ /* -Copyright 2020 New Vector Ltd +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. From 202ad9f98ac43323a0ccf2a4362aaf67230e928a Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Thu, 2 Apr 2020 13:42:59 +0100 Subject: [PATCH 076/230] Remove sort and include new scss file in components --- res/css/_components.scss | 1 + res/css/rethemendex.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/res/css/_components.scss b/res/css/_components.scss index b959b1f1cd..8706772ad9 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -1,5 +1,6 @@ // autogenerated by rethemendex.sh @import "./_common.scss"; +@import "./_font-sizes.scss"; @import "./structures/_AutoHideScrollbar.scss"; @import "./structures/_CompatibilityPage.scss"; @import "./structures/_ContextualMenu.scss"; diff --git a/res/css/rethemendex.sh b/res/css/rethemendex.sh index 5d9e789982..13be73f9a9 100755 --- a/res/css/rethemendex.sh +++ b/res/css/rethemendex.sh @@ -8,7 +8,7 @@ cd `dirname $0` # we used to have exclude /themes from the find at this point. # as themes are no longer a spurious subdirectory of css/, we don't # need it any more. - find . -iname _\*.scss | sort | fgrep -v _components.scss | LC_ALL=C sort | + find . -iname _\*.scss | fgrep -v _components.scss | LC_ALL=C sort | while read i; do echo "@import \"$i\";" done From ee61a3aff6b359c07a8422ec4855f7878f049040 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 16:07:55 +0200 Subject: [PATCH 077/230] dismiss setup encryption toast if cross-signing is ready --- src/DeviceListener.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index f8555c7602..ddeacedd75 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -165,6 +165,9 @@ export default class DeviceListener { props: {kind: 'upgrade_ssss'}, component: sdk.getComponent("toasts.SetupEncryptionToast"), }); + } else { + // cross-signing is ready, and we don't need to upgrade encryption + ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY); } } From 705fd57a4bacf594e295f9110ac7bd36cb434069 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 2 Apr 2020 15:09:33 +0100 Subject: [PATCH 078/230] Fix spurious extra devices on registration We send a parameter to prevent being immediately logged in after registration, but we regressed it from snake case to camelcase during the course of cross-signing dev. Fixes https://github.com/vector-im/riot-web/issues/12865 --- src/components/structures/auth/Registration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index 08c2a11641..c74f6ed6e3 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -463,7 +463,7 @@ export default createReactClass({ initial_device_display_name: this.props.defaultDeviceDisplayName, }; if (auth) registerParams.auth = auth; - if (inhibitLogin !== undefined && inhibitLogin !== null) registerParams.inhibitLogin = inhibitLogin; + if (inhibitLogin !== undefined && inhibitLogin !== null) registerParams.inhibit_login = inhibitLogin; return this.state.matrixClient.registerRequest(registerParams); }, From 2b7bbe701380ff09cdeac67a888c56df94cd5d86 Mon Sep 17 00:00:00 2001 From: call_xz Date: Thu, 2 Apr 2020 11:29:01 +0000 Subject: [PATCH 079/230] Translated using Weblate (Japanese) Currently translated at 55.1% (1244 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 79950ab4fc..7e7c1443a4 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -844,7 +844,7 @@ "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "すべて再送信またはすべてキャンセル。個々のメッセージを選択して、再送信またはキャンセルすることもできます。", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "メッセージ再送信またはメッセージキャンセル。", "Connectivity to the server has been lost.": "サーバーへの接続が失われました。", - "Sent messages will be stored until your connection has returned.": "送信されたメッセージは、接続が返されるまで保存されます。", + "Sent messages will be stored until your connection has returned.": "送信されたメッセージは、接続が復旧するまで保存されます。", "Active call": "アクティブコール", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "他に誰もいません! 他のユーザーを招待または空の部屋に関する警告を停止しますか?", "You seem to be uploading files, are you sure you want to quit?": "ファイルをアップロードしているようですが、中止しますか?", From 63ed6c3dac931a6b1007802b82d1546a904f3098 Mon Sep 17 00:00:00 2001 From: "Nils J. Haugen" Date: Thu, 2 Apr 2020 11:14:09 +0000 Subject: [PATCH 080/230] Translated using Weblate (Norwegian Nynorsk) Currently translated at 59.6% (1345 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 154 +++++++++++++++++++++++++++------------ 1 file changed, 108 insertions(+), 46 deletions(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index f71ab4fa94..197212fb09 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -100,7 +100,7 @@ "Ignores a user, hiding their messages from you": "Overser ein brukar, slik at meldingane deira ikkje synast for deg", "Ignored user": "Oversedd brukar", "You are now ignoring %(userId)s": "Du overser no %(userId)s", - "Stops ignoring a user, showing their messages going forward": "Sluttar å oversjå ein brukar, slik at meldingane deira no kan sjåast", + "Stops ignoring a user, showing their messages going forward": "Sluttar å ignorer ein brukar, slik at meldingane deira no kan sjåast", "Unignored user": "Avoversedd brukar", "You are no longer ignoring %(userId)s": "Du overser ikkje %(userId)s no lenger", "Define the power level of a user": "Sett tilgangsnivået til ein brukar", @@ -286,8 +286,8 @@ "Failed to change power level": "Fekk ikkje til å endra tilgangsnivået", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du kan ikkje angre denne endringa, fordi brukaren du forfremmar vil få same tilgangsnivå som du har no.", "Are you sure?": "Er du sikker?", - "Unignore": "Slutt å oversjå", - "Ignore": "Oversjå", + "Unignore": "Slutt å ignorer", + "Ignore": "Ignorer", "Mention": "Nemn", "Invite": "Inviter", "Enable inline URL previews by default": "Skru URL-førehandsvising i tekstfeltet på", @@ -600,14 +600,14 @@ "Event Type": "Hendingsort", "Event Content": "Hendingsinnhald", "Send Account Data": "Send Brukardata", - "Explore Room State": "Undersøk Romtilstanden", - "Explore Account Data": "Undersøk Brukardata", + "Explore Room State": "Undersøk tilstand for rommet", + "Explore Account Data": "Undersøk kontodata", "Toolbox": "Verktøykasse", "Developer Tools": "Utviklarverktøy", "An error has occurred.": "Noko gjekk gale.", "Start verification": "Start verifikasjon", "Share without verifying": "Del utan å godkjenna", - "Ignore request": "Oversjå førespurnad", + "Ignore request": "Ignorer førespurnad", "Encryption key request": "Krypteringsnykel-førespurnad", "Sign out": "Logg ut", "Clear Storage and Sign Out": "Tøm Lager og Logg Ut", @@ -615,7 +615,7 @@ "Refresh": "Hent fram på nytt", "Unable to restore session": "Kunne ikkje henta øykta fram att", "We encountered an error trying to restore your previous session.": "Noko gjekk gale med framhentinga av den førre øykta di.", - "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Viss du har tidligare brukt ein nyare versjon av Riot, kan sesjons-data vere inkompatibel med denne versjonen. Lukk dette vindauget og bytt til ein nyare versjon.", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Viss du har tidligare brukt ein nyare versjon av Riot, kan økts-data vere inkompatibel med denne versjonen. Lukk dette vindauget og bytt til ein nyare versjon.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Det kan henda at å tømma nettlesarlageret rettar opp i det, men det loggar deg ut og kan gjera den krypterte pratehistoria uleseleg.", "Invalid Email Address": "Ugangbar Epostadresse", "This doesn't appear to be a valid email address": "Det ser ikkje ut til at epostadressa er gangbar", @@ -661,7 +661,7 @@ "Pin Message": "Fest Meldinga", "View Source": "Sjå Kjelda", "View Decrypted Source": "Sjå den Dekrypterte Kjelda", - "Unhide Preview": "Slutt å Gøyma Førehandsvising", + "Unhide Preview": "Vis førehandsvising", "Share Message": "Del Melding", "Quote": "Sitat", "Source URL": "Kjelde-URL", @@ -734,37 +734,37 @@ "Review terms and conditions": "Sjå over Vilkår og Føresetnader", "Old cryptography data detected": "Gamal kryptografidata vart oppdagen", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data frå ein eldre versjon av Riot er oppdaga. Dette kan ha gjort at ende-til-ende kryptering feilar i den eldre versjonen. Krypterte meldingar som er utveksla med den gamle versjonen er kanskje ikkje dekrypterbare i denne versjonen. Dette kan forårsake at meldingar utveksla mot denne versjonen vil feile. Opplever du problem med dette, kan du logge inn og ut igjen. For å behalde meldingshistorikk, eksporter og importer nøklane dine på nytt.", - "Logout": "Loggar ut", + "Logout": "Logg ut", "Your Communities": "Dine fellesskap", "Error whilst fetching joined communities": "Noko gjekk gale under innlasting av fellesskapa du med er i", - "Create a new community": "Lag eit nytt fellesskap", + "Create a new community": "Opprett nytt fellesskap", "You have no visible notifications": "Du har ingen synlege varsel", - "Members": "Medlemer", + "Members": "Medlemmar", "Invite to this room": "Inviter til dette rommet", "Files": "Filer", "Notifications": "Varsel", "Invite to this community": "Inviter til dette fellesskapet", "The server may be unavailable or overloaded": "Tenaren er kanskje utilgjengeleg eller overlasta", - "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slett rommaliaset %(alias)s og fjern %(name)s frå utvalet?", - "Remove %(name)s from the directory?": "Fjern %(name)s frå utvalet?", - "Remove from Directory": "Fjern frå Utvalet", - "remove %(name)s from the directory.": "fjern %(name)s frå utvalet.", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slette rommaliaset %(alias)s og fjern %(name)s frå romkatalogen?", + "Remove %(name)s from the directory?": "Fjern %(name)s frå romkatalogen?", + "Remove from Directory": "Fjern frå romkatalog", + "remove %(name)s from the directory.": "fjern %(name)s frå romkatalogen.", "delete the alias.": "slett aliaset.", - "Unable to join network": "Klarte ikkje å verta med i nettverket", - "Riot does not know how to join a room on this network": "Riot veit ikkje korleis ein fer inn i eit rom på dette nettverket", + "Unable to join network": "Klarte ikkje å bli med i nettverket", + "Riot does not know how to join a room on this network": "Riot veit ikkje korleis den kan bli med i rom på dette nettverket", "Room not found": "Fann ikkje rommet", - "Couldn't find a matching Matrix room": "Kunne ikkje finna eit samsvarande Matrixrom", - "Fetching third party location failed": "Noko gjekk gale med hentinga tredjepartiplasseringa", + "Couldn't find a matching Matrix room": "Kunne ikkje finna eit samsvarande Matrix-rom", + "Fetching third party location failed": "Noko gjekk gale under henting av tredjepartslokasjon", "Scroll to bottom of page": "Blad til botnen", - "You can't send any messages until you review and agree to our terms and conditions.": "Du kan ikkje senda meldingar før du ser over og seier deg einig i våre Vilkår og Føresetnader.", + "You can't send any messages until you review and agree to our terms and conditions.": "Du kan ikkje senda meldingar før du les over og godkjenner våre bruksvilkår.", "%(count)s of your messages have not been sent.|other": "Nokre av meldingane dine vart ikkje sende.", "%(count)s of your messages have not been sent.|one": "Meldinga di vart ikkje send.", - "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Send alle på nytt eller avbryt alle. Du kan ogso velja enkelte meldingar til sending på nytt eller avbryting.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Send alle på nytt eller avbryt alle. Du kan og markere enkelte meldingar for å sende på nytt eller avbryte.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Send melding på nytt eller avbryt.", "Connectivity to the server has been lost.": "Tilkoplinga til tenaren vart tapt.", - "Sent messages will be stored until your connection has returned.": "Sendte meldingar lagrast ikkje før tilkoplinga di er tilbake.", + "Sent messages will be stored until your connection has returned.": "Sendte meldingar vil blir lagra lokalt fram til nettverket er oppe igjen.", "Active call": "Pågåande samtale", - "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Det er ingen andre her! Vil du byda andre inn eller enda åtvaringa om det tomme rommet??", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Det er ingen andre her! Vil du invitera andre eller skru av varselet om det tomme rommet??", "You seem to be uploading files, are you sure you want to quit?": "Det ser ut til at du lastar opp filer, er du sikker på at du vil avslutte?", "You seem to be in a call, are you sure you want to quit?": "Det ser ut til at du er i ein samtale, er du sikker på at du vil avslutte?", "Search failed": "Søket feila", @@ -773,10 +773,10 @@ "Room": "Rom", "Failed to reject invite": "Fekk ikkje til å avstå invitasjonen", "Fill screen": "Fyll skjermen", - "Click to unmute video": "Klikk for å avstilna videoen", - "Click to mute video": "Klikk for å stilna videoen", - "Click to unmute audio": "Klikk for å avstilna ljoden", - "Click to mute audio": "Klikk for å dempe lyden", + "Click to unmute video": "Klikk for slå på video", + "Click to mute video": "Klikk for å slå av video", + "Click to unmute audio": "Klikk for å slå på lyd", + "Click to mute audio": "Klikk for å slå av lyd", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Prøvde å laste eit bestemt punkt i rommet sin historikk, men du har ikkje lov til å sjå den spesifike meldingen.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Prøvde å lasta eit bestemt punkt i rommet sin historikk, men klarde ikkje å finna det.", "Failed to load timeline position": "Innlasting av punkt i historikken feila.", @@ -853,7 +853,7 @@ "End-to-end encryption information": "Ende-til-ende-krypteringsinfo", "Event information": "Hendingsinfo", "Passphrases must match": "Passfrasane må vere identiske", - "Passphrase must not be empty": "Passefrasefeltet kan ikkje vera tomt", + "Passphrase must not be empty": "Passfrasefeltet kan ikkje stå tomt", "Enter passphrase": "Skriv inn passfrase", "Confirm passphrase": "Stadfest passfrase", "You must specify an event type!": "Du må oppgje ein handlingssort!", @@ -869,8 +869,8 @@ "Filter community members": "Filtrer fellesskapssmedlemmar", "Custom Server Options": "Tilpassa tenar-innstillingar", "Filter community rooms": "Filtrer rom i fellesskapet", - "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Ver venleg og hjelp oss å forbetra Riot.im ved å senda anonym brukardata. Dette brukar ei datakake (ver venleg og sjå på Datakakeretningslinene våre).", - "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Ver venleg og hjelp oss å forbetra Riot.im ved å senda anonym brukardata. Dette brukar ei datakake.", + "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Hjelp oss å forbetra Riot.im ved å senda anonym brukardata. Dette brukar informasjonskapslar (les gjerne vår Cookie-policy).", + "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Hjelp oss å forbetra Riot.im ved å senda anonym brukardata. Dette brukar informasjonskapslar (cookies).", "Whether or not you're using the Richtext mode of the Rich Text Editor": "Om du brukar Riktekst-innstillinga på Riktekstfeltet", "This room is not accessible by remote Matrix servers": "Rommet er ikkje tilgjengeleg for andre Matrix-heimtenarar", "Add an Integration": "Legg tillegg til", @@ -888,7 +888,7 @@ "Failed to set Direct Message status of room": "Fekk ikkje til å setja Direktemelding-tilstanden til rommet", "Did you know: you can use communities to filter your Riot.im experience!": "Visste du at: du kan bruka fellesskap for å filtrera Riot.im-opplevinga di!", "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.": "For å setja opp eit filter, dra ein fellesskapsavatar bort til filterpanelet til venstre på skjermen. Du kan klikka på ein avatar i filterpanelet når som helst for å sjå berre romma og folka tilknytta det fellesskapet.", - "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Lag eit fellesskap for å føra saman brukarar og rom! Bygg di eiga heimeside for å kreva din del av Matrix-verda.", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Lag eit fellesskap for å føra saman brukarar og rom! Lag ei tilpassa heimeside for å markere din del av Matrix-universet.", "Unable to look up room ID from server": "Klarte ikkje å henta rom-ID frå tenaren", "Server may be unavailable, overloaded, or search timed out :(": "Tenaren er kanskje utilgjengeleg, overlasta, elles så vart søket tidsavbrote :(", "Clear filter": "Tøm filter", @@ -905,7 +905,7 @@ "Failed to remove tag %(tagName)s from room": "Fekk ikkje til å fjerna merket %(tagName)s frå rommet", "Failed to add tag %(tagName)s to room": "Fekk ikkje til å leggja merket %(tagName)s til i rommet", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Dette tillèt deg å henta nøklane for meldingar du har sendt i krypterte rom ut til ei lokal fil. Då kan du importera fila i ein annan Matrix-klient i framtida, slik at den klienten òg kan dekryptera meldingane.", - "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Å henta filen ut tillèt kven som helst som kan lesa ho å dekryptera alle krypterte meldingar du kan sjå, so du bør passa på å halda ho trygg. For å hjelpa til med dette bør du skriva ei passetning inn i feltet under, som vil brukast til å kryptere den uthenta dataen. Det vil berre vera mogeleg å henta dataen inn med den same passetninga.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Å henta fila ut tillèt kven som helst som kan lesa ho, samt dekryptera alle krypterte meldingar du kan sjå. Du bør passa på å halda ho trygg. For å hjelpa til med dette bør du skriva ein passfrase inn i feltet under, som vil brukast til å kryptere den eksporterte dataen. Det vil berre vera mogeleg å importera data inn med den same passfrasen.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Dette tillèt deg å importere krypteringsnøklar som du tidlegare har eksportert frå ein annan Matrix-klient. Du har deretter moglegheit for å dekryptere alle meldingane som den andre klienten kunne dekryptere.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Den eksporterte fila vil bli verna med ein passfrase. Du bør skriva passfrasen her, for å dekryptere fila.", "Only room administrators will see this warning": "Berre rom-administratorar vil sjå denne åtvaringa", @@ -1041,7 +1041,7 @@ "Adds a custom widget by URL to the room": "Legg til eit tilpassa miniprogram til rommet med ein URL", "Please supply a https:// or http:// widget URL": "Skriv inn https:// eller http:// URL-en for miniprogrammet", "You cannot modify widgets in this room.": "Du kan ikkje endra miniprogram i dette rommet.", - "Forces the current outbound group session in an encrypted room to be discarded": "Tvingar i eit kryptert rom kassering av gjeldande utgåande gruppe-sesjon", + "Forces the current outbound group session in an encrypted room to be discarded": "Tvingar i eit kryptert rom kassering av gjeldande utgåande gruppe-økt", "Sends the given message coloured as a rainbow": "Sender den bestemte meldinga farga som ein regnboge", "Displays list of commands with usages and descriptions": "Viser ei liste over kommandoar med bruksområde og skildringar", "%(senderName)s made no change.": "%(senderName)s utførde ingen endring.", @@ -1052,13 +1052,13 @@ "Whether you're using Riot as an installed Progressive Web App": "Om din Riot er installert som ein webapplikasjon (Progressive Web App)", "Your user agent": "Din nettlesar (User-Agent)", "The information being sent to us to help make Riot better includes:": "Informasjon sendt til oss for å forbetre Riot inkluderar:", - "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det er ukjende sesjonar i dette rommet: om går vidare utan å verifisere dei, kan andre avlytte samtalen.", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det er ukjende økter i dette rommet: om går vidare utan å verifisere dei, kan andre avlytte samtalen.", "If you cancel now, you won't complete verifying the other user.": "Om du avbryter no, vil dette stoppe verifikasjonsprosessen for den andre brukaren.", - "If you cancel now, you won't complete verifying your other session.": "Om du avbryter no, vil dette stoppe verifikasjonsprosessen for den andre sesjonen.", - "If you cancel now, you won't complete your secret storage operation.": "Om du avbryter no, vil dette stoppe lagringa av den hemmelege passfrasen.", + "If you cancel now, you won't complete verifying your other session.": "Om du avbryter no, vil dette stoppe verifikasjonsprosessen for den andre økta.", + "If you cancel now, you won't complete your secret storage operation.": "Om du avbryter no, vil dette stoppe opprettinga av det hemmelege lageret.", "Cancel entering passphrase?": "Avbryte inntasting av passfrase ?", "Setting up keys": "Setter opp nøklar", - "Verify this session": "Stadfest denne sesjonen", + "Verify this session": "Stadfest denne økta", "Encryption upgrade available": "Kryptering kan oppgraderast", "Set up encryption": "Sett opp kryptering", "Unverified session": "Uverifisert sesjon", @@ -1069,12 +1069,12 @@ "Custom (%(level)s)": "Tilpassa (%(level)s)", "Error upgrading room": "Feil ved oppgradering av rom", "Double check that your server supports the room version chosen and try again.": "Sjekk at server støttar romversjon, og prøv på nytt.", - "Verifies a user, session, and pubkey tuple": "Verifiser brukar, sesjon eller public key objekt (pubkey tuple)", - "Unknown (user, session) pair:": "Ukjent (brukar,sesjon) par:", + "Verifies a user, session, and pubkey tuple": "Verifiser brukar, økt eller public-key objekt (pubkey tuple)", + "Unknown (user, session) pair:": "Ukjent (brukar,økt) par:", "Session already verified!": "Sesjon er tidligare verifisert!", "WARNING: Session already verified, but keys do NOT MATCH!": "ÅTVARING: Sesjon er tidligare verifisert, men nøklane STEMMER IKKJE!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ÅTVARING: NØKKELVERIFIKASJON FEILA! Signeringsnøkkel for %(userId)s og sesjon %(deviceId)s er \"%(fprint)s\" stemmer ikkje med innsendt nøkkel \"%(fingerprint)s\". Dette kan vere teikn på at kommunikasjonen er avlytta!", - "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Innsendt signeringsnøkkel er lik nøkkelen du mottok frå %(userId)s med sesjon %(deviceId)s. Sesjonen no er verifisert.", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ÅTVARING: NØKKELVERIFIKASJON FEILA! Signeringsnøkkel for %(userId)s og økt %(deviceId)s er \"%(fprint)s\" stemmer ikkje med innsendt nøkkel \"%(fingerprint)s\". Dette kan vere teikn på at kommunikasjonen er avlytta!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Innsendt signeringsnøkkel er lik nøkkelen du mottok frå %(userId)s med økt %(deviceId)s. Sesjonen no er verifisert.", "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s satte rommet til offentleg for alle som har linken.", "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s avgrensa romtilgang til inviterte deltakarar.", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s satte tilgangsregelen til %(rule)s", @@ -1111,7 +1111,7 @@ "Prompt before sending invites to potentially invalid matrix IDs": "Spør før utsending av invitasjonar til potensielle ugyldige Matrix-IDar", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ved å fjerne koplinga mot din identitetstenar, vil ikkje brukaren din bli oppdaga av andre brukarar, og du kan heller ikkje invitera andre med e-post eller telefonnummer.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Å bruke ein identitetstenar er frivillig. Om du vel å ikkje bruke dette, vil ikkje brukaren din bli oppdaga av andre brukarar, og du kan ikkje invitera andre med e-post eller telefonnummer.", - "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Passordet ditt vart endra. Du vil ikkje motta push-varslingar på andre sesjonar, før etter til at du har logga inn på nytt der", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Passordet ditt vart endra. Du vil ikkje motta push-varslingar på andre økter, før etter til at du har logga inn på nytt der", "Error downloading theme information.": "Feil under nedlasting av temainformasjon.", "Theme added!": "Tema lagt til!", "Email addresses": "E-postadresser", @@ -1139,7 +1139,7 @@ "Deactivate user?": "Deaktivere brukar?", "Deactivate user": "Deaktiver brukar", "Failed to deactivate user": "Fekk ikkje til å deaktivere brukaren", - "No sessions with registered encryption keys": "Ingen sesjonar med registrerte krypteringsnøklar", + "No sessions with registered encryption keys": "Ingen økter med registrerte krypteringsnøklar", "Remove recent messages": "Fjern nyare meldingar", "Send a reply…": "Send eit svar…", "Send a message…": "Send melding…", @@ -1221,7 +1221,7 @@ "Error updating flair": "Oppdatering av etikett gjekk gale", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Feil under oppdatering av etikett for dette rommet. Dette kan vere deaktivert på server , eller så oppstod det ein feil.", "Room Name": "Romnamn", - "Room Topic": "Rom-emne", + "Room Topic": "Romemne", "Room avatar": "Rom-avatar", "Power level": "Tilgangsnivå", "Voice & Video": "Tale & Video", @@ -1295,7 +1295,7 @@ "Send typing notifications": "Kringkast \"skriv...\"-status til andre", "Show typing notifications": "Vis \"skriv...\"-status frå andre", "Show previews/thumbnails for images": "Vis førehandsvisningar/thumbnails for bilete", - "Manually verify all remote sessions": "Manuelt verifiser alle eksterne sesjonar", + "Manually verify all remote sessions": "Manuelt verifiser alle eksterne økter", "Messages containing my username": "Meldingar som inneheld mitt brukarnamn", "Messages containing @room": "Meldingar som inneheld @room", "Encrypted messages in one-to-one chats": "Krypterte meldingar i ein-til-ein-samtalar", @@ -1319,5 +1319,67 @@ "Your theme": "Ditt tema", "Failed to upgrade room": "Fekk ikkje til å oppgradere rom", "Jump to start/end of the composer": "Hopp til start/slutt av teksteditoren", - "Navigate composer history": "Naviger historikk for teksteditor" + "Navigate composer history": "Naviger historikk for teksteditor", + "Use Single Sign On to continue": "Bruk Single-sign-on for å fortsette", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Stadfest at du legger til denne e-postadressa, ved å bruke Single-sign-on for å bevise identiteten din.", + "Single Sign On": "Single-sign-on", + "Review Sessions": "Sjå gjennom økter", + "Capitalization doesn't help very much": "Store bokstavar hjelp dessverre lite", + "Predictable substitutions like '@' instead of 'a' don't help very much": "Forutsigbare teiknbytte som '@' istaden for 'a' hjelp dessverre lite", + "Try out new ways to ignore people (experimental)": "Prøv ut nye måtar å ignorere folk på (eksperimentelt)", + "Keep secret storage passphrase in memory for this session": "Hald passfrase for hemmeleg lager i systemminnet for denne økta", + "Cross-signing and secret storage are enabled.": "Krysssignering og hemmeleg lager er aktivert.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Kontoen din har ein kryss-signert identitet det hemmelege lageret, økta di stolar ikkje på denne enno.", + "Cross-signing and secret storage are not yet set up.": "Krysssignering og hemmeleg lager er endå ikkje konfiguert.", + "Reset cross-signing and secret storage": "Tilbakestill krysssignering og hemmeleg lager", + "Bootstrap cross-signing and secret storage": "Førebur krysssignering og hemmeleg lager", + "in secret storage": "i hemmeleg lager", + "Secret storage public key:": "Public-nøkkel for hemmeleg lager:", + "Secret Storage key format:": "Nøkkel-format for hemmeleg lager:", + "Keyboard Shortcuts": "Tastatursnarvegar", + "Ignored users": "Ignorerte brukarar", + "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Legg til brukarar og serverar du vil ignorera her. Bruk stjerne/wildcard (*) for at markere eitkvart teikn. Til dømes, @bot* vil ignorere alle brukarar med namn 'bot' på uansett server.", + "Server or user ID to ignore": "Server eller brukar-ID for å ignorere", + "If this isn't what you want, please use a different tool to ignore users.": "Om det ikkje var dette du ville, bruk eit anna verktøy til å ignorera brukarar.", + "Enter the name of a new server you want to explore.": "Skriv inn namn på ny server du ynskjer å utforske.", + "Matrix rooms": "Matrix-rom", + "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Om du har meir info rundt korleis problemet oppstod, som kva du prøvde å gjere på det tidspunktet, brukar-IDar m.m ,inkluder gjerne den informasjonen her.", + "Topic (optional)": "Emne (valfritt)", + "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "For å unngå duplikate feilrapportar, sjekk eksisterande innmeldte feil fyrst (og legg på ein +1) eller meld inn ny feil viss du ikkje finn den der.", + "Command Help": "Kommandohjelp", + "To help us prevent this in future, please send us logs.": "For å bistå med å forhindre dette i framtida, gjerne send oss loggar.", + "Enter secret storage passphrase": "Skriv inn passfrase for hemmeleg lager", + "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Tilgang til hemmeleg lager vart feila. Sjekk at du har skrive inn korrekt passfrase.", + "Warning: You should only access secret storage from a trusted computer.": "Åtvaring: Du bør berre nytte hemmeleg lager frå ei sikker,personleg datamaskin.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Skriv inn passfrasen din for å få tilgang til sikker samtalehistorikk og identiet nytta ved krysssignering for å verifisere andre økter.", + "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Om du har gløymt passfrasen din kan du bruke gjennopprettingsnøkkel eller opprette nye gjenopprettingsalternativ.", + "Enter secret storage recovery key": "Skriv inn gjenopprettingsnøkkel for hemmeleg lagring", + "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Fekk ikkje tilgang til hemmeleg lager. Sjekk at du skreiv inn korrekt gjenopprettingsnøkkel.", + "Incorrect recovery passphrase": "Feil gjenopprettingspassfrase", + "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "Fekk ikkje til å dekryptere sikkerheitkopien med denne passfrasen: sjekk at du har skrive inn korrekt gjenopprettingspassfrase.", + "Enter recovery passphrase": "Skriv inn gjennopprettingspassfrase", + "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Få tilgang til sikker meldingshistorikk og sett opp sikker meldingsutveksling, ved å skrive inn gjennopprettingspassfrasen.", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "Har du gløymt gjennopprettingspassfrasen kan du bruke gjennopprettingsnøkkel eller sette opp nye gjennopprettingsval", + "Help": "Hjelp", + "Explore": "Utforsk", + "%(creator)s created and configured the room.": "%(creator)s oppretta og konfiguerte dette rommet.", + "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot klarde ikkje å hente protokolllister frå heimeserveren. Det kan hende at serveren er for gammal til å støtte tredjeparts-nettverk", + "The homeserver may be unavailable or overloaded.": "Heimeserveren kan vere overlasta eller utilgjengeleg.", + "Preview": "Førehandsvis", + "View": "Vis", + "Find a room…": "Finn eit rom…", + "Find a room… (e.g. %(exampleRoom)s)": "Finn eit rom... (t.d. %(exampleRoom)s)", + "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Om du ikkje kan finne rommet du ser etter, spør etter ein invitasjon eller opprett eit nytt rom.", + "Message not sent due to unknown sessions being present": "Meldinga vart ikkje sendt fordi ukjende økter er tilstades", + "Show sessions, send anyway or cancel.": "Vis økter, send likevel elleravbryt.", + "Jump to first unread room.": "Hopp til fyrste uleste rom.", + "Jump to first invite.": "Hopp til fyrste invitasjon.", + "If you can’t access one, ": "Har du ikkje tilgang til ein, ", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Hald krypteringsnøkklane dine sikre med ein passfrase. For maksimal sikkerheit bør denne vere forskjellig frå kontopassordet ditt:", + "Enter a passphrase": "Skriv inn ein passfrase", + "Back up my encryption keys, securing them with the same passphrase": "Sikkerheitskopier mine krypteringsnøklar, sikre dei med same passfrase", + "Enter your passphrase a second time to confirm it.": "Stadfest passfrasen ved å skrive den inn ein gong til.", + "Unable to set up secret storage": "Oppsett av hemmeleg lager feila", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Denne økta har oppdaga at gjenopprettingspassfrasen og nøkkelen for sikre meldingar vart fjerna.", + "Toggle microphone mute": "Slå av/på demping av mikrofon" } From 0307361fa2b815e841707d034bc58102d7d61c85 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 16:42:39 +0200 Subject: [PATCH 081/230] more polish for self-verification --- .../views/right_panel/_VerificationPanel.scss | 33 ++++++++---------- .../views/right_panel/VerificationPanel.js | 34 ++++++++++++------- src/i18n/strings/en_EN.json | 1 + 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index e4e7e2dddc..f8e5a54afb 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -13,6 +13,17 @@ 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_VerificationPanel_verified_section, +.mx_VerificationPanel_reciprocate_section { + // center the big shield icon + .mx_E2EIcon { + // Override general user info margin + margin: 20px auto !important; + } +} + .mx_UserInfo { .mx_EncryptionPanel_cancel { @@ -30,15 +41,6 @@ limitations under the License. right: 14px; } - .mx_VerificationPanel_verified_section, - .mx_VerificationPanel_reciprocate_section { - .mx_E2EIcon { - // Override general user info margin - margin: 20px auto !important; - } - } - - .mx_VerificationPanel_qrCode { padding: 4px 4px 0 4px; background: white; @@ -123,10 +125,6 @@ limitations under the License. // EncryptionPanel when verification is done .mx_VerificationPanel_verified_section { - // center the big shield icon - .mx_E2EIcon { - margin: 0 auto; - } // right align the "Got it" button .mx_AccessibleButton { float: right; @@ -134,16 +132,15 @@ limitations under the License. } .mx_VerificationPanel_reciprocate_section { - .mx_FormButton { - margin: 0 10px; - padding: 10px; - flex: 1; + .mx_AccessibleButton { + margin-left: 10px; + padding: 7px 40px; } - // show Yes/No buttons next to each other .mx_VerificationPanel_reciprocateButtons { display: flex; flex-direction: row; + justify-content: flex-end; } } } diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 103497169f..840ece873c 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -18,6 +18,7 @@ import React from "react"; import PropTypes from "prop-types"; import * as sdk from '../../../index'; +import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {SCAN_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; @@ -154,29 +155,38 @@ export default class VerificationPanel extends React.PureComponent { this.state.reciprocateQREvent.cancel(); }; + get _isSelfVerification() { + return this.props.request.otherUserId === MatrixClientPeg.get().getUserId(); + } + renderQRReciprocatePhase() { const {member} = this.props; - const FormButton = sdk.getComponent("elements.FormButton"); - + let Button; + if (this.props.inDialog) { + Button = sdk.getComponent("elements.AccessibleButton"); + } else { + Button = sdk.getComponent("elements.FormButton"); + } + const description = this._isSelfVerification ? + _t("Almost there! Is your other session showing the same shield?") : + _t("Almost there! Is %(displayName)s showing the same shield?", { + displayName: member.displayName || member.name || member.userId, + }); let body; if (this.state.reciprocateQREvent) { // riot web doesn't support scanning yet, so assume here we're the client being scanned. body = -

{_t("Almost there! Is %(displayName)s showing the same shield?", { - displayName: member.displayName || member.name || member.userId, - })}

+

{description}

- - {_t("No")} +
; } else { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 26dcfb7ee8..389a30fe8f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1252,6 +1252,7 @@ "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", "Verify by emoji": "Verify by emoji", + "Almost there! Is your other session showing the same shield?": "Almost there! Is your other session showing the same shield?", "Almost there! Is %(displayName)s showing the same shield?": "Almost there! Is %(displayName)s showing the same shield?", "No": "No", "Yes": "Yes", From 1baaafe7b9174dcb6b11da4edbd3be1c6abc13b7 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 16:44:42 +0200 Subject: [PATCH 082/230] some comments to explain the mess --- src/components/views/right_panel/VerificationPanel.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 840ece873c..579cd2c000 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -162,6 +162,8 @@ export default class VerificationPanel extends React.PureComponent { renderQRReciprocatePhase() { const {member} = this.props; let Button; + // a bit of a hack, but the FormButton should only be used in the right panel + // they should probably just be the same component with a css class applied to it? if (this.props.inDialog) { Button = sdk.getComponent("elements.AccessibleButton"); } else { @@ -175,6 +177,9 @@ export default class VerificationPanel extends React.PureComponent { let body; if (this.state.reciprocateQREvent) { // riot web doesn't support scanning yet, so assume here we're the client being scanned. + // + // we're passing both a label and a child string to Button as + // FormButton and AccessibleButton expect this differently body =

{description}

From fffd5a4a5ee4449d3a0949ecb429c206b82824f9 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 16:46:29 +0200 Subject: [PATCH 083/230] fix stylelint --- res/css/views/right_panel/_VerificationPanel.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index f8e5a54afb..01a654b523 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -13,7 +13,6 @@ 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_VerificationPanel_verified_section, .mx_VerificationPanel_reciprocate_section { From 081baa23592c0a6d2677dcd09e4b67d44a2a474b Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 17:12:10 +0200 Subject: [PATCH 084/230] set dialog title for self-verification use request.isSelfVerification helper --- .../views/dialogs/VerificationRequestDialog.js | 17 +++++++++++++++-- .../views/right_panel/VerificationPanel.js | 8 ++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/VerificationRequestDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js index bbf3482a41..88ca0bc337 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.js +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -30,16 +30,29 @@ export default class VerificationRequestDialog extends React.Component { constructor(...args) { super(...args); this.onFinished = this.onFinished.bind(this); + this.state = {}; + if (this.props.verificationRequest) { + this.state.verificationRequest = this.props.verificationRequest; + } else if (this.props.verificationRequestPromise) { + this.props.verificationRequestPromise.then(r => { + this.setState({verificationRequest: r}); + }); + } } render() { const BaseDialog = sdk.getComponent("views.dialogs.BaseDialog"); const EncryptionPanel = sdk.getComponent("views.right_panel.EncryptionPanel"); + const request = this.state.verificationRequest; + const otherUserId = request && request.otherUserId; const member = this.props.member || - MatrixClientPeg.get().getUser(this.props.verificationRequest.otherUserId); + otherUserId && MatrixClientPeg.get().getUser(otherUserId); + const title = request && request.isSelfVerification ? + _t("Verify this session") : _t("Verification Request"); + return Date: Thu, 2 Apr 2020 17:51:25 +0200 Subject: [PATCH 085/230] adapt encryption info to self-verification - hide text when shown in a dialog - adapt "waiting for ... to accept" text to self-verif --- .../views/right_panel/EncryptionInfo.js | 24 +++++++++++++++---- .../views/right_panel/EncryptionPanel.js | 7 +++++- src/i18n/strings/en_EN.json | 1 + 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/components/views/right_panel/EncryptionInfo.js b/src/components/views/right_panel/EncryptionInfo.js index 610ea99511..007e2831ce 100644 --- a/src/components/views/right_panel/EncryptionInfo.js +++ b/src/components/views/right_panel/EncryptionInfo.js @@ -28,14 +28,26 @@ export const PendingActionSpinner = ({text}) => {
; }; -const EncryptionInfo = ({waitingForOtherParty, waitingForNetwork, member, onStartVerification, isRoomEncrypted}) => { +const EncryptionInfo = ({ + waitingForOtherParty, + waitingForNetwork, + member, + onStartVerification, + isRoomEncrypted, + inDialog, + isSelfVerification, +}) => { let content; if (waitingForOtherParty || waitingForNetwork) { let text; if (waitingForOtherParty) { - text = _t("Waiting for %(displayName)s to accept…", { - displayName: member.displayName || member.name || member.userId, - }); + if (isSelfVerification) { + text = _t("Waiting for you to accept on your other session…"); + } else { + text = _t("Waiting for %(displayName)s to accept…", { + displayName: member.displayName || member.name || member.userId, + }); + } } else { text = _t("Accepting…"); } @@ -66,6 +78,10 @@ const EncryptionInfo = ({waitingForOtherParty, waitingForNetwork, member, onStar ); } + if (inDialog) { + return content; + } + return

{_t("Encryption")}

diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index 6f884c4abf..152f4c0aa0 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -112,6 +112,9 @@ const EncryptionPanel = (props) => { const requested = (!request && isRequesting) || (request && (phase === PHASE_REQUESTED || phase === PHASE_UNSENT || phase === undefined)); + const isSelfVerification = request ? + request.isSelfVerification : + member.userId === MatrixClientPeg.get().getUserId(); if (!request || requested) { const initiatedByMe = (!request && isRequesting) || (request && request.initiatedByMe); return ( @@ -120,8 +123,10 @@ const EncryptionPanel = (props) => { isRoomEncrypted={isRoomEncrypted} onStartVerification={onStartVerification} member={member} + isSelfVerification={isSelfVerification} waitingForOtherParty={requested && initiatedByMe} - waitingForNetwork={requested && !initiatedByMe} /> + waitingForNetwork={requested && !initiatedByMe} + inDialog={inDialog} /> ); } else { return ( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 389a30fe8f..68ff781ceb 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1212,6 +1212,7 @@ "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.", + "Waiting for you to accept on your other session…": "Waiting for you to accept on your other session…", "Waiting for %(displayName)s to accept…": "Waiting for %(displayName)s to accept…", "Accepting…": "Accepting…", "Start Verification": "Start Verification", From 6bb6885578b6b5847ba2dd17ed692e50c3097dde Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 18:28:01 +0200 Subject: [PATCH 086/230] adjust sas copy to use device -> session --- src/components/views/verification/VerificationShowSas.js | 4 ++-- src/i18n/strings/en_EN.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 9b4ea4f2bd..36f2df6360 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -75,7 +75,7 @@ export default class VerificationShowSas extends React.Component {
; sasCaption = this.props.isSelf ? _t( - "Confirm the emoji below are displayed on both devices, in the same order:", + "Confirm the emoji below are displayed on both sessions, in the same order:", ): _t( "Verify this user by confirming the following emoji appear on their screen.", @@ -89,7 +89,7 @@ export default class VerificationShowSas extends React.Component {
; sasCaption = this.props.isSelf ? _t( - "Verify this device by confirming the following number appears on its screen.", + "Verify this session by confirming the following number appears on its screen.", ): _t( "Verify this user by confirming the following number appears on their screen.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 68ff781ceb..912a86446f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -478,9 +478,9 @@ "Compare unique emoji": "Compare unique emoji", "Compare a unique set of emoji if you don't have a camera on either device": "Compare a unique set of emoji if you don't have a camera on either device", "Start": "Start", - "Confirm the emoji below are displayed on both devices, in the same order:": "Confirm the emoji below are displayed on both devices, in the same order:", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Confirm the emoji below are displayed on both sessions, in the same order:", "Verify this user by confirming the following emoji appear on their screen.": "Verify this user by confirming the following emoji appear on their screen.", - "Verify this device by confirming the following number appears on its screen.": "Verify this device by confirming the following number appears on its screen.", + "Verify this session by confirming the following number appears on its screen.": "Verify this session by confirming the following number appears on its screen.", "Verify this user by confirming the following number appears on their screen.": "Verify this user by confirming the following number appears on their screen.", "Unable to find a supported verification method.": "Unable to find a supported verification method.", "Waiting for %(displayName)s to verify…": "Waiting for %(displayName)s to verify…", From 2ee780caa2785b4c234b2a70d2a66f7440728cb5 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 2 Apr 2020 18:28:14 +0200 Subject: [PATCH 087/230] pass isSelf flag to sas component --- src/components/views/right_panel/VerificationPanel.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index f407d5f792..22cf855d2c 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -275,6 +275,7 @@ export default class VerificationPanel extends React.PureComponent { onCancel={this._onSasMismatchesClick} onDone={this._onSasMatchesClick} inDialog={this.props.inDialog} + isSelf={request.isSelfVerification} /> : ; return

{_t("Compare emoji")}

From 86f39ee0eee2e18e86b3e92b2b7d8c0a56da9bdd Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 2 Apr 2020 15:07:50 +0100 Subject: [PATCH 088/230] Fix read marker visibility for grouped events The recent "groupers" which extracted out timeline grouping logic forgot to pass through the last event state for read marker computation. This causes the read marker to become visible when e.g. returning to room if it was last placed inside a grouped set of events (currently room creation and membership events). Regressed by https://github.com/matrix-org/matrix-react-sdk/pull/4059 Related to https://github.com/vector-im/riot-web/issues/12338 --- src/components/structures/MessagePanel.js | 21 +- .../structures/MessagePanel-test.js | 306 +++++++++++------- 2 files changed, 209 insertions(+), 118 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 4fd57d95e6..c3a2bdbc59 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -838,14 +838,16 @@ class CreationGrouper { // events that we include in the group but then eject out and place // above the group. this.ejectedEvents = []; - this.readMarker = panel._readMarkerForEvent(createEvent.getId()); + this.readMarker = panel._readMarkerForEvent( + createEvent.getId(), + createEvent === lastShownEvent, + ); } shouldGroup(ev) { const panel = this.panel; const createEvent = this.createEvent; if (!panel._shouldShowEvent(ev)) { - this.readMarker = this.readMarker || panel._readMarkerForEvent(ev.getId()); return true; } if (panel._wantsDateSeparator(this.createEvent, ev.getDate())) { @@ -863,7 +865,10 @@ class CreationGrouper { add(ev) { const panel = this.panel; - this.readMarker = this.readMarker || panel._readMarkerForEvent(ev.getId()); + this.readMarker = this.readMarker || panel._readMarkerForEvent( + ev.getId(), + ev === this.lastShownEvent, + ); if (!panel._shouldShowEvent(ev)) { return; } @@ -950,7 +955,10 @@ class MemberGrouper { constructor(panel, ev, prevEvent, lastShownEvent) { this.panel = panel; - this.readMarker = panel._readMarkerForEvent(ev.getId()); + this.readMarker = panel._readMarkerForEvent( + ev.getId(), + ev === lastShownEvent, + ); this.events = [ev]; this.prevEvent = prevEvent; this.lastShownEvent = lastShownEvent; @@ -971,7 +979,10 @@ class MemberGrouper { const renderText = textForEvent(ev); if (!renderText || renderText.trim().length === 0) return; // quietly ignore } - this.readMarker = this.readMarker || this.panel._readMarkerForEvent(ev.getId()); + this.readMarker = this.readMarker || this.panel._readMarkerForEvent( + ev.getId(), + ev === this.lastShownEvent, + ); this.events.push(ev); } diff --git a/test/components/structures/MessagePanel-test.js b/test/components/structures/MessagePanel-test.js index e6332cf7f8..3ac70bdac9 100644 --- a/test/components/structures/MessagePanel-test.js +++ b/test/components/structures/MessagePanel-test.js @@ -142,128 +142,42 @@ describe('MessagePanel', function() { return events; } - it('should show the events', function() { - const res = TestUtils.renderIntoDocument( - , - ); + // A list of membership events only with nothing else + function mkMelsEventsOnly() { + const events = []; + const ts0 = Date.now(); - // just check we have the right number of tiles for now - const tiles = TestUtils.scryRenderedComponentsWithType( - res, sdk.getComponent('rooms.EventTile')); - expect(tiles.length).toEqual(10); - }); + let i = 0; - it('should collapse adjacent member events', function() { - const res = TestUtils.renderIntoDocument( - , - ); + for (i = 0; i < 10; i++) { + events.push(test_utils.mkMembership({ + event: true, room: "!room:id", user: "@user:id", + target: { + userId: "@user:id", + name: "Bob", + getAvatarUrl: () => { + return "avatar.jpeg"; + }, + }, + ts: ts0 + i*1000, + mship: 'join', + prevMship: 'join', + name: 'A user', + })); + } - // just check we have the right number of tiles for now - const tiles = TestUtils.scryRenderedComponentsWithType( - res, sdk.getComponent('rooms.EventTile'), - ); - expect(tiles.length).toEqual(2); + return events; + } - const summaryTiles = TestUtils.scryRenderedComponentsWithType( - res, sdk.getComponent('elements.MemberEventListSummary'), - ); - expect(summaryTiles.length).toEqual(1); - }); - - it('should show the read-marker in the right place', function() { - const res = TestUtils.renderIntoDocument( - , - ); - - const tiles = TestUtils.scryRenderedComponentsWithType( - res, sdk.getComponent('rooms.EventTile')); - - // find the
  • which wraps the read marker - const rm = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_RoomView_myReadMarker_container'); - - // it should follow the
  • which wraps the event tile for event 4 - const eventContainer = ReactDOM.findDOMNode(tiles[4]).parentNode; - expect(rm.previousSibling).toEqual(eventContainer); - }); - - it('should show the read-marker that fall in summarised events after the summary', function() { - const melsEvents = mkMelsEvents(); - const res = TestUtils.renderIntoDocument( - , - ); - - const summary = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_EventListSummary'); - - // find the
  • which wraps the read marker - const rm = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_RoomView_myReadMarker_container'); - - expect(rm.previousSibling).toEqual(summary); - }); - - it('shows a ghost read-marker when the read-marker moves', function(done) { - // fake the clock so that we can test the velocity animation. - clock.install(); - clock.mockDate(); - - const parentDiv = document.createElement('div'); - - // first render with the RM in one place - let mp = ReactDOM.render( - , parentDiv); - - const tiles = TestUtils.scryRenderedComponentsWithType( - mp, sdk.getComponent('rooms.EventTile')); - const tileContainers = tiles.map(function(t) { - return ReactDOM.findDOMNode(t).parentNode; - }); - - // find the
  • which wraps the read marker - const rm = TestUtils.findRenderedDOMComponentWithClass(mp, 'mx_RoomView_myReadMarker_container'); - expect(rm.previousSibling).toEqual(tileContainers[4]); - - // now move the RM - mp = ReactDOM.render( - , parentDiv); - - // now there should be two RM containers - const found = TestUtils.scryRenderedDOMComponentsWithClass(mp, 'mx_RoomView_myReadMarker_container'); - expect(found.length).toEqual(2); - - // the first should be the ghost - expect(found[0].previousSibling).toEqual(tileContainers[4]); - const hr = found[0].children[0]; - - // the second should be the real thing - expect(found[1].previousSibling).toEqual(tileContainers[6]); - - // advance the clock, and then let the browser run an animation frame, - // to let the animation start - clock.tick(1500); - - realSetTimeout(() => { - // then advance it again to let it complete - clock.tick(1000); - realSetTimeout(() => { - // the ghost should now have finished - expect(hr.style.opacity).toEqual('0'); - done(); - }, 100); - }, 100); - }); - - it('should collapse creation events', function() { + // A list of room creation, encryption, and invite events. + function mkCreationEvents() { const mkEvent = test_utils.mkEvent; const mkMembership = test_utils.mkMembership; const roomId = "!someroom"; const alice = "@alice:example.org"; const ts0 = Date.now(); - const events = [ + + return [ mkEvent({ event: true, type: "m.room.create", @@ -341,6 +255,150 @@ describe('MessagePanel', function() { name: 'Bob', }), ]; + } + + function isReadMarkerVisible(rmContainer) { + return rmContainer && rmContainer.children.length > 0; + } + + it('should show the events', function() { + const res = TestUtils.renderIntoDocument( + , + ); + + // just check we have the right number of tiles for now + const tiles = TestUtils.scryRenderedComponentsWithType( + res, sdk.getComponent('rooms.EventTile')); + expect(tiles.length).toEqual(10); + }); + + it('should collapse adjacent member events', function() { + const res = TestUtils.renderIntoDocument( + , + ); + + // just check we have the right number of tiles for now + const tiles = TestUtils.scryRenderedComponentsWithType( + res, sdk.getComponent('rooms.EventTile'), + ); + expect(tiles.length).toEqual(2); + + const summaryTiles = TestUtils.scryRenderedComponentsWithType( + res, sdk.getComponent('elements.MemberEventListSummary'), + ); + expect(summaryTiles.length).toEqual(1); + }); + + it('should insert the read-marker in the right place', function() { + const res = TestUtils.renderIntoDocument( + , + ); + + const tiles = TestUtils.scryRenderedComponentsWithType( + res, sdk.getComponent('rooms.EventTile')); + + // find the
  • which wraps the read marker + const rm = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_RoomView_myReadMarker_container'); + + // it should follow the
  • which wraps the event tile for event 4 + const eventContainer = ReactDOM.findDOMNode(tiles[4]).parentNode; + expect(rm.previousSibling).toEqual(eventContainer); + }); + + it('should show the read-marker that fall in summarised events after the summary', function() { + const melsEvents = mkMelsEvents(); + const res = TestUtils.renderIntoDocument( + , + ); + + const summary = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_EventListSummary'); + + // find the
  • which wraps the read marker + const rm = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_RoomView_myReadMarker_container'); + + expect(rm.previousSibling).toEqual(summary); + + // read marker should be visible given props and not at the last event + expect(isReadMarkerVisible(rm)).toBeTruthy(); + }); + + it('should hide the read-marker at the end of summarised events', function() { + const melsEvents = mkMelsEventsOnly(); + const res = TestUtils.renderIntoDocument( + , + ); + + const summary = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_EventListSummary'); + + // find the
  • which wraps the read marker + const rm = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_RoomView_myReadMarker_container'); + + expect(rm.previousSibling).toEqual(summary); + + // read marker should be hidden given props and at the last event + expect(isReadMarkerVisible(rm)).toBeFalsy(); + }); + + it('shows a ghost read-marker when the read-marker moves', function(done) { + // fake the clock so that we can test the velocity animation. + clock.install(); + clock.mockDate(); + + const parentDiv = document.createElement('div'); + + // first render with the RM in one place + let mp = ReactDOM.render( + , parentDiv); + + const tiles = TestUtils.scryRenderedComponentsWithType( + mp, sdk.getComponent('rooms.EventTile')); + const tileContainers = tiles.map(function(t) { + return ReactDOM.findDOMNode(t).parentNode; + }); + + // find the
  • which wraps the read marker + const rm = TestUtils.findRenderedDOMComponentWithClass(mp, 'mx_RoomView_myReadMarker_container'); + expect(rm.previousSibling).toEqual(tileContainers[4]); + + // now move the RM + mp = ReactDOM.render( + , parentDiv); + + // now there should be two RM containers + const found = TestUtils.scryRenderedDOMComponentsWithClass(mp, 'mx_RoomView_myReadMarker_container'); + expect(found.length).toEqual(2); + + // the first should be the ghost + expect(found[0].previousSibling).toEqual(tileContainers[4]); + const hr = found[0].children[0]; + + // the second should be the real thing + expect(found[1].previousSibling).toEqual(tileContainers[6]); + + // advance the clock, and then let the browser run an animation frame, + // to let the animation start + clock.tick(1500); + + realSetTimeout(() => { + // then advance it again to let it complete + clock.tick(1000); + realSetTimeout(() => { + // the ghost should now have finished + expect(hr.style.opacity).toEqual('0'); + done(); + }, 100); + }, 100); + }); + + it('should collapse creation events', function() { + const events = mkCreationEvents(); const res = mount( , ); @@ -363,4 +421,26 @@ describe('MessagePanel', function() { // invite event should be in the event summary expect(summaryEventTiles.length).toEqual(tiles.length - 3); }); + + it('should hide read-marker at the end of creation event summary', function() { + const events = mkCreationEvents(); + const res = mount( + , + ); + + // find the
  • which wraps the read marker + const rm = res.find('.mx_RoomView_myReadMarker_container').getDOMNode(); + + const rows = res.find('.mx_RoomView_MessageList').children(); + expect(rows.length).toEqual(6); + expect(rm.previousSibling).toEqual(rows.at(4).getDOMNode()); + + // read marker should be hidden given props and at the last event + expect(isReadMarkerVisible(rm)).toBeFalsy(); + }); }); From 4b5e2198fd784c6ff9ea6fdb682449b742353c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Fri, 3 Apr 2020 06:55:13 +0000 Subject: [PATCH 089/230] Translated using Weblate (French) Currently translated at 100.0% (2256 of 2256 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index f138f81647..47cee69682 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2309,5 +2309,17 @@ "Compare emoji": "Comparer des émojis", "Sends a message as html, without interpreting it as markdown": "Envoie un message en HTML, sans l’interpréter comme du Markdown", "Sign in with SSO": "Se connecter avec l’authentification unique", - "Cancel replying to a message": "Annuler la réponse à un message" + "Cancel replying to a message": "Annuler la réponse à un message", + "Use Single Sign On to continue": "Utiliser l’authentification unique pour continuer", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirmez l’ajout de cette adresse e-mail en utilisant l’authentification unique pour prouver votre identité.", + "Single Sign On": "Authentification unique", + "Confirm adding email": "Confirmer l’ajout de l’e-mail", + "Click the button below to confirm adding this email address.": "Cliquez sur le bouton ci-dessous pour confirmer l’ajout de l’adresse e-mail.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Confirmez l’ajout de ce numéro de téléphone en utilisant l’authentification unique pour prouver votre identité.", + "Confirm adding phone number": "Confirmer l’ajout du numéro de téléphone", + "Click the button below to confirm adding this phone number.": "Cliquez sur le bouton ci-dessous pour confirmer l’ajout de ce numéro de téléphone.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Confirmez la suppression de ces sessions en utilisant l’authentification unique pour prouver votre identité.", + "Confirm deleting these sessions": "Confirmer la suppression de ces sessions", + "Click the button below to confirm deleting these sessions.": "Cliquez sur le bouton ci-dessous pour confirmer la suppression de ces sessions.", + "Delete sessions": "Supprimer les sessions" } From 0102876e40e3decc484186618d8cf5ab069a2549 Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 3 Apr 2020 11:49:08 +0100 Subject: [PATCH 090/230] Re-request room keys after auth --- src/stores/SetupEncryptionStore.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stores/SetupEncryptionStore.js b/src/stores/SetupEncryptionStore.js index 7b42e1552d..cbbbefb129 100644 --- a/src/stores/SetupEncryptionStore.js +++ b/src/stores/SetupEncryptionStore.js @@ -140,5 +140,7 @@ export class SetupEncryptionStore extends EventEmitter { done() { this.phase = PHASE_FINISHED; this.emit("update"); + // async - ask other clients for keys, if necessary + MatrixClientPeg.get()._crypto.cancelAndResendAllOutgoingKeyRequests(); } } From 94236de63719a9ac5585f421f739244b0250fb6b Mon Sep 17 00:00:00 2001 From: JungEon Kim Date: Fri, 3 Apr 2020 03:36:25 +0900 Subject: [PATCH 091/230] Fix Hangul typing does not work properly compositionstart event may fire in the meantime because compositionend event is being processed asynchronously. Signed-off-by: JungEon Kim --- src/components/views/rooms/BasicMessageComposer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index 7042cdc00d..5b597e1999 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -203,9 +203,9 @@ export default class BasicMessageEditor extends React.Component { if (isSafari) { this._onInput({inputType: "insertCompositionText"}); } else { - setTimeout(() => { + Promise.resolve().then(() => { this._onInput({inputType: "insertCompositionText"}); - }, 0); + }); } } From 030d594e67ec09f451da928d5b177188c6c7c35a Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 3 Apr 2020 17:03:37 +0200 Subject: [PATCH 092/230] for self-verif, mention which device, not user we're verifying in panel --- .../views/right_panel/EncryptionPanel.js | 10 +++++++++- .../views/right_panel/VerificationPanel.js | 14 +++++++++++--- .../views/verification/VerificationShowSas.js | 11 +++++++++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index 152f4c0aa0..da06c37f75 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -22,6 +22,7 @@ import VerificationPanel from "./VerificationPanel"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {ensureDMExists} from "../../../createRoom"; import {useEventEmitter} from "../../../hooks/useEventEmitter"; +import {useAsyncMemo} from "../../../hooks/useAsyncMemo"; import Modal from "../../../Modal"; import {PHASE_REQUESTED, PHASE_UNSENT} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import * as sdk from "../../../index"; @@ -45,6 +46,12 @@ const EncryptionPanel = (props) => { } }, [verificationRequest]); + const deviceId = request && request.channel.deviceId; + const device = useAsyncMemo(() => { + const cli = MatrixClientPeg.get(); + return cli.getStoredDevice(cli.getUserId(), deviceId); + }, [deviceId]); + useEffect(() => { async function awaitPromise() { setRequesting(true); @@ -139,7 +146,8 @@ const EncryptionPanel = (props) => { request={request} key={request.channel.transactionId} inDialog={inDialog} - phase={phase} /> + phase={phase} + device={device} /> ); } }; diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 22cf855d2c..e114b60b28 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -210,12 +210,19 @@ export default class VerificationPanel extends React.PureComponent { } const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + const description = request.isSelfVerification ? + _t("You've successfully verified %(deviceName)s (%(deviceId)s)!", { + deviceName: this.props.device.getDisplayName(), + deviceId: this.props.device.deviceId, + }): + _t("You've successfully verified %(displayName)s!", { + displayName: member.displayName || member.name || member.userId, + }); + return (

    {_t("Verified")}

    -

    {_t("You've successfully verified %(displayName)s!", { - displayName: member.displayName || member.name || member.userId, - })}

    +

    {description}

    { text }

    @@ -276,6 +283,7 @@ export default class VerificationPanel extends React.PureComponent { onDone={this._onSasMatchesClick} inDialog={this.props.inDialog} isSelf={request.isSelfVerification} + device={this.props.device} /> : ; return

    {_t("Compare emoji")}

    diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 36f2df6360..7e9096e8fe 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -107,8 +107,15 @@ export default class VerificationShowSas extends React.Component { if (this.state.pending || this.state.cancelling) { let text; if (this.state.pending) { - const {displayName} = this.props; - text = _t("Waiting for %(displayName)s to verify…", {displayName}); + if (this.props.isSelf) { + text = _t("Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…", { + deviceName: this.props.device.getDisplayName(), + deviceId: this.props.device.deviceId, + }); + } else { + const {displayName} = this.props; + text = _t("Waiting for %(displayName)s to verify…", {displayName}); + } } else { text = _t("Cancelling…"); } From cdbd4da0e4e45d8fa64b5458f3f226d74ac5862a Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 3 Apr 2020 17:04:29 +0200 Subject: [PATCH 093/230] adjust copy for self-verification in verification panel --- .../views/right_panel/VerificationPanel.js | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index e114b60b28..b60cc234eb 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -18,7 +18,6 @@ import React from "react"; import PropTypes from "prop-types"; import * as sdk from '../../../index'; -import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import {SCAN_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; @@ -200,13 +199,15 @@ export default class VerificationPanel extends React.PureComponent { } renderVerifiedPhase() { - const {member} = this.props; + const {member, request} = this.props; let text; - if (this.props.isRoomEncrypted) { - text = _t("Verify all users in a room to ensure it's secure."); - } else { - text = _t("In encrypted rooms, verify all users to ensure it’s secure."); + if (!request.isSelfVerification) { + if (this.props.isRoomEncrypted) { + text = _t("Verify all users in a room to ensure it's secure."); + } else { + text = _t("In encrypted rooms, verify all users to ensure it’s secure."); + } } const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); @@ -224,8 +225,7 @@ export default class VerificationPanel extends React.PureComponent {

    {_t("Verified")}

    {description}

    -

    { text }

    - + { text ?

    { text }

    : null } {_t("Got it")} @@ -238,15 +238,27 @@ export default class VerificationPanel extends React.PureComponent { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + let startAgainInstruction; + if (request.isSelfVerification) { + startAgainInstruction = _t("Start verification again from the notification."); + } else { + startAgainInstruction = _t("Start verification again from their profile."); + } + let text; if (request.cancellationCode === "m.timeout") { - text = _t("Verification timed out. Start verification again from their profile."); + text = _t("Verification timed out.") + ` ${startAgainInstruction}`; } else if (request.cancellingUserId === request.otherUserId) { - text = _t("%(displayName)s cancelled verification. Start verification again from their profile.", { - displayName: member.displayName || member.name || member.userId, - }); + if (request.isSelfVerification) { + text = _t("You cancelled verification on your other session."); + } else { + text = _t("%(displayName)s cancelled verification.", { + displayName: member.displayName || member.name || member.userId, + }); + } + text = `${text} ${startAgainInstruction}`; } else { - text = _t("You cancelled verification. Start verification again from their profile."); + text = _t("You cancelled verification.") + ` ${startAgainInstruction}`; } return ( From 364421b08896e93cd10050c5e5a89292686dd503 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 3 Apr 2020 17:04:58 +0200 Subject: [PATCH 094/230] adjust self-verification copy in incoming verif req toast --- src/components/structures/MatrixChat.js | 2 +- .../views/toasts/VerificationRequestToast.js | 35 +++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 09d4740c73..7d3b7dd0d9 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1521,7 +1521,7 @@ export default createReactClass({ } else if (request.pending) { ToastStore.sharedInstance().addOrReplaceToast({ key: 'verifreq_' + request.channel.transactionId, - title: _t("Verification Request"), + title: request.isSelfVerification ? _t("Self-verification request") : _t("Verification Request"), icon: "verification", props: {request}, component: sdk.getComponent("toasts.VerificationRequestToast"), diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index c11cefc839..6ca582fbc7 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -31,7 +31,7 @@ export default class VerificationRequestToast extends React.PureComponent { this.state = {counter: Math.ceil(props.request.timeout / 1000)}; } - componentDidMount() { + async componentDidMount() { const {request} = this.props; if (request.timeout && request.timeout > 0) { this._intervalHandle = setInterval(() => { @@ -48,6 +48,11 @@ export default class VerificationRequestToast extends React.PureComponent { // As a quick & dirty fix, check the toast is still relevant when it mounts (this prevents // a toast hanging around after logging in if you did a verification as part of login). this._checkRequestIsPending(); + + if (request.isSelfVerification) { + const cli = MatrixClientPeg.get(); + this.setState({device: await cli.getStoredDevice(cli.getUserId(), request.channel.deviceId)}); + } } componentWillUnmount() { @@ -107,15 +112,25 @@ export default class VerificationRequestToast extends React.PureComponent { render() { const FormButton = sdk.getComponent("elements.FormButton"); const {request} = this.props; - const userId = request.otherUserId; - const roomId = request.channel.roomId; - let nameLabel = roomId ? userLabelForEventRoom(userId, roomId) : userId; - // for legacy to_device verification requests - if (nameLabel === userId) { - const client = MatrixClientPeg.get(); - const user = client.getUser(userId); - if (user && user.displayName) { - nameLabel = _t("%(name)s (%(userId)s)", {name: user.displayName, userId}); + let nameLabel; + if (request.isSelfVerification) { + if (this.state.device) { + nameLabel = _t("From %(deviceName)s (%(deviceId)s)", { + deviceName: this.state.device.getDisplayName(), + deviceId: this.state.device.deviceId, + }); + } + } else { + const userId = request.otherUserId; + const roomId = request.channel.roomId; + nameLabel = roomId ? userLabelForEventRoom(userId, roomId) : userId; + // for legacy to_device verification requests + if (nameLabel === userId) { + const client = MatrixClientPeg.get(); + const user = client.getUser(userId); + if (user && user.displayName) { + nameLabel = _t("%(name)s (%(userId)s)", {name: user.displayName, userId}); + } } } const declineLabel = this.state.counter == 0 ? From 37289bc832cbe6fa02fde12dbd9da426a098ce23 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 3 Apr 2020 17:05:20 +0200 Subject: [PATCH 095/230] i18n --- src/i18n/strings/en_EN.json | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 912a86446f..3007db1b44 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -483,6 +483,7 @@ "Verify this session by confirming the following number appears on its screen.": "Verify this session by confirming the following number appears on its screen.", "Verify this user by confirming the following number appears on their screen.": "Verify this user by confirming the following number appears on their screen.", "Unable to find a supported verification method.": "Unable to find a supported verification method.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…", "Waiting for %(displayName)s to verify…": "Waiting for %(displayName)s to verify…", "Cancelling…": "Cancelling…", "They match": "They match", @@ -559,6 +560,7 @@ "Verify": "Verify", "Later": "Later", "Review": "Review", + "From %(deviceName)s (%(deviceId)s)": "From %(deviceName)s (%(deviceId)s)", "Decline (%(counter)s)": "Decline (%(counter)s)", "Accept to continue:": "Accept to continue:", "Upload": "Upload", @@ -1259,12 +1261,16 @@ "Yes": "Yes", "Verify all users in a room to ensure it's secure.": "Verify all users in a room to ensure it's secure.", "In encrypted rooms, verify all users to ensure it’s secure.": "In encrypted rooms, verify all users to ensure it’s secure.", - "Verified": "Verified", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "You've successfully verified %(deviceName)s (%(deviceId)s)!", "You've successfully verified %(displayName)s!": "You've successfully verified %(displayName)s!", + "Verified": "Verified", "Got it": "Got it", - "Verification timed out. Start verification again from their profile.": "Verification timed out. Start verification again from their profile.", - "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s cancelled verification. Start verification again from their profile.", - "You cancelled verification. Start verification again from their profile.": "You cancelled verification. Start verification again from their profile.", + "Start verification again from the notification.": "Start verification again from the notification.", + "Start verification again from their profile.": "Start verification again from their profile.", + "Verification timed out.": "Verification timed out.", + "You cancelled verification on your other session.": "You cancelled verification on your other session.", + "%(displayName)s cancelled verification.": "%(displayName)s cancelled verification.", + "You cancelled verification.": "You cancelled verification.", "Verification cancelled": "Verification cancelled", "Compare emoji": "Compare emoji", "Sunday": "Sunday", @@ -1964,6 +1970,7 @@ "Review terms and conditions": "Review terms and conditions", "Old cryptography data detected": "Old cryptography data detected", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.", + "Self-verification request": "Self-verification request", "Logout": "Logout", "%(creator)s created and configured the room.": "%(creator)s created and configured the room.", "Your Communities": "Your Communities", From 2cf55fb2a0a166eca9bf5217edcfb44e88550dc9 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 3 Apr 2020 17:32:09 +0200 Subject: [PATCH 096/230] adjust start options styling --- res/css/views/right_panel/_VerificationPanel.scss | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 01a654b523..7634706d51 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -75,6 +75,7 @@ limitations under the License. margin-top: 10px; margin-bottom: 10px; align-items: stretch; + justify-content: center; > .mx_VerificationPanel_QRPhase_betweenText { width: 50px; @@ -90,10 +91,12 @@ limitations under the License. border-radius: 10px; flex: 1; display: flex; - padding: 10px; + padding: 20px; align-items: center; flex-direction: column; position: relative; + max-width: 310px; + justify-content: space-between; canvas, .mx_VerificationPanel_QRPhase_noQR { width: 220px !important; @@ -106,19 +109,15 @@ limitations under the License. } > p { + margin-top: 0; font-weight: 700; } .mx_VerificationPanel_QRPhase_helpText { font-size: 14px; - margin-top: 71px; + margin: 30px 0; text-align: center; } - - .mx_AccessibleButton { - position: absolute; - bottom: 30px; - } } } From aaad265190f129de3ca73969240adf72aa09c91b Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Fri, 3 Apr 2020 15:54:53 +0000 Subject: [PATCH 097/230] Translated using Weblate (German) Currently translated at 76.7% (1731 of 2258 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1a33195f79..4cd4a0a72e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -64,7 +64,7 @@ "For security, this session has been signed out. Please sign in again.": "Aus Sicherheitsgründen wurde diese Sitzung beendet. Bitte melde dich erneut an.", "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.", "Hangup": "Auflegen", - "Homeserver is": "Heimserver:", + "Homeserver is": "Heimserver ist", "Identity Server is": "Identitätsserver:", "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", "Import E2E room keys": "E2E-Raum-Schlüssel importieren", From 2c29172d702fb23c23dcb81d2a4390db27e5a08d Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 3 Apr 2020 15:55:03 +0000 Subject: [PATCH 098/230] Translated using Weblate (German) Currently translated at 76.7% (1731 of 2258 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4cd4a0a72e..0e798e0808 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -64,7 +64,7 @@ "For security, this session has been signed out. Please sign in again.": "Aus Sicherheitsgründen wurde diese Sitzung beendet. Bitte melde dich erneut an.", "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.", "Hangup": "Auflegen", - "Homeserver is": "Heimserver ist", + "Homeserver is": "Der Heimserver ist", "Identity Server is": "Identitätsserver:", "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", "Import E2E room keys": "E2E-Raum-Schlüssel importieren", From e8848892f29ea5017ca85056acf2c09766973f2b Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Fri, 3 Apr 2020 15:55:11 +0000 Subject: [PATCH 099/230] Translated using Weblate (German) Currently translated at 76.7% (1731 of 2258 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 0e798e0808..8a2167b8c0 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -65,7 +65,7 @@ "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.", "Hangup": "Auflegen", "Homeserver is": "Der Heimserver ist", - "Identity Server is": "Identitätsserver:", + "Identity Server is": "Identitätsserver ist", "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", "Import E2E room keys": "E2E-Raum-Schlüssel importieren", "Invalid Email Address": "Ungültige E-Mail-Adresse", From c0dff262352a9a8c99998afb6d1fb302e0a77e7b Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 3 Apr 2020 15:55:20 +0000 Subject: [PATCH 100/230] Translated using Weblate (German) Currently translated at 76.7% (1731 of 2258 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 8a2167b8c0..23f95b002e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -65,7 +65,7 @@ "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten, auch wenn sie explizit eingeladen wurden.", "Hangup": "Auflegen", "Homeserver is": "Der Heimserver ist", - "Identity Server is": "Identitätsserver ist", + "Identity Server is": "Der Identitätsserver ist", "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", "Import E2E room keys": "E2E-Raum-Schlüssel importieren", "Invalid Email Address": "Ungültige E-Mail-Adresse", @@ -1718,8 +1718,8 @@ "Displays information about a user": "Zeigt Informationen über einen Benutzer", "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s hat den Raumnamen von %(oldRoomName)s zu %(newRoomName)s geändert.", "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Raum hinzugefügt.", - "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s hat die alternativen Adressen %(addresses)s für diesen Raum entfernt", - "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Raum entfernt", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s hat die alternativen Adressen %(addresses)s für diesen Raum entfernt.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Raum entfernt.", "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s hat die alternative Adresse für diesen Raum geändert.", "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s hat die Haupt- und Alternativadresse für diesen Raum geändert.", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s entfernte die Ausschluss-Regel für Nutzer, die %(glob)s entsprechen", From fd5a7ad74df088bf2b2035028a9e23a8d7eeece9 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Fri, 3 Apr 2020 15:58:20 +0000 Subject: [PATCH 101/230] Translated using Weblate (German) Currently translated at 76.7% (1731 of 2258 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 23f95b002e..c0c1b5508d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -692,7 +692,7 @@ "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Du wirst nicht in der Lage sein, die Änderung zurückzusetzen, da du dich degradierst. Wenn du der letze Nutzer mit Berechtigungen bist, wird es unmöglich sein die Privilegien zurückzubekommen.", "Community IDs cannot be empty.": "Community-IDs können nicht leer sein.", "Learn more about how we use analytics.": "Lerne mehr darüber, wie wir die Analysedaten nutzen.", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen wie Raum, Nutzer oder Gruppen-ID enthalten, werden diese Daten entfernt bevor sie an den Server gesendet werden.", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen wie Raum-, Nutzer- oder Gruppen-ID enthält, werden diese Daten entfernt bevor sie an den Server gesendet werden.", "Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn es der Fall ist", "In reply to ": "Als Antwort auf ", "This room is not public. You will not be able to rejoin without an invite.": "Dies ist kein öffentlicher Raum. Du wirst diesen nicht ohne Einladung wieder beitreten können.", @@ -1544,9 +1544,9 @@ "You are currently subscribed to:": "Du abonnierst momentan:", "⚠ These settings are meant for advanced users.": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht.", "The version of Riot": "Die Version von Riot", - "Whether you're using Riot on a device where touch is the primary input mechanism": "Ob Sie Riot auf einem Gerät verwenden, bei dem Berührung der primäre Eingabemechanismus ist", + "Whether you're using Riot on a device where touch is the primary input mechanism": "Ob du Riot auf einem Gerät verwendest, bei dem Berührung der primäre Eingabemechanismus ist", "Whether you're using Riot as an installed Progressive Web App": "Ob Sie Riot als installierte progressive Web-App verwenden", - "Your user agent": "Ihr User-Agent", + "Your user agent": "Dein User-Agent", "The information being sent to us to help make Riot better includes:": "Zu den Informationen, die uns zugesandt werden, um zu helfen, Riot besser zu machen, gehören:", "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Es sind unbekannte Sitzungen in diesem Raum: Wenn du ohne Verifizierung fortfährst, wird es für jemanden möglich sein, deinen Anruf zu belauschen.", "If you cancel now, you won't complete verifying the other user.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung des anderen Nutzers nicht beenden können.", From 4c46ae18643cf3c4a3223c36933da0c9837e5b3a Mon Sep 17 00:00:00 2001 From: random Date: Fri, 3 Apr 2020 13:25:47 +0000 Subject: [PATCH 102/230] Translated using Weblate (Italian) Currently translated at 100.0% (2258 of 2258 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index fbb3b2f210..f78cbd315d 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -215,7 +215,7 @@ "Submit": "Invia", "Phone": "Telefono", "Failed to upload profile picture!": "Invio dell'immagine profilo fallito!", - "Upload new:": "Invia nuovo:", + "Upload new:": "Carica nuovo:", "No display name": "Nessun nome visibile", "New passwords don't match": "Le nuove password non corrispondono", "Passwords can't be empty": "Le password non possono essere vuote", @@ -896,8 +896,8 @@ "Permission Required": "Permesso richiesto", "You do not have permission to start a conference call in this room": "Non hai il permesso di avviare una chiamata di gruppo in questa stanza", "This event could not be displayed": "Questo evento non può essere mostrato", - "Demote yourself?": "Retrocedi?", - "Demote": "Retrocedi", + "Demote yourself?": "Vuoi declassarti?", + "Demote": "Declassa", "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "Nelle stanze criptate, come questa, le anteprime degli URL sono disabilitate di default per garantire che il tuo server di casa (dove vengono generate le anteprime) non possa raccogliere informazioni sui collegamenti che vedi in questa stanza.", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Quando qualcuno inserisce un URL nel proprio messaggio, è possibile mostrare un'anteprima dell'URL per fornire maggiori informazioni su quel collegamento, come il titolo, la descrizione e un'immagine dal sito web.", "The email field must not be blank.": "Il campo email non deve essere vuoto.", @@ -1004,7 +1004,7 @@ "Restored %(sessionCount)s session keys": "Ripristinate le chiavi di %(sessionCount)s sessioni", "Enter Recovery Passphrase": "Inserisci la password di recupero", "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Accedi alla cronologia sicura dei messaggi e imposta la messaggistica sicura inserendo la tua password di recupero.", - "Next": "Prossimo", + "Next": "Avanti", "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "Se hai dimenticato la password di recupero puoi usare la tua chiave di recupero o impostare nuove opzioni di recupero", "Enter Recovery Key": "Inserisci la chiave di recupero", "This looks like a valid recovery key!": "Sembra essere una chiave di recupero valida!", @@ -1215,7 +1215,7 @@ "Ignored users": "Utenti ignorati", "Bulk options": "Opzioni generali", "Accept all %(invitedRooms)s invites": "Accetta tutti i %(invitedRooms)s inviti", - "Key backup": "Backup chiave", + "Key backup": "Backup chiavi", "Security & Privacy": "Sicurezza e privacy", "Missing media permissions, click the button below to request.": "Autorizzazione multimediale mancante, clicca il pulsante sotto per richiederla.", "Request media permissions": "Richiedi autorizzazioni multimediali", @@ -1342,7 +1342,7 @@ "For maximum security, this should be different from your account password.": "Per la massima sicurezza, questa dovrebbe essere diversa dalla password del tuo account.", "Set up with a Recovery Key": "Imposta con una chiave di ripristino", "Please enter your passphrase a second time to confirm.": "Inserisci la tua password un'altra volta per confermare.", - "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "La tua chiave di ripristino è una rete di sicurezza - puoi usarla per recuperare l'accesso ai tuoi messaggi cifrati se dimentichi la tua password.", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "La tua chiave di recupero è come una rete di sicurezza - puoi usarla per recuperare l'accesso ai tuoi messaggi cifrati se dimentichi la tua password.", "Your keys are being backed up (the first backup could take a few minutes).": "Il backup delle chiavi è in corso (il primo backup potrebbe richiedere qualche minuto).", "Secure your backup with a passphrase": "Proteggi il tuo backup con una password", "Confirm your passphrase": "Conferma la tua password", @@ -1433,7 +1433,7 @@ "Your browser likely removed this data when running low on disk space.": "Probabilmente il tuo browser ha rimosso questi dati per mancanza di spazio su disco.", "Upload files (%(current)s of %(total)s)": "Invio dei file (%(current)s di %(total)s)", "Upload files": "Invia i file", - "Upload": "Invia", + "Upload": "Carica", "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Questo file è troppo grande da inviare. Il limite di dimensione è %(limit)s ma questo file è di %(sizeOfThisFile)s.", "These files are too large to upload. The file size limit is %(limit)s.": "Questi file sono troppo grandi da inviare. Il limite di dimensione è %(limit)s.", "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Alcuni file sono troppo grandi da inviare. Il limite di dimensione è %(limit)s.", @@ -1522,7 +1522,7 @@ "Use bots, bridges, widgets and sticker packs": "Usa bot, bridge, widget e pacchetti di adesivi", "Terms of Service": "Condizioni di servizio", "Service": "Servizio", - "Summary": "Sommario", + "Summary": "Riepilogo", "Call failed due to misconfigured server": "Chiamata non riuscita a causa di un server non configurato correttamente", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Chiedi all'amministratore del tuo homeserver(%(homeserverDomain)s) per configurare un server TURN affinché le chiamate funzionino in modo affidabile.", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "In alternativa, puoi provare a utilizzare il server pubblico all'indirizzo turn.matrix.org, ma questo non sarà così affidabile e condividerà il tuo indirizzo IP con quel server. Puoi anche gestirlo in Impostazioni.", @@ -2318,5 +2318,7 @@ "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Conferma eliminando queste sessioni usando Single Sign On per provare la tua identità.", "Confirm deleting these sessions": "Conferma eliminando queste sessioni", "Click the button below to confirm deleting these sessions.": "Clicca il pulsante sotto per confermare l'eliminazione di queste sessioni.", - "Delete sessions": "Elimina sessioni" + "Delete sessions": "Elimina sessioni", + "Almost there! Is your other session showing the same shield?": "Quasi fatto! L'altra tua sessione sta mostrando lo stesso scudo?", + "Almost there! Is %(displayName)s showing the same shield?": "Quasi fatto! %(displayName)s sta mostrando lo stesso scudo?" } From fc74d927c0d13bd533408fc7b6c4bed8f63a4cb1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 4 Apr 2020 17:23:19 +0100 Subject: [PATCH 103/230] import VelocityBounce sync as it is *tiny* (481B) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/ReadReceiptMarker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js index dcb8fd4310..be0ca1f8d6 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.js @@ -18,7 +18,7 @@ limitations under the License. import React, {createRef} from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; -import('../../../VelocityBounce'); +import '../../../VelocityBounce'; import { _t } from '../../../languageHandler'; import {formatDate} from '../../../DateUtils'; import Velociraptor from "../../../Velociraptor"; From 5ac68d4ce04e9314c19d8c13300804834b0ede7f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 6 Apr 2020 11:10:00 +0100 Subject: [PATCH 104/230] Update emojibase for fixed emoji codepoints and Emoji 13 support Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index c9300a13ca..616f3f541e 100644 --- a/package.json +++ b/package.json @@ -64,8 +64,8 @@ "create-react-class": "^15.6.0", "diff-dom": "^4.1.3", "diff-match-patch": "^1.0.4", - "emojibase-data": "^4.0.2", - "emojibase-regex": "^3.0.0", + "emojibase-data": "^5.0.1", + "emojibase-regex": "^4.0.1", "escape-html": "^1.0.3", "file-saver": "^1.3.3", "filesize": "3.5.6", diff --git a/yarn.lock b/yarn.lock index acd474ffd7..0391132786 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3053,15 +3053,15 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emojibase-data@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/emojibase-data/-/emojibase-data-4.2.1.tgz#3d1f0c69ddbb2ca7b7014f5e34654190802a40df" - integrity sha512-O0vxoPMgVkRq/uII/gdAjz9RwNv6ClJrd3J9QCCRC4btZRmeut/qohC/Fi+NNXUcjY08RWNTvxSnq/vij8hvrw== +emojibase-data@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/emojibase-data/-/emojibase-data-5.0.1.tgz#ce6fe36b4affd3578e0be8779211018a2fdae960" + integrity sha512-rYWlogJ2q5P78U8Xx1vhsXHcYKu1wFnr7+o6z9QHssZ1SsJLTCkJINZIPHRFWuDreAUK457TkqHpdOXElu0fzA== -emojibase-regex@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/emojibase-regex/-/emojibase-regex-3.2.1.tgz#122935958c9a49c96bb29ac69ccbbac0b2e7022d" - integrity sha512-VAX2Rc2U/alu5q6P2cET2alzC63o1Uarm6Ea/b3ab+KOzxZT4JKmB0tCU1sTZvfNKa16KMLCK2k7hJBHJq4vWQ== +emojibase-regex@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/emojibase-regex/-/emojibase-regex-4.0.1.tgz#a2cd4bbb42825422da9ec72f15e970bc2c90b46a" + integrity sha512-S42UHkFfz15i4NNz+wi9iMKFo+B6Kalc6PJLpYX0BUANViXw4vSyYZMFdBGRLduSabWHuEcTLZl9xOa2YP3eJw== emojis-list@^2.0.0: version "2.1.0" From a5856042b12e54c14190128511c6fd25e9cff6e0 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sat, 4 Apr 2020 17:12:06 +0000 Subject: [PATCH 105/230] Translated using Weblate (Albanian) Currently translated at 99.7% (2259 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 9c15bbaa3b..8be33f1e20 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2295,5 +2295,35 @@ "Verified": "I verifikuar", "Verification cancelled": "Verifikimi u anulua", "Compare emoji": "Krahasoni emoji", - "Session backup key:": "Kyç kopjeruajtjeje sesioni:" + "Session backup key:": "Kyç kopjeruajtjeje sesioni:", + "Use Single Sign On to continue": "Që të vazhdohet, përdorni Hyrje Njëshe", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Ripohoni shtimin e kësaj adrese email duke përdorur Hyrje Njëshe për të provuar identitetin tuaj.", + "Single Sign On": "Hyrje Njëshe", + "Confirm adding email": "Ripohoni shtim email-i", + "Click the button below to confirm adding this email address.": "Klikoni butonin më poshtë që të ripohoni shtimin e kësaj adrese email.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Ripohojeni shtimin e këtij numri telefoni duke përdorur Hyrje Njëshe që të provoni identitetin tuaj.", + "Confirm adding phone number": "Ripohoni shtim numri telefoni", + "Click the button below to confirm adding this phone number.": "Klikoni mbi butonin më poshtë që të ripohoni shtimin e këtij numri telefoni.", + "Sends a message as html, without interpreting it as markdown": "E dërgon një mesazh si html, pa e interpretuar si markdown", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Ripohoni se emoxhit më poshtë shfaqen në të dy sesionet, nën të njëjtën radhë:", + "Verify this session by confirming the following number appears on its screen.": "Verifikojeni këtë sesion duke ripohuar se numri vijues shfaqet në ekranin e sesionit.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Po pritet që të verifikohet sesioni juaj tjetër, %(deviceName)s (%(deviceId)s)…", + "From %(deviceName)s (%(deviceId)s)": "Nga %(deviceName)s (%(deviceId)s)", + "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Ripohoni fshirjen e këtyre sesioneve duke përdorur Hyrje Njëshe për të dëshmuar identitetin tuaj.", + "Confirm deleting these sessions": "Ripohoni fshirjen e këtyre sesioneve", + "Click the button below to confirm deleting these sessions.": "Që të ripohoni fshirjen e këtyre sesioneve, klikoni mbi butonin më poshtë.", + "Delete sessions": "Fshini sesione", + "Waiting for you to accept on your other session…": "Po pritet që të pranoni në sesionin tuaj tjetër…", + "Almost there! Is your other session showing the same shield?": "Thuajse mbërritëm! A shfaq sesioni juaj tjetër të njëjtën mburojë?", + "Almost there! Is %(displayName)s showing the same shield?": "Thuaje mbërritëm! A shfaq %(displayName)s të njëjtën mburojë?", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Keni verifikuar me sukses %(deviceName)s (%(deviceId)s)!", + "Start verification again from the notification.": "Rifillo verifikimin prej njoftimit.", + "Start verification again from their profile.": "Rifillo verifikimin prej profilit të tyre.", + "Verification timed out.": "Verifikimit i mbaroi koha.", + "You cancelled verification on your other session.": "Anuluat verifikimin në sesionin tuaj tjetër.", + "%(displayName)s cancelled verification.": "%(displayName)s anuloi verifikimin.", + "You cancelled verification.": "Anuluat verifikimin.", + "Sign in with SSO": "Hyni me HNj", + "Self-verification request": "Kërkesë vetë-verifikimi", + "Cancel replying to a message": "Anulo përgjigjen te një mesazh" } From 0b549ddf7f52aad906630b2900091c01f79ee6a2 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 4 Apr 2020 04:11:33 +0000 Subject: [PATCH 106/230] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2266 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index e7c0e118d6..a87ba36d33 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2320,5 +2320,20 @@ "Confirm deleting these sessions by using Single Sign On to prove your identity.": "透過使用單一登入來證明您的身份以確認刪除這些工作階段。", "Confirm deleting these sessions": "確認刪除這些工作階段", "Click the button below to confirm deleting these sessions.": "點擊下方按鈕以確認刪除這些工作階段。", - "Delete sessions": "刪除工作階段" + "Delete sessions": "刪除工作階段", + "Confirm the emoji below are displayed on both sessions, in the same order:": "確認以下的顏文字以相同的順序顯示在兩個工作階段中:", + "Verify this session by confirming the following number appears on its screen.": "透過確認螢幕上顯示以下的數字來確認此工作階段。", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "正在等待您的其他工作階段,%(deviceName)s (%(deviceId)s),進行驗證……", + "From %(deviceName)s (%(deviceId)s)": "從 %(deviceName)s (%(deviceId)s)", + "Waiting for you to accept on your other session…": "正在等待您接受其他工作階段……", + "Almost there! Is your other session showing the same shield?": "差不多了!您的其他工作階段是否顯示相同的盾牌?", + "Almost there! Is %(displayName)s showing the same shield?": "差不多了!%(displayName)s 是否顯示相同的盾牌?", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "您已成功驗證了 %(deviceName)s (%(deviceId)s)!", + "Start verification again from the notification.": "從通知再次開始驗證。", + "Start verification again from their profile.": "從他們的個人簡介再次開始驗證。", + "Verification timed out.": "驗證逾時。", + "You cancelled verification on your other session.": "您已在其他工作階段取消驗證。", + "%(displayName)s cancelled verification.": "%(displayName)s 取消驗證。", + "You cancelled verification.": "您取消了驗證。", + "Self-verification request": "自我驗證請求" } From da9fbba37dfb7f0ed86eccf9b97c227fb63d30cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Sun, 5 Apr 2020 11:31:16 +0000 Subject: [PATCH 107/230] Translated using Weblate (Czech) Currently translated at 96.4% (2184 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index ef2e95949a..a3314dd920 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -80,7 +80,7 @@ "Attachment": "Příloha", "Autoplay GIFs and videos": "Automaticky přehrávat GIFy a videa", "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.": "Nelze se připojit k domovskému serveru – zkontrolujte prosím své připojení, prověřte, zda je SSL certifikát vašeho domovského serveru důvěryhodný, a že některé z rozšíření prohlížeče neblokuje komunikaci.", - "Anyone who knows the room's link, apart from guests": "Kdokoliv s odkazem na místnost, kromě hostů", + "Anyone who knows the room's link, apart from guests": "Kdokoliv s odkazem na místnost, ale pouze registrovaní uživatelé", "Anyone who knows the room's link, including guests": "Kdokoliv s odkazem na místnost, včetně hostů", "Banned users": "Vykázaní uživatelé", "Ban": "Vykázat", @@ -941,9 +941,9 @@ "Nothing appearing? Not all clients support interactive verification yet. .": "Nic se neděje? Ne všichni klienti klienti podporují interaktivní ověření. .", "Waiting for %(userId)s to confirm...": "Čekáme až to %(userId)s potvrdí...", "Use two-way text verification": "Použít oboustranné ověření", - "Security & Privacy": "Bezpečnost a soukromí", + "Security & Privacy": "Zabezpečení", "Encryption": "Šifrování", - "Once enabled, encryption cannot be disabled.": "Když se šifrování zapne, už nepůjde vypnout.", + "Once enabled, encryption cannot be disabled.": "Po zapnutí, už nepůjde šifrování vypnout.", "Encrypted": "Šifrování", "General": "Obecné", "General failure": "Nějaká chyba", @@ -1546,8 +1546,8 @@ "Create a private room": "Vytvořit neveřejnou místnost", "Topic (optional)": "Téma (volitelné)", "Make this room public": "Zveřejnit místnost", - "Hide advanced": "Skrýt pokročilé", - "Show advanced": "Zobrazit pokročilé", + "Hide advanced": "Skrýt pokročilé možnosti", + "Show advanced": "Zobrazit pokročilé možnosti", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Zamezit uživatelům jiných domovských serverů, aby do místnosti vstoupili (nelze později změnit!)", "Your homeserver doesn't seem to support this feature.": "Váš domovský server asi tuto funkci nepodporuje.", "Message edits": "Editování zpráv", @@ -2215,5 +2215,27 @@ "Verified": "Oveřený", "Verification cancelled": "Oveření bylo zrušeno", "Compare emoji": "Porovnejte emotikony", - "Enter a server name": "Zadejte jméno serveru" + "Enter a server name": "Zadejte jméno serveru", + "Use Single Sign On to continue": "Pokračovat pomocí Jednotného přihlášení", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Potvrďte přidání této adresy pomocí Jednotného přihlášení.", + "Single Sign On": "Jednotné přihlášení", + "Confirm adding email": "Potvrdit přidání emailu", + "Click the button below to confirm adding this email address.": "Kliknutím na tlačítko potvrdíte přidání emailové adresy.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Potvrďte přidání telefonního čísla pomocí Jednotného přihlášení.", + "Confirm adding phone number": "Potrvrdit přidání telefonního čísla", + "Click the button below to confirm adding this phone number.": "Kliknutím na tlačítko potvrdíte přidání telefonního čísla.", + "Sends a message as html, without interpreting it as markdown": "Pošle zprávu jako HTML a nebude jí interpretovat jako Markdown", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Potvrďte, že následující emotikony se zobrazují ve stejném pořadí na obou zařízeních:", + "Verify this session by confirming the following number appears on its screen.": "Ověřtě tuto relaci potrvrzením, že se následující čísla objevily na její obrazovce.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Čekám na ověření od relace %(deviceName)s (%(deviceId)s)…", + "From %(deviceName)s (%(deviceId)s)": "Od %(deviceName)s (%(deviceId)s)", + "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Potvrďte odstranění těchto relací pomocí Jednotného přihlášení.", + "Confirm deleting these sessions": "Potvrdit odstranění těchto relací", + "Click the button below to confirm deleting these sessions.": "Kliknutím na tlačítko potvrdíte odstranění těchto relací.", + "Delete sessions": "Odstranit relace", + "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "Pro hlášení bezpečnostních problémů s Matrixem si prosím přečtěte naší Bezpečnostní politiku (anglicky).", + "Waiting for you to accept on your other session…": "Čekáme na vaše přijetí v druhé relaci…", + "Almost there! Is your other session showing the same shield?": "Téměř hotovo! Je vaše druhá relace také ověřená?", + "Almost there! Is %(displayName)s showing the same shield?": "Téměř hotovo! Je relace %(displayName)s také ověřená?", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Ověřili jste %(deviceName)s (%(deviceId)s)!" } From 340fd6914f21e9fca340925c4b9a6dc304666ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Sat, 4 Apr 2020 07:30:16 +0000 Subject: [PATCH 108/230] Translated using Weblate (French) Currently translated at 100.0% (2266 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 47cee69682..7c3c2ca255 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2321,5 +2321,20 @@ "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Confirmez la suppression de ces sessions en utilisant l’authentification unique pour prouver votre identité.", "Confirm deleting these sessions": "Confirmer la suppression de ces sessions", "Click the button below to confirm deleting these sessions.": "Cliquez sur le bouton ci-dessous pour confirmer la suppression de ces sessions.", - "Delete sessions": "Supprimer les sessions" + "Delete sessions": "Supprimer les sessions", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Confirmez que les émojis ci-dessous s’affichent dans les deux sessions et dans le même ordre :", + "Verify this session by confirming the following number appears on its screen.": "Vérifiez cette session en confirmant que le nombre suivant s’affiche sur son écran.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Dans l’attente que votre autre session, %(deviceName)s (%(deviceId)s), vérifie…", + "From %(deviceName)s (%(deviceId)s)": "Depuis %(deviceName)s (%(deviceId)s)", + "Waiting for you to accept on your other session…": "Dans l’attente que vous acceptiez dans votre autre session…", + "Almost there! Is your other session showing the same shield?": "On y est presque ! Est-ce que votre autre session affiche le même bouclier ?", + "Almost there! Is %(displayName)s showing the same shield?": "On y est presque ! Est-ce que %(displayName)s affiche le même bouclier ?", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Vous avez bien vérifié %(deviceName)s (%(deviceId)s) !", + "Start verification again from the notification.": "Recommencer la vérification depuis la notification.", + "Start verification again from their profile.": "Recommencer la vérification depuis son profil.", + "Verification timed out.": "La vérification a expiré.", + "You cancelled verification on your other session.": "Vous avez annulé la vérification dans votre autre session.", + "%(displayName)s cancelled verification.": "%(displayName)s a annulé la vérification.", + "You cancelled verification.": "Vous avez annulé la vérification.", + "Self-verification request": "Demande d’auto-vérification" } From 39edfc7c056a5e1542532925a01543577c261075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melvyn=20La=C3=AFly?= Date: Sun, 5 Apr 2020 17:21:24 +0000 Subject: [PATCH 109/230] Translated using Weblate (French) Currently translated at 100.0% (2266 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 7c3c2ca255..37bada3c0e 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -787,7 +787,7 @@ "Reject": "Rejeter", "Failed to set Direct Message status of room": "Échec du réglage de l'état du salon en Discussion directe", "Monday": "Lundi", - "All messages (noisy)": "Tous les messages (fort)", + "All messages (noisy)": "Tous les messages (sonore)", "Enable them now": "Les activer maintenant", "Toolbox": "Boîte à outils", "Collecting logs": "Récupération des journaux", @@ -2040,7 +2040,7 @@ "This backup is trusted because it has been restored on this session": "Cette sauvegarde est fiable car elle a été restaurée sur cette session", "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Une sauvegarde de clés est stockée dans le coffre secret, mais cette fonctionnalité n’est pas activée sur cette session. Activez la signature croisée dans le Labo pour modifier l’état de la sauvegarde de clés.", "Your keys are not being backed up from this session.": "Vos clés ne sont pas sauvegardées sur cette session.", - "Enable desktop notifications for this session": "Activer les notifications de l’ordinateur pour cette session", + "Enable desktop notifications for this session": "Activer les notifications de bureau pour cette session", "Enable audible notifications for this session": "Activer les notifications sonores pour cette session", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Votre mot de passe a été modifié. Vous ne recevrez plus de notifications push sur les autres sessions tant que vous ne vous y serez pas reconnecté", "Session ID:": "Identifiant de session :", From faae7d0b1b4c4bdeb36561d83b603468b5d5b135 Mon Sep 17 00:00:00 2001 From: random Date: Sun, 5 Apr 2020 10:11:29 +0000 Subject: [PATCH 110/230] Translated using Weblate (Italian) Currently translated at 100.0% (2266 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index f78cbd315d..fdd79fe074 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2320,5 +2320,18 @@ "Click the button below to confirm deleting these sessions.": "Clicca il pulsante sotto per confermare l'eliminazione di queste sessioni.", "Delete sessions": "Elimina sessioni", "Almost there! Is your other session showing the same shield?": "Quasi fatto! L'altra tua sessione sta mostrando lo stesso scudo?", - "Almost there! Is %(displayName)s showing the same shield?": "Quasi fatto! %(displayName)s sta mostrando lo stesso scudo?" + "Almost there! Is %(displayName)s showing the same shield?": "Quasi fatto! %(displayName)s sta mostrando lo stesso scudo?", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Conferma che gli emoji sottostanti sono mostrati in entrambe le sessioni, nello stesso ordine:", + "Verify this session by confirming the following number appears on its screen.": "Verifica questa sessione confermando che il seguente numero compare nel suo schermo.", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "In attesa che la tua altra sessione, %(deviceName)s (%(deviceId)s), verifichi…", + "From %(deviceName)s (%(deviceId)s)": "Da %(deviceName)s (%(deviceId)s)", + "Waiting for you to accept on your other session…": "In attesa che tu accetti nella tua altra sessione…", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Hai verificato %(deviceName)s (%(deviceId)s) correttamente!", + "Start verification again from the notification.": "Inizia di nuovo la verifica dalla notifica.", + "Start verification again from their profile.": "Inizia di nuovo la verifica dal suo profilo.", + "Verification timed out.": "Verifica scaduta.", + "You cancelled verification on your other session.": "Hai annullato la verifica nell'altra sessione.", + "%(displayName)s cancelled verification.": "%(displayName)s ha annullato la verifica.", + "You cancelled verification.": "Hai annullato la verifica.", + "Self-verification request": "Richiesta di auto-verifica" } From 2778f1fa5101b7b83fc3bb0d73c7d965e62c5843 Mon Sep 17 00:00:00 2001 From: MamasLT Date: Sat, 4 Apr 2020 20:35:35 +0000 Subject: [PATCH 111/230] Translated using Weblate (Lithuanian) Currently translated at 43.6% (987 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/lt/ --- src/i18n/strings/lt.json | 76 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 4476c21609..5defb98281 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -90,10 +90,10 @@ "Download this file": "Atsisiųsti šį failą", "Saturday": "Šeštadienis", "Remember, you can always set an email address in user settings if you change your mind.": "Nepamirškite, kad jei persigalvosite, tai bet kada galite nustatyti el. pašto adresą vartotojo nustatymuose.", - "Direct Chat": "Tiesioginis pokalbis", + "Direct Chat": "Privatus pokalbis", "The server may be unavailable or overloaded": "Gali būti, kad serveris yra neprieinamas arba perkrautas", "Online": "Prisijungęs", - "Failed to set Direct Message status of room": "Nepavyko nustatyti tiesioginio pranešimo kambario būklės", + "Failed to set Direct Message status of room": "Nepavyko nustatyti privačios žinutės kambario statuso", "Monday": "Pirmadienis", "All messages (noisy)": "Visos žinutės (triukšmingas)", "Enable them now": "Įjungti juos dabar", @@ -530,7 +530,7 @@ "Demote yourself?": "Pažeminti save?", "Demote": "Pažeminti", "Share Link to User": "Dalintis nuoroda į naudotoją", - "Direct chats": "Tiesioginiai pokalbiai", + "Direct chats": "Privatūs pokalbiai", "The conversation continues here.": "Pokalbis tęsiasi čia.", "Jump to message": "Pereiti prie žinutės", "Favourites": "Mėgstami", @@ -940,5 +940,73 @@ "We recommend you change your password and recovery key in Settings immediately": "Mes rekomenduojame nedelsiant Nustatymuose pasikeisti jūsų slaptažodį ir atgavimo raktą", "Email (optional)": "El. paštas (neprivaloma)", "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Jei jūs nenustatėte naujo paskyros atgavimo metodo, tada gali būti, kad užpuolikas bando patekti į jūsų paskyrą. Nedelsiant Nustatymuose pakeiskite savo paskyros slaptažodį ir nustatykite naują paskyros atgavimo metodą.", - "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Jei jūs nepašalinote paskyros atgavimo metodo, tada gali būti, kad užpuolikas bando patekti į jūsų paskyrą. Nedelsiant Nustatymuose pakeiskite savo paskyros slaptažodį ir nustatykite naują paskyros atgavimo metodą." + "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Jei jūs nepašalinote paskyros atgavimo metodo, tada gali būti, kad užpuolikas bando patekti į jūsų paskyrą. Nedelsiant Nustatymuose pakeiskite savo paskyros slaptažodį ir nustatykite naują paskyros atgavimo metodą.", + "Help & About": "Pagalba ir Apie", + "Direct Messages": "Privačios žinutės", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Nustatykite adresus šiam kambariui, kad vartotojai galėtų surasti šį kambarį per jūsų serverį (%(localDomain)s)", + "Direct message": "Privati žinutė", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s prisijungė %(count)s kartų(-us)", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s prisijungė", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s prisijungė %(count)s kartų(-us)", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s prisijungė", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s prisijungė ir išėjo %(count)s kartų(-us)", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s prisijungė ir išėjo", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s prisijungė ir išėjo %(count)s kartų(-us)", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s prisijungė ir išėjo", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s išėjo ir vėl prisijungė %(count)s kartų(-us)", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s išėjo ir vėl prisijungė", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s išėjo ir vėl prisijungė %(count)s kartų(-us)", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s išėjo ir vėl prisijungė", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s atmetė jų kvietimus %(count)s kartų(-us)", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s atmetė jų kvietimus", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s atmetė jų kvietimą %(count)s kartų(-us)", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s atmetė jų kvietimą", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s atšaukė savo pakvietimus %(count)s kartų(-us)", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s atšaukė savo pakvietimus", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s atšaukė savo pakvietimą %(count)s kartų(-us)", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s atšaukė savo pakvietimą", + "were invited %(count)s times|other": "buvo pakviesti %(count)s kartų(-us)", + "were invited %(count)s times|one": "buvo pakviesti", + "was invited %(count)s times|other": "buvo pakviestas %(count)s kartų(-us)", + "was invited %(count)s times|one": "buvo pakviestas", + "were banned %(count)s times|other": "buvo užblokuoti %(count)s kartų(-us)", + "were banned %(count)s times|one": "buvo užblokuoti", + "was banned %(count)s times|other": "buvo užblokuotas %(count)s kartų(-us)", + "was banned %(count)s times|one": "buvo užblokuotas", + "were unbanned %(count)s times|other": "buvo atblokuoti %(count)s kartų(-us)", + "were unbanned %(count)s times|one": "buvo atblokuoti", + "was unbanned %(count)s times|other": "buvo atblokuotas %(count)s kartų(-us)", + "was unbanned %(count)s times|one": "buvo atblokuotas", + "were kicked %(count)s times|other": "buvo išmesti %(count)s kartų(-us)", + "were kicked %(count)s times|one": "buvo išmesti", + "was kicked %(count)s times|other": "buvo išmestas %(count)s kartų(-us)", + "was kicked %(count)s times|one": "buvo išmestas", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s pasikeitė vardus %(count)s kartų(-us)", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s neatliko jokių pakeitimų %(count)s kartų(-us)", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s neatliko jokių pakeitimų", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s neatliko jokių pakeitimų %(count)s kartų(-us)", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s neatliko jokių pakeitimų", + "Power level": "Galios lygis", + "Custom level": "Pritaikytas lygis", + "Can't find this server or its room list": "Negalime rasti šio serverio arba jo kambarių sąrašo", + "Matrix rooms": "Matrix kambariai", + "Recently Direct Messaged": "Neseniai siųsta privati žinutė", + "Command Help": "Komandų pagalba", + "Help": "Pagalba", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Sukurkite bendruomenę, kad kartu sugrupuotumėte vartotojus ir kambarius! Sukurkite pagrindinį puslapį, kad pažymėtumėte savo vietą Matrix visatoje.", + "Find a room…": "Rasti kambarį…", + "Find a room… (e.g. %(exampleRoom)s)": "Rasti kambarį... (pvz.: %(exampleRoom)s)", + "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Jei jūs negalite rasti kambario, kurio ieškote, paprašykite pakvietimo arba Sukurkite naują kambarį.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Bandyta įkelti konkrečią vietą šio kambario laiko juostoje, bet nepavyko jos rasti.", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Šis procesas leidžia jums eksportuoti užšifruotuose kambariuose gautų žinučių raktus į lokalų failą. Tada jūs turėsite galimybę ateityje importuoti šį failą į kitą Matrix klientą, kad tas klientas taip pat galėtų iššifruoti tas žinutes.", + "Failed to set direct chat tag": "Nepavyko nustatyti privataus pokalbio žymos", + "Navigation": "Navigacija", + "Calls": "Skambučiai", + "Room List": "Kambarių sąrašas", + "Autocomplete": "Autorašymas", + "Alt": "Alt", + "Alt Gr": "Alt Gr", + "Shift": "Shift", + "Super": "Super", + "Ctrl": "Ctrl" } From 60e3f55f5a3fe950b7e911a2aa59bbe3c3383387 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Sat, 4 Apr 2020 12:03:02 +0000 Subject: [PATCH 112/230] Translated using Weblate (Polish) Currently translated at 61.3% (1388 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index fbe8ac86ca..d71013d999 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1373,5 +1373,45 @@ "Enable desktop notifications for this session": "Włącz powiadomienia na pulpicie dla tej sesji", "Enable audible notifications for this session": "Włącz powiadomienia dźwiękowe dla tej sesji", "Sessions": "Sesje", - "Direct Messages": "Wiadomości bezpośrednie" + "Direct Messages": "Wiadomości bezpośrednie", + "Create Account": "Utwórz konto", + "Sign In": "Zaloguj się", + "a few seconds ago": "kilka sekund temu", + "%(num)s minutes ago": "%(num)s minut temu", + "%(num)s hours ago": "%(num)s godzin temu", + "%(num)s days ago": "%(num)s dni temu", + "Later": "Później", + "Show less": "Pokaż mniej", + "Show more": "Pokaż więcej", + "Clear notifications": "Wyczyść powiadomienia", + "Theme added!": "Dodano motyw!", + "Custom theme URL": "Niestandardowy adres URL motywu", + "Add theme": "Dodaj motyw", + "Keyboard Shortcuts": "Skróty klawiszowe", + "Ignored users": "Zignorowani użytkownicy", + "⚠ These settings are meant for advanced users.": "⚠ Te ustawienia są przeznaczone dla zaawansowanych użytkowników.", + "Subscribe": "Subskrybuj", + "This room isn’t bridging messages to any platforms. Learn more.": "Ten pokój nie łączy wiadomości z żadnymi platformami. Dowiedz się więcej.", + "Reset": "Resetuj", + "Local address": "Lokalny adres", + "Published Addresses": "Opublikowane adresy", + "Local Addresses": "Lokalne adresy", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Ustaw adresy tego pokoju, aby użytkownicy mogli go znaleźć za pośrednictwem Twojego serwera domowego (%(localDomain)s)", + "Sign in to your Matrix account on %(serverName)s": "Zaloguj się do Twojego konta Matrix na %(serverName)s", + "Couldn't load page": "Nie można załadować strony", + "Create account": "Utwórz konto", + "Navigation": "Nawigacja", + "Calls": "Połączenia", + "Room List": "Lista pokoi", + "Alt": "Alt", + "Alt Gr": "Alt Gr", + "Shift": "Shift", + "Ctrl": "Ctrl", + "New line": "Nowa linia", + "Page Up": "Page Up", + "Page Down": "Page Down", + "Esc": "Esc", + "Enter": "Enter", + "Space": "Spacja", + "End": "End" } From 959801cf2fce2022fd0bd005ab5ffa46111b0e10 Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 6 Apr 2020 16:10:40 +0100 Subject: [PATCH 113/230] Special-case certain msgtypes for notifications --- src/Notifier.js | 23 +++++++++++++++++++++-- src/i18n/strings/en_EN.json | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Notifier.js b/src/Notifier.js index 36a6f13bb6..ec92840998 100644 --- a/src/Notifier.js +++ b/src/Notifier.js @@ -37,6 +37,18 @@ import SettingsStore, {SettingLevel} from "./settings/SettingsStore"; const MAX_PENDING_ENCRYPTED = 20; +/* +Override both the content body and the TextForEvent handler for specific msgtypes, in notifications. +This is useful when the content body contains fallback text that would explain that the client can't handle a particular +type of tile. +*/ +const typehandlers = { + "m.key.verification.request": (event) => { + const name = (event.sender || {}).name; + return _t("%(name)s is requesting verification", { name }); + }, +}; + const Notifier = { notifsByRoom: {}, @@ -46,6 +58,9 @@ const Notifier = { pendingEncryptedEventIds: [], notificationMessageForEvent: function(ev) { + if (typehandlers.hasOwnProperty(ev.getContent().msgtype)) { + return typehandlers[ev.getContent().msgtype](ev); + } return TextForEvent.textForEvent(ev); }, @@ -69,7 +84,9 @@ const Notifier = { title = room.name; // notificationMessageForEvent includes sender, // but we already have the sender here - if (ev.getContent().body) msg = ev.getContent().body; + if (ev.getContent().body && !typehandlers.hasOwnProperty(ev.getContent().msgtype)) { + msg = ev.getContent().body; + } } else if (ev.getType() === 'm.room.member') { // context is all in the message here, we don't need // to display sender info @@ -78,7 +95,9 @@ const Notifier = { title = ev.sender.name + " (" + room.name + ")"; // notificationMessageForEvent includes sender, // but we've just out sender in the title - if (ev.getContent().body) msg = ev.getContent().body; + if (ev.getContent().body && !typehandlers.hasOwnProperty(ev.getContent().msgtype)) { + msg = ev.getContent().body; + } } if (!this.isBodyEnabled()) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3007db1b44..e193c19444 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -125,6 +125,7 @@ "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.", "Only continue if you trust the owner of the server.": "Only continue if you trust the owner of the server.", "Trust": "Trust", + "%(name)s is requesting verification": "%(name)s is requesting verification", "Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings", "Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again", "Unable to enable Notifications": "Unable to enable Notifications", From a0d54bd43ad4771fe6d3348e1f668a3e204aaeee Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 6 Apr 2020 16:40:53 +0100 Subject: [PATCH 114/230] Clear sessionStorage on sign out The browser's `sessionStorage` is only used for composer history today, but still we should also clear this on sign out for those on shared computers, etc. Fixes https://github.com/vector-im/riot-web/issues/13041 --- src/Lifecycle.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index b9fbf4f1bc..305a73fbad 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -637,6 +637,10 @@ async function _clearStorage() { window.localStorage.clear(); } + if (window.sessionStorage) { + window.sessionStorage.clear(); + } + // create a temporary client to clear out the persistent stores. const cli = createMatrixClient({ // we'll never make any requests, so can pass a bogus HS URL From bdeba252ec89ae7755148b0b6fea0c167c76f25c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 6 Apr 2020 15:42:06 -0600 Subject: [PATCH 115/230] Support deactivating your account with SSO Fixes https://github.com/vector-im/riot-web/issues/12940 --- .../views/dialogs/DeactivateAccountDialog.js | 194 ++++++++++-------- src/i18n/strings/en_EN.json | 12 +- 2 files changed, 117 insertions(+), 89 deletions(-) diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index 4c14f356e4..3889f0989a 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -1,6 +1,6 @@ /* Copyright 2016 OpenMarket Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 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. @@ -23,71 +23,109 @@ import Analytics from '../../../Analytics'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import * as Lifecycle from '../../../Lifecycle'; import { _t } from '../../../languageHandler'; +import InteractiveAuth, {ERROR_USER_CANCELLED} from "../../structures/InteractiveAuth"; +import {DEFAULT_PHASE, PasswordAuthEntry, SSOAuthEntry} from "../auth/InteractiveAuthEntryComponents"; + +const dialogAesthetics = { + [SSOAuthEntry.PHASE_PREAUTH]: { + body: _t("Confirm your account deactivation by using Single Sign On to prove your identity."), + continueText: _t("Single Sign On"), + continueKind: "danger", + }, + [SSOAuthEntry.PHASE_POSTAUTH]: { + body: _t("Are you sure you want to deactivate your account? This is irreversible."), + continueText: _t("Confirm account deactivation"), + continueKind: "danger", + }, +}; + +// This is the same as aestheticsForStagePhases in InteractiveAuthDialog minus the `title` +const DEACTIVATE_AESTHETICS = { + [SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics, + [SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics, + [PasswordAuthEntry.LOGIN_TYPE]: { + [DEFAULT_PHASE]: { + body: _t("To continue, please enter your password:"), + }, + }, +}; export default class DeactivateAccountDialog extends React.Component { constructor(props) { super(props); - this._onOk = this._onOk.bind(this); - this._onCancel = this._onCancel.bind(this); - this._onPasswordFieldChange = this._onPasswordFieldChange.bind(this); - this._onEraseFieldChange = this._onEraseFieldChange.bind(this); - this.state = { - password: "", - busy: false, shouldErase: false, errStr: null, + authData: null, // for UIA + + // A few strings that are passed to InteractiveAuth for design or are displayed + // next to the InteractiveAuth component. + bodyText: null, + continueText: null, + continueKind: null, }; - } - _onPasswordFieldChange(ev) { - this.setState({ - password: ev.target.value, - }); - } - - _onEraseFieldChange(ev) { - this.setState({ - shouldErase: ev.target.checked, - }); - } - - async _onOk() { - this.setState({busy: true}); - - try { - // This assumes that the HS requires password UI auth - // for this endpoint. In reality it could be any UI auth. - const auth = { - type: 'm.login.password', - // TODO: Remove `user` once servers support proper UIA - // See https://github.com/vector-im/riot-web/issues/10312 - user: MatrixClientPeg.get().credentials.userId, - identifier: { - type: "m.id.user", - user: MatrixClientPeg.get().credentials.userId, - }, - password: this.state.password, - }; - await MatrixClientPeg.get().deactivateAccount(auth, this.state.shouldErase); - } catch (err) { - let errStr = _t('Unknown error'); - // https://matrix.org/jira/browse/SYN-744 - if (err.httpStatus === 401 || err.httpStatus === 403) { - errStr = _t('Incorrect password'); + MatrixClientPeg.get().deactivateAccount(null, false).then(r => { + // If we got here, oops. The server didn't require any auth. + // Our application lifecycle will catch the error and do the logout bits. + // We'll try to log something in an vain attempt to record what happened (storage + // is also obliterated on logout). + console.warn("User's account got deactivated without confirmation: Server had no auth"); + this.setState({errStr: _t("Server did not require any authentication")}); + }).catch(e => { + if (e && e.httpStatus === 401 && e.data) { + // Valid UIA response + this.setState({authData: e.data}); + } else { + this.setState({errStr: _t("Server did not return valid authentication information.")}); } - this.setState({ - busy: false, - errStr: errStr, - }); + }); + } + + _onStagePhaseChange = (stage, phase) => { + const aesthetics = DEACTIVATE_AESTHETICS[stage]; + let bodyText = null; + let continueText = null; + let continueKind = null; + if (aesthetics) { + const phaseAesthetics = aesthetics[phase]; + if (phaseAesthetics && phaseAesthetics.body) bodyText = phaseAesthetics.body; + if (phaseAesthetics && phaseAesthetics.continueText) continueText = phaseAesthetics.continueText; + if (phaseAesthetics && phaseAesthetics.continueKind) continueKind = phaseAesthetics.continueKind; + } + this.setState({bodyText, continueText, continueKind}); + }; + + _onUIAuthFinished = (success, result, extra) => { + if (success) return; // great! makeRequest() will be called too. + + if (result === ERROR_USER_CANCELLED) { + this._onCancel(); return; } - Analytics.trackEvent('Account', 'Deactivate Account'); - Lifecycle.onLoggedOut(); - this.props.onFinished(true); - } + console.error("Error during UI Auth:", {result, extra}); + this.setState({errStr: _t("There was a problem communicating with the server. Please try again.")}); + }; + + _onUIAuthComplete = (auth) => { + MatrixClientPeg.get().deactivateAccount(auth, this.state.shouldErase).then(r => { + // Deactivation worked - logout & close this dialog + Analytics.trackEvent('Account', 'Deactivate Account'); + Lifecycle.onLoggedOut(); + this.props.onFinished(true); + }).catch(e => { + console.error(e); + this.setState({errStr: _t("There was a problem communicating with the server. Please try again.")}); + }); + }; + + _onEraseFieldChange = (ev) => { + this.setState({ + shouldErase: ev.target.checked, + }); + }; _onCancel() { this.props.onFinished(false); @@ -95,34 +133,36 @@ export default class DeactivateAccountDialog extends React.Component { render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const Loader = sdk.getComponent("elements.Spinner"); - let passwordBoxClass = ''; let error = null; if (this.state.errStr) { error =
    { this.state.errStr }
    ; - passwordBoxClass = 'error'; } - const okLabel = this.state.busy ? : _t('Deactivate Account'); - const okEnabled = this.state.password && !this.state.busy; - - let cancelButton = null; - if (!this.state.busy) { - cancelButton = ; + let auth =
    {_t("Loading...")}
    ; + if (this.state.authData) { + auth = ( +
    + {this.state.bodyText} + +
    + ); } - const Field = sdk.getComponent('elements.Field'); - // this is on purpose not a
    to prevent Enter triggering submission, to further prevent accidents return ( @@ -172,28 +212,10 @@ export default class DeactivateAccountDialog extends React.Component {

    -

    { _t("To continue, please enter your password:") }

    - + {error} + {auth}
    - { error } -
    -
    - - - { cancelButton }
    ); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3007db1b44..ce678284b7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1566,13 +1566,17 @@ "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ", "Incompatible Database": "Incompatible Database", "Continue With Encryption Disabled": "Continue With Encryption Disabled", - "Unknown error": "Unknown error", - "Incorrect password": "Incorrect password", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "Confirm your account deactivation by using Single Sign On to prove your identity.", + "Are you sure you want to deactivate your account? This is irreversible.": "Are you sure you want to deactivate your account? This is irreversible.", + "Confirm account deactivation": "Confirm account deactivation", + "To continue, please enter your password:": "To continue, please enter your password:", + "Server did not require any authentication": "Server did not require any authentication", + "Server did not return valid authentication information.": "Server did not return valid authentication information.", + "There was a problem communicating with the server. Please try again.": "There was a problem communicating with the server. Please try again.", "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.": "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.", "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.": "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.", "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.": "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.", "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)", - "To continue, please enter your password:": "To continue, please enter your password:", "Verify session": "Verify session", "Use Legacy Verification (for older clients)": "Use Legacy Verification (for older clients)", "Verify by comparing a short text string.": "Verify by comparing a short text string.", @@ -1963,6 +1967,7 @@ "Failed to leave room": "Failed to leave room", "Can't leave Server Notices room": "Can't leave Server Notices room", "This room is used for important messages from the Homeserver, so you cannot leave it.": "This room is used for important messages from the Homeserver, so you cannot leave it.", + "Unknown error": "Unknown error", "Signed Out": "Signed Out", "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", "Terms and Conditions": "Terms and Conditions", @@ -2102,6 +2107,7 @@ "Without completing security on this session, it won’t have access to encrypted messages.": "Without completing security on this session, it won’t have access to encrypted messages.", "Go Back": "Go Back", "Failed to re-authenticate due to a homeserver problem": "Failed to re-authenticate due to a homeserver problem", + "Incorrect password": "Incorrect password", "Failed to re-authenticate": "Failed to re-authenticate", "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.", "Enter your password to sign in and regain access to your account.": "Enter your password to sign in and regain access to your account.", From 2ec7f2290c07e5152c5d1da7f8326813143773c3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 6 Apr 2020 16:04:41 -0600 Subject: [PATCH 116/230] Support Jitsi information from client .well-known It can be useful for the homeserver to support a dedicated Jitsi instance instead of requiring that all their users change/update their configs manually. --- src/CallHandler.js | 3 +- src/Lifecycle.js | 4 +++ src/widgets/Jitsi.ts | 73 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/widgets/Jitsi.ts diff --git a/src/CallHandler.js b/src/CallHandler.js index 8284e788b4..fdd0d5ae45 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -66,6 +66,7 @@ import WidgetUtils from './utils/WidgetUtils'; import WidgetEchoStore from './stores/WidgetEchoStore'; import SettingsStore, { SettingLevel } from './settings/SettingsStore'; import {generateHumanReadableId} from "./utils/NamingUtils"; +import {Jitsi} from "./widgets/Jitsi"; global.mxCalls = { //room_id: MatrixCall @@ -431,7 +432,7 @@ async function _startCallApp(roomId, type) { } const confId = `JitsiConference${generateHumanReadableId()}`; - const jitsiDomain = SdkConfig.get()['jitsi']['preferredDomain']; + const jitsiDomain = Jitsi.getInstance().preferredDomain; let widgetUrl = WidgetUtils.getLocalJitsiWrapperUrl(); diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 305a73fbad..b3d777240b 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -40,6 +40,7 @@ import ToastStore from "./stores/ToastStore"; import {IntegrationManagers} from "./integrations/IntegrationManagers"; import {Mjolnir} from "./mjolnir/Mjolnir"; import DeviceListener from "./DeviceListener"; +import {Jitsi} from "./widgets/Jitsi"; /** * Called at startup, to attempt to build a logged-in Matrix session. It tries @@ -604,6 +605,9 @@ async function startMatrixClient(startSyncing=true) { // This needs to be started after crypto is set up DeviceListener.sharedInstance().start(); + // Now that we have a MatrixClientPeg, update the Jitsi info + await Jitsi.getInstance().update(); + // dispatch that we finished starting up to wire up any other bits // of the matrix client that cannot be set prior to starting up. dis.dispatch({action: 'client_started'}); diff --git a/src/widgets/Jitsi.ts b/src/widgets/Jitsi.ts new file mode 100644 index 0000000000..988131e045 --- /dev/null +++ b/src/widgets/Jitsi.ts @@ -0,0 +1,73 @@ +/* +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 SdkConfig from "../SdkConfig"; +import {MatrixClientPeg} from "../MatrixClientPeg"; +import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery"; + +const JITSI_WK_PROPERTY = "im.vector.riot.jitsi"; +const JITSI_WK_CHECK_INTERVAL = 2 * 60 * 60 * 1000; // 2 hours, arbitrarily selected + +export class Jitsi { + private static instance: Jitsi; + + private domain: string; + + public get preferredDomain(): string { + return this.domain || 'jitsi.riot.im'; + } + + constructor() { + // We rely on the first call to be an .update() instead of doing one here. Doing one + // here could result in duplicate calls to the homeserver. + + // Start a timer to update the server info regularly + setInterval(() => this.update(), JITSI_WK_CHECK_INTERVAL); + } + + public async update(): Promise { + // Start with a default of the config's domain + let domain = (SdkConfig.get()['jitsi'] || {})['preferredDomain'] || 'jitsi.riot.im'; + + // Now request the .well-known config to see if it changed + if (MatrixClientPeg.get()) { + try { + console.log("Attempting to get Jitsi conference information from homeserver"); + + const homeserverDomain = MatrixClientPeg.getHomeserverName(); + const discoveryResponse = await AutoDiscovery.getRawClientConfig(homeserverDomain); + if (discoveryResponse && discoveryResponse[JITSI_WK_PROPERTY]) { + const wkPreferredDomain = discoveryResponse[JITSI_WK_PROPERTY]['preferredDomain']; + if (wkPreferredDomain) domain = wkPreferredDomain; + } + } catch (e) { + // These are non-fatal errors + console.error(e); + } + } + + // Put the result into memory for us to use later + this.domain = domain; + console.log("Jitsi conference domain:", this.preferredDomain); + } + + public static getInstance(): Jitsi { + if (!Jitsi.instance) { + Jitsi.instance = new Jitsi(); + } + return Jitsi.instance; + } +} From 53f4820e8e738ff8e790918013568b6e353742c3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 6 Apr 2020 16:08:43 -0600 Subject: [PATCH 117/230] Appease the linter --- src/CallHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index fdd0d5ae45..c63bfe309a 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -60,7 +60,6 @@ import * as sdk from './index'; import { _t } from './languageHandler'; import Matrix from 'matrix-js-sdk'; import dis from './dispatcher'; -import SdkConfig from './SdkConfig'; import { showUnknownDeviceDialogForCalls } from './cryptodevices'; import WidgetUtils from './utils/WidgetUtils'; import WidgetEchoStore from './stores/WidgetEchoStore'; From faab35738f3686a609d6e0f2072f05e4a20ddc7f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Apr 2020 10:48:56 +0100 Subject: [PATCH 118/230] Add new default home page fallback Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/_HomePage.scss | 79 +++++++++++++++++++ src/components/structures/HomePage.tsx | 67 ++++++++++++++++ src/components/structures/LoggedInView.js | 9 +-- .../views/context_menus/TopLeftMenu.js | 11 +-- src/i18n/strings/en_EN.json | 5 ++ 5 files changed, 155 insertions(+), 16 deletions(-) create mode 100644 src/components/structures/HomePage.tsx diff --git a/res/css/structures/_HomePage.scss b/res/css/structures/_HomePage.scss index 3aa80f6f59..2f2f27f377 100644 --- a/res/css/structures/_HomePage.scss +++ b/res/css/structures/_HomePage.scss @@ -23,3 +23,82 @@ limitations under the License. margin-left: auto; margin-right: auto; } + +.mx_HomePage_default { + text-align: center; + + .mx_HomePage_default_wrapper { + padding: 25vh 0 12px; + } + + img { + width: 40px; + } + + h1 { + font-weight: 600; + font-size: $font-32px; + line-height: $font-44px; + margin-bottom: 4px; + } + + h4 { + margin-top: 4px; + font-weight: 600; + font-size: $font-18px; + line-height: $font-25px; + color: $muted-fg-color; + } + + .mx_HomePage_default_buttons { + margin: 80px auto 0; + width: fit-content; + + .mx_AccessibleButton { + padding: 73px 8px 15px; // top: 20px top padding + 40px icon + 13px margin + + width: 104px; // 120px - 2* 8px + margin: 0 39px; // 55px - 2* 8px + position: relative; + display: inline-block; + border-radius: 8px; + + font-weight: 600; + font-size: $font-15px; + line-height: $font-20px; + color: $muted-fg-color; + + &:hover { + color: $accent-color; + background: rgba(#03b381, 0.06); + + &::before { + background-color: $accent-color; + } + } + + &::before { + top: 20px; + left: 40px; // (120px-40px)/2 + width: 40px; + height: 40px; + + content: ''; + position: absolute; + background-color: $muted-fg-color; + mask-repeat: no-repeat; + mask-size: contain; + } + + &.mx_HomePage_button_sendDm::before { + mask-image: url('$(res)/img/feather-customised/message-circle.svg'); + } + &.mx_HomePage_button_explore::before { + mask-image: url('$(res)/img/feather-customised/explore.svg'); + } + &.mx_HomePage_button_createGroup::before { + mask-image: url('$(res)/img/feather-customised/group.svg'); + } + } + } +} diff --git a/src/components/structures/HomePage.tsx b/src/components/structures/HomePage.tsx new file mode 100644 index 0000000000..ecc56ef0e5 --- /dev/null +++ b/src/components/structures/HomePage.tsx @@ -0,0 +1,67 @@ +/* +Copyright 2020 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +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 AutoHideScrollbar from './AutoHideScrollbar'; +import { getHomePageUrl } from "../../utils/pages"; +import { _t } from "../../languageHandler"; +import SdkConfig from "../../SdkConfig"; +import * as sdk from "../../index"; +import dis from "../../dispatcher"; + + +const onClickSendDm = () => dis.dispatch({action: 'view_create_chat'}); +const onClickExplore = () => dis.dispatch({action: 'view_room_directory'}); +const onClickNewRoom = () => dis.dispatch({action: 'view_create_room'}); + +const HomePage = () => { + const config = SdkConfig.get(); + const pageUrl = getHomePageUrl(config); + + if (pageUrl) { + const EmbeddedPage = sdk.getComponent('structures.EmbeddedPage'); + return ; + } + + const brandingConfig = config.branding; + let logoUrl = "themes/riot/img/logos/riot-logo.svg"; + if (brandingConfig && brandingConfig.authHeaderLogoUrl) { + logoUrl = brandingConfig.authHeaderLogoUrl; + } + + const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); + return +
    + Riot +

    { _t("Welcome to %(appName)s", { appName: config.brand || "Riot" }) }

    +

    { _t("Liberate your communication") }

    +
    + + { _t("Send a Direct Message") } + + + { _t("Explore Public Rooms") } + + + { _t("Create a Group Chat") } + +
    +
    +
    ; +}; + +export default HomePage; diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 51ce41e36f..53c2d61642 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -40,6 +40,7 @@ import ResizeHandle from '../views/elements/ResizeHandle'; import {Resizer, CollapseDistributor} from '../../resizer'; import MatrixClientContext from "../../contexts/MatrixClientContext"; import * as KeyboardShortcuts from "../../accessibility/KeyboardShortcuts"; +import HomePage from "./HomePage"; // We need to fetch each pinned message individually (if we don't already have it) // so each pinned message may trigger a request. Limit the number per room for sanity. // NB. this is just for server notices rather than pinned messages in general. @@ -577,13 +578,7 @@ const LoggedInView = createReactClass({ break; case PageTypes.HomePage: - { - const pageUrl = getHomePageUrl(this.props.config); - pageElement = ; - } + pageElement = ; break; case PageTypes.UserView: diff --git a/src/components/views/context_menus/TopLeftMenu.js b/src/components/views/context_menus/TopLeftMenu.js index f1309cac2d..4448ecd041 100644 --- a/src/components/views/context_menus/TopLeftMenu.js +++ b/src/components/views/context_menus/TopLeftMenu.js @@ -26,6 +26,7 @@ import { getHostingLink } from '../../../utils/HostingLink'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {MenuItem} from "../../structures/ContextMenu"; import * as sdk from "../../../index"; +import {getHomePageUrl} from "../../../utils/pages"; export default class TopLeftMenu extends React.Component { static propTypes = { @@ -47,15 +48,7 @@ export default class TopLeftMenu extends React.Component { } hasHomePage() { - const config = SdkConfig.get(); - const pagesConfig = config.embeddedPages; - if (pagesConfig && pagesConfig.homeUrl) { - return true; - } - // This is a deprecated config option for the home page - // (despite the name, given we also now have a welcome - // page, which is not the same). - return !!config.welcomePageUrl; + return !!getHomePageUrl(SdkConfig.get()); } render() { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3007db1b44..b7ad92757a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1954,6 +1954,11 @@ "Community %(groupId)s not found": "Community %(groupId)s not found", "This homeserver does not support communities": "This homeserver does not support communities", "Failed to load %(groupId)s": "Failed to load %(groupId)s", + "Welcome to %(appName)s": "Welcome to %(appName)s", + "Liberate your communication": "Liberate your communication", + "Send a Direct Message": "Send a Direct Message", + "Explore Public Rooms": "Explore Public Rooms", + "Create a Group Chat": "Create a Group Chat", "Explore": "Explore", "Filter": "Filter", "Filter rooms…": "Filter rooms…", From 4d002bd24d5b63ebdabb71bf65036842642835d8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Apr 2020 10:51:51 +0100 Subject: [PATCH 119/230] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LoggedInView.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 53c2d61642..d9980aeca6 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -32,7 +32,6 @@ import sessionStore from '../../stores/SessionStore'; import {MatrixClientPeg} from '../../MatrixClientPeg'; import SettingsStore from "../../settings/SettingsStore"; import RoomListStore from "../../stores/RoomListStore"; -import { getHomePageUrl } from '../../utils/pages'; import TagOrderActions from '../../actions/TagOrderActions'; import RoomListActions from '../../actions/RoomListActions'; @@ -539,7 +538,6 @@ const LoggedInView = createReactClass({ const LeftPanel = sdk.getComponent('structures.LeftPanel'); const RoomView = sdk.getComponent('structures.RoomView'); const UserView = sdk.getComponent('structures.UserView'); - const EmbeddedPage = sdk.getComponent('structures.EmbeddedPage'); const GroupView = sdk.getComponent('structures.GroupView'); const MyGroups = sdk.getComponent('structures.MyGroups'); const ToastContainer = sdk.getComponent('structures.ToastContainer'); From 971c57552bc4b234053be4846ba83e962668745f Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 7 Apr 2020 10:57:10 +0100 Subject: [PATCH 120/230] Check more account data in toast listener Since any change to cross-signing or secret storage account data may affect the outcome of checks in the toast listener, we need to broaden the account data listener there to re-run for changes to all such bits of account data. Fixes https://github.com/vector-im/riot-web/issues/13048 --- src/DeviceListener.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index ddeacedd75..80ea693a38 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -90,8 +90,15 @@ export default class DeviceListener { } _onAccountData = (ev) => { - // User may have migrated SSSS to symmetric, in which case we can dismiss that toast - if (ev.getType().startsWith('m.secret_storage.key.')) { + // User may have: + // * migrated SSSS to symmetric + // * uploaded keys to secret storage + // * completed secret storage creation + // which result in account data changes affecting checks below. + if ( + ev.getType().startsWith('m.secret_storage.') || + ev.getType().startsWith('m.cross_signing.') + ) { this._recheck(); } } From 5c8ad71a15193ad76c43ca554b4ccecaa428c95f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Apr 2020 11:03:49 +0100 Subject: [PATCH 121/230] add missing assets Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/img/feather-customised/explore.svg | 8 ++++++++ res/img/feather-customised/group.svg | 7 +++++++ res/img/feather-customised/message-circle.svg | 3 +++ 3 files changed, 18 insertions(+) create mode 100644 res/img/feather-customised/explore.svg create mode 100644 res/img/feather-customised/group.svg create mode 100644 res/img/feather-customised/message-circle.svg diff --git a/res/img/feather-customised/explore.svg b/res/img/feather-customised/explore.svg new file mode 100644 index 0000000000..45be889bb7 --- /dev/null +++ b/res/img/feather-customised/explore.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/res/img/feather-customised/group.svg b/res/img/feather-customised/group.svg new file mode 100644 index 0000000000..7051860e62 --- /dev/null +++ b/res/img/feather-customised/group.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/res/img/feather-customised/message-circle.svg b/res/img/feather-customised/message-circle.svg new file mode 100644 index 0000000000..acc6d2fb0f --- /dev/null +++ b/res/img/feather-customised/message-circle.svg @@ -0,0 +1,3 @@ + + + From 90255be4992d27f2070a0b19c32b2ac6a003fa34 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Apr 2020 11:17:19 +0100 Subject: [PATCH 122/230] Fix copy button on code blocks when there is no code just pre Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/TextualBody.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index c1de376385..27514d0e23 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -278,7 +278,7 @@ export default createReactClass({ const button = document.createElement("span"); button.className = "mx_EventTile_copyButton"; button.onclick = (e) => { - const copyCode = button.parentNode.getElementsByTagName("code")[0]; + const copyCode = button.parentNode.getElementsByTagName("pre")[0]; const successful = this.copyToClipboard(copyCode.textContent); const buttonRect = e.target.getBoundingClientRect(); From 0dd3ded2a9d6e77424ae945fc82af5e6ba4da4bf Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Mon, 6 Apr 2020 17:54:16 +0000 Subject: [PATCH 123/230] Translated using Weblate (Bulgarian) Currently translated at 84.9% (1924 of 2266 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/bg/ --- src/i18n/strings/bg.json | 71 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 4fbe3b2903..b31498ef0b 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1892,5 +1892,74 @@ "The information being sent to us to help make Riot better includes:": "Информацията, която се изпраща за да ни помогне да подобрим Riot включва:", "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "В тази стая има непознати сесии: ако продължите без да ги потвърдите, ще е възможно някой да подслуша обаждането ви.", "Review Sessions": "Прегледай сесиите", - "If you cancel now, you won't complete verifying the other user.": "Ако се откажете сега, няма да завършите верификацията на другия потребител." + "If you cancel now, you won't complete verifying the other user.": "Ако се откажете сега, няма да завършите верификацията на другия потребител.", + "Use Single Sign On to continue": "Използвайте Single Sign On за да продължите", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Потвърдете добавянето на този имейл адрес като потвърдите идентичността си чрез Single Sign On.", + "Single Sign On": "Single Sign On", + "Confirm adding email": "Потвърдете добавянето на имейл", + "Click the button below to confirm adding this email address.": "Кликнете бутона по-долу за да потвърдите добавянето на имейл адреса.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Потвърдете добавянето на този телефонен номер като докажете идентичността си чрез използване на Single Sign On.", + "Confirm adding phone number": "Потвърдете добавянето на телефонен номер", + "Click the button below to confirm adding this phone number.": "Кликнете бутона по-долу за да потвърдите добавянето на телефонния номер.", + "If you cancel now, you won't complete verifying your other session.": "Ако се откажете сега, няма да завършите потвърждаването на другата ви сесия.", + "If you cancel now, you won't complete your secret storage operation.": "Ако се откажете сега, няма да завърши операцията по секретно складиране.", + "Cancel entering passphrase?": "Откажете въвеждането на парола?", + "Setting up keys": "Настройка на ключове", + "Verify this session": "Потвърди тази сесия", + "Encryption upgrade available": "Има обновление на шифроването", + "Set up encryption": "Настрой шифроване", + "Unverified login. Was this you?": "Непотвърден вход. Вие ли бяхте?", + "Sign In or Create Account": "Влезте или Създайте профил", + "Use your account or create a new one to continue.": "Използвайте профила си или създайте нов за да продължите.", + "Create Account": "Създай профил", + "Sends a message as html, without interpreting it as markdown": "Изпраща съобщението като HTML, без да го интерпретира като Markdown", + "Verifies a user, session, and pubkey tuple": "Потвърждава потребител, сесия и двойка ключове", + "Unknown (user, session) pair:": "Непозната двойка (потребител, сесия):", + "Session already verified!": "Сесията вече е потвърдена!", + "WARNING: Session already verified, but keys do NOT MATCH!": "ВНИМАНИЕ: Сесията вече е потвърдена, но ключовете НЕ СЪВПАДАТ!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ВНИМАНИЕ: ПОТВЪРЖДАВАНЕТО НА КЛЮЧОВЕТЕ Е НЕУСПЕШНО! Подписващия ключ за %(userId)s и сесия %(deviceId)s е \"%(fprint)s\", което не съвпада с предоставения ключ \"%(fingerprint)s\". Това може би означава, че комуникацията ви бива прихваната!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Предоставения от вас ключ за подписване съвпада с ключа за подписване получен от сесия %(deviceId)s на %(userId)s. Сесията е маркирана като потвърдена.", + "Displays information about a user": "Показва информация за потребителя", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s промени името на стаята от %(oldRoomName)s на %(newRoomName)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 промени адресите на стаята.", + "Not Trusted": "Недоверено", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) влезе в нова сесия без да я потвърди:", + "Ask this user to verify their session, or manually verify it below.": "Поискайте от този потребител да потвърди сесията си, или я потвърдете ръчно по-долу.", + "Manually Verify by Text": "Ръчно потвърждаване чрез текст", + "Interactively verify by Emoji": "Потвърдете интерактивно с Емоджи", + "Done": "Готово", + "a few seconds ago": "преди няколко секунди", + "about a minute ago": "преди около минута", + "%(num)s minutes ago": "преди %(num)s минути", + "about an hour ago": "преди около час", + "%(num)s hours ago": "преди %(num)s часа", + "about a day ago": "преди около ден", + "%(num)s days ago": "преди %(num)s дни", + "a few seconds from now": "след няколко секунди", + "about a minute from now": "след около минута", + "%(num)s minutes from now": "след %(num)s минути", + "about an hour from now": "след около час", + "%(num)s hours from now": "след %(num)s часа", + "about a day from now": "след около ден", + "%(num)s days from now": "след %(num)s дни", + "Show a presence dot next to DMs in the room list": "Показвай точка за присъствие до директните съобщения в списъка със стаи", + "Support adding custom themes": "Включи поддръжка за добавяне на собствени теми", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Включи кръстосано-подписване за потвърждаване на потребител, вместо на отделни сесии (в процес на разработка)", + "Show padlocks on invite only rooms": "Показвай катинари на стаите изискващи покана", + "Show typing notifications": "Показвай уведомления за писане", + "Never send encrypted messages to unverified sessions from this session": "Никога не изпращай шифровани съобщения към непотвърдени сесии от тази сесия", + "Never send encrypted messages to unverified sessions in this room from this session": "Никога не изпращай шифровани съобщения към непотвърдени сесии в тази стая от тази сесия", + "Order rooms by name": "Подреждай стаите по име", + "Show rooms with unread notifications first": "Показвай първи стаите с непрочетени уведомления", + "Show shortcuts to recently viewed rooms above the room list": "Показвай преки пътища до скоро-прегледаните стаи над списъка със стаи", + "Enable message search in encrypted rooms": "Включи търсенето на съобщения в шифровани стаи", + "Keep secret storage passphrase in memory for this session": "Съхрани паролата за секретното складиране в паметта за тази сесия", + "How fast should messages be downloaded.": "Колко бързо да се изтеглят съобщенията.", + "Manually verify all remote sessions": "Ръчно потвърждаване на всички отдалечени сесии" } From 8d68a4ab52e28e14d3710c7638a9b633b2ae7413 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 7 Apr 2020 12:07:41 +0100 Subject: [PATCH 124/230] Don't try to send presence updates until the client is started Otherwise we can start making API reqiests which can fail which can trigger things like the soft logout code. Fixes https://github.com/vector-im/riot-web/issues/12943 --- src/Lifecycle.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index b9fbf4f1bc..6dabdc0912 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -578,9 +578,6 @@ async function startMatrixClient(startSyncing=true) { UserActivity.sharedInstance().start(); TypingStore.sharedInstance().reset(); // just in case ToastStore.sharedInstance().reset(); - if (!SettingsStore.getValue("lowBandwidth")) { - Presence.start(); - } DMRoomMap.makeShared().start(); IntegrationManagers.sharedInstance().startWatching(); ActiveWidgetStore.start(); @@ -603,6 +600,11 @@ async function startMatrixClient(startSyncing=true) { // This needs to be started after crypto is set up DeviceListener.sharedInstance().start(); + // Similarly, don't start sending presence updates until we've started + // the client + if (!SettingsStore.getValue("lowBandwidth")) { + Presence.start(); + } // dispatch that we finished starting up to wire up any other bits // of the matrix client that cannot be set prior to starting up. From bce22c620fa8245e94ebcdcd2586d530b87a0f89 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 7 Apr 2020 13:08:18 +0100 Subject: [PATCH 125/230] Don't show spinner over encryption setup dialogs Fixes https://github.com/vector-im/riot-web/issues/13051 --- src/components/views/toasts/SetupEncryptionToast.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/toasts/SetupEncryptionToast.js b/src/components/views/toasts/SetupEncryptionToast.js index 6e2df12658..3c1f42b526 100644 --- a/src/components/views/toasts/SetupEncryptionToast.js +++ b/src/components/views/toasts/SetupEncryptionToast.js @@ -63,7 +63,9 @@ export default class SetupEncryptionToast extends React.PureComponent { {}, null, /* priority = */ false, /* static = */ true); } else { const Spinner = sdk.getComponent("elements.Spinner"); - const modal = Modal.createDialog(Spinner, null, 'mx_Dialog_spinner'); + const modal = Modal.createDialog( + Spinner, null, 'mx_Dialog_spinner', /* priority */ false, /* static */ true, + ); try { await accessSecretStorage(); await this._waitForCompletion(); From b5e6f8b8c199066221699a49d8d577e1916b9994 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Apr 2020 13:34:10 +0100 Subject: [PATCH 126/230] Iterate PR Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/_HomePage.scss | 3 ++- src/components/structures/HomePage.tsx | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/css/structures/_HomePage.scss b/res/css/structures/_HomePage.scss index 2f2f27f377..a4c39c8e06 100644 --- a/res/css/structures/_HomePage.scss +++ b/res/css/structures/_HomePage.scss @@ -32,7 +32,7 @@ limitations under the License. } img { - width: 40px; + height: 48px; } h1 { @@ -62,6 +62,7 @@ limitations under the License. position: relative; display: inline-block; border-radius: 8px; + vertical-align: top; font-weight: 600; font-size: $font-15px; diff --git a/src/components/structures/HomePage.tsx b/src/components/structures/HomePage.tsx index ecc56ef0e5..ddf9cd6d00 100644 --- a/src/components/structures/HomePage.tsx +++ b/src/components/structures/HomePage.tsx @@ -1,5 +1,5 @@ /* -Copyright 2020 New Vector Ltd +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. @@ -23,7 +23,6 @@ import SdkConfig from "../../SdkConfig"; import * as sdk from "../../index"; import dis from "../../dispatcher"; - const onClickSendDm = () => dis.dispatch({action: 'view_create_chat'}); const onClickExplore = () => dis.dispatch({action: 'view_room_directory'}); const onClickNewRoom = () => dis.dispatch({action: 'view_create_room'}); From 3e4e7953ed9ec897ed160c89caf323dd525dd138 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Apr 2020 13:40:25 +0100 Subject: [PATCH 127/230] word-break: break-word; Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/_HomePage.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/structures/_HomePage.scss b/res/css/structures/_HomePage.scss index a4c39c8e06..0160cf368b 100644 --- a/res/css/structures/_HomePage.scss +++ b/res/css/structures/_HomePage.scss @@ -63,6 +63,7 @@ limitations under the License. display: inline-block; border-radius: 8px; vertical-align: top; + word-break: break-word; font-weight: 600; font-size: $font-15px; From 13545abb20cdb4e848aa821c93bf73ed27c71d44 Mon Sep 17 00:00:00 2001 From: rkfg Date: Tue, 7 Apr 2020 14:49:10 +0000 Subject: [PATCH 128/230] Translated using Weblate (Russian) Currently translated at 83.4% (1894 of 2271 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 41cd901692..5e98b25ace 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1430,7 +1430,7 @@ "Sign in instead": "Войдите, вместо этого", "Your password has been reset.": "Ваш пароль был сброшен.", "Set a new password": "Установить новый пароль", - "Invalid homeserver discovery response": "Неверное обнаружения сервера", + "Invalid homeserver discovery response": "Неверный ответ при попытке обнаружения домашнего сервера", "Failed to get autodiscovery configuration from server": "Не удалось получить конфигурацию автообнаружения с сервера", "Show recently visited rooms above the room list": "Показать недавно посещённые комнаты над списком комнат", "Invalid base_url for m.homeserver": "Неверный base_url для m.homeserver", From 3be197cf86057799605d4f4806f54d724c79657b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 7 Apr 2020 11:19:56 -0600 Subject: [PATCH 129/230] Use singular copy when only deleting one device --- src/components/views/settings/DevicesPanel.js | 9 +++++++-- src/i18n/strings/en_EN.json | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/DevicesPanel.js b/src/components/views/settings/DevicesPanel.js index 61e7724a6f..70e0bf0109 100644 --- a/src/components/views/settings/DevicesPanel.js +++ b/src/components/views/settings/DevicesPanel.js @@ -124,16 +124,21 @@ export default class DevicesPanel extends React.Component { // pop up an interactive auth dialog const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); + const singularDevice = this.state.selectedDevices.length === 1; const dialogAesthetics = { [SSOAuthEntry.PHASE_PREAUTH]: { title: _t("Use Single Sign On to continue"), - body: _t("Confirm deleting these sessions by using Single Sign On to prove your identity."), + body: singularDevice + ? _t("Confirm deleting this session by using Single Sign On to prove your identity.") + : _t("Confirm deleting these sessions by using Single Sign On to prove your identity."), continueText: _t("Single Sign On"), continueKind: "primary", }, [SSOAuthEntry.PHASE_POSTAUTH]: { title: _t("Confirm deleting these sessions"), - body: _t("Click the button below to confirm deleting these sessions."), + body: singularDevice + ? _t("Click the button below to confirm deleting this session.") + : _t("Click the button below to confirm deleting these sessions."), continueText: _t("Delete sessions"), continueKind: "danger", }, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b7ad92757a..164b999825 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -610,8 +610,10 @@ "up to date": "up to date", "Your homeserver does not support session management.": "Your homeserver does not support session management.", "Unable to load session list": "Unable to load session list", + "Confirm deleting this session by using Single Sign On to prove your identity.": "Confirm deleting this session by using Single Sign On to prove your identity.", "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Confirm deleting these sessions by using Single Sign On to prove your identity.", "Confirm deleting these sessions": "Confirm deleting these sessions", + "Click the button below to confirm deleting this session.": "Click the button below to confirm deleting this session.", "Click the button below to confirm deleting these sessions.": "Click the button below to confirm deleting these sessions.", "Delete sessions": "Delete sessions", "Authentication": "Authentication", From 3ab96342493b62c84af0d6ceb694d84dd0c27573 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 7 Apr 2020 11:46:53 -0600 Subject: [PATCH 130/230] Pluralize more differently --- src/components/views/settings/DevicesPanel.js | 14 +++++++------- src/i18n/strings/en_EN.json | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/views/settings/DevicesPanel.js b/src/components/views/settings/DevicesPanel.js index 70e0bf0109..e097ef9e47 100644 --- a/src/components/views/settings/DevicesPanel.js +++ b/src/components/views/settings/DevicesPanel.js @@ -124,21 +124,21 @@ export default class DevicesPanel extends React.Component { // pop up an interactive auth dialog const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); - const singularDevice = this.state.selectedDevices.length === 1; + const numDevices = this.state.selectedDevices.length; const dialogAesthetics = { [SSOAuthEntry.PHASE_PREAUTH]: { title: _t("Use Single Sign On to continue"), - body: singularDevice - ? _t("Confirm deleting this session by using Single Sign On to prove your identity.") - : _t("Confirm deleting these sessions by using Single Sign On to prove your identity."), + body: _t("Confirm deleting these sessions by using Single Sign On to prove your identity.", { + count: numDevices, + }), continueText: _t("Single Sign On"), continueKind: "primary", }, [SSOAuthEntry.PHASE_POSTAUTH]: { title: _t("Confirm deleting these sessions"), - body: singularDevice - ? _t("Click the button below to confirm deleting this session.") - : _t("Click the button below to confirm deleting these sessions."), + body: _t("Click the button below to confirm deleting these sessions.", { + count: numDevices, + }), continueText: _t("Delete sessions"), continueKind: "danger", }, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 164b999825..4a2edf66a6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -610,11 +610,11 @@ "up to date": "up to date", "Your homeserver does not support session management.": "Your homeserver does not support session management.", "Unable to load session list": "Unable to load session list", - "Confirm deleting this session by using Single Sign On to prove your identity.": "Confirm deleting this session by using Single Sign On to prove your identity.", - "Confirm deleting these sessions by using Single Sign On to prove your identity.": "Confirm deleting these sessions by using Single Sign On to prove your identity.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Confirm deleting these sessions by using Single Sign On to prove your identity.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Confirm deleting this session by using Single Sign On to prove your identity.", "Confirm deleting these sessions": "Confirm deleting these sessions", - "Click the button below to confirm deleting this session.": "Click the button below to confirm deleting this session.", - "Click the button below to confirm deleting these sessions.": "Click the button below to confirm deleting these sessions.", + "Click the button below to confirm deleting these sessions.|other": "Click the button below to confirm deleting these sessions.", + "Click the button below to confirm deleting these sessions.|one": "Click the button below to confirm deleting this session.", "Delete sessions": "Delete sessions", "Authentication": "Authentication", "Delete %(count)s sessions|other": "Delete %(count)s sessions", From 712e6e8c4999fb89b7b591c5bfb14768409e01ae Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Apr 2020 19:03:12 +0100 Subject: [PATCH 131/230] Fix sas verification buttons to match figma and remove useless inDialog prop from EncryptionPanel.js Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../verification/_VerificationShowSas.scss | 18 ++++++++++++++++++ .../views/dialogs/VerificationRequestDialog.js | 1 - .../views/right_panel/EncryptionPanel.js | 6 +++--- .../views/verification/VerificationShowSas.js | 4 ++-- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/res/css/views/verification/_VerificationShowSas.scss b/res/css/views/verification/_VerificationShowSas.scss index 6e26943640..af003112f7 100644 --- a/res/css/views/verification/_VerificationShowSas.scss +++ b/res/css/views/verification/_VerificationShowSas.scss @@ -61,3 +61,21 @@ limitations under the License. .mx_VerificationShowSas_emojiSas_break { flex-basis: 100%; } + +.mx_VerificationShowSas { + .mx_Dialog_buttons { + // this is more specific than the DialogButtons css so gets preference + button.mx_VerificationShowSas_matchButton { + color: $accent-color; + background-color: $accent-bg-color; + border: none; + } + + // this is more specific than the DialogButtons css so gets preference + button.mx_VerificationShowSas_noMatchButton { + color: $notice-primary-color; + background-color: $notice-primary-bg-color; + border: none; + } + } +} diff --git a/src/components/views/dialogs/VerificationRequestDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js index 88ca0bc337..7ff2cb8f50 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.js +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -61,7 +61,6 @@ export default class VerificationRequestDialog extends React.Component { verificationRequestPromise={this.props.verificationRequestPromise} onClose={this.props.onFinished} member={member} - inDialog={true} /> ; } diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index da06c37f75..476b6cace9 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -32,7 +32,7 @@ import {_t} from "../../../languageHandler"; const MISMATCHES = ["m.key_mismatch", "m.user_error", "m.mismatched_sas"]; const EncryptionPanel = (props) => { - const {verificationRequest, verificationRequestPromise, member, onClose, layout, isRoomEncrypted, inDialog} = props; + const {verificationRequest, verificationRequestPromise, member, onClose, layout, isRoomEncrypted} = props; const [request, setRequest] = useState(verificationRequest); // state to show a spinner immediately after clicking "start verification", // before we have a request @@ -133,7 +133,7 @@ const EncryptionPanel = (props) => { isSelfVerification={isSelfVerification} waitingForOtherParty={requested && initiatedByMe} waitingForNetwork={requested && !initiatedByMe} - inDialog={inDialog} /> + inDialog={layout === "dialog"} /> ); } else { return ( @@ -145,7 +145,7 @@ const EncryptionPanel = (props) => { member={member} request={request} key={request.channel.transactionId} - inDialog={inDialog} + inDialog={layout === "dialog"} phase={phase} device={device} /> ); diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 7e9096e8fe..5fd0dca267 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -125,10 +125,10 @@ export default class VerificationShowSas extends React.Component { confirm = ; } else { confirm = From c21dccc397860d288e181c2df91712c619a31f68 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 7 Apr 2020 19:11:06 +0100 Subject: [PATCH 132/230] Add debug status for cached backup key format Check backup key format to ease tracking such issues Debug helper for https://github.com/vector-im/riot-web/issues/13057 --- .../views/settings/CrossSigningPanel.js | 21 +++++++++++++++++-- src/i18n/strings/en_EN.json | 2 ++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index 2217a0f2ee..cb04d2a018 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -81,7 +81,9 @@ export default class CrossSigningPanel extends React.PureComponent { const crossSigningPrivateKeysInStorage = await crossSigning.isStoredInSecretStorage(secretStorage); const selfSigningPrivateKeyCached = !!(pkCache && await pkCache.getCrossSigningKeyCache("self_signing")); const userSigningPrivateKeyCached = !!(pkCache && await pkCache.getCrossSigningKeyCache("user_signing")); - const sessionBackupKeyCached = !!(await cli._crypto.getSessionBackupPrivateKey()); + const sessionBackupKeyFromCache = await cli._crypto.getSessionBackupPrivateKey(); + const sessionBackupKeyCached = !!(sessionBackupKeyFromCache); + const sessionBackupKeyWellFormed = sessionBackupKeyFromCache instanceof Uint8Array; const secretStorageKeyInAccount = await secretStorage.hasKey(); const homeserverSupportsCrossSigning = await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing"); @@ -94,6 +96,7 @@ export default class CrossSigningPanel extends React.PureComponent { selfSigningPrivateKeyCached, userSigningPrivateKeyCached, sessionBackupKeyCached, + sessionBackupKeyWellFormed, secretStorageKeyInAccount, homeserverSupportsCrossSigning, crossSigningReady, @@ -143,6 +146,7 @@ export default class CrossSigningPanel extends React.PureComponent { selfSigningPrivateKeyCached, userSigningPrivateKeyCached, sessionBackupKeyCached, + sessionBackupKeyWellFormed, secretStorageKeyInAccount, homeserverSupportsCrossSigning, crossSigningReady, @@ -208,6 +212,16 @@ export default class CrossSigningPanel extends React.PureComponent { ); } + let sessionBackupKeyWellFormedText = ""; + if (sessionBackupKeyCached) { + sessionBackupKeyWellFormedText = ", "; + if (sessionBackupKeyWellFormed) { + sessionBackupKeyWellFormedText += _t("well formed"); + } else { + sessionBackupKeyWellFormedText += _t("unexpected type"); + } + } + return (
    {summarisedStatus} @@ -232,7 +246,10 @@ export default class CrossSigningPanel extends React.PureComponent { {_t("Session backup key:")} - {sessionBackupKeyCached ? _t("cached locally") : _t("not found locally")} + + {sessionBackupKeyCached ? _t("cached locally") : _t("not found locally")} + {sessionBackupKeyWellFormedText} + {_t("Secret storage public key:")} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b7ad92757a..3336c50472 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -601,6 +601,8 @@ "not found locally": "not found locally", "User signing private key:": "User signing private key:", "Session backup key:": "Session backup key:", + "well formed": "well formed", + "unexpected type": "unexpected type", "Secret storage public key:": "Secret storage public key:", "in account data": "in account data", "Homeserver feature support:": "Homeserver feature support:", From 3196c1a0315446cebf5c236b9aa09857529766f0 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 7 Apr 2020 19:24:07 +0100 Subject: [PATCH 133/230] Update i18n --- 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 3336c50472..82e87c3ac6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -591,6 +591,8 @@ "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Reset cross-signing and secret storage": "Reset cross-signing and secret storage", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", + "well formed": "well formed", + "unexpected type": "unexpected type", "Cross-signing public keys:": "Cross-signing public keys:", "in memory": "in memory", "not found": "not found", @@ -601,8 +603,6 @@ "not found locally": "not found locally", "User signing private key:": "User signing private key:", "Session backup key:": "Session backup key:", - "well formed": "well formed", - "unexpected type": "unexpected type", "Secret storage public key:": "Secret storage public key:", "in account data": "in account data", "Homeserver feature support:": "Homeserver feature support:", From 900a05366e2175ea1c7e48faf6f5059be4644198 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 7 Apr 2020 15:22:38 -0600 Subject: [PATCH 134/230] Fix share dialog correctly componentDidMount fires too late for this dialog, so we need to set ourselves up in the constructor. Fixes https://github.com/vector-im/riot-web/issues/13068 --- src/components/views/dialogs/ShareDialog.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index cf4735f608..1bc9decd39 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -70,9 +70,16 @@ export default class ShareDialog extends React.Component { this.onCopyClick = this.onCopyClick.bind(this); this.onLinkSpecificEventCheckboxClick = this.onLinkSpecificEventCheckboxClick.bind(this); + let permalinkCreator: RoomPermalinkCreator = null; + if (props.target instanceof Room) { + permalinkCreator = new RoomPermalinkCreator(props.target); + permalinkCreator.load(); + } + this.state = { // MatrixEvent defaults to share linkSpecificEvent linkSpecificEvent: this.props.target instanceof MatrixEvent, + permalinkCreator, }; this._link = createRef(); @@ -121,14 +128,6 @@ export default class ShareDialog extends React.Component { }); } - componentDidMount() { - if (this.props.target instanceof Room) { - const permalinkCreator = new RoomPermalinkCreator(this.props.target); - permalinkCreator.load(); - this.setState({permalinkCreator}); - } - } - componentWillUnmount() { // if the Copied tooltip is open then get rid of it, there are ways to close the modal which wouldn't close // the tooltip otherwise, such as pressing Escape or clicking X really quickly From 23ccd6de1cfb3f1447a3c6154c2f799f32528880 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 8 Apr 2020 05:24:57 +0000 Subject: [PATCH 135/230] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2273 of 2273 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-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 a87ba36d33..46d32a2af5 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2335,5 +2335,14 @@ "You cancelled verification on your other session.": "您已在其他工作階段取消驗證。", "%(displayName)s cancelled verification.": "%(displayName)s 取消驗證。", "You cancelled verification.": "您取消了驗證。", - "Self-verification request": "自我驗證請求" + "Self-verification request": "自我驗證請求", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "透過使用單一登入系統來證明您的身份以確認刪除這些工作階段。", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "透過使用單一登入系統來證明您的身份以確認刪除此工作階段。", + "Click the button below to confirm deleting these sessions.|other": "點擊下方按鈕以確認刪除這些工作階段。", + "Click the button below to confirm deleting these sessions.|one": "點擊下方按鈕以確認刪除此工作階段。", + "Welcome to %(appName)s": "歡迎使用 %(appName)s", + "Liberate your communication": "讓您的通訊自由", + "Send a Direct Message": "傳送直接訊息", + "Explore Public Rooms": "探索公開聊天室", + "Create a Group Chat": "建立群組聊天" } From b9d28f09c848d0bb4e113832d30c59a5de057471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 8 Apr 2020 06:43:37 +0000 Subject: [PATCH 136/230] Translated using Weblate (French) Currently translated at 100.0% (2273 of 2273 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 37bada3c0e..c4343432d2 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2336,5 +2336,14 @@ "You cancelled verification on your other session.": "Vous avez annulé la vérification dans votre autre session.", "%(displayName)s cancelled verification.": "%(displayName)s a annulé la vérification.", "You cancelled verification.": "Vous avez annulé la vérification.", - "Self-verification request": "Demande d’auto-vérification" + "Self-verification request": "Demande d’auto-vérification", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Confirmez la suppression de ces sessions en utilisant l’authentification unique pour prouver votre identité.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Confirmez la suppression de cette session en utilisant l’authentification unique pour prouver votre identité.", + "Click the button below to confirm deleting these sessions.|other": "Cliquez sur le bouton ci-dessous pour confirmer la suppression de ces sessions.", + "Click the button below to confirm deleting these sessions.|one": "Cliquez sur le bouton ci-dessous pour confirmer la suppression de cette session.", + "Welcome to %(appName)s": "Bienvenue sur %(appName)s", + "Liberate your communication": "Libérez votre communication", + "Send a Direct Message": "Envoyez un message direct", + "Explore Public Rooms": "Explorez les salons publics", + "Create a Group Chat": "Créez une discussion de groupe" } From 755374743318c257f8d89ebae295ae7c222a8eb0 Mon Sep 17 00:00:00 2001 From: MamasLT Date: Tue, 7 Apr 2020 22:44:40 +0000 Subject: [PATCH 137/230] Translated using Weblate (Lithuanian) Currently translated at 46.3% (1052 of 2273 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/lt/ --- src/i18n/strings/lt.json | 87 +++++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 11 deletions(-) diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 5defb98281..2652433075 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -15,7 +15,7 @@ "A new version of Riot is available.": "Yra prieinama nauja Riot versija.", "I understand the risks and wish to continue": "Aš suprantu riziką ir noriu tęsti", "Send Account Data": "Siųsti paskyros duomenis", - "Advanced notification settings": "Išplėstiniai pranešimų nustatymai", + "Advanced notification settings": "Sudėtingesni pranešimų nustatymai", "Uploading report": "Išsiunčiama ataskaita", "Sunday": "Sekmadienis", "Guests can join": "Svečiai gali prisijungti", @@ -276,7 +276,7 @@ "Password": "Slaptažodis", "New Password": "Naujas slaptažodis", "Device ID": "Įrenginio ID", - "Failed to set display name": "Nepavyko nustatyti rodomą vardą", + "Failed to set display name": "Nepavyko nustatyti rodomo vardo", "Disable Notifications": "Išjungti pranešimus", "Enable Notifications": "Įjungti pranešimus", "Cannot add any more widgets": "Nepavyksta pridėti daugiau valdiklių", @@ -324,7 +324,7 @@ "Anyone who knows the room's link, including guests": "Bet kas, žinantis kambario nuorodą, įskaitant svečius", "Anyone": "Bet kas", "Permissions": "Leidimai", - "Advanced": "Išplėstiniai", + "Advanced": "Sudėtingesni nustatymai", "Add a topic": "Pridėti temą", "Local addresses for this room:": "Vietiniai šio kambario adresai:", "This room has no local addresses": "Šis kambarys neturi jokių vietinių adresų", @@ -499,9 +499,9 @@ "Not a valid Riot keyfile": "Negaliojantis Riot rakto failas", "Authentication check failed: incorrect password?": "Autentifikavimo patikra nepavyko: neteisingas slaptažodis?", "Send analytics data": "Siųsti analitinius duomenis", - "Incoming voice call from %(name)s": "Gaunamasis balso skambutis nuo %(name)s", - "Incoming video call from %(name)s": "Gaunamasis vaizdo skambutis nuo %(name)s", - "Incoming call from %(name)s": "Gaunamasis skambutis nuo %(name)s", + "Incoming voice call from %(name)s": "Įeinantis balso skambutis nuo %(name)s", + "Incoming video call from %(name)s": "Įeinantis vaizdo skambutis nuo %(name)s", + "Incoming call from %(name)s": "Įeinantis skambutis nuo %(name)s", "Change Password": "Keisti slaptažodį", "Authentication": "Tapatybės nustatymas", "The maximum permitted number of widgets have already been added to this room.": "Į šį kambarį jau yra pridėtas didžiausias leidžiamas valdiklių skaičius.", @@ -743,7 +743,7 @@ "Failed to perform homeserver discovery": "Nepavyko atlikti namų serverio aptikimo", "Error: Problem communicating with the given homeserver.": "Klaida: Problemos susisiekiant su nurodytu namų serveriu.", "This server does not support authentication with a phone number.": "Šis serveris nepalaiko tapatybės nustatymo telefono numeriu.", - "Great! This passphrase looks strong enough.": "Puiku! Ši slaptafrazė atrodo pakankamai stipri.", + "Great! This passphrase looks strong enough.": "Puiku! Ši slapta frazė atrodo pakankamai stipri.", "Your Recovery Key": "Jūsų atkūrimo raktas", "Copy to clipboard": "Kopijuoti į iškarpinę", "Download": "Atsisiųsti", @@ -809,7 +809,7 @@ "Adds a custom widget by URL to the room": "Į kambarį prideda pasirinktinį valdiklį pagal URL", "Please supply a https:// or http:// widget URL": "Prašome pateikti https:// arba http:// valdiklio URL", "You cannot modify widgets in this room.": "Jūs negalite keisti valdiklių šiame kambaryje.", - "Forces the current outbound group session in an encrypted room to be discarded": "Priverčia išmesti esamą užsibaigiančią grupės sesiją šifruotame kambaryje", + "Forces the current outbound group session in an encrypted room to be discarded": "Priverčia išmesti esamą užsibaigiantį grupės seansą užšifruotame kambaryje", "Sends the given message coloured as a rainbow": "Išsiunčia nurodytą žinutę nuspalvintą kaip vaivorykštė", "Sends the given emote coloured as a rainbow": "Išsiunčia nurodytą emociją nuspalvintą kaip vaivorykštė", "Displays list of commands with usages and descriptions": "Parodo komandų sąrašą su naudojimo būdais ir aprašymais", @@ -835,7 +835,7 @@ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s pakeitė %(powerLevelDiffText)s galios lygį.", "%(displayName)s is typing …": "%(displayName)s rašo …", "%(names)s and %(count)s others are typing …|other": "%(names)s ir %(count)s kiti rašo …", - "%(names)s and %(count)s others are typing …|one": "%(names)s ir vienas kitas rašo …", + "%(names)s and %(count)s others are typing …|one": "%(names)s ir dar vienas rašo …", "%(names)s and %(lastPerson)s are typing …": "%(names)s ir %(lastPerson)s rašo …", "Cannot reach homeserver": "Serveris nepasiekiamas", "Ensure you have a stable internet connection, or get in touch with the server admin": "Įsitikinkite, kad jūsų interneto ryšys yra stabilus, arba susisiekite su serverio administratoriumi", @@ -848,7 +848,7 @@ "Unexpected error resolving homeserver configuration": "Netikėta klaida nustatant serverio konfigūraciją", "Unexpected error resolving identity server configuration": "Netikėta klaida nustatant tapatybės serverio konfigūraciją", "%(items)s and %(count)s others|other": "%(items)s ir %(count)s kiti", - "%(items)s and %(count)s others|one": "%(items)s ir vienas kitas", + "%(items)s and %(count)s others|one": "%(items)s ir dar vienas", "%(items)s and %(lastItem)s": "%(items)s ir %(lastItem)s", "Unrecognised address": "Neatpažintas adresas", "You do not have permission to invite people to this room.": "Jūs neturite leidimo pakviesti žmones į šį kambarį.", @@ -1008,5 +1008,70 @@ "Alt Gr": "Alt Gr", "Shift": "Shift", "Super": "Super", - "Ctrl": "Ctrl" + "Ctrl": "Ctrl", + "If you cancel now, you won't complete verifying the other user.": "Jei atšauksite dabar, neužbaigsite kito vartotojo patvirtinimo.", + "If you cancel now, you won't complete verifying your other session.": "Jei atšauksite dabar, neužbaigsite kito seanso patvirtinimo.", + "Verify this session": "Patvirtinti šį seansą", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s pakeitė kambario pavadinimą iš %(oldRoomName)s į %(newRoomName)s.", + "Show display name changes": "Rodyti vardo pakeitimus", + "Show read receipts sent by other users": "Rodyti kitų vartotojų siųstus perskaitymo kvitus", + "Order rooms by name": "Rūšiuoti kambarius pagal pavadinimą", + "The other party cancelled the verification.": "Kita šalis atšaukė patvirtinimą.", + "Public Name": "Viešas Vardas", + "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Užšifruotos žinutės yra apsaugotos su \"end-to-end\" šifravimu. Tik jūs ir gavėjas(-ai) turi raktus šioms žinutėms perskaityti.", + "Back up your keys before signing out to avoid losing them.": "Prieš atsijungdami sukurkite atsarginę savo raktų kopiją, kad jų neprarastumėte.", + "Start using Key Backup": "Pradėti naudoti Atsarginę Raktų Kopiją", + "Display Name": "Rodomas Vardas", + "Please verify the room ID or alias and try again.": "Prašome patikrinti kambario ID arba slapyvardį ir bandyti dar kartą.", + "Room %(name)s": "Kambarys %(name)s", + "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Atnaujinimas išjungs dabartinę kambario instanciją ir sukurs atnaujintą kambarį tuo pačiu vardu.", + "Other published addresses:": "Kiti paskelbti adresai:", + "No other published addresses yet, add one below": "Kol kas nėra kitų paskelbtų adresų, pridėkite vieną žemiau", + "Room Name": "Kambario Pavadinimas", + "You verified %(name)s": "Jūs patvirtinote %(name)s", + "You cancelled verifying %(name)s": "Jūs atšaukėte %(name)s patvirtinimą", + "%(name)s cancelled verifying": "%(name)s atšaukė patvirtinimą", + "%(name)s accepted": "%(name)s priimtas", + "%(name)s declined": "%(name)s atmestas", + "%(name)s cancelled": "%(name)s atšauktas", + "%(name)s wants to verify": "%(name)s nori patvirtinti", + "Your display name": "Jūsų rodomas vardas", + "Rotate Left": "Pasukti Kairėn", + "Room alias": "Kambario slapyvardis", + "e.g. my-room": "pvz.: mano-kambarys", + "Please provide a room alias": "Įveskite kambario slapyvardį", + "Enter a server name": "Įveskite serverio pavadinimą", + "Enter the name of a new server you want to explore.": "Įveskite naujo, norimo žvalgyti serverio pavadinimą.", + "Server name": "Serverio pavadinimas", + "Please enter a name for the room": "Įveskite kambario pavadinimą", + "Set a room alias to easily share your room with other people.": "Nustatykite kambario slapyvardį, kad galėtumėte nesunkiai pasidalinti juo su kitais.", + "This room is private, and can only be joined by invitation.": "Šis kambarys yra privatus, prie jo prisijungti galima tik su pakvietimu.", + "Create a private room": "Sukurti privatų kambarį", + "Name": "Pavadinimas", + "Topic (optional)": "Tema (nebūtina)", + "Hide advanced": "Paslėpti sudėtingesnius nustatymus", + "Show advanced": "Rodyti sudėtingesnius nustatymus", + "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Neleisti kitų matrix serverių vartotojams prisijungti prie šio kambario (Šis nustatymas negali būti vėliau pakeistas!)", + "Session name": "Seanso pavadinimas", + "Session key": "Seanso raktas", + "I don't want my encrypted messages": "Man nereikalingos užšifruotos žinutės", + "You'll lose access to your encrypted messages": "Jūs prarasite prieigą prie savo užšifruotų žinučių", + "New session": "Naujas seansas", + "Enter secret storage passphrase": "Įveskite slaptos saugyklos slaptafrazę", + "Enter recovery passphrase": "Įveskite atstatymo slaptafrazę", + "Warning: you should only set up key backup from a trusted computer.": "Įspėjimas: atsarginę raktų kopiją sukurkite tik iš patikimo kompiuterio.", + "Warning: You should only set up key backup from a trusted computer.": "Įspėjimas: Atsarginę raktų kopiją sukurkite tik iš patikimo kompiuterio.", + "Server Name": "Serverio Pavadinimas", + "Other servers": "Kiti serveriai", + "Add room": "Sukurti kambarį", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Slaptažodžio keitimas ištrins visų jūsų seansų šifravimo raktus, todėl nebebus galima perskaityti užšifruotos pokalbių istorijos. Nustatykite Raktų Atsarginę Kopiją arba eksportuokite savo kambarių raktus iš kito seanso prieš atstatydami slaptažodį.", + "Set a display name:": "Nustatyti rodomą vardą:", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Apsaugokite savo šifravimo raktus slaptafraze. Maksimaliam saugumui užtikrinti ji turi skirtis nuo jūsų paskyros slaptažodžio:", + "Enter a passphrase": "Įveskite slaptafrazę", + "Enter your passphrase a second time to confirm it.": "Įveskite slaptafrazę antrą kartą, kad ją patvirtintumėte.", + "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "Mes saugosime užšifruotą jūsų raktų kopiją mūsų serveryje. Apsaugokite savo atsarginę kopiją slaptafraze, kad ji būtų saugi.", + "For maximum security, this should be different from your account password.": "Maksimaliam saugumui užtikrinti ji turi skirtis nuo jūsų paskyros slaptažodžio.", + "Enter a passphrase...": "Įveskite slaptafrazę...", + "Please enter your passphrase a second time to confirm.": "Įveskite slaptafrazę antrą kartą, kad ją patvirtintumėte.", + "Secure your backup with a passphrase": "Apsaugokite savo atsarginę kopiją slaptafraze" } From c6fcaf86ffafe79dde4b55423999028d98bfc9f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 8 Apr 2020 11:15:13 +0200 Subject: [PATCH 138/230] EventIndex: Log if we had all events in a checkpoint but are continuing. --- src/indexing/EventIndex.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 69939d0f32..1226b84b5b 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -530,6 +530,10 @@ export default class EventIndex extends EventEmitter { "added, stopping the crawl", checkpoint); await indexManager.removeCrawlerCheckpoint(newCheckpoint); } else { + if (eventsAlreadyAdded === true) { + console.log("EventIndex: Checkpoint had already all events", + "added, but continuing due to a full crawl", checkpoint); + } this.crawlerCheckpoints.push(newCheckpoint); } } catch (e) { From 44473707648f1fffcb4b6af8d0a83d3c38692e9d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Apr 2020 10:19:52 +0100 Subject: [PATCH 139/230] Fix composer placeholder not updating Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/BasicMessageComposer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index 5b597e1999..e3cffd59f8 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -94,8 +94,7 @@ export default class BasicMessageEditor extends React.Component { this._emoticonSettingHandle = null; } - // TODO: [REACT-WARNING] Move into better lifecycle position - UNSAFE_componentWillUpdate(prevProps) { // eslint-disable-line camelcase + componentDidUpdate(prevProps) { if (this.props.placeholder !== prevProps.placeholder && this.props.placeholder) { const {isEmpty} = this.props.model; if (isEmpty) { From ada860f163b66a54c0518cb5a21b547b472b5934 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Apr 2020 10:50:22 +0100 Subject: [PATCH 140/230] Add toggle for e2ee when creating private room in x-signing world Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/dialogs/_CreateRoomDialog.scss | 1 + .../views/dialogs/CreateRoomDialog.js | 20 +++++++++++++++++++ src/i18n/strings/en_EN.json | 2 ++ 3 files changed, 23 insertions(+) diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index c542741c30..ac46b8e91a 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -78,6 +78,7 @@ limitations under the License. .mx_SettingsFlag { display: flex; + margin-top: 4px; } .mx_SettingsFlag_label { diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 77014db21d..2431a4d32f 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -24,6 +24,7 @@ import withValidation from '../elements/Validation'; import { _t } from '../../../languageHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {Key} from "../../../Keyboard"; +import SettingsStore from "../../../settings/SettingsStore"; export default createReactClass({ displayName: 'CreateRoomDialog', @@ -35,6 +36,7 @@ export default createReactClass({ const config = SdkConfig.get(); return { isPublic: false, + isEncrypted: true, name: "", topic: "", alias: "", @@ -62,6 +64,11 @@ export default createReactClass({ if (this.state.noFederate) { createOpts.creation_content = {'m.federate': false}; } + + if (!this.state.isPublic && SettingsStore.isFeatureEnabled("feature_cross_signing")) { + createOpts.encryption = this.state.isEncrypted; + } + return opts; }, @@ -127,6 +134,10 @@ export default createReactClass({ this.setState({isPublic}); }, + onEncryptedChange(isEncrypted) { + this.setState({isEncrypted}); + }, + onAliasChange(alias) { this.setState({alias}); }, @@ -181,6 +192,14 @@ export default createReactClass({ privateLabel = (

    {_t("This room is private, and can only be joined by invitation.")}

    ); } + let e2eeSection; + if (!this.state.isPublic && SettingsStore.isFeatureEnabled("feature_cross_signing")) { + e2eeSection = + + { _t("Bridges and most bots will not function in end-to-end encrypted rooms.") } + ; + } + const title = this.state.isPublic ? _t('Create a public room') : _t('Create a private room'); return ( this._nameFieldRef = ref} label={ _t('Name') } onChange={this.onNameChange} onValidate={this.onNameValidate} value={this.state.name} className="mx_CreateRoomDialog_name" /> + { e2eeSection } { privateLabel } { publicLabel } { aliasField } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index aa2f0aa819..2e33445821 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1555,6 +1555,8 @@ "Please enter a name for the room": "Please enter a name for the room", "Set a room alias to easily share your room with other people.": "Set a room alias to easily share your room with other people.", "This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.", + "Enable end-to-end encryption": "Enable end-to-end encryption", + "Bridges and most bots will not function in end-to-end encrypted rooms.": "Bridges and most bots will not function in end-to-end encrypted rooms.", "Create a public room": "Create a public room", "Create a private room": "Create a private room", "Name": "Name", From 3a05d74ae83ae0268e553f09780200449f590b55 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 8 Apr 2020 10:52:33 +0000 Subject: [PATCH 141/230] Translated using Weblate (Albanian) Currently translated at 99.6% (2268 of 2276 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 8be33f1e20..c467873553 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2325,5 +2325,16 @@ "You cancelled verification.": "Anuluat verifikimin.", "Sign in with SSO": "Hyni me HNj", "Self-verification request": "Kërkesë vetë-verifikimi", - "Cancel replying to a message": "Anulo përgjigjen te një mesazh" + "Cancel replying to a message": "Anulo përgjigjen te një mesazh", + "%(name)s is requesting verification": "%(name)s po kërkon verifikim", + "unexpected type": "lloj i papritur", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Ripohoni fshirjen e këtyre sesioneve duke përdorur Hyrje Njëshe për të dëshmuar identitetin tuaj.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Ripohoni fshirjen e këtij sesioni duke përdorur Hyrje Njëshe për të dëshmuar identitetin tuaj.", + "Click the button below to confirm deleting these sessions.|other": "Klikoni butonin më poshtë që të ripohoni fshirjen e këtyre sesioneve.", + "Click the button below to confirm deleting these sessions.|one": "Klikoni mbi butonin më poshtë që të ripohoni fshirjen e këtij sesioni.", + "Welcome to %(appName)s": "Mirë se vini te %(appName)s", + "Liberate your communication": "Çlironi komunikimin tuaj", + "Send a Direct Message": "Dërgoni Mesazh të Drejtpërdrejtë", + "Explore Public Rooms": "Eksploroni Dhoma Publike", + "Create a Group Chat": "Krijoni një Fjalosje Grupi" } From eec28ce38ad504c3b27555a256e578a2d527f12d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Apr 2020 13:47:15 +0100 Subject: [PATCH 142/230] Update styling and copy to match Figma Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/dialogs/_CreateRoomDialog.scss | 22 +++++++++++++++++-- .../views/dialogs/CreateRoomDialog.js | 14 +++++------- src/i18n/strings/en_EN.json | 2 +- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index ac46b8e91a..6800722802 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -15,6 +15,8 @@ limitations under the License. */ .mx_CreateRoomDialog_details { + margin-top: 15px; + .mx_CreateRoomDialog_details_summary { outline: none; list-style: none; @@ -71,14 +73,17 @@ limitations under the License. } .mx_CreateRoomDialog { - &.mx_Dialog_fixedWidth { width: 450px; } + p, + .mx_Field_input label { + color: $muted-fg-color; + } + .mx_SettingsFlag { display: flex; - margin-top: 4px; } .mx_SettingsFlag_label { @@ -91,5 +96,18 @@ limitations under the License. flex: 0 0 auto; margin-left: 30px; } + + .mx_CreateRoomDialog_topic { + margin-bottom: 36px; + } + + .mx_Dialog_content > .mx_SettingsFlag { + margin-top: 20px; + } + + p { + margin: 0 85px 0 0; + line-height: $font-24px; + } } diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 2431a4d32f..5f723234b0 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -177,11 +177,10 @@ export default createReactClass({ const LabelledToggleSwitch = sdk.getComponent('views.elements.LabelledToggleSwitch'); const RoomAliasField = sdk.getComponent('views.elements.RoomAliasField'); - let privateLabel; - let publicLabel; + let publicPrivateLabel; let aliasField; if (this.state.isPublic) { - publicLabel = (

    {_t("Set a room alias to easily share your room with other people.")}

    ); + publicPrivateLabel = (

    {_t("Set a room alias to easily share your room with other people.")}

    ); const domain = MatrixClientPeg.get().getDomain(); aliasField = (
    @@ -189,14 +188,14 @@ export default createReactClass({
    ); } else { - privateLabel = (

    {_t("This room is private, and can only be joined by invitation.")}

    ); + publicPrivateLabel = (

    {_t("This room is private, and can only be joined by invitation.")}

    ); } let e2eeSection; if (!this.state.isPublic && SettingsStore.isFeatureEnabled("feature_cross_signing")) { e2eeSection = - { _t("Bridges and most bots will not function in end-to-end encrypted rooms.") } +

    { _t("You can’t disable this later. Bridges & most bots currently won’t work.") }

    ; } @@ -208,11 +207,10 @@ export default createReactClass({
    this._nameFieldRef = ref} label={ _t('Name') } onChange={this.onNameChange} onValidate={this.onNameValidate} value={this.state.name} className="mx_CreateRoomDialog_name" /> - + + { publicPrivateLabel } { e2eeSection } - { privateLabel } - { publicLabel } { aliasField }
    { this.state.detailsOpen ? _t('Hide advanced') : _t('Show advanced') } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2e33445821..4fbb32e241 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1556,7 +1556,7 @@ "Set a room alias to easily share your room with other people.": "Set a room alias to easily share your room with other people.", "This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.", "Enable end-to-end encryption": "Enable end-to-end encryption", - "Bridges and most bots will not function in end-to-end encrypted rooms.": "Bridges and most bots will not function in end-to-end encrypted rooms.", + "You can’t disable this later. Bridges & most bots currently won’t work.": "You can’t disable this later. Bridges & most bots currently won’t work.", "Create a public room": "Create a public room", "Create a private room": "Create a private room", "Name": "Name", From 4041c030a559f85d48a35a7db0938bc200073a4f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Apr 2020 14:44:34 +0100 Subject: [PATCH 143/230] Apply changes from Figma Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/dialogs/_CreateRoomDialog.scss | 7 ++++++- src/components/views/dialogs/CreateRoomDialog.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index 6800722802..2ec0011729 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -77,6 +77,10 @@ limitations under the License. width: 450px; } + .mx_Dialog_content { + margin-bottom: 40px; + } + p, .mx_Field_input label { color: $muted-fg-color; @@ -102,11 +106,12 @@ limitations under the License. } .mx_Dialog_content > .mx_SettingsFlag { - margin-top: 20px; + margin-top: 12px; } p { margin: 0 85px 0 0; + font-size: $font-12px; line-height: $font-24px; } } diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 5f723234b0..88e90627e8 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -195,7 +195,7 @@ export default createReactClass({ if (!this.state.isPublic && SettingsStore.isFeatureEnabled("feature_cross_signing")) { e2eeSection = -

    { _t("You can’t disable this later. Bridges & most bots currently won’t work.") }

    +

    { _t("You can’t disable this later. Bridges & most bots won’t work yet.") }

    ; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4fbb32e241..072863c2c4 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1556,7 +1556,7 @@ "Set a room alias to easily share your room with other people.": "Set a room alias to easily share your room with other people.", "This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.", "Enable end-to-end encryption": "Enable end-to-end encryption", - "You can’t disable this later. Bridges & most bots currently won’t work.": "You can’t disable this later. Bridges & most bots currently won’t work.", + "You can’t disable this later. Bridges & most bots won’t work yet.": "You can’t disable this later. Bridges & most bots won’t work yet.", "Create a public room": "Create a public room", "Create a private room": "Create a private room", "Name": "Name", From ffecf03b2a12d7f67e032ed64535537a233bfc40 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Apr 2020 14:48:50 +0100 Subject: [PATCH 144/230] Update margins to improve grouping Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/dialogs/_CreateRoomDialog.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index 2ec0011729..2678f7b4ad 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -106,13 +106,12 @@ limitations under the License. } .mx_Dialog_content > .mx_SettingsFlag { - margin-top: 12px; + margin-top: 24px; } p { margin: 0 85px 0 0; font-size: $font-12px; - line-height: $font-24px; } } From c87d6c22dfa62e5270b54526786836ae9b91dafe Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 8 Apr 2020 14:49:52 +0100 Subject: [PATCH 145/230] yarn upgrade --- yarn.lock | 1405 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 816 insertions(+), 589 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0391132786..538a049bff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,42 +25,43 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.6.tgz#7eeaa0dfa17e50c7d9c0832515eee09b56f04e35" - integrity sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q== +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== dependencies: - browserslist "^4.8.5" + browserslist "^4.9.1" invariant "^2.2.4" semver "^5.5.0" "@babel/core@>=7.2.2", "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.7.tgz#b69017d221ccdeb203145ae9da269d72cf102f3b" - integrity sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.7" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.7" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" "@babel/template" "^7.8.6" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.7" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" - json5 "^2.1.0" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.8.3", "@babel/generator@^7.8.6", "@babel/generator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.7.tgz#870b3cf7984f5297998152af625c4f3e341400f7" - integrity sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew== +"@babel/generator@^7.4.0", "@babel/generator@^7.8.3", "@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== dependencies: - "@babel/types" "^7.8.7" + "@babel/types" "^7.9.5" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -80,22 +81,22 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-builder-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" - integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== +"@babel/helper-builder-react-jsx-experimental@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3" + integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg== dependencies: - "@babel/types" "^7.8.3" - esutils "^2.0.0" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/types" "^7.9.5" -"@babel/helper-call-delegate@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" - integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== +"@babel/helper-builder-react-jsx@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" + integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.7" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/types" "^7.9.0" "@babel/helper-compilation-targets@^7.8.7": version "7.8.7" @@ -109,25 +110,25 @@ semver "^5.5.0" "@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz#79753d44017806b481017f24b02fd4113c7106ea" + integrity sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA== dependencies: - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.6.tgz#7fa040c97fb8aebe1247a5c645330c32d083066b" - integrity sha512-bPyujWfsHhV/ztUkwGHz/RPV1T1TDEsSZDsN42JPehndA+p1KKTh3npvTadux0ZhCrytx9tvjpWNowKby3tM6A== +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.6.0" + regexpu-core "^4.7.0" "@babel/helper-define-map@^7.8.3": version "7.8.3" @@ -146,14 +147,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== dependencies: "@babel/helper-get-function-arity" "^7.8.3" "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.9.5" "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" @@ -183,17 +184,17 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz#6a13b5eecadc35692047073a64e42977b97654a4" - integrity sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg== +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-simple-access" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" "@babel/template" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/types" "^7.9.0" lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.8.3": @@ -251,6 +252,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -261,28 +267,28 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" "@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== dependencies: + "@babel/helper-validator-identifier" "^7.9.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.7.tgz#7b8facf95d25fef9534aad51c4ffecde1a61e26a" - integrity sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A== +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" @@ -342,7 +348,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.7.4": +"@babel/plugin-proposal-numeric-separator@^7.7.4", "@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== @@ -350,13 +356,14 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.7.4", "@babel/plugin-proposal-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== +"@babel/plugin-proposal-object-rest-spread@^7.7.4", "@babel/plugin-proposal-object-rest-spread@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz#3fd65911306d8746014ec0d0cf78f0e39a149116" + integrity sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.8.3" @@ -366,20 +373,20 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== +"@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" - integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.8.8" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-async-generators@^7.8.0": @@ -438,7 +445,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== @@ -511,14 +518,14 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz#77534447a477cbe5995ae4aee3e39fbc8090c46d" - integrity sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg== +"@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" @@ -532,14 +539,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.8.3": +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== @@ -571,18 +578,18 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz#da705a655466b2a9b36046b57bf0cbcd53551bd4" - integrity sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA== +"@babel/plugin-transform-flow-strip-types@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-for-of@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz#a051bd1b402c61af97a27ff51b468321c7c2a085" - integrity sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw== +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -608,41 +615,41 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== dependencies: "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": @@ -667,12 +674,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.7.tgz#66fa2f1de4129b4e0447509223ac71bda4955395" - integrity sha512-brYWaEPTRimOctz2NDA3jnBbDi7SVN2T4wYuu0aqSzxC3nozFZngGaw29CJ9ZPweB7k+iFmZuoG3IVPIcXmD2g== +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== dependencies: - "@babel/helper-call-delegate" "^7.8.7" "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -690,28 +696,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx-self@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" - integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== +"@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" + integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== + dependencies: + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" + integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx-source@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" - integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" + integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" - integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== +"@babel/plugin-transform-react-jsx@^7.9.4": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" + integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== dependencies: - "@babel/helper-builder-react-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" @@ -730,9 +746,9 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-runtime@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" - integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -776,10 +792,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-typescript@^7.8.3": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda" - integrity sha512-7O0UsPQVNKqpHeHLpfvOG4uXmlw+MOxYvUv6Otc9uH5SYMIxvF6eBdjkWvC3f9G+VXe0RsNExyAQBeTRug/wqQ== +"@babel/plugin-transform-typescript@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" + integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== dependencies: "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -794,11 +810,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/preset-env@^7.7.6": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.7.tgz#1fc7d89c7f75d2d70c2b6768de6c2e049b3cb9db" - integrity sha512-BYftCVOdAYJk5ASsznKAUl53EMhfBbr8CJ1X+AJLfGPscQkwJFiaV/Wn9DPH/7fzm2v6iRYJKYHSqyynTGw0nw== + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.5.tgz#8ddc76039bc45b774b19e2fc548f6807d8a8919f" + integrity sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ== dependencies: - "@babel/compat-data" "^7.8.6" + "@babel/compat-data" "^7.9.0" "@babel/helper-compilation-targets" "^7.8.7" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -806,14 +822,16 @@ "@babel/plugin-proposal-dynamic-import" "^7.8.3" "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.5" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" @@ -822,24 +840,24 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.6" + "@babel/plugin-transform-classes" "^7.9.5" "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.6" + "@babel/plugin-transform-for-of" "^7.9.0" "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-transform-property-literals" "^7.8.3" "@babel/plugin-transform-regenerator" "^7.8.7" "@babel/plugin-transform-reserved-words" "^7.8.3" @@ -849,44 +867,57 @@ "@babel/plugin-transform-template-literals" "^7.8.3" "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.7" - browserslist "^4.8.5" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.5" + browserslist "^4.9.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" semver "^5.5.0" "@babel/preset-flow@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.8.3.tgz#52af74c6a4e80d889bd9436e8e278d0fecac6e18" - integrity sha512-iCXFk+T4demnq+dNLLvlGOgvYF6sPZ/hS1EmswugOqh1Ysp2vuiqJzpgsnp5rW8+6dLJT/0CXDzye28ZH6BAfQ== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.9.0.tgz#fee847c3e090b0b2d9227c1949e4da1d1379280d" + integrity sha512-88uSmlshIrlmPkNkEcx3UpSZ6b8n0UGBq0/0ZMZCF/uxAW0XIAUuDHBhIOAh0pvweafH4RxOwi/H3rWhtqOYPA== dependencies: "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-flow-strip-types" "^7.8.3" + "@babel/plugin-transform-flow-strip-types" "^7.9.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" "@babel/preset-react@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" - integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d" + integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self" "^7.8.3" - "@babel/plugin-transform-react-jsx-source" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.4" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" "@babel/preset-typescript@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz#90af8690121beecd9a75d0cc26c6be39d1595d13" - integrity sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" "@babel/register@^7.7.4": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.8.6.tgz#a1066aa6168a73a70c35ef28cc5865ccc087ea69" - integrity sha512-7IDO93fuRsbyml7bAafBQb3RcBGlCpU4hh5wADA2LJEEcYk92WkwFZ0pHyIi2fb5Auoz1714abETdZKCOxN0CQ== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.9.0.tgz#02464ede57548bddbb5e9f705d263b7c3f43d48b" + integrity sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q== dependencies: find-cache-dir "^2.0.0" lodash "^4.17.13" @@ -895,17 +926,17 @@ source-map-support "^0.5.16" "@babel/runtime-corejs3@^7.8.3": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.8.7.tgz#8209d9dff2f33aa2616cb319c83fe159ffb07b8c" - integrity sha512-sc7A+H4I8kTd7S61dgB9RomXu/C+F4IrRr4Ytze4dnfx7AXEpCrejSNpjx7vq6y/Bak9S6Kbk65a/WgMLtg43Q== + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz#26fe4aa77e9f1ecef9b776559bbb8e84d34284b7" + integrity sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.7.tgz#8fefce9802db54881ba59f90bb28719b4996324d" - integrity sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg== + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== dependencies: regenerator-runtime "^0.13.4" @@ -918,27 +949,27 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" - integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" - "@babel/helper-function-name" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" - integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.9.5" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -1111,44 +1142,43 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@peculiar/asn1-schema@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-1.0.3.tgz#e55ff9e98a1cf31832629aabacf85be3edf13a48" - integrity sha512-Tfgj9eNJ6cTKEtEuidKenLHMx/Q5M8KEE9hnohHqvdpqHJXWYr5RlT3GjAHPjGXy5+mr7sSfuXfzE6aAkEGN7A== +"@peculiar/asn1-schema@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-1.0.5.tgz#aa5a2c51225d213d1d6a5499ada926da3f556ff5" + integrity sha512-rzzorGYnQNmVHleLvC8gJSbbdNYtg+EB9s075dHvwpxs10teXHYnRmTWhCVuWjbSVSofwdm7IYPtMTWTbcNUWA== dependencies: - asn1js "^2.0.22" - tslib "^1.9.3" + asn1js "^2.0.26" + tslib "^1.11.1" -"@peculiar/json-schema@^1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.9.tgz#b746e046b787607a1b2804f64437fda2527b3e62" - integrity sha512-F2ST2y/IQPgY+1QMw1Q33sqJbGDCeO3lGqI69SL3Hgo0++7iHqprUB1QyxB/A7bN3tuM65MBxoM2JLbwh42lsQ== +"@peculiar/json-schema@^1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.10.tgz#d772b4323c9a4b5352b5ad52dc821a07b0db4877" + integrity sha512-kbpnG9CkF1y6wwGkW7YtSA+yYK4X5uk4rAwsd1hxiaYE3Hkw2EsGlbGh/COkMLyFf+Fe830BoFiMSB3QnC/ItA== dependencies: - tslib "^1.10.0" + tslib "^1.11.1" "@peculiar/webcrypto@^1.0.22": - version "1.0.23" - resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.0.23.tgz#5519b839fba2cf8603bbbd6764dc41b108093dad" - integrity sha512-Ssb4xpQI3BJ0itAtT9y9jyeeiWNjcFvP6Wt/ehITxRYrEnlSfnrP7Ytc7BwN8XtnKmXDS2cWvppPldw5QsFCcw== + version "1.0.27" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.0.27.tgz#f32c58656267c8f8419a6b574322573a1b83a683" + integrity sha512-sERMakD19gNhwBVXGGoJjBfc28bDbd2YWaio7/x8jKtvwMKNuljM7ANQ6LzEkEvqFAyjf3bhBZktJ6UXy/0Plg== dependencies: - "@peculiar/asn1-schema" "^1.0.3" - "@peculiar/json-schema" "^1.1.9" - asn1js "^2.0.26" - pvtsutils "^1.0.9" + "@peculiar/asn1-schema" "^1.0.5" + "@peculiar/json-schema" "^1.1.10" + pvtsutils "^1.0.10" tslib "^1.11.1" - webcrypto-core "^1.0.17" + webcrypto-core "^1.0.19-next.0" "@sinonjs/commons@^1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.1.tgz#da5fd19a5f71177a53778073978873964f49acf1" - integrity sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ== + version "1.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" + integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== dependencies: type-detect "4.0.8" "@types/babel__core@^7.1.0": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" - integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" + integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1172,9 +1202,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" - integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + version "7.0.10" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.10.tgz#d9a99f017317d9b3d1abc2ced45d3bca68df0daf" + integrity sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw== dependencies: "@babel/types" "^7.3.0" @@ -1228,9 +1258,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "13.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.0.tgz#5b6ee7a77faacddd7de719017d0bc12f52f81589" - integrity sha512-0ARSQootUG1RljH2HncpsY2TJBfGQIKOOi7kxzUY6z54ePu/ZD+wJA8zI2Q6v8rol2qpG/rvqsReco8zNMPvhQ== + version "13.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" + integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== "@types/prop-types@*": version "15.7.3" @@ -1238,9 +1268,9 @@ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/react@16.9": - version "16.9.23" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.23.tgz#1a66c6d468ba11a8943ad958a8cb3e737568271c" - integrity sha512-SsGVT4E7L2wLN3tPYLiF20hmZTPGuzaayVunfgXzUn1x4uHVsKH6QDJQ/TdpHqwsTLd4CwrmQ2vOgxN7gE24gw== + version "16.9.32" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383" + integrity sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -1284,18 +1314,19 @@ "@types/yargs-parser" "*" "@typescript-eslint/experimental-utils@^2.5.0": - version "2.23.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.23.0.tgz#5d2261c8038ec1698ca4435a8da479c661dc9242" - integrity sha512-OswxY59RcXH3NNPmq+4Kis2CYZPurRU6mG5xPcn24CjFyfdVli5mySwZz/g/xDbJXgDsYqNGq7enV0IziWGXVQ== + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a" + integrity sha512-vOsYzjwJlY6E0NJRXPTeCGqjv5OHgRU1kzxHKWJVPjDYGbPgLudBXjIlc+OD1hDBZ4l1DLbOc5VjofKahsu9Jw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.23.0" + "@typescript-eslint/typescript-estree" "2.27.0" eslint-scope "^5.0.0" + eslint-utils "^2.0.0" -"@typescript-eslint/typescript-estree@2.23.0": - version "2.23.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.23.0.tgz#d355960fab96bd550855488dcc34b9a4acac8d36" - integrity sha512-pmf7IlmvXdlEXvE/JWNNJpEvwBV59wtJqA8MLAxMKLXNKVRC3HZBXR/SlZLPWTCcwOSg9IM7GeRSV3SIerGVqw== +"@typescript-eslint/typescript-estree@2.27.0": + version "2.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8" + integrity sha512-t2miCCJIb/FU8yArjAvxllxbTiyNqaXJag7UOpB5DVoM3+xnjeOngtqlJkLRnMtzaRcJhe3CIR9RmL40omubhg== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -1305,150 +1336,149 @@ semver "^6.3.0" tsutils "^3.17.1" -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== dependencies: - "@webassemblyjs/wast-printer" "1.8.5" + "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" + "@webassemblyjs/ast" "1.9.0" -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -1466,6 +1496,11 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn-globals@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" @@ -1599,11 +1634,19 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.1.1: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1709,7 +1752,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -asn1js@^2.0.22, asn1js@^2.0.26: +asn1js@^2.0.26: version "2.0.26" resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.0.26.tgz#0a6d435000f556a96c6012969d9704d981b71251" integrity sha512-yG89F0j9B4B0MKIcFyWWxnpZPLaNTjCj4tkE3fjbAoo0qmpGw0PYYqSbX/4ebnd9Icn8ZgK4K1fvDyEtW1JYtQ== @@ -1767,17 +1810,17 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.0.0: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + version "9.7.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4" + integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" + browserslist "^4.11.1" + caniuse-lite "^1.0.30001039" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.27" + postcss-value-parser "^4.0.3" aws-sign2@~0.7.0: version "0.7.0" @@ -1924,9 +1967,9 @@ bluebird@^3.5.0, bluebird@^3.5.5: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== blueimp-canvas-to-blob@^3.5.0: - version "3.17.0" - resolved "https://registry.yarnpkg.com/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.17.0.tgz#d796e72aa1fd37f9471e0396e64d323956564a23" - integrity sha512-LcuVZZtKtE4yUrLb0IQA7ndMm19gooDTrzvjjkvmQ1MhkFlSzTw+8Ftp+/ckfGeP2UDQvDsPyy8mIT69itAqbg== + version "3.18.0" + resolved "https://registry.yarnpkg.com/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.18.0.tgz#15f67cd1469f0be4d90c4619a0499a76bb835f79" + integrity sha512-AkYW5KQ0kTMrmcXvSVi+2TsWDXVZwrJM3g4o7r2z6OA3IlMhlAnoBNWI1ow45jfRr/co7tNch4OdNyb3WU3Pxw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -2055,14 +2098,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.9.1.tgz#01ffb9ca31a1aef7678128fc6a2253316aa7287c" - integrity sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw== +browserslist@^4.11.1, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" + integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== dependencies: - caniuse-lite "^1.0.30001030" - electron-to-chromium "^1.3.363" - node-releases "^1.1.50" + caniuse-lite "^1.0.30001038" + electron-to-chromium "^1.3.390" + node-releases "^1.1.53" + pkg-up "^2.0.0" bs58@^4.0.1: version "4.0.1" @@ -2134,9 +2178,9 @@ builtin-status-codes@^3.0.0: integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= cacache@^12.0.0, cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -2217,10 +2261,10 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001030: - version "1.0.30001033" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001033.tgz#60c328fb56860de60f9a2cb419c31fb80587cba0" - integrity sha512-8Ibzxee6ibc5q88cM1usPsMpJOG5CTq0s/dKOmlekPbDGKt+UrnOOTPSjQz3kVo6yL7N4SB5xd+FGLHQmbzh6A== +caniuse-lite@^1.0.30001038, caniuse-lite@^1.0.30001039: + version "1.0.30001039" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" + integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== capture-exit@^2.0.0: version "2.0.0" @@ -2290,7 +2334,7 @@ cheerio@^1.0.0-rc.3: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^2.0.2, chokidar@^2.1.8: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2509,6 +2553,11 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2698,9 +2747,9 @@ cssstyle@^1.0.0: cssom "0.3.x" csstype@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098" - integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q== + version "2.6.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" + integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== currently-unhandled@^0.4.1: version "0.4.1" @@ -2754,7 +2803,7 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.1.0: +debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -2830,6 +2879,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -2843,6 +2897,11 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -3025,10 +3084,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.363: - version "1.3.375" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.375.tgz#e290d59d316024e5499057944c10d05c518b7a24" - integrity sha512-zmaFnYVBtfpF8bGRYxgPeVAlXB7N3On8rjBE2ROc6wOpTPpzRWaiHo6KkbJMvlH07CH33uks/TEb6kuMMn8q6A== +electron-to-chromium@^1.3.390: + version "1.3.398" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.398.tgz#4c01e29091bf39e578ac3f66c1f157d92fa5725d" + integrity sha512-BJjxuWLKFbM5axH3vES7HKMQgAknq9PZHBkMK/rEXUQG9i1Iw5R+6hGkm6GtsQSANjSUrh/a6m32nzCNDNo/+w== elliptic@^6.0.0: version "6.5.2" @@ -3197,10 +3256,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" @@ -3297,9 +3356,9 @@ eslint-plugin-jest@^23.0.4: "@typescript-eslint/experimental-utils" "^2.5.0" eslint-plugin-react-hooks@^2.0.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.0.tgz#c50ab7ca5945ce6d1cf8248d9e185c80b54171b6" - integrity sha512-bzvdX47Jx847bgAYf0FPX3u1oxU+mKU8tqrpj4UX9A96SbAmj/HVEefEy6rJUog5u8QIlOPTKZcBpGn5kkKfAQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0" + integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== eslint-plugin-react@^7.7.0: version "7.19.0" @@ -3347,6 +3406,13 @@ eslint-utils@^1.3.1: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" + integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" @@ -3409,11 +3475,11 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" - integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" + integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== dependencies: - estraverse "^4.0.0" + estraverse "^5.0.0" esrecurse@^4.1.0: version "4.2.1" @@ -3422,11 +3488,16 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" + integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== + estree-walker@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" @@ -3437,7 +3508,7 @@ estree-walker@^0.6.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -3654,9 +3725,9 @@ fbjs@^0.8.4, fbjs@^0.8.9: ua-parser-js "^0.7.18" figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^2.0.0: version "2.0.0" @@ -3736,7 +3807,7 @@ find-up@4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -3770,9 +3841,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flow-parser@^0.57.3: version "0.57.3" @@ -3802,9 +3873,9 @@ focus-lock@^0.6.6: integrity sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw== focus-visible@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.0.2.tgz#4fae9cf40458b73c10701c9774c462e3ccd53caf" - integrity sha512-zT2fj/bmOgEBjqGbURGlowTmCwsIs3bRDMr/sFZz8Ly7VkEiwuCn9swNTL3pPuf8Oua2de7CLuKdnuNajWdDsQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.1.0.tgz#4b9d40143b865f53eafbd93ca66672b3bf9e7b6a" + integrity sha512-nPer0rjtzdZ7csVIu233P2cUm/ks/4aVSI+5KUkYrYpgA7ujgC3p6J7FtFU+AIMWwnwYQOB/yeiOITxFeYIXiw== for-in@^1.0.2: version "1.0.2" @@ -3845,6 +3916,13 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -3866,9 +3944,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== dependencies: bindings "^1.5.0" nan "^2.12.1" @@ -3907,6 +3985,20 @@ fuse.js@^2.2.0: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-2.7.4.tgz#96e420fde7ef011ac49c258a621314fe576536f9" integrity sha1-luQg/efvARrEnCWKYhMU/ldlNvk= +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -3960,9 +4052,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -4060,11 +4152,11 @@ globjoin@^0.1.4: integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= gonzales-pe@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2" - integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== dependencies: - minimist "1.1.x" + minimist "^1.2.5" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.2.3" @@ -4104,6 +4196,11 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -4218,9 +4315,9 @@ html-entities@^1.2.1: integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-tags@^2.0.0: version "2.0.0" @@ -4291,7 +4388,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4308,6 +4405,13 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -5350,12 +5454,12 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsprim@^1.2.2: version "1.4.1" @@ -5547,7 +5651,7 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.mergewith@^4.6.1: +lodash.mergewith@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== @@ -5640,11 +5744,6 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -5691,7 +5790,7 @@ mathml-tag-names@^2.0.1: "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "5.2.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/934ed37fdc90948273d7da3ec9f8728195c78a63" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/84637c6ebd442346623bce562b441e1093d40270" dependencies: "@babel/runtime" "^7.8.3" another-json "^0.2.0" @@ -5866,25 +5965,30 @@ minimist-options@^3.0.1: arrify "^1.0.1" is-plain-obj "^1.1.0" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@1.1.x: - version "1.1.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" - integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= - minimist@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@^1.1.1, minimist@^1.2.0, "minimist@~ 1.2.0": - version "1.2.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.3.tgz#3db5c0765545ab8637be71f333a104a965a9ca3f" - integrity sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw== +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, "minimist@~ 1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" mississippi@^3.0.0: version "3.0.0" @@ -5910,12 +6014,12 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" moo@^0.5.0: version "0.5.1" @@ -5987,6 +6091,15 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" +needle@^2.2.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a" + integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" @@ -5998,9 +6111,9 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch-npm@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" - integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" + integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg== dependencies: encoding "^0.1.11" json-parse-better-errors "^1.0.0" @@ -6064,12 +6177,34 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.50: - version "1.1.51" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.51.tgz#70d0e054221343d2966006bfbd4d98622cc00bd0" - integrity sha512-1eQEs6HFYY1kMXQPOLzCf7HdjReErmvn85tZESMczdCNVWP3Y7URYLBAyYynuI7yef1zj4HN5q+oB2x67QU0lw== +node-pre-gyp@*: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== dependencies: - semver "^6.3.0" + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4.4.2" + +node-releases@^1.1.53: + version "1.1.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" + integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" @@ -6103,6 +6238,27 @@ normalize-selector@^0.2.0: resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6110,6 +6266,16 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -6259,6 +6425,11 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -6268,11 +6439,19 @@ os-locale@^3.0.0, os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -6303,9 +6482,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -6489,9 +6668,9 @@ performance-now@^2.1.0: integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picomatch@^2.0.4, picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^3.0.0: version "3.0.0" @@ -6517,6 +6696,13 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pluralizers@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/pluralizers/-/pluralizers-0.1.7.tgz#8d38dd0a1b660e739b10ab2eab10b684c9d50142" @@ -6643,7 +6829,7 @@ postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.2: +postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== @@ -6721,9 +6907,9 @@ promise@^7.0.3, promise@^7.1.1: asap "~2.0.3" prompts@^2.0.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.1.tgz#b63a9ce2809f106fa9ae1277c275b167af46ea05" - integrity sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== dependencies: kleur "^3.0.3" sisteransi "^1.0.4" @@ -6752,9 +6938,9 @@ prr@~1.0.1: integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -6808,10 +6994,10 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pvtsutils@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.0.9.tgz#0eb6106f27878ccaa55e7dfbf6bd2c75af461dee" - integrity sha512-/kDsuCKPqJuIzn37w6+iN+TiSrN+zrwPEd7FjT61oNbRvceGdsS94fMEWZ4/h6QZU5EZhBMiV+79IYedroP/Yw== +pvtsutils@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.0.10.tgz#157d0fcb853f570d32e0f8788179f3057eacdf38" + integrity sha512-8ZKQcxnZKTn+fpDh7wL4yKax5fdl3UJzT8Jv49djZpB/dzPxacyN1Sez90b6YLdOmvIr9vaySJ5gw4aUA1EdSw== dependencies: tslib "^1.10.0" @@ -6846,9 +7032,9 @@ qrcode@^1.4.4: yargs "^13.2.4" qs@^6.5.2, qs@^6.6.0: - version "6.9.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" - integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== + version "6.9.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== qs@~6.5.2: version "6.5.2" @@ -6910,7 +7096,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@1.2.8, rc@^1.2.8: +rc@1.2.8, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6951,14 +7137,14 @@ react-clientside-effect@^1.2.2: "@babel/runtime" "^7.0.0" react-dom@^16.9.0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.0.tgz#cdde54b48eb9e8a0ca1b3dc9943d9bb409b81866" - integrity sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg== + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.19.0" + scheduler "^0.19.1" react-focus-lock@^2.2.1: version "2.2.1" @@ -6973,9 +7159,9 @@ react-focus-lock@^2.2.1: use-sidecar "^1.0.1" react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527" - integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA== + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-lifecycles-compat@^3.0.0: version "3.0.4" @@ -7005,14 +7191,14 @@ react-redux@^5.0.6: react-lifecycles-compat "^3.0.0" react-test-renderer@^16.0.0-0, react-test-renderer@^16.9.0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.0.tgz#39ba3bf72cedc8210c3f81983f0bb061b14a3014" - integrity sha512-NQ2S9gdMUa7rgPGpKGyMcwl1d6D9MCF0lftdI3kts6kkiX+qvpC955jNjAZXlIDTjnN9jwFI8A8XhRh/9v0spA== + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1" + integrity sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ== dependencies: object-assign "^4.1.1" prop-types "^15.6.2" react-is "^16.8.6" - scheduler "^0.19.0" + scheduler "^0.19.1" react-transition-group@^1.2.0: version "1.2.1" @@ -7026,9 +7212,9 @@ react-transition-group@^1.2.0: warning "^3.0.0" react@^16.9.0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" - integrity sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ== + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -7068,7 +7254,7 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7141,10 +7327,10 @@ reflect.ownkeys@^0.2.0: resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: regenerate "^1.4.0" @@ -7159,14 +7345,14 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz#e96bf612a3362d12bb69f7e8f74ffeab25c7ac91" - integrity sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g== + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== regenerator-transform@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.2.tgz#949d9d87468ff88d5a7e4734ebb994a892de1ff2" - integrity sha512-V4+lGplCM/ikqi5/mkkpJ06e9Bujq1NFmNLvsCs56zg3ZbzrnUzAtizZ24TXxtRX/W2jcdScwQCnbL0CICTFkQ== + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== dependencies: "@babel/runtime" "^7.8.4" private "^0.1.8" @@ -7192,17 +7378,17 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" + unicode-match-property-value-ecmascript "^1.2.0" registry-auth-token@4.0.0: version "4.0.0" @@ -7212,12 +7398,12 @@ registry-auth-token@4.0.0: rc "^1.2.8" safe-buffer "^5.0.1" -regjsgen@^0.5.0: +regjsgen@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== -regjsparser@^0.6.0: +regjsparser@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== @@ -7428,7 +7614,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -7489,9 +7675,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.4.0, rxjs@^6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== dependencies: tslib "^1.9.0" @@ -7533,9 +7719,9 @@ sane@^4.0.3: walker "~1.0.5" sanitize-html@^1.18.4: - version "1.22.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.22.0.tgz#9df779c53cf5755adb2322943c21c1c1dffca7bf" - integrity sha512-3RPo65mbTKpOAdAYWU496MSty1YbB3Y5bjwL5OclgaSSMtv65xvM7RW/EHRumzaZ1UddEJowCbSdK0xl5sAu0A== + version "1.22.1" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.22.1.tgz#5b36c92ab27917ddd2775396815c2bc1a6268310" + integrity sha512-++IMC00KfMQc45UWZJlhWOlS9eMrME38sFG9GXfR+k6oBo9JXSYQgTOZCl9j3v/smFTRNT9XNwz5DseFdMY+2Q== dependencies: chalk "^2.4.1" htmlparser2 "^4.1.0" @@ -7543,7 +7729,7 @@ sanitize-html@^1.18.4: lodash.escaperegexp "^4.1.2" lodash.isplainobject "^4.0.6" lodash.isstring "^4.0.1" - lodash.mergewith "^4.6.1" + lodash.mergewith "^4.6.2" postcss "^7.0.27" srcset "^2.0.1" xtend "^4.0.1" @@ -7553,10 +7739,10 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.0.tgz#a715d56302de403df742f4a9be11975b32f5698d" - integrity sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA== +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -7590,7 +7776,7 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== -set-blocking@^2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -7644,14 +7830,14 @@ side-channel@^1.0.2: object-inspect "^1.7.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== sisteransi@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^2.0.0: version "2.0.0" @@ -7926,7 +8112,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -7969,21 +8155,39 @@ string.prototype.trim@^1.2.1: es-abstract "^1.17.0-next.1" function-bind "^1.1.1" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373" + integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2" + integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -8068,9 +8272,9 @@ stylelint-config-standard@^18.2.0: stylelint-config-recommended "^2.2.0" stylelint-scss@^3.9.0: - version "3.14.2" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.14.2.tgz#e449a47e0ac410e6909f1a71b49550202c978bf9" - integrity sha512-59/BkIEWyFoORiejDIQB2P2kmg0KcqMn7wtj1y5sRvS4N+Qh+Ng3hbKelOzgS+OM2Ezbai0uEev8xckXxkh9TQ== + version "3.16.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.16.0.tgz#6928fe57bcfc924110d09847c1f720472a9b7bd6" + integrity sha512-dAWs/gagdPYO3VDdvgRv5drRBMcWI4E//z3AXPAY1qYkSdXCEVJtEW+R9JtinG0U2rcJIu5XWaVddPQeaaufzw== dependencies: lodash "^4.17.15" postcss-media-query-parser "^0.2.3" @@ -8189,6 +8393,19 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tar@^4.4.2: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + terser-webpack-plugin@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" @@ -8205,9 +8422,9 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser@^4.1.2, terser@^4.6.2: - version "4.6.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" - integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== + version "4.6.10" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2" + integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -8465,15 +8682,15 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== unified@^7.0.0: version "7.1.0" @@ -8697,9 +8914,9 @@ vfile-location@^2.0.0: integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== vfile-message@*: - version "2.0.3" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.3.tgz#0dd4f6879fb240a8099b22bd3755536c92e59ba5" - integrity sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^2.0.0" @@ -8755,21 +8972,24 @@ warning@^3.0.0: loose-envify "^1.0.0" watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + version "1.6.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" + integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== dependencies: - chokidar "^2.0.2" + chokidar "^2.1.8" graceful-fs "^4.1.2" neo-async "^2.5.0" -webcrypto-core@^1.0.17: - version "1.0.17" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.0.17.tgz#a9354bc0b1ba6735e882f4137ede2c4366e6ad9b" - integrity sha512-7jxTLgtM+TahBPErx/Dd2XvxFDfWJrHxjVeTSvIa4LSgiYrmCPlC2INiAMAfb8MbtHiwJKKqF5sPS0AWNjBbXw== +webcrypto-core@^1.0.19-next.0: + version "1.0.19" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.0.19.tgz#521a0b082afecd914b8e968efb5dc381b8416c6f" + integrity sha512-6XHExtfMJrpkFDh9MiJ/y7ptX0dfZi0ogxFyelqxMu1eFowxivHfIp6DKzT+ZjU66xTuNfJkfkUk1bIB3tEOgA== dependencies: - pvtsutils "^1.0.9" - tslib "^1.10.0" + "@peculiar/asn1-schema" "^1.0.5" + "@peculiar/json-schema" "^1.1.10" + asn1js "^2.0.26" + pvtsutils "^1.0.10" + tslib "^1.11.1" webidl-conversions@^4.0.2: version "4.0.2" @@ -8802,14 +9022,14 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-map "~0.6.1" webpack@^4.20.2: - version "4.42.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" - integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + version "4.42.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" + integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" acorn "^6.2.1" ajv "^6.10.2" ajv-keywords "^3.4.1" @@ -8821,7 +9041,7 @@ webpack@^4.20.2: loader-utils "^1.2.3" memory-fs "^0.4.1" micromatch "^3.1.10" - mkdirp "^0.5.1" + mkdirp "^0.5.3" neo-async "^2.6.1" node-libs-browser "^2.2.1" schema-utils "^1.0.0" @@ -8908,6 +9128,13 @@ which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -8992,7 +9219,7 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -9012,10 +9239,10 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.0, yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.1.0, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -9056,9 +9283,9 @@ yargs@^12.0.5: yargs-parser "^11.1.1" yargs@^13.2.4, yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" @@ -9069,7 +9296,7 @@ yargs@^13.2.4, yargs@^13.3.0: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^13.1.2" zxcvbn@^4.4.2: version "4.4.2" From b5aaae1c27f0ce43b49c0611c8d3ec3f0a9905ad Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 8 Apr 2020 12:58:52 -0600 Subject: [PATCH 146/230] Fix encoding of widget arguments Fixes https://github.com/vector-im/riot-web/issues/12985 This is done by using a more modern API and de-encoding dollar signs. --- src/components/views/elements/AppTile.js | 29 ++++++++++++------------ 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index c49510b8b6..678384add0 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -136,22 +136,21 @@ export default class AppTile extends React.Component { * If url can not be parsed, it is returned unmodified. */ _addWurlParams(urlString) { - const u = url.parse(urlString); - if (!u) { - console.error("_addWurlParams", "Invalid URL", urlString); - return url; + try { + const parsed = new URL(urlString); + + // TODO: Replace these with proper widget params + // See https://github.com/matrix-org/matrix-doc/pull/1958/files#r405714833 + parsed.searchParams.set('widgetId', this.props.app.id); + parsed.searchParams.set('parentUrl', window.location.href.split('#', 2)[0]); + + // Replace the encoded dollar signs back to dollar signs. They have no special meaning + // in HTTP, but URL parsers encode them anyways. + return parsed.toString().replace(/%24/g, '$'); + } catch (e) { + console.error("Failed to add widget URL params:", e); + return urlString; } - - const params = qs.parse(u.query); - // Append widget ID to query parameters - params.widgetId = this.props.app.id; - // Append current / parent URL, minus the hash because that will change when - // we view a different room (ie. may change for persistent widgets) - params.parentUrl = window.location.href.split('#', 2)[0]; - u.search = undefined; - u.query = params; - - return u.format(); } isMixedContent() { From 68608c2bcb52a53e2441e0c07d9f9316d2beb209 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Apr 2020 21:42:12 +0100 Subject: [PATCH 147/230] Fix gen-i18n.js script for .ts files Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- scripts/gen-i18n.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gen-i18n.js b/scripts/gen-i18n.js index a4d53aea2f..a1823cdf50 100755 --- a/scripts/gen-i18n.js +++ b/scripts/gen-i18n.js @@ -237,7 +237,7 @@ const walkOpts = { const fullPath = path.join(root, fileStats.name); let trs; - if (fileStats.name.endsWith('.js') || fileStats.name.endsWith('.tsx')) { + if (fileStats.name.endsWith('.js') || fileStats.name.endsWith('.ts') || fileStats.name.endsWith('.tsx')) { trs = getTranslationsJs(fullPath); } else if (fileStats.name.endsWith('.html')) { trs = getTranslationsOther(fullPath); From cef9dbe254321cb93884e1e168b55850e7d140f7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 8 Apr 2020 21:42:58 +0100 Subject: [PATCH 148/230] Analytics.js gets executed during times where localStorage is not ensured to exist Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/Analytics.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Analytics.js b/src/Analytics.js index c96cfdefee..e55612c4f1 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -123,8 +123,8 @@ const LAST_VISIT_TS_KEY = "mx_Riot_Analytics_lvts"; function getUid() { try { - let data = localStorage.getItem(UID_KEY); - if (!data) { + let data = localStorage && localStorage.getItem(UID_KEY); + if (!data && localStorage) { localStorage.setItem(UID_KEY, data = [...Array(16)].map(() => Math.random().toString(16)[2]).join('')); } return data; @@ -145,14 +145,16 @@ class Analytics { this.firstPage = true; this._heartbeatIntervalID = null; - this.creationTs = localStorage.getItem(CREATION_TS_KEY); - if (!this.creationTs) { + this.creationTs = localStorage && localStorage.getItem(CREATION_TS_KEY); + if (!this.creationTs && localStorage) { localStorage.setItem(CREATION_TS_KEY, this.creationTs = new Date().getTime()); } - this.lastVisitTs = localStorage.getItem(LAST_VISIT_TS_KEY); - this.visitCount = localStorage.getItem(VISIT_COUNT_KEY) || 0; - localStorage.setItem(VISIT_COUNT_KEY, parseInt(this.visitCount, 10) + 1); + this.lastVisitTs = localStorage && localStorage.getItem(LAST_VISIT_TS_KEY); + this.visitCount = localStorage && localStorage.getItem(VISIT_COUNT_KEY) || 0; + if (localStorage) { + localStorage.setItem(VISIT_COUNT_KEY, parseInt(this.visitCount, 10) + 1); + } } get disabled() { From 291fae649328a3493d475c844a4954ec55a36087 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 9 Apr 2020 13:43:30 +0200 Subject: [PATCH 149/230] update room trust when cross-signing gets en/disabled --- src/components/structures/RoomView.js | 9 +++++++++ src/components/views/rooms/RoomTile.js | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 4a3666fc38..c68b10d33f 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -182,6 +182,7 @@ export default createReactClass({ this.context.on("crypto.keyBackupStatus", this.onKeyBackupStatus); this.context.on("deviceVerificationChanged", this.onDeviceVerificationChanged); this.context.on("userTrustStatusChanged", this.onUserVerificationChanged); + this.context.on("crossSigning.keysChanged", this.onCrossSigningKeysChanged); // Start listening for RoomViewStore updates this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate); this._rightPanelStoreToken = RightPanelStore.getSharedInstance().addListener(this._onRightPanelStoreUpdate); @@ -504,6 +505,7 @@ export default createReactClass({ this.context.removeListener("crypto.keyBackupStatus", this.onKeyBackupStatus); this.context.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); this.context.removeListener("userTrustStatusChanged", this.onUserVerificationChanged); + this.context.removeListener("crossSigning.keysChanged", this.onCrossSigningKeysChanged); } window.removeEventListener('beforeunload', this.onPageUnload); @@ -805,6 +807,13 @@ export default createReactClass({ this._updateE2EStatus(room); }, + onCrossSigningKeysChanged: function() { + const room = this.state.room; + if (room) { + this._updateE2EStatus(room); + } + }, + _updateE2EStatus: async function(room) { if (!this.context.isRoomEncrypted(room.roomId)) { return; diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 0b06be48af..d264b087a0 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -130,6 +130,10 @@ export default createReactClass({ this._updateE2eStatus(); }, + onCrossSigningKeysChanged: function() { + this._updateE2eStatus(); + }, + onRoomTimeline: function(ev, room) { if (!room) return; if (room.roomId != this.props.room.roomId) return; @@ -142,7 +146,7 @@ export default createReactClass({ const cli = MatrixClientPeg.get(); cli.on("RoomState.members", this.onRoomStateMember); cli.on("userTrustStatusChanged", this.onUserVerificationChanged); - + cli.on("crossSigning.keysChanged", this.onCrossSigningKeysChanged); this._updateE2eStatus(); }, @@ -267,6 +271,7 @@ export default createReactClass({ cli.removeListener("RoomState.events", this.onJoinRule); cli.removeListener("RoomState.members", this.onRoomStateMember); cli.removeListener("userTrustStatusChanged", this.onUserVerificationChanged); + cli.removeListener("crossSigning.keysChanged", this.onCrossSigningKeysChanged); cli.removeListener("Room.timeline", this.onRoomTimeline); } ActiveRoomObserver.removeListener(this.props.room.roomId, this._onActiveRoomChange); From 282577cefb9560dc9104747d75066beeb9aba60c Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 9 Apr 2020 13:43:51 +0200 Subject: [PATCH 150/230] recalculate toasts when cross-signing gets en/disabled --- src/DeviceListener.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index 80ea693a38..21c844e11c 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -50,6 +50,7 @@ export default class DeviceListener { MatrixClientPeg.get().on('crypto.devicesUpdated', this._onDevicesUpdated); MatrixClientPeg.get().on('deviceVerificationChanged', this._onDeviceVerificationChanged); MatrixClientPeg.get().on('userTrustStatusChanged', this._onUserTrustStatusChanged); + MatrixClientPeg.get().on('crossSigning.keysChanged', this._onCrossSingingKeysChanged); MatrixClientPeg.get().on('accountData', this._onAccountData); this._recheck(); } @@ -59,6 +60,7 @@ export default class DeviceListener { MatrixClientPeg.get().removeListener('crypto.devicesUpdated', this._onDevicesUpdated); MatrixClientPeg.get().removeListener('deviceVerificationChanged', this._onDeviceVerificationChanged); MatrixClientPeg.get().removeListener('userTrustStatusChanged', this._onUserTrustStatusChanged); + MatrixClientPeg.get().removeListener('crossSigning.keysChanged', this._onCrossSingingKeysChanged); MatrixClientPeg.get().removeListener('accountData', this._onAccountData); } this._dismissed.clear(); @@ -89,6 +91,10 @@ export default class DeviceListener { this._recheck(); } + _onCrossSingingKeysChanged = () => { + this._recheck(); + } + _onAccountData = (ev) => { // User may have: // * migrated SSSS to symmetric From 60808ef6d24e00bbe58650ff406ca9bd6fea4138 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 9 Apr 2020 13:36:53 +0100 Subject: [PATCH 151/230] apply clear:both to fix automatic margins for continuation events Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/rooms/_EventTile.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index b26312cebf..e015f30e48 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -111,6 +111,7 @@ limitations under the License. } .mx_EventTile_line, .mx_EventTile_reply { + clear: both; position: relative; padding-left: 65px; /* left gutter */ padding-top: 4px; From b6ef30af8f286576f17773bce13c333bcb8baab2 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 9 Apr 2020 13:40:46 +0100 Subject: [PATCH 152/230] Retry the request for the master key from SSSS on login If this failed we assumed it didn't exist which would erroneously prompt people to upgrade encryption. --- src/components/structures/MatrixChat.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 7d3b7dd0d9..da416142f8 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1907,13 +1907,19 @@ export default createReactClass({ } // Test for the master cross-signing key in SSSS as a quick proxy for - // whether cross-signing has been set up on the account. - let masterKeyInStorage = false; - try { - masterKeyInStorage = !!await cli.getAccountDataFromServer("m.cross_signing.master"); - } catch (e) { - if (e.errcode !== "M_NOT_FOUND") { - console.warn("Secret storage account data check failed", e); + // whether cross-signing has been set up on the account. We can't + // really continue until we know whether it's there or not so retry + // if this fails. + let masterKeyInStorage; + while (masterKeyInStorage === undefined) { + try { + masterKeyInStorage = !!await cli.getAccountDataFromServer("m.cross_signing.master"); + } catch (e) { + if (e.errcode === "M_NOT_FOUND") { + masterKeyInStorage = false; + } else { + console.warn("Secret storage account data check failed: retrying...", e); + } } } From 53b753789a925c2e6f875bd3f5081bd680c04c66 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 9 Apr 2020 16:04:14 +0100 Subject: [PATCH 153/230] Fix logging for failed searches error is an object so appending it to a string is not helpful --- src/components/structures/RoomView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 4a3666fc38..7d4cc6faa2 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -1203,7 +1203,7 @@ export default createReactClass({ }); }, function(error) { const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - console.error("Search failed: " + error); + console.error("Search failed", error); Modal.createTrackedDialog('Search failed', '', ErrorDialog, { title: _t("Search failed"), description: ((error && error.message) ? error.message : _t("Server may be unavailable, overloaded, or search timed out :(")), From e1a496f231619c7c2dde03f6b5be35cb9e89e4c2 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 9 Apr 2020 17:30:10 +0100 Subject: [PATCH 154/230] Pass along key backup for bootstrap If we ask for the key backup key early in creating secret storage to ensure we trust the backup, then we stash it to ensure it's available to bootstrap as well without prompting again. Fixes https://github.com/vector-im/riot-web/issues/12958 --- src/CrossSigningManager.js | 2 +- .../CreateSecretStorageDialog.js | 23 ++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 1bcf1ba706..07ec776bd1 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -185,7 +185,7 @@ export async function promptForBackupPassphrase() { const RestoreKeyBackupDialog = sdk.getComponent('dialogs.keybackup.RestoreKeyBackupDialog'); const { finished } = Modal.createTrackedDialog('Restore Backup', '', RestoreKeyBackupDialog, { - showSummary: false, keyCallback: k => key = k, + showSummary: false, keyCallback: k => key = k, }, null, /* priority = */ false, /* static = */ true); const success = await finished; diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 01a2856df0..d63db617d5 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -70,6 +70,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { this._recoveryKey = null; this._recoveryKeyNode = null; this._setZxcvbnResultTimeout = null; + this._backupKey = null; this.state = { phase: PHASE_LOADING, @@ -243,7 +244,15 @@ export default class CreateSecretStorageDialog extends React.PureComponent { createSecretStorageKey: async () => this._recoveryKey, keyBackupInfo: this.state.backupInfo, setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, - getKeyBackupPassphrase: promptForBackupPassphrase, + getKeyBackupPassphrase: () => { + // We may already have the backup key if we earlier went + // through the restore backup path, so pass it along + // rather than prompting again. + if (this._backupKey) { + return this._backupKey; + } + return promptForBackupPassphrase(); + }, }); } this.setState({ @@ -272,10 +281,18 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } _restoreBackup = async () => { + // It's possible we'll need the backup key later on for bootstrapping, + // so let's stash it here, rather than prompting for it twice. + const keyCallback = k => this._backupKey = k; + const RestoreKeyBackupDialog = sdk.getComponent('dialogs.keybackup.RestoreKeyBackupDialog'); const { finished } = Modal.createTrackedDialog( - 'Restore Backup', '', RestoreKeyBackupDialog, {showSummary: false}, null, - /* priority = */ false, /* static = */ false, + 'Restore Backup', '', RestoreKeyBackupDialog, + { + showSummary: false, + keyCallback, + }, + null, /* priority = */ false, /* static = */ false, ); await finished; From db3c7a8f1ca9f81df00c1ccae796516d535b21f5 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 9 Apr 2020 14:31:46 -0600 Subject: [PATCH 155/230] Obliterate widgets when they are minimized Fixes https://github.com/vector-im/riot-web/issues/12810 We do this to all widgets as we can't guarantee what sorts of other widgets might need similar treatment. --- src/components/views/elements/AppTile.js | 47 +++++++++++++++++------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 678384add0..73ed605edd 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -269,7 +269,9 @@ export default class AppTile extends React.Component { if (this.props.show && this.state.hasPermissionToLoad) { this.setScalarToken(); } - } else if (nextProps.show && !this.props.show) { + } + + if (nextProps.show && !this.props.show) { // We assume that persisted widgets are loaded and don't need a spinner. if (this.props.waitForIframeLoad && !PersistedElement.isMounted(this._persistKey)) { this.setState({ @@ -280,7 +282,9 @@ export default class AppTile extends React.Component { if (this.state.hasPermissionToLoad) { this.setScalarToken(); } - } else if (nextProps.widgetPageTitle !== this.props.widgetPageTitle) { + } + + if (nextProps.widgetPageTitle !== this.props.widgetPageTitle) { this.setState({ widgetPageTitle: nextProps.widgetPageTitle, }); @@ -332,6 +336,28 @@ export default class AppTile extends React.Component { }); } + /** + * Ends all widget interaction, such as cancelling calls and disabling webcams. + * @private + */ + _endWidgetActions() { + // HACK: This is a really dirty way to ensure that Jitsi cleans up + // its hold on the webcam. Without this, the widget holds a media + // stream open, even after death. See https://github.com/vector-im/riot-web/issues/7351 + if (this._appFrame.current) { + // In practice we could just do `+= ''` to trick the browser + // into thinking the URL changed, however I can foresee this + // being optimized out by a browser. Instead, we'll just point + // the iframe at a page that is reasonably safe to use in the + // event the iframe doesn't wink away. + // This is relative to where the Riot instance is located. + this._appFrame.current.src = 'about:blank'; + } + + // Delete the widget from the persisted store for good measure. + PersistedElement.destroyElement(this._persistKey); + } + /* If user has permission to modify widgets, delete the widget, * otherwise revoke access for the widget to load in the user's browser */ @@ -353,18 +379,7 @@ export default class AppTile extends React.Component { } this.setState({deleting: true}); - // HACK: This is a really dirty way to ensure that Jitsi cleans up - // its hold on the webcam. Without this, the widget holds a media - // stream open, even after death. See https://github.com/vector-im/riot-web/issues/7351 - if (this._appFrame.current) { - // In practice we could just do `+= ''` to trick the browser - // into thinking the URL changed, however I can foresee this - // being optimized out by a browser. Instead, we'll just point - // the iframe at a page that is reasonably safe to use in the - // event the iframe doesn't wink away. - // This is relative to where the Riot instance is located. - this._appFrame.current.src = 'about:blank'; - } + this._endWidgetActions(); WidgetUtils.setRoomWidget( this.props.room.roomId, @@ -529,6 +544,10 @@ export default class AppTile extends React.Component { if (this.props.userWidget) { this._onMinimiseClick(); } else { + if (this.props.show) { + // if we were being shown, end the widget as we're about to be minimized. + this._endWidgetActions(); + } dis.dispatch({ action: 'appsDrawer', show: !this.props.show, From 3dc03ba0896969c54f1cc7c768b3a2f3304defe9 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 9 Apr 2020 14:40:23 -0600 Subject: [PATCH 156/230] Pass widget data through from sticker picker This allows for sticker pickers to have custom template variables. Fixes https://github.com/vector-im/riot-web/issues/6716 --- src/components/views/rooms/Stickerpicker.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index 3af9ff4f65..67537c4cee 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -246,6 +246,7 @@ export default class Stickerpicker extends React.Component { url: stickerpickerWidget.content.url, name: stickerpickerWidget.content.name, type: stickerpickerWidget.content.type, + data: stickerpickerWidget.content.data, }; stickersContent = ( From 34be024b21c2c52a2c77c74b084e8752e8c66d4d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 9 Apr 2020 14:47:20 -0600 Subject: [PATCH 157/230] Minimize widgets by default Fixes https://github.com/vector-im/riot-web/issues/12921 --- src/components/structures/RoomView.js | 11 +++-------- src/components/views/rooms/AppsDrawer.js | 6 ++++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 90bf3a5a99..78bd34bf7f 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -49,7 +49,6 @@ import RoomViewStore from '../../stores/RoomViewStore'; import RoomScrollStateStore from '../../stores/RoomScrollStateStore'; import WidgetEchoStore from '../../stores/WidgetEchoStore'; import SettingsStore, {SettingLevel} from "../../settings/SettingsStore"; -import WidgetUtils from '../../utils/WidgetUtils'; import AccessibleButton from "../views/elements/AccessibleButton"; import RightPanelStore from "../../stores/RightPanelStore"; import {haveTileForEvent} from "../views/rooms/EventTile"; @@ -406,13 +405,9 @@ export default createReactClass({ const hideWidgetDrawer = localStorage.getItem( room.roomId + "_hide_widget_drawer"); - if (hideWidgetDrawer === "true") { - return false; - } - - const widgets = WidgetEchoStore.getEchoedRoomWidgets(room.roomId, WidgetUtils.getRoomWidgets(room)); - - return widgets.length > 0 || WidgetEchoStore.roomHasPendingWidgets(room.roomId, WidgetUtils.getRoomWidgets(room)); + // This is confusing, but it means to say that we default to the tray being + // hidden unless the user clicked to open it. + return hideWidgetDrawer === "false"; }, componentDidMount: function() { diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index f7c5e8122f..b64eb33435 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -81,12 +81,14 @@ export default createReactClass({ const hideWidgetKey = this.props.room.roomId + '_hide_widget_drawer'; switch (action.action) { case 'appsDrawer': + // Note: these booleans are awkward because localstorage is fundamentally + // string-based. We also do exact equality on the strings later on. if (action.show) { - localStorage.removeItem(hideWidgetKey); + localStorage.setItem(hideWidgetKey, "false"); } else { // Store hidden state of widget // Don't show if previously hidden - localStorage.setItem(hideWidgetKey, true); + localStorage.setItem(hideWidgetKey, "true"); } break; From b4b0c4c6dfd944346e7ea82bc607e2f83fcf228a Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 9 Apr 2020 15:14:07 -0600 Subject: [PATCH 158/230] Add comments to highlight where we'll need m.widget support For https://github.com/vector-im/riot-web/issues/13111 --- src/ScalarMessaging.js | 2 ++ src/TextForEvent.js | 1 + src/components/views/rooms/EventTile.js | 1 + .../views/settings/tabs/room/RolesRoomSettingsTab.js | 2 ++ src/stores/ActiveWidgetStore.js | 1 + src/utils/WidgetUtils.js | 7 +++++-- test/components/views/rooms/RoomSettings-test.js | 1 + 7 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 2211e513c3..ca8ca103e1 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -172,6 +172,7 @@ Request: Response: [ { + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) type: "im.vector.modular.widgets", state_key: "wid1", content: { @@ -190,6 +191,7 @@ Example: room_id: "!foo:bar", response: [ { + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) type: "im.vector.modular.widgets", state_key: "wid1", content: { diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 6b1c1dcd2d..3607d7a676 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -603,6 +603,7 @@ const stateHandlers = { 'm.room.guest_access': textForGuestAccessEvent, 'm.room.related_groups': textForRelatedGroupsEvent, + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) 'im.vector.modular.widgets': textForWidgetEvent, }; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index aed2d4b25b..75fbe5caa3 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -59,6 +59,7 @@ const stateEventTileTypes = { 'm.room.power_levels': 'messages.TextualEvent', 'm.room.pinned_events': 'messages.TextualEvent', 'm.room.server_acl': 'messages.TextualEvent', + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) 'im.vector.modular.widgets': 'messages.TextualEvent', 'm.room.tombstone': 'messages.TextualEvent', 'm.room.join_rules': 'messages.TextualEvent', diff --git a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js index a3a9cb78c5..b812bb6b68 100644 --- a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js +++ b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js @@ -33,6 +33,7 @@ const plEventsToLabels = { "m.room.tombstone": _td("Upgrade the room"), "m.room.encryption": _td("Enable room encryption"), + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) "im.vector.modular.widgets": _td("Modify widgets"), }; @@ -47,6 +48,7 @@ const plEventsToShow = { "m.room.tombstone": {isState: true}, "m.room.encryption": {isState: true}, + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) "im.vector.modular.widgets": {isState: true}, }; diff --git a/src/stores/ActiveWidgetStore.js b/src/stores/ActiveWidgetStore.js index 60ea3f9106..c6f8dc69b7 100644 --- a/src/stores/ActiveWidgetStore.js +++ b/src/stores/ActiveWidgetStore.js @@ -64,6 +64,7 @@ class ActiveWidgetStore extends EventEmitter { // Everything else relies on views listening for events and calling setters // on this class which is terrible. This store should just listen for events // and keep itself up to date. + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) if (ev.getType() !== 'im.vector.modular.widgets') return; if (ev.getStateKey() === this._persistentWidgetId) { diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js index 9fb6358c1f..6768119d8f 100644 --- a/src/utils/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -66,6 +66,7 @@ export default class WidgetUtils { return false; } + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) return room.currentState.maySendStateEvent('im.vector.modular.widgets', me); } @@ -180,6 +181,7 @@ export default class WidgetUtils { } const room = MatrixClientPeg.get().getRoom(roomId); + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) const startingWidgetEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); if (eventsInIntendedState(startingWidgetEvents)) { resolve(); @@ -189,6 +191,7 @@ export default class WidgetUtils { function onRoomStateEvents(ev) { if (ev.getRoomId() !== roomId) return; + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) const currentWidgetEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); if (eventsInIntendedState(currentWidgetEvents)) { @@ -268,8 +271,7 @@ export default class WidgetUtils { WidgetEchoStore.setRoomWidgetEcho(roomId, widgetId, content); const client = MatrixClientPeg.get(); - // TODO - Room widgets need to be moved to 'm.widget' state events - // https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) return client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).then(() => { return WidgetUtils.waitForRoomWidget(widgetId, roomId, addingWidget); }).finally(() => { @@ -283,6 +285,7 @@ export default class WidgetUtils { * @return {[object]} Array containing current / active room widgets */ static getRoomWidgets(room) { + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); if (!appsStateEvents) { return []; diff --git a/test/components/views/rooms/RoomSettings-test.js b/test/components/views/rooms/RoomSettings-test.js index 5e21f729d0..b3790b2507 100644 --- a/test/components/views/rooms/RoomSettings-test.js +++ b/test/components/views/rooms/RoomSettings-test.js @@ -177,6 +177,7 @@ describe.skip('RoomSettings', () => { 'm.room.history_visibility': 50, 'm.room.power_levels': 50, 'm.room.topic': 50, + // TODO: Enable support for m.widget event type (https://github.com/vector-im/riot-web/issues/13111) 'im.vector.modular.widgets': 50, }, }, From 879b4e15e56aa54e621c069282e19162e9631578 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 9 Apr 2020 16:18:12 -0600 Subject: [PATCH 159/230] Use singular text on 'delete sessions' button for SSO Missed in https://github.com/matrix-org/matrix-react-sdk/pull/4357 Not a release blocker at this time. --- src/components/views/settings/DevicesPanel.js | 2 +- src/i18n/strings/en_EN.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/DevicesPanel.js b/src/components/views/settings/DevicesPanel.js index e097ef9e47..fe4a4abfdc 100644 --- a/src/components/views/settings/DevicesPanel.js +++ b/src/components/views/settings/DevicesPanel.js @@ -139,7 +139,7 @@ export default class DevicesPanel extends React.Component { body: _t("Click the button below to confirm deleting these sessions.", { count: numDevices, }), - continueText: _t("Delete sessions"), + continueText: _t("Delete sessions", {count: numDevices}), continueKind: "danger", }, }; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 067d5d8eee..ae8ed90402 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -618,7 +618,8 @@ "Confirm deleting these sessions": "Confirm deleting these sessions", "Click the button below to confirm deleting these sessions.|other": "Click the button below to confirm deleting these sessions.", "Click the button below to confirm deleting these sessions.|one": "Click the button below to confirm deleting this session.", - "Delete sessions": "Delete sessions", + "Delete sessions|other": "Delete sessions", + "Delete sessions|one": "Delete session", "Authentication": "Authentication", "Delete %(count)s sessions|other": "Delete %(count)s sessions", "Delete %(count)s sessions|one": "Delete %(count)s session", From 740b6f6cac91d3beff5658b1411b33311e68e947 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 10 Apr 2020 09:30:19 +0100 Subject: [PATCH 160/230] Composer pills respect showPillAvatar setting Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/rooms/_BasicMessageComposer.scss | 42 ++++++++++--------- .../views/rooms/BasicMessageComposer.js | 28 +++++++++---- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/res/css/views/rooms/_BasicMessageComposer.scss b/res/css/views/rooms/_BasicMessageComposer.scss index cc76623a8c..e9013eb7b7 100644 --- a/res/css/views/rooms/_BasicMessageComposer.scss +++ b/res/css/views/rooms/_BasicMessageComposer.scss @@ -44,27 +44,29 @@ limitations under the License. outline: none; overflow-x: hidden; - span.mx_UserPill, span.mx_RoomPill { - padding-left: 21px; - position: relative; + &.mx_BasicMessageComposer_input_shouldShowPillAvatar { + span.mx_UserPill, span.mx_RoomPill { + padding-left: 21px; + position: relative; - // avatar psuedo element - &::before { - position: absolute; - left: 2px; - top: 2px; - content: var(--avatar-letter); - width: 16px; - height: 16px; - background: var(--avatar-background), $avatar-bg-color; - color: $avatar-initial-color; - background-repeat: no-repeat; - background-size: 16px; - border-radius: 8px; - text-align: center; - font-weight: normal; - line-height: $font-16px; - font-size: $font-10-4px; + // avatar psuedo element + &::before { + position: absolute; + left: 2px; + top: 2px; + content: var(--avatar-letter); + width: 16px; + height: 16px; + background: var(--avatar-background), $avatar-bg-color; + color: $avatar-initial-color; + background-repeat: no-repeat; + background-size: 16px; + border-radius: 8px; + text-align: center; + font-weight: normal; + line-height: $font-16px; + font-size: $font-10-4px; + } } } } diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index e3cffd59f8..880bc352de 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -84,6 +84,7 @@ export default class BasicMessageEditor extends React.Component { super(props); this.state = { autoComplete: null, + showPillAvatar: SettingsStore.getValue("Pill.shouldShowPillAvatar"), }; this._editorRef = null; this._autocompleteRef = null; @@ -92,6 +93,7 @@ export default class BasicMessageEditor extends React.Component { this._isIMEComposing = false; this._hasTextSelected = false; this._emoticonSettingHandle = null; + this._shouldShowPillAvatarSettingHandle = null; } componentDidUpdate(prevProps) { @@ -508,10 +510,15 @@ export default class BasicMessageEditor extends React.Component { this.setState({completionIndex}); } - _configureEmoticonAutoReplace() { + _configureEmoticonAutoReplace = () => { const shouldReplace = SettingsStore.getValue('MessageComposerInput.autoReplaceEmoji'); this.props.model.setTransformCallback(shouldReplace ? this._replaceEmoticon : null); - } + }; + + _configureShouldShowPillAvatar = () => { + const showPillAvatar = SettingsStore.getValue("Pill.shouldShowPillAvatar"); + this.setState({ showPillAvatar }); + }; componentWillUnmount() { document.removeEventListener("selectionchange", this._onSelectionChange); @@ -519,15 +526,17 @@ export default class BasicMessageEditor extends React.Component { this._editorRef.removeEventListener("compositionstart", this._onCompositionStart, true); this._editorRef.removeEventListener("compositionend", this._onCompositionEnd, true); SettingsStore.unwatchSetting(this._emoticonSettingHandle); + SettingsStore.unwatchSetting(this._shouldShowPillAvatarSettingHandle); } componentDidMount() { const model = this.props.model; model.setUpdateCallback(this._updateEditorState); - this._emoticonSettingHandle = SettingsStore.watchSetting('MessageComposerInput.autoReplaceEmoji', null, () => { - this._configureEmoticonAutoReplace(); - }); + this._emoticonSettingHandle = SettingsStore.watchSetting('MessageComposerInput.autoReplaceEmoji', null, + this._configureEmoticonAutoReplace); this._configureEmoticonAutoReplace(); + this._shouldShowPillAvatarSettingHandle = SettingsStore.watchSetting("Pill.shouldShowPillAvatar", null, + this._configureShouldShowPillAvatar); const partCreator = model.partCreator; // TODO: does this allow us to get rid of EditorStateTransfer? // not really, but we could not serialize the parts, and just change the autoCompleter @@ -605,9 +614,12 @@ export default class BasicMessageEditor extends React.Component { />
    ); } - const classes = classNames("mx_BasicMessageComposer", { + const wrapperClasses = classNames("mx_BasicMessageComposer", { "mx_BasicMessageComposer_input_error": this.state.showVisualBell, }); + const classes = classNames("mx_BasicMessageComposer_input", { + "mx_BasicMessageComposer_input_shouldShowPillAvatar": this.state.showPillAvatar, + }); const MessageComposerFormatBar = sdk.getComponent('rooms.MessageComposerFormatBar'); const shortcuts = { @@ -618,11 +630,11 @@ export default class BasicMessageEditor extends React.Component { const {completionIndex} = this.state; - return (
    + return (
    { autoComplete } this._formatBarRef = ref} onAction={this._onFormatAction} shortcuts={shortcuts} />
    Date: Fri, 10 Apr 2020 13:59:01 +0100 Subject: [PATCH 161/230] Only send typing notification when composing commands which send messages Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.tsx | 27 +++++++++++-------- .../views/rooms/BasicMessageComposer.js | 12 ++++++++- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index d60434cf97..aac42b6740 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -914,7 +914,7 @@ export const Commands = [ // Command definitions for autocompletion ONLY: // /me is special because its not handled by SlashCommands.js and is instead done inside the Composer classes new Command({ - command: 'me', + command: "me", args: '', description: _td('Displays action'), category: CommandCategories.messages, @@ -931,16 +931,7 @@ Commands.forEach(cmd => { }); }); - -/** - * Process the given text for /commands and return a bound method to perform them. - * @param {string} roomId The room in which the command was performed. - * @param {string} input The raw text input by the user. - * @return {null|function(): Object} Function returning an object with the property 'error' if there was an error - * processing the command, or 'promise' if a request was sent out. - * Returns null if the input didn't match a command. - */ -export function getCommand(roomId, input) { +export function parseCommandString(input) { // trim any trailing whitespace, as it can confuse the parser for // IRC-style commands input = input.replace(/\s+$/, ''); @@ -956,6 +947,20 @@ export function getCommand(roomId, input) { cmd = input; } + return {cmd, args}; +} + +/** + * Process the given text for /commands and return a bound method to perform them. + * @param {string} roomId The room in which the command was performed. + * @param {string} input The raw text input by the user. + * @return {null|function(): Object} Function returning an object with the property 'error' if there was an error + * processing the command, or 'promise' if a request was sent out. + * Returns null if the input didn't match a command. + */ +export function getCommand(roomId, input) { + const {cmd, args} = parseCommandString(input); + if (CommandMap.has(cmd)) { return () => CommandMap.get(cmd).run(roomId, args, cmd); } diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index e3cffd59f8..bbfc2780e8 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -39,6 +39,7 @@ import EMOTICON_REGEX from 'emojibase-regex/emoticon'; import * as sdk from '../../../index'; import {Key} from "../../../Keyboard"; import {EMOTICON_TO_EMOJI} from "../../../emoji"; +import {CommandCategories, CommandMap, parseCommandString} from "../../../SlashCommands"; const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s$'); @@ -162,7 +163,16 @@ export default class BasicMessageEditor extends React.Component { } this.setState({autoComplete: this.props.model.autoComplete}); this.historyManager.tryPush(this.props.model, selection, inputType, diff); - TypingStore.sharedInstance().setSelfTyping(this.props.room.roomId, !this.props.model.isEmpty); + + let isTyping = !this.props.model.isEmpty; + // If the user is entering a command, only consider them typing if it is one which sends a message into the room + if (isTyping && this.props.model.parts[0].type === "command") { + const {cmd} = parseCommandString(this.props.model.parts[0].text); + if (CommandMap.get(cmd).category !== CommandCategories.messages) { + isTyping = false; + } + } + TypingStore.sharedInstance().setSelfTyping(this.props.room.roomId, isTyping); if (this.props.onChange) { this.props.onChange(); From 22558f090de18599cdac83d8ff3d19fa6498f22a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 10 Apr 2020 15:38:17 +0100 Subject: [PATCH 162/230] Reverse order of they match/they don't match buttons Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/verification/VerificationShowSas.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 5fd0dca267..0a8947f2c2 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -132,12 +132,12 @@ export default class VerificationShowSas extends React.Component { />; } else { confirm = - - { _t("They match") } - { _t("They don't match") } + + { _t("They match") } + ; } From 6d33138950d68843af1d9a756a3fd1df98cb71f6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 11 Apr 2020 16:41:07 +0100 Subject: [PATCH 163/230] op/deop return error if trying to affect an unknown user Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.tsx | 8 +++++--- src/i18n/strings/en_EN.json | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index aac42b6740..71815dde8c 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -350,7 +350,7 @@ export const Commands = [ return success(cli.setRoomTopic(roomId, args)); } const room = cli.getRoom(roomId); - if (!room) return reject('Bad room ID: ' + roomId); + if (!room) return reject(_t("Failed to set topic")); const topicEvents = room.currentState.getStateEvents('m.room.topic', ''); const topic = topicEvents && topicEvents.getContent().topic; @@ -721,9 +721,10 @@ export const Commands = [ if (!isNaN(powerLevel)) { const cli = MatrixClientPeg.get(); const room = cli.getRoom(roomId); - if (!room) return reject('Bad room ID: ' + roomId); + if (!room) return reject(_t("Command failed")); const powerLevelEvent = room.currentState.getStateEvents('m.room.power_levels', ''); + if (!powerLevelEvent.getContent().users[args]) return reject(_t("Could not find user in room")); return success(cli.setPowerLevel(roomId, userId, powerLevel, powerLevelEvent)); } } @@ -742,9 +743,10 @@ export const Commands = [ if (matches) { const cli = MatrixClientPeg.get(); const room = cli.getRoom(roomId); - if (!room) return reject('Bad room ID: ' + roomId); + if (!room) return reject(_t("Command failed")); const powerLevelEvent = room.currentState.getStateEvents('m.room.power_levels', ''); + if (!powerLevelEvent.getContent().users[args]) return reject(_t("Could not find user in room")); return success(cli.setPowerLevel(roomId, args, undefined, powerLevelEvent)); } } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ae8ed90402..51a2a59672 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -177,6 +177,7 @@ "Changes your avatar in this current room only": "Changes your avatar in this current room only", "Changes your avatar in all rooms": "Changes your avatar in all rooms", "Gets or sets the room topic": "Gets or sets the room topic", + "Failed to set topic": "Failed to set topic", "This room has no topic.": "This room has no topic.", "Sets the room name": "Sets the room name", "Invites user with given id to current room": "Invites user with given id to current room", @@ -196,6 +197,8 @@ "Unignored user": "Unignored user", "You are no longer ignoring %(userId)s": "You are no longer ignoring %(userId)s", "Define the power level of a user": "Define the power level of a user", + "Command failed": "Command failed", + "Could not find user in room": "Could not find user in room", "Deops user with given id": "Deops user with given id", "Opens the Developer Tools dialog": "Opens the Developer Tools dialog", "Adds a custom widget by URL to the room": "Adds a custom widget by URL to the room", From 7a936798b948d8207735c958b1cbffde19601bf1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 11 Apr 2020 16:42:14 +0100 Subject: [PATCH 164/230] Fix invalid commands when figuring out whether to send typing notification Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/BasicMessageComposer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index a9389400ef..2e4a966404 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -170,7 +170,7 @@ export default class BasicMessageEditor extends React.Component { // If the user is entering a command, only consider them typing if it is one which sends a message into the room if (isTyping && this.props.model.parts[0].type === "command") { const {cmd} = parseCommandString(this.props.model.parts[0].text); - if (CommandMap.get(cmd).category !== CommandCategories.messages) { + if (!CommandMap.has(cmd) || CommandMap.get(cmd).category !== CommandCategories.messages) { isTyping = false; } } From 3a0e1aeeaf75ce74f3b837ae720d21aa1ef8714c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 11 Apr 2020 18:09:28 +0100 Subject: [PATCH 165/230] Sort emoji by shortcodes for autocomplete so that :-1 and :+1 first results are correct Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/EmojiProvider.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/autocomplete/EmojiProvider.js b/src/autocomplete/EmojiProvider.js index 9373ed662e..76058b42b0 100644 --- a/src/autocomplete/EmojiProvider.js +++ b/src/autocomplete/EmojiProvider.js @@ -100,6 +100,10 @@ export default class EmojiProvider extends AutocompleteProvider { // then sort by score (Infinity if matchedString not in shortname) sorters.push((c) => score(matchedString, c.shortname)); + // then sort by max score of all shortcodes, trim off the `:` + sorters.push((c) => { + return Math.min.apply(null, c.emoji.shortcodes.map(s => score(matchedString.substring(1), s))); + }); // If the matchedString is not empty, sort by length of shortname. Example: // matchedString = ":bookmark" // completions = [":bookmark:", ":bookmark_tabs:", ...] From 7e996cb91c9d6af8bfffd1782b51c6bff75075da Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 11 Apr 2020 18:57:59 +0100 Subject: [PATCH 166/230] Add riot-desktop shortcuts for forward/back matching browsers&slack Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/BasePlatform.js | 4 ++++ src/Keyboard.ts | 2 ++ src/components/structures/LoggedInView.js | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/src/BasePlatform.js b/src/BasePlatform.js index 5d809eb28f..7214031586 100644 --- a/src/BasePlatform.js +++ b/src/BasePlatform.js @@ -188,4 +188,8 @@ export default class BasePlatform { const callbackUrl = this.getSSOCallbackUrl(mxClient.getHomeserverUrl(), mxClient.getIdentityServerUrl()); window.location.href = mxClient.getSsoLoginUrl(callbackUrl.toString(), loginType); // redirect to SSO } + + onKeyDown(ev: KeyboardEvent): boolean { + return false; // no shortcuts implemented + } } diff --git a/src/Keyboard.ts b/src/Keyboard.ts index 23e2bbf0d6..7040898872 100644 --- a/src/Keyboard.ts +++ b/src/Keyboard.ts @@ -43,6 +43,8 @@ export const Key = { BACKTICK: "`", SPACE: " ", SLASH: "/", + SQUARE_BRACKET_LEFT: "[", + SQUARE_BRACKET_RIGHT: "]", A: "a", B: "b", C: "c", diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index d9980aeca6..fe59a6a8f1 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -40,6 +40,7 @@ import {Resizer, CollapseDistributor} from '../../resizer'; import MatrixClientContext from "../../contexts/MatrixClientContext"; import * as KeyboardShortcuts from "../../accessibility/KeyboardShortcuts"; import HomePage from "./HomePage"; +import PlatformPeg from "../../PlatformPeg"; // We need to fetch each pinned message individually (if we don't already have it) // so each pinned message may trigger a request. Limit the number per room for sanity. // NB. this is just for server notices rather than pinned messages in general. @@ -407,6 +408,11 @@ const LoggedInView = createReactClass({ }); handled = true; } + break; + + default: + // if we do not have a handler for it, pass it to the platform which might + handled = PlatformPeg.get().onKeyDown(ev); } if (handled) { From 71b4aab5dcb9edfd5bc5834a3ade66efd4d58fa2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 12 Apr 2020 00:12:58 +0100 Subject: [PATCH 167/230] Fix emoji tooltip flickering because onMouseOut&onMouseOver fired when moving between children Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/messages/_ReactionsRowButton.scss | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/res/css/views/messages/_ReactionsRowButton.scss b/res/css/views/messages/_ReactionsRowButton.scss index 941153ca5b..fe5b081042 100644 --- a/res/css/views/messages/_ReactionsRowButton.scss +++ b/res/css/views/messages/_ReactionsRowButton.scss @@ -34,12 +34,17 @@ limitations under the License. background-color: $reaction-row-button-selected-bg-color; border-color: $reaction-row-button-selected-border-color; } -} -.mx_ReactionsRowButton_content { - max-width: 100px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding-right: 4px; + // ignore mouse events for all children, treat it as one entire hoverable entity + * { + pointer-events: none; + } + + .mx_ReactionsRowButton_content { + max-width: 100px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding-right: 4px; + } } From 3e057070fd50391a1ec8453afd8af88ce14db49a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 12 Apr 2020 00:56:21 +0100 Subject: [PATCH 168/230] Fix width of MVideoBody in FilePanel Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/_components.scss | 1 + res/css/views/messages/_MVideoBody.scss | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 res/css/views/messages/_MVideoBody.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 8706772ad9..0ba2b609e8 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -133,6 +133,7 @@ @import "./views/messages/_MNoticeBody.scss"; @import "./views/messages/_MStickerBody.scss"; @import "./views/messages/_MTextBody.scss"; +@import "./views/messages/_MVideoBody.scss"; @import "./views/messages/_MessageActionBar.scss"; @import "./views/messages/_MessageTimestamp.scss"; @import "./views/messages/_MjolnirBody.scss"; diff --git a/res/css/views/messages/_MVideoBody.scss b/res/css/views/messages/_MVideoBody.scss new file mode 100644 index 0000000000..db044aba03 --- /dev/null +++ b/res/css/views/messages/_MVideoBody.scss @@ -0,0 +1,22 @@ +/* +Copyright 2020 New Vector Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +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. +*/ + +span.mx_MVideoBody { + video.mx_MVideoBody { + max-width: 100%; + height: auto; + } +} From 4fc88d69a325c7de018804cff2ba3d980fa8beeb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 12 Apr 2020 01:04:54 +0100 Subject: [PATCH 169/230] Remove unused react-addons-css-transition-group Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 1 - yarn.lock | 234 +++------------------------------------------------ 2 files changed, 12 insertions(+), 223 deletions(-) diff --git a/package.json b/package.json index 616f3f541e..7ba69c4272 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,6 @@ "qrcode-react": "^0.1.16", "qs": "^6.6.0", "react": "^16.9.0", - "react-addons-css-transition-group": "15.6.2", "react-beautiful-dnd": "^4.0.1", "react-dom": "^16.9.0", "react-focus-lock": "^2.2.1", diff --git a/yarn.lock b/yarn.lock index 538a049bff..c42828e461 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1496,11 +1496,6 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - acorn-globals@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" @@ -1634,19 +1629,11 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2283,11 +2270,6 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== -chain-function@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc" - integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg== - chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2553,11 +2535,6 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2803,7 +2780,7 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -2879,11 +2856,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -2897,11 +2869,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -2975,13 +2942,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-helpers@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== - dependencies: - "@babel/runtime" "^7.1.2" - dom-serializer@0, dom-serializer@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -3916,13 +3876,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -3985,20 +3938,6 @@ fuse.js@^2.2.0: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-2.7.4.tgz#96e420fde7ef011ac49c258a621314fe576536f9" integrity sha1-luQg/efvARrEnCWKYhMU/ldlNvk= -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -4196,11 +4135,6 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -4388,7 +4322,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4405,13 +4339,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -5975,21 +5902,6 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, "minimist@~ 1.2.0": resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -6014,7 +5926,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: +mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -6091,15 +6003,6 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -needle@^2.2.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a" - integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" @@ -6177,35 +6080,11 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.53: version "1.1.53" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -6238,27 +6117,6 @@ normalize-selector@^0.2.0: resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6266,16 +6124,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -6425,11 +6273,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -6439,19 +6282,11 @@ os-locale@^3.0.0, os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -6923,7 +6758,7 @@ prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -7096,7 +6931,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@1.2.8, rc@^1.2.7, rc@^1.2.8: +rc@1.2.8, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7106,13 +6941,6 @@ rc@1.2.8, rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-addons-css-transition-group@15.6.2: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-addons-css-transition-group/-/react-addons-css-transition-group-15.6.2.tgz#9e4376bcf40b5217d14ec68553081cee4b08a6d6" - integrity sha1-nkN2vPQLUhfRTsaFUwgc7ksIptY= - dependencies: - react-transition-group "^1.2.0" - react-beautiful-dnd@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-4.0.1.tgz#3b0a49bf6be75af351176c904f012611dd292b81" @@ -7200,17 +7028,6 @@ react-test-renderer@^16.0.0-0, react-test-renderer@^16.9.0: react-is "^16.8.6" scheduler "^0.19.1" -react-transition-group@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" - integrity sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q== - dependencies: - chain-function "^1.0.0" - dom-helpers "^3.2.0" - loose-envify "^1.3.1" - prop-types "^15.5.6" - warning "^3.0.0" - react@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" @@ -7254,7 +7071,7 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7614,7 +7431,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@^2.4.3, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -7776,7 +7593,7 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -8112,7 +7929,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -8393,19 +8210,6 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - terser-webpack-plugin@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" @@ -8964,13 +8768,6 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= - dependencies: - loose-envify "^1.0.0" - watchpack@^1.6.0: version "1.6.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" @@ -9128,13 +8925,6 @@ which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -9219,7 +9009,7 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From 379aeb667ce4a80941808091634186d7d1bac67c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 13 Apr 2020 14:13:27 +0100 Subject: [PATCH 170/230] Convert LoggedInView to a PureComponent class Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LoggedInView.js | 120 +++++++++++----------- 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index d9980aeca6..36beec3f6c 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -1,7 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd -Copyright 2017, 2018 New Vector Ltd +Copyright 2017, 2018, 2020 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,8 +17,7 @@ limitations under the License. */ import { MatrixClient } from 'matrix-js-sdk'; -import React, {createRef} from 'react'; -import createReactClass from 'create-react-class'; +import React, {createRef, PureComponent} from 'react'; import PropTypes from 'prop-types'; import { DragDropContext } from 'react-beautiful-dnd'; @@ -61,10 +60,10 @@ function canElementReceiveInput(el) { * * Components mounted below us can access the matrix client via the react context. */ -const LoggedInView = createReactClass({ - displayName: 'LoggedInView', +class LoggedInView extends PureComponent { + static displayName = 'LoggedInView'; - propTypes: { + static propTypes = { matrixClient: PropTypes.instanceOf(MatrixClient).isRequired, page_type: PropTypes.string.isRequired, onRoomCreated: PropTypes.func, @@ -77,25 +76,18 @@ const LoggedInView = createReactClass({ viaServers: PropTypes.arrayOf(PropTypes.string), // and lots and lots of other stuff. - }, + }; - getInitialState: function() { - return { + constructor(props, context) { + super(props, context); + + this.state = { // use compact timeline view useCompactLayout: SettingsStore.getValue('useCompactLayout'), // any currently active server notice events serverNoticeEvents: [], }; - }, - componentDidMount: function() { - this.resizer = this._createResizer(); - this.resizer.attach(); - this._loadResizerPreferences(); - }, - - // TODO: [REACT-WARNING] Replace component with real class, use constructor for refs - UNSAFE_componentWillMount: function() { // stash the MatrixClient in case we log out before we are unmounted this._matrixClient = this.props.matrixClient; @@ -118,7 +110,13 @@ const LoggedInView = createReactClass({ fixupColorFonts(); this._roomView = createRef(); - }, + } + + componentDidMount() { + this.resizer = this._createResizer(); + this.resizer.attach(); + this._loadResizerPreferences(); + } componentDidUpdate(prevProps) { // attempt to guess when a banner was opened or closed @@ -130,9 +128,9 @@ const LoggedInView = createReactClass({ ) { this.props.resizeNotifier.notifyBannersChanged(); } - }, + } - componentWillUnmount: function() { + componentWillUnmount() { document.removeEventListener('keydown', this._onNativeKeyDown, false); this._matrixClient.removeListener("accountData", this.onAccountData); this._matrixClient.removeListener("sync", this.onSync); @@ -141,7 +139,7 @@ const LoggedInView = createReactClass({ this._sessionStoreToken.remove(); } this.resizer.detach(); - }, + } // Child components assume that the client peg will not be null, so give them some // sort of assurance here by only allowing a re-render if the client is truthy. @@ -149,22 +147,22 @@ const LoggedInView = createReactClass({ // This is required because `LoggedInView` maintains its own state and if this state // updates after the client peg has been made null (during logout), then it will // attempt to re-render and the children will throw errors. - shouldComponentUpdate: function() { + shouldComponentUpdate() { return Boolean(MatrixClientPeg.get()); - }, + } - canResetTimelineInRoom: function(roomId) { + canResetTimelineInRoom = (roomId) => { if (!this._roomView.current) { return true; } return this._roomView.current.canResetTimeline(); - }, + }; - _setStateFromSessionStore() { + _setStateFromSessionStore = () => { this.setState({ userHasGeneratedPassword: Boolean(this._sessionStore.getCachedPassword()), }); - }, + }; _createResizer() { const classNames = { @@ -193,7 +191,7 @@ const LoggedInView = createReactClass({ collapseConfig); resizer.setClassNames(classNames); return resizer; - }, + } _loadResizerPreferences() { let lhsSize = window.localStorage.getItem("mx_lhs_size"); @@ -203,9 +201,9 @@ const LoggedInView = createReactClass({ lhsSize = 350; } this.resizer.forHandleAt(0).resize(lhsSize); - }, + } - onAccountData: function(event) { + onAccountData = (event) => { if (event.getType() === "im.vector.web.settings") { this.setState({ useCompactLayout: event.getContent().useCompactLayout, @@ -214,9 +212,9 @@ const LoggedInView = createReactClass({ if (event.getType() === "m.ignored_user_list") { dis.dispatch({action: "ignore_state_changed"}); } - }, + }; - onSync: function(syncState, oldSyncState, data) { + onSync = (syncState, oldSyncState, data) => { const oldErrCode = ( this.state.syncErrorData && this.state.syncErrorData.error && @@ -238,16 +236,16 @@ const LoggedInView = createReactClass({ if (oldSyncState === 'PREPARED' && syncState === 'SYNCING') { this._updateServerNoticeEvents(); } - }, + }; - onRoomStateEvents: function(ev, state) { + onRoomStateEvents = (ev, state) => { const roomLists = RoomListStore.getRoomLists(); if (roomLists['m.server_notice'] && roomLists['m.server_notice'].some(r => r.roomId === ev.getRoomId())) { this._updateServerNoticeEvents(); } - }, + }; - _updateServerNoticeEvents: async function() { + _updateServerNoticeEvents = async () => { const roomLists = RoomListStore.getRoomLists(); if (!roomLists['m.server_notice']) return []; @@ -267,9 +265,9 @@ const LoggedInView = createReactClass({ this.setState({ serverNoticeEvents: pinnedEvents, }); - }, + }; - _onPaste: function(ev) { + _onPaste = (ev) => { let canReceiveInput = false; let element = ev.target; // test for all parents because the target can be a child of a contenteditable element @@ -283,7 +281,7 @@ const LoggedInView = createReactClass({ // so dispatch synchronously before paste happens dis.dispatch({action: 'focus_composer'}, true); } - }, + }; /* SOME HACKERY BELOW: @@ -307,22 +305,22 @@ const LoggedInView = createReactClass({ We also listen with a native listener on the document to get keydown events when no element is focused. Bubbling is irrelevant here as the target is the body element. */ - _onReactKeyDown: function(ev) { + _onReactKeyDown = (ev) => { // events caught while bubbling up on the root element // of this component, so something must be focused. this._onKeyDown(ev); - }, + }; - _onNativeKeyDown: function(ev) { + _onNativeKeyDown = (ev) => { // only pass this if there is no focused element. // if there is, _onKeyDown will be called by the // react keydown handler that respects the react bubbling order. if (ev.target === document.body) { this._onKeyDown(ev); } - }, + }; - _onKeyDown: function(ev) { + _onKeyDown = (ev) => { /* // Remove this for now as ctrl+alt = alt-gr so this breaks keyboards which rely on alt-gr for numbers // Will need to find a better meta key if anyone actually cares about using this. @@ -432,19 +430,19 @@ const LoggedInView = createReactClass({ // that would prevent typing in the now-focussed composer } } - }, + }; /** * dispatch a page-up/page-down/etc to the appropriate component * @param {Object} ev The key event */ - _onScrollKeyPressed: function(ev) { + _onScrollKeyPressed = (ev) => { if (this._roomView.current) { this._roomView.current.handleScrollKey(ev); } - }, + }; - _onDragEnd: function(result) { + _onDragEnd = (result) => { // Dragged to an invalid destination, not onto a droppable if (!result.destination) { return; @@ -467,9 +465,9 @@ const LoggedInView = createReactClass({ } else if (dest.startsWith('room-sub-list-droppable_')) { this._onRoomTileEndDrag(result); } - }, + }; - _onRoomTileEndDrag: function(result) { + _onRoomTileEndDrag = (result) => { let newTag = result.destination.droppableId.split('_')[1]; let prevTag = result.source.droppableId.split('_')[1]; if (newTag === 'undefined') newTag = undefined; @@ -486,9 +484,9 @@ const LoggedInView = createReactClass({ prevTag, newTag, oldIndex, newIndex, ), true); - }, + }; - _onMouseDown: function(ev) { + _onMouseDown = (ev) => { // When the panels are disabled, clicking on them results in a mouse event // which bubbles to certain elements in the tree. When this happens, close // any settings page that is currently open (user/room/group). @@ -507,9 +505,9 @@ const LoggedInView = createReactClass({ }); } } - }, + }; - _onMouseUp: function(ev) { + _onMouseUp = (ev) => { if (!this.state.mouseDown) return; const deltaX = ev.pageX - this.state.mouseDown.x; @@ -528,13 +526,13 @@ const LoggedInView = createReactClass({ // Always clear the mouseDown state to ensure we don't accidentally // use stale values due to the mouseDown checks. this.setState({mouseDown: null}); - }, + }; - _setResizeContainerRef(div) { + _setResizeContainerRef = (div) => { this.resizeContainer = div; - }, + }; - render: function() { + render() { const LeftPanel = sdk.getComponent('structures.LeftPanel'); const RoomView = sdk.getComponent('structures.RoomView'); const UserView = sdk.getComponent('structures.UserView'); @@ -660,7 +658,7 @@ const LoggedInView = createReactClass({
    ); - }, -}); + } +} export default LoggedInView; From 368e3f9e85bf8d950ac8541ea0693859c57300b1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 13 Apr 2020 14:29:00 +0100 Subject: [PATCH 171/230] Convert LoggedInView to TypeScript Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../{LoggedInView.js => LoggedInView.tsx} | 89 +++++++++++++++---- 1 file changed, 71 insertions(+), 18 deletions(-) rename src/components/structures/{LoggedInView.js => LoggedInView.tsx} (91%) diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.tsx similarity index 91% rename from src/components/structures/LoggedInView.js rename to src/components/structures/LoggedInView.tsx index 36beec3f6c..e09a5c9ac6 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.tsx @@ -16,9 +16,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixClient } from 'matrix-js-sdk'; -import React, {createRef, PureComponent} from 'react'; -import PropTypes from 'prop-types'; +import * as React from 'react'; +import * as PropTypes from 'prop-types'; +import { MatrixClient } from 'matrix-js-sdk/src/client'; +import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { DragDropContext } from 'react-beautiful-dnd'; import {Key, isOnlyCtrlOrCmdKeyEvent, isOnlyCtrlOrCmdIgnoreShiftKeyEvent} from '../../Keyboard'; @@ -28,7 +29,7 @@ import { fixupColorFonts } from '../../utils/FontManager'; import * as sdk from '../../index'; import dis from '../../dispatcher'; import sessionStore from '../../stores/SessionStore'; -import {MatrixClientPeg} from '../../MatrixClientPeg'; +import {MatrixClientPeg, MatrixClientCreds} from '../../MatrixClientPeg'; import SettingsStore from "../../settings/SettingsStore"; import RoomListStore from "../../stores/RoomListStore"; @@ -39,6 +40,7 @@ import {Resizer, CollapseDistributor} from '../../resizer'; import MatrixClientContext from "../../contexts/MatrixClientContext"; import * as KeyboardShortcuts from "../../accessibility/KeyboardShortcuts"; import HomePage from "./HomePage"; +import ResizeNotifier from "../../utils/ResizeNotifier"; // We need to fetch each pinned message individually (if we don't already have it) // so each pinned message may trigger a request. Limit the number per room for sanity. // NB. this is just for server notices rather than pinned messages in general. @@ -51,6 +53,52 @@ function canElementReceiveInput(el) { !!el.getAttribute("contenteditable"); } +interface IProps { + matrixClient: MatrixClient; + onRegistered: (credentials: MatrixClientCreds) => Promise; + viaServers?: string[]; + hideToSRUsers: boolean; + resizeNotifier: ResizeNotifier; + middleDisabled: boolean; + initialEventPixelOffset: number; + leftDisabled: boolean; + rightDisabled: boolean; + showCookieBar: boolean; + hasNewVersion: boolean; + userHasGeneratedPassword: boolean; + showNotifierToolbar: boolean; + page_type: string; + autoJoin: boolean; + thirdPartyInvite?: object; + roomOobData?: object; + currentRoomId: string; + ConferenceHandler?: object; + collapseLhs: boolean; + checkingForUpdate: boolean; + config: { + piwik: { + policyUrl: string; + }, + [key: string]: any, + }; + currentUserId?: string; + currentGroupId?: string; + currentGroupIsNew?: boolean; + version?: string; + newVersion?: string; + newVersionReleaseNotes?: string; +} +interface IState { + mouseDown?: { + x: number; + y: number; + }; + syncErrorData: any; + useCompactLayout: boolean; + serverNoticeEvents: MatrixEvent[]; + userHasGeneratedPassword: boolean; +} + /** * This is what our MatrixChat shows when we are logged in. The precise view is * determined by the page_type property. @@ -60,7 +108,7 @@ function canElementReceiveInput(el) { * * Components mounted below us can access the matrix client via the react context. */ -class LoggedInView extends PureComponent { +class LoggedInView extends React.PureComponent { static displayName = 'LoggedInView'; static propTypes = { @@ -78,10 +126,20 @@ class LoggedInView extends PureComponent { // and lots and lots of other stuff. }; + private readonly _matrixClient: MatrixClient; + private readonly _roomView: React.RefObject; + private readonly _resizeContainer: React.RefObject; + private readonly _sessionStore: sessionStore; + private readonly _sessionStoreToken: { remove: () => void }; + private resizer: Resizer; + constructor(props, context) { super(props, context); this.state = { + mouseDown: undefined, + syncErrorData: undefined, + userHasGeneratedPassword: false, // use compact timeline view useCompactLayout: SettingsStore.getValue('useCompactLayout'), // any currently active server notice events @@ -109,7 +167,8 @@ class LoggedInView extends PureComponent { fixupColorFonts(); - this._roomView = createRef(); + this._roomView = React.createRef(); + this._resizeContainer = React.createRef(); } componentDidMount() { @@ -118,12 +177,12 @@ class LoggedInView extends PureComponent { this._loadResizerPreferences(); } - componentDidUpdate(prevProps) { + componentDidUpdate(prevProps, prevState) { // attempt to guess when a banner was opened or closed if ( (prevProps.showCookieBar !== this.props.showCookieBar) || (prevProps.hasNewVersion !== this.props.hasNewVersion) || - (prevProps.userHasGeneratedPassword !== this.props.userHasGeneratedPassword) || + (prevState.userHasGeneratedPassword !== this.state.userHasGeneratedPassword) || (prevProps.showNotifierToolbar !== this.props.showNotifierToolbar) ) { this.props.resizeNotifier.notifyBannersChanged(); @@ -186,7 +245,7 @@ class LoggedInView extends PureComponent { }, }; const resizer = new Resizer( - this.resizeContainer, + this._resizeContainer.current, CollapseDistributor, collapseConfig); resizer.setClassNames(classNames); @@ -194,10 +253,8 @@ class LoggedInView extends PureComponent { } _loadResizerPreferences() { - let lhsSize = window.localStorage.getItem("mx_lhs_size"); - if (lhsSize !== null) { - lhsSize = parseInt(lhsSize, 10); - } else { + let lhsSize = parseInt(window.localStorage.getItem("mx_lhs_size"), 10); + if (isNaN(lhsSize)) { lhsSize = 350; } this.resizer.forHandleAt(0).resize(lhsSize); @@ -528,10 +585,6 @@ class LoggedInView extends PureComponent { this.setState({mouseDown: null}); }; - _setResizeContainerRef = (div) => { - this.resizeContainer = div; - }; - render() { const LeftPanel = sdk.getComponent('structures.LeftPanel'); const RoomView = sdk.getComponent('structures.RoomView'); @@ -645,7 +698,7 @@ class LoggedInView extends PureComponent { { topBar } -
    +
    Date: Mon, 13 Apr 2020 14:30:52 +0100 Subject: [PATCH 172/230] prefer protected over private so that the class can be extended Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LoggedInView.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index e09a5c9ac6..8497b9bc80 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -126,12 +126,12 @@ class LoggedInView extends React.PureComponent { // and lots and lots of other stuff. }; - private readonly _matrixClient: MatrixClient; - private readonly _roomView: React.RefObject; - private readonly _resizeContainer: React.RefObject; - private readonly _sessionStore: sessionStore; - private readonly _sessionStoreToken: { remove: () => void }; - private resizer: Resizer; + protected readonly _matrixClient: MatrixClient; + protected readonly _roomView: React.RefObject; + protected readonly _resizeContainer: React.RefObject; + protected readonly _sessionStore: sessionStore; + protected readonly _sessionStoreToken: { remove: () => void }; + protected resizer: Resizer; constructor(props, context) { super(props, context); From 46f7fadf3f23e3f4eaaf3a97124ec2fe8cc4ccd3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 13 Apr 2020 14:33:45 +0100 Subject: [PATCH 173/230] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LoggedInView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 8497b9bc80..0e2a74faae 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -315,8 +315,8 @@ class LoggedInView extends React.PureComponent { const pinnedEventIds = pinStateEvent.getContent().pinned.slice(0, MAX_PINNED_NOTICES_PER_ROOM); for (const eventId of pinnedEventIds) { const timeline = await this._matrixClient.getEventTimeline(room.getUnfilteredTimelineSet(), eventId, 0); - const ev = timeline.getEvents().find(ev => ev.getId() === eventId); - if (ev) pinnedEvents.push(ev); + const event = timeline.getEvents().find(ev => ev.getId() === eventId); + if (event) pinnedEvents.push(event); } } this.setState({ From 09d56e7bbc13461aeee7229de15e582c1eb4ee9d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 Apr 2020 13:05:23 +0100 Subject: [PATCH 174/230] Fix create room dialog e2ee private room setting Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/CreateRoomDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 88e90627e8..f18e28b85e 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -66,7 +66,7 @@ export default createReactClass({ } if (!this.state.isPublic && SettingsStore.isFeatureEnabled("feature_cross_signing")) { - createOpts.encryption = this.state.isEncrypted; + opts.encryption = this.state.isEncrypted; } return opts; From e114effcfad25efe3a2e16faf3a26a0c21ef82ff Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 Apr 2020 13:07:44 +0100 Subject: [PATCH 175/230] make code more readable as per pr suggestion Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/EmojiProvider.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/autocomplete/EmojiProvider.js b/src/autocomplete/EmojiProvider.js index 76058b42b0..670776644e 100644 --- a/src/autocomplete/EmojiProvider.js +++ b/src/autocomplete/EmojiProvider.js @@ -101,9 +101,7 @@ export default class EmojiProvider extends AutocompleteProvider { // then sort by score (Infinity if matchedString not in shortname) sorters.push((c) => score(matchedString, c.shortname)); // then sort by max score of all shortcodes, trim off the `:` - sorters.push((c) => { - return Math.min.apply(null, c.emoji.shortcodes.map(s => score(matchedString.substring(1), s))); - }); + sorters.push((c) => Math.min(...c.emoji.shortcodes.map(s => score(matchedString.substring(1), s)))); // If the matchedString is not empty, sort by length of shortname. Example: // matchedString = ":bookmark" // completions = [":bookmark:", ":bookmark_tabs:", ...] From a7d95d396eb5e504bce352e36a40e45dd638b28a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 Apr 2020 14:46:04 +0100 Subject: [PATCH 176/230] fix copyright Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/messages/_MVideoBody.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/messages/_MVideoBody.scss b/res/css/views/messages/_MVideoBody.scss index db044aba03..3b05c53f34 100644 --- a/res/css/views/messages/_MVideoBody.scss +++ b/res/css/views/messages/_MVideoBody.scss @@ -1,5 +1,5 @@ /* -Copyright 2020 New Vector Ltd. +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. From 50d6551c86d1a8f49830801d2988c964fa094d1f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 Apr 2020 14:50:09 +0100 Subject: [PATCH 177/230] @replaceableComponent Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LoggedInView.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 0e2a74faae..ecf6a92c89 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -41,6 +41,7 @@ import MatrixClientContext from "../../contexts/MatrixClientContext"; import * as KeyboardShortcuts from "../../accessibility/KeyboardShortcuts"; import HomePage from "./HomePage"; import ResizeNotifier from "../../utils/ResizeNotifier"; +import { replaceableComponent } from '../../utils/replaceableComponent'; // We need to fetch each pinned message individually (if we don't already have it) // so each pinned message may trigger a request. Limit the number per room for sanity. // NB. this is just for server notices rather than pinned messages in general. @@ -108,6 +109,7 @@ interface IState { * * Components mounted below us can access the matrix client via the react context. */ +@replaceableComponent("structures.LoggedInView") class LoggedInView extends React.PureComponent { static displayName = 'LoggedInView'; From 26569dea065ddb42877d8bece5db7162f7f45cf8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 Apr 2020 14:59:20 +0100 Subject: [PATCH 178/230] Revert "@replaceableComponent" This reverts commit 50d6551c Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LoggedInView.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index ecf6a92c89..0e2a74faae 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -41,7 +41,6 @@ import MatrixClientContext from "../../contexts/MatrixClientContext"; import * as KeyboardShortcuts from "../../accessibility/KeyboardShortcuts"; import HomePage from "./HomePage"; import ResizeNotifier from "../../utils/ResizeNotifier"; -import { replaceableComponent } from '../../utils/replaceableComponent'; // We need to fetch each pinned message individually (if we don't already have it) // so each pinned message may trigger a request. Limit the number per room for sanity. // NB. this is just for server notices rather than pinned messages in general. @@ -109,7 +108,6 @@ interface IState { * * Components mounted below us can access the matrix client via the react context. */ -@replaceableComponent("structures.LoggedInView") class LoggedInView extends React.PureComponent { static displayName = 'LoggedInView'; From 7b3c34bd129a77eaade524fa1ae458903b46dfc4 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 14 Apr 2020 16:46:02 +0200 Subject: [PATCH 179/230] use js-sdk qr code generation --- .../VerificationQREmojiOptions.js | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/src/components/views/verification/VerificationQREmojiOptions.js b/src/components/views/verification/VerificationQREmojiOptions.js index d72c6951fe..89b3a596d7 100644 --- a/src/components/views/verification/VerificationQREmojiOptions.js +++ b/src/components/views/verification/VerificationQREmojiOptions.js @@ -20,8 +20,8 @@ import { _t } from '../../../languageHandler'; import AccessibleButton from "../elements/AccessibleButton"; import {replaceableComponent} from "../../../utils/replaceableComponent"; import VerificationQRCode from "../elements/crypto/VerificationQRCode"; -import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import Spinner from "../elements/Spinner"; +import {SCAN_QR_CODE_METHOD} from "matrix-js-sdk/src/crypto/verification/QRCode"; @replaceableComponent("views.verification.VerificationQREmojiOptions") export default class VerificationQREmojiOptions extends React.Component { @@ -31,31 +31,17 @@ export default class VerificationQREmojiOptions extends React.Component { onStartEmoji: PropTypes.func.isRequired, }; - constructor(props) { - super(props); - - this.state = { - qrProps: null, - }; - - this._prepareQrCode(props.request); - } - - async _prepareQrCode(request: VerificationRequest) { - try { - const props = await VerificationQRCode.getPropsForRequest(request); - this.setState({qrProps: props}); - } catch (e) { - console.error(e); - // We just won't show a QR code - } - } - render() { - let qrCode =
    ; - if (this.state.qrProps) { - qrCode = ; + const {request} = this.props; + const showQR = request.otherPartySupportsMethod(SCAN_QR_CODE_METHOD); + + let qrCode; + if (showQR) { + qrCode = ; + } else { + qrCode =
    ; } + return (
    {_t("Verify this session by completing one of the following:")} From db09cadb667c158479c87b421cb95edc2042023e Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 14 Apr 2020 17:19:15 +0200 Subject: [PATCH 180/230] remove spinner, change copy, add button placeholder --- res/css/_components.scss | 1 + .../structures/auth/_CompleteSecurity.scss | 1 + .../views/elements/_ButtonPlaceholder.scss | 24 +++++++++++++++++++ .../structures/auth/SetupEncryptionBody.js | 6 ++--- .../views/elements/ButtonPlaceholder.js | 19 +++++++++++++++ src/i18n/strings/en_EN.json | 4 ++-- 6 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 res/css/views/elements/_ButtonPlaceholder.scss create mode 100644 src/components/views/elements/ButtonPlaceholder.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 8706772ad9..21df53d0b9 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -94,6 +94,7 @@ @import "./views/elements/_AccessibleButton.scss"; @import "./views/elements/_AddressSelector.scss"; @import "./views/elements/_AddressTile.scss"; +@import "./views/elements/_ButtonPlaceholder.scss"; @import "./views/elements/_DirectorySearchBox.scss"; @import "./views/elements/_Dropdown.scss"; @import "./views/elements/_EditableItemList.scss"; diff --git a/res/css/structures/auth/_CompleteSecurity.scss b/res/css/structures/auth/_CompleteSecurity.scss index 3050840fe8..80e7aaada0 100644 --- a/res/css/structures/auth/_CompleteSecurity.scss +++ b/res/css/structures/auth/_CompleteSecurity.scss @@ -44,6 +44,7 @@ limitations under the License. .mx_CompleteSecurity_actionRow { display: flex; justify-content: flex-end; + margin-top: $font-28px; .mx_AccessibleButton { margin-inline-start: 18px; diff --git a/res/css/views/elements/_ButtonPlaceholder.scss b/res/css/views/elements/_ButtonPlaceholder.scss new file mode 100644 index 0000000000..c9a8c1f794 --- /dev/null +++ b/res/css/views/elements/_ButtonPlaceholder.scss @@ -0,0 +1,24 @@ +/* +Copyright 2017 Vector Creations Ltd + +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_ButtonPlaceholder { + font-size: $font-14px; + font-weight: 600; + padding: 7px 18px; + display: inline-block; + text-align: center; + color: $authpage-secondary-color; +} diff --git a/src/components/structures/auth/SetupEncryptionBody.js b/src/components/structures/auth/SetupEncryptionBody.js index c7c73cd616..a982957ed0 100644 --- a/src/components/structures/auth/SetupEncryptionBody.js +++ b/src/components/structures/auth/SetupEncryptionBody.js @@ -108,14 +108,13 @@ export default class SetupEncryptionBody extends React.Component { member={MatrixClientPeg.get().getUser(this.state.verificationRequest.otherUserId)} />; } else if (phase === PHASE_INTRO) { - const InlineSpinner = sdk.getComponent('elements.InlineSpinner'); + const ButtonPlaceholder = sdk.getComponent("elements.ButtonPlaceholder"); return (

    {_t( - "Open an existing session & use it to verify this one, " + + "Use an existing session to verify this one, " + "granting it access to encrypted messages.", )}

    -

    {_t("Waiting…")}

    {_t( "If you can’t access one, ", {}, { @@ -133,6 +132,7 @@ export default class SetupEncryptionBody extends React.Component { > {_t("Skip")} + {_t("Use your other device to continue…")}

    ); diff --git a/src/components/views/elements/ButtonPlaceholder.js b/src/components/views/elements/ButtonPlaceholder.js new file mode 100644 index 0000000000..9c40df9db6 --- /dev/null +++ b/src/components/views/elements/ButtonPlaceholder.js @@ -0,0 +1,19 @@ +/* +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. +*/ + +export default function ButtonPlaceholder(props) { + return
    {props.children}
    ; +} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ae8ed90402..a46c357a3e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2112,9 +2112,9 @@ "You can now close this window or log in to your new account.": "You can now close this window or log in to your new account.", "Registration Successful": "Registration Successful", "Create your account": "Create your account", - "Open an existing session & use it to verify this one, granting it access to encrypted messages.": "Open an existing session & use it to verify this one, granting it access to encrypted messages.", - "Waiting…": "Waiting…", + "Use an existing session to verify this one, granting it access to encrypted messages.": "Use an existing session to verify this one, granting it access to encrypted messages.", "If you can’t access one, ": "If you can’t access one, ", + "Use your other device to continue…": "Use your other device to continue…", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", "Your new session is now verified. Other users will see it as trusted.": "Your new session is now verified. Other users will see it as trusted.", "Without completing security on this session, it won’t have access to encrypted messages.": "Without completing security on this session, it won’t have access to encrypted messages.", From 368737cfd95f700f376453f1921b13cbc92005f2 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 14 Apr 2020 17:41:06 +0200 Subject: [PATCH 181/230] fix copyright --- res/css/views/elements/_ButtonPlaceholder.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/elements/_ButtonPlaceholder.scss b/res/css/views/elements/_ButtonPlaceholder.scss index c9a8c1f794..858fcdecf6 100644 --- a/res/css/views/elements/_ButtonPlaceholder.scss +++ b/res/css/views/elements/_ButtonPlaceholder.scss @@ -1,5 +1,5 @@ /* -Copyright 2017 Vector Creations Ltd +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. From 24fe125cb63090ef5e14aae1a1551d38d1a7a899 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 14 Apr 2020 17:53:33 +0200 Subject: [PATCH 182/230] dont try to enable 4S if cross-signing is disabled --- src/verification.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/verification.js b/src/verification.js index 3170eb8825..e00e5e05fa 100644 --- a/src/verification.js +++ b/src/verification.js @@ -61,15 +61,18 @@ function UntrustedDeviceDialog(props) { } export async function verifyDevice(user, device) { - if (!await enable4SIfNeeded()) { - return; + const cli = MatrixClientPeg.get(); + // if cross-signing is not explicitly disabled, check if it should be enabled first. + if (cli.getCryptoTrustCrossSignedDevices()) { + if (!await enable4SIfNeeded()) { + return; + } } Modal.createTrackedDialog("Verification warning", "unverified session", UntrustedDeviceDialog, { user, device, onFinished: async (action) => { if (action === "sas") { - const cli = MatrixClientPeg.get(); const verificationRequestPromise = cli.legacyDeviceVerification( user.userId, device.deviceId, @@ -95,10 +98,13 @@ export async function verifyDevice(user, device) { } export async function legacyVerifyUser(user) { - if (!await enable4SIfNeeded()) { - return; - } const cli = MatrixClientPeg.get(); + // if cross-signing is not explicitly disabled, check if it should be enabled first. + if (cli.getCryptoTrustCrossSignedDevices()) { + if (!await enable4SIfNeeded()) { + return; + } + } const verificationRequestPromise = cli.requestVerification(user.userId); dis.dispatch({ action: "set_right_panel_phase", From 769cf1c9870b3ebcb75e5a96e30fbc141efb1792 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 Apr 2020 17:34:39 +0100 Subject: [PATCH 183/230] Allow network dropdown to be scrollable and fix context menu window padding calc Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/directory/_NetworkDropdown.scss | 2 ++ src/components/structures/ContextMenu.js | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/res/css/views/directory/_NetworkDropdown.scss b/res/css/views/directory/_NetworkDropdown.scss index 269b507e3c..dd1892c448 100644 --- a/res/css/views/directory/_NetworkDropdown.scss +++ b/res/css/views/directory/_NetworkDropdown.scss @@ -35,6 +35,8 @@ limitations under the License. border-radius: 4px; border: 1px solid $dialog-close-fg-color; background-color: $primary-bg-color; + max-height: calc(100vh - 20px); // allow 10px padding on both top and bottom + overflow-y: auto; } .mx_NetworkDropdown_menu_network { diff --git a/src/components/structures/ContextMenu.js b/src/components/structures/ContextMenu.js index b4647a6c30..98b0867ccc 100644 --- a/src/components/structures/ContextMenu.js +++ b/src/components/structures/ContextMenu.js @@ -245,7 +245,6 @@ export class ContextMenu extends React.Component { } const contextMenuRect = this.state.contextMenuElem ? this.state.contextMenuElem.getBoundingClientRect() : null; - const padding = 10; const chevronOffset = {}; if (props.chevronFace) { @@ -264,7 +263,8 @@ export class ContextMenu extends React.Component { // If we know the dimensions of the context menu, adjust its position // such that it does not leave the (padded) window. if (contextMenuRect) { - adjusted = Math.min(position.top, document.body.clientHeight - contextMenuRect.height - padding); + const padding = 10; + adjusted = Math.min(position.top, document.body.clientHeight - contextMenuRect.height + padding); } position.top = adjusted; From 89bc3bdd5bb1fb0668f76981b05f8712de33b89d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 00:16:11 +0100 Subject: [PATCH 184/230] consolidate and extract copyPlaintext, copyNode and selectText Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../keybackup/CreateKeyBackupDialog.js | 14 +--- .../CreateSecretStorageDialog.js | 14 +--- src/components/views/dialogs/ShareDialog.js | 76 ++++++++----------- src/components/views/messages/TextualBody.js | 26 ++----- src/utils/strings.ts | 75 ++++++++++++++++++ 5 files changed, 117 insertions(+), 88 deletions(-) create mode 100644 src/utils/strings.ts diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 3a480a2579..7e5e0afb79 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -25,6 +25,7 @@ import { _t } from '../../../../languageHandler'; import { accessSecretStorage } from '../../../../CrossSigningManager'; import SettingsStore from '../../../../settings/SettingsStore'; import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; +import {copyNode} from "../../../../utils/strings"; const PHASE_PASSPHRASE = 0; const PHASE_PASSPHRASE_CONFIRM = 1; @@ -37,16 +38,6 @@ const PHASE_OPTOUT_CONFIRM = 6; const PASSWORD_MIN_SCORE = 4; // So secure, many characters, much complex, wow, etc, etc. const PASSPHRASE_FEEDBACK_DELAY = 500; // How long after keystroke to offer passphrase feedback, ms. -// XXX: copied from ShareDialog: factor out into utils -function selectText(target) { - const range = document.createRange(); - range.selectNodeContents(target); - - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); -} - /* * Walks the user through the process of creating an e2e key backup * on the server. @@ -101,8 +92,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { } _onCopyClick = () => { - selectText(this._recoveryKeyNode); - const successful = document.execCommand('copy'); + const successful = copyNode(this._recoveryKeyNode); if (successful) { this.setState({ copied: true, diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index d63db617d5..cfad49c38d 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -24,6 +24,7 @@ import FileSaver from 'file-saver'; import { _t } from '../../../../languageHandler'; import Modal from '../../../../Modal'; import { promptForBackupPassphrase } from '../../../../CrossSigningManager'; +import {copyNode} from "../../../../utils/strings"; const PHASE_LOADING = 0; const PHASE_MIGRATE = 1; @@ -38,16 +39,6 @@ const PHASE_CONFIRM_SKIP = 8; const PASSWORD_MIN_SCORE = 4; // So secure, many characters, much complex, wow, etc, etc. const PASSPHRASE_FEEDBACK_DELAY = 500; // How long after keystroke to offer passphrase feedback, ms. -// XXX: copied from ShareDialog: factor out into utils -function selectText(target) { - const range = document.createRange(); - range.selectNodeContents(target); - - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); -} - /* * Walks the user through the process of creating a passphrase to guard Secure * Secret Storage in account data. @@ -169,8 +160,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } _onCopyClick = () => { - selectText(this._recoveryKeyNode); - const successful = document.execCommand('copy'); + const successful = copyNode(this._recoveryKeyNode); if (successful) { this.setState({ copied: true, diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index 1bc9decd39..ebd1f8d1eb 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -23,6 +23,7 @@ import QRCode from 'qrcode-react'; import {RoomPermalinkCreator, makeGroupPermalink, makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import * as ContextMenu from "../../structures/ContextMenu"; import {toRightOf} from "../../structures/ContextMenu"; +import {copyPlaintext, selectText} from "../../../utils/strings"; const socials = [ { @@ -81,45 +82,26 @@ export default class ShareDialog extends React.Component { linkSpecificEvent: this.props.target instanceof MatrixEvent, permalinkCreator, }; - - this._link = createRef(); - } - - static _selectText(target) { - const range = document.createRange(); - range.selectNodeContents(target); - - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); } static onLinkClick(e) { e.preventDefault(); - const {target} = e; - ShareDialog._selectText(target); + selectText(e.target); } - onCopyClick(e) { + async onCopyClick(e) { e.preventDefault(); + const target = e.target; // copy target before we go async and React throws it away - ShareDialog._selectText(this._link.current); - - let successful; - try { - successful = document.execCommand('copy'); - } catch (err) { - console.error('Failed to copy: ', err); - } - - const buttonRect = e.target.getBoundingClientRect(); + const successful = await copyPlaintext(this.getUrl()); + const buttonRect = target.getBoundingClientRect(); const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu'); const {close} = ContextMenu.createMenu(GenericTextContextMenu, { ...toRightOf(buttonRect, 2), message: successful ? _t('Copied!') : _t('Failed to copy'), }); // Drop a reference to this close handler for componentWillUnmount - this.closeCopiedTooltip = e.target.onmouseleave = close; + this.closeCopiedTooltip = target.onmouseleave = close; } onLinkSpecificEventCheckboxClick() { @@ -134,10 +116,32 @@ export default class ShareDialog extends React.Component { if (this.closeCopiedTooltip) this.closeCopiedTooltip(); } - render() { - let title; + getUrl() { let matrixToUrl; + if (this.props.target instanceof Room) { + if (this.state.linkSpecificEvent) { + const events = this.props.target.getLiveTimeline().getEvents(); + matrixToUrl = this.state.permalinkCreator.forEvent(events[events.length - 1].getId()); + } else { + matrixToUrl = this.state.permalinkCreator.forRoom(); + } + } else if (this.props.target instanceof User || this.props.target instanceof RoomMember) { + matrixToUrl = makeUserPermalink(this.props.target.userId); + } else if (this.props.target instanceof Group) { + matrixToUrl = makeGroupPermalink(this.props.target.groupId); + } else if (this.props.target instanceof MatrixEvent) { + if (this.state.linkSpecificEvent) { + matrixToUrl = this.props.permalinkCreator.forEvent(this.props.target.getId()); + } else { + matrixToUrl = this.props.permalinkCreator.forRoom(); + } + } + return matrixToUrl; + } + + render() { + let title; let checkbox; if (this.props.target instanceof Room) { @@ -155,18 +159,10 @@ export default class ShareDialog extends React.Component {
    ; } - - if (this.state.linkSpecificEvent) { - matrixToUrl = this.state.permalinkCreator.forEvent(events[events.length - 1].getId()); - } else { - matrixToUrl = this.state.permalinkCreator.forRoom(); - } } else if (this.props.target instanceof User || this.props.target instanceof RoomMember) { title = _t('Share User'); - matrixToUrl = makeUserPermalink(this.props.target.userId); } else if (this.props.target instanceof Group) { title = _t('Share Community'); - matrixToUrl = makeGroupPermalink(this.props.target.groupId); } else if (this.props.target instanceof MatrixEvent) { title = _t('Share Room Message'); checkbox =
    @@ -178,14 +174,9 @@ export default class ShareDialog extends React.Component { { _t('Link to selected message') }
    ; - - if (this.state.linkSpecificEvent) { - matrixToUrl = this.props.permalinkCreator.forEvent(this.props.target.getId()); - } else { - matrixToUrl = this.props.permalinkCreator.forRoom(); - } } + const matrixToUrl = this.getUrl(); const encodedUrl = encodeURIComponent(matrixToUrl); const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); @@ -196,8 +187,7 @@ export default class ShareDialog extends React.Component { >
    - diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 27514d0e23..882e331675 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -34,6 +34,7 @@ import {pillifyLinks, unmountPills} from '../../../utils/pillify'; import {IntegrationManagers} from "../../../integrations/IntegrationManagers"; import {isPermalinkHost} from "../../../utils/permalinks/Permalinks"; import {toRightOf} from "../../structures/ContextMenu"; +import {copyPlaintext} from "../../../utils/strings"; export default createReactClass({ displayName: 'TextualBody', @@ -69,23 +70,6 @@ export default createReactClass({ }; }, - copyToClipboard: function(text) { - const textArea = document.createElement("textarea"); - textArea.value = text; - document.body.appendChild(textArea); - textArea.select(); - - let successful = false; - try { - successful = document.execCommand('copy'); - } catch (err) { - console.log('Unable to copy'); - } - - document.body.removeChild(textArea); - return successful; - }, - // TODO: [REACT-WARNING] Replace component with real class, use constructor for refs UNSAFE_componentWillMount: function() { this._content = createRef(); @@ -277,17 +261,17 @@ export default createReactClass({ Array.from(ReactDOM.findDOMNode(this).querySelectorAll('.mx_EventTile_body pre')).forEach((p) => { const button = document.createElement("span"); button.className = "mx_EventTile_copyButton"; - button.onclick = (e) => { + button.onclick = async () => { const copyCode = button.parentNode.getElementsByTagName("pre")[0]; - const successful = this.copyToClipboard(copyCode.textContent); + const successful = await copyPlaintext(copyCode.textContent); - const buttonRect = e.target.getBoundingClientRect(); + const buttonRect = button.getBoundingClientRect(); const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu'); const {close} = ContextMenu.createMenu(GenericTextContextMenu, { ...toRightOf(buttonRect, 2), message: successful ? _t('Copied!') : _t('Failed to copy'), }); - e.target.onmouseleave = close; + button.onmouseleave = close; }; // Wrap a div around
     so that the copy button can be correctly positioned
    diff --git a/src/utils/strings.ts b/src/utils/strings.ts
    new file mode 100644
    index 0000000000..7d1fa0049d
    --- /dev/null
    +++ b/src/utils/strings.ts
    @@ -0,0 +1,75 @@
    +/*
    +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.
    +*/
    +
    +/**
    + * Copy plaintext to user's clipboard
    + * It will overwrite user's selection range
    + * In certain browsers it may only work if triggered by a user action or may ask user for permissions
    + * Tries to use new async clipboard API if available
    + * @param text the plaintext to put in the user's clipboard
    + */
    +export async function copyPlaintext(text: string): Promise {
    +    try {
    +        if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
    +            await navigator.clipboard.writeText(text);
    +            return true;
    +        } else {
    +            const textArea = document.createElement("textarea");
    +            textArea.value = text;
    +
    +            // Avoid scrolling to bottom
    +            textArea.style.top = "0";
    +            textArea.style.left = "0";
    +            textArea.style.position = "fixed";
    +
    +            document.body.appendChild(textArea);
    +            const selection = document.getSelection();
    +            const range = document.createRange();
    +            // range.selectNodeContents(textArea);
    +            range.selectNode(textArea);
    +            selection.removeAllRanges();
    +            selection.addRange(range);
    +
    +            const successful = document.execCommand("copy");
    +            selection.removeAllRanges();
    +            document.body.removeChild(textArea);
    +            return successful;
    +        }
    +    } catch (e) {
    +        console.error(e);
    +    }
    +    return false;
    +}
    +
    +export function selectText(target: Element) {
    +    const range = document.createRange();
    +    range.selectNodeContents(target);
    +
    +    const selection = window.getSelection();
    +    selection.removeAllRanges();
    +    selection.addRange(range);
    +}
    +
    +/**
    + * Copy rich text to user's clipboard
    + * It will overwrite user's selection range
    + * In certain browsers it may only work if triggered by a user action or may ask user for permissions
    + * @param ref pointer to the node to copy
    + */
    +export function copyNode(ref: Element): boolean {
    +    selectText(ref);
    +    return document.execCommand('copy');
    +}
    
    From 276b5b874c1a8e7c4fa826c7fba0507fcc9babbe Mon Sep 17 00:00:00 2001
    From: Michael Telatynski <7t3chguy@gmail.com>
    Date: Wed, 15 Apr 2020 00:22:19 +0100
    Subject: [PATCH 185/230] Convert ShareDialog to Typescript
    
    Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
    ---
     .../{ShareDialog.js => ShareDialog.tsx}       | 45 +++++++++++++------
     1 file changed, 32 insertions(+), 13 deletions(-)
     rename src/components/views/dialogs/{ShareDialog.js => ShareDialog.tsx} (86%)
    
    diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.tsx
    similarity index 86%
    rename from src/components/views/dialogs/ShareDialog.js
    rename to src/components/views/dialogs/ShareDialog.tsx
    index ebd1f8d1eb..375cb65b5f 100644
    --- a/src/components/views/dialogs/ShareDialog.js
    +++ b/src/components/views/dialogs/ShareDialog.tsx
    @@ -1,5 +1,6 @@
     /*
     Copyright 2018 New Vector Ltd
    +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.
    @@ -14,9 +15,13 @@ See the License for the specific language governing permissions and
     limitations under the License.
     */
     
    -import React, {createRef} from 'react';
    -import PropTypes from 'prop-types';
    -import {Room, User, Group, RoomMember, MatrixEvent} from 'matrix-js-sdk';
    +import * as React from 'react';
    +import * as PropTypes from 'prop-types';
    +import {Room} from "matrix-js-sdk/src/models/room";
    +import {User} from "matrix-js-sdk/src/models/user";
    +import {Group} from "matrix-js-sdk/src/models/group";
    +import {RoomMember} from "matrix-js-sdk/src/models/room-member";
    +import {MatrixEvent} from "matrix-js-sdk/src/models/event";
     import * as sdk from '../../../index';
     import { _t } from '../../../languageHandler';
     import QRCode from 'qrcode-react';
    @@ -53,7 +58,18 @@ const socials = [
         },
     ];
     
    -export default class ShareDialog extends React.Component {
    +interface IProps {
    +    onFinished: () => void;
    +    target: Room | User | Group | RoomMember | MatrixEvent;
    +    permalinkCreator: RoomPermalinkCreator;
    +}
    +
    +interface IState {
    +    linkSpecificEvent: boolean;
    +    permalinkCreator: RoomPermalinkCreator;
    +}
    +
    +export default class ShareDialog extends React.PureComponent {
         static propTypes = {
             onFinished: PropTypes.func.isRequired,
             target: PropTypes.oneOfType([
    @@ -65,6 +81,8 @@ export default class ShareDialog extends React.Component {
             ]).isRequired,
         };
     
    +    protected closeCopiedTooltip: () => void;
    +
         constructor(props) {
             super(props);
     
    @@ -206,17 +224,18 @@ export default class ShareDialog extends React.Component {
                             
                         
    From 95eaf94cd89c12c56eb2e909fb4d9a5c8092f27f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 00:40:38 +0100 Subject: [PATCH 186/230] Fix pills being broken by unescaped characters Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/editor/deserialize.js | 2 +- src/editor/serialize.js | 2 +- test/editor/deserialize-test.js | 16 ++++++++++++++++ test/editor/serialize-test.js | 12 ++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/editor/deserialize.js b/src/editor/deserialize.js index 190963f357..d80a62b981 100644 --- a/src/editor/deserialize.js +++ b/src/editor/deserialize.js @@ -50,7 +50,7 @@ function parseLink(a, partCreator) { if (href === a.textContent) { return partCreator.plain(a.textContent); } else { - return partCreator.plain(`[${a.textContent}](${href})`); + return partCreator.plain(`[${a.textContent.replace(/[\\\]]/, c => "\\" + c)}](${href})`); } } } diff --git a/src/editor/serialize.js b/src/editor/serialize.js index ba380f2809..341d92d3c8 100644 --- a/src/editor/serialize.js +++ b/src/editor/serialize.js @@ -30,7 +30,7 @@ export function mdSerialize(model) { return html + part.text; case "room-pill": case "user-pill": - return html + `[${part.text}](${makeGenericPermalink(part.resourceId)})`; + return html + `[${part.text.replace(/[\\\]]/, c => "\\" + c)}](${makeGenericPermalink(part.resourceId)})`; } }, ""); } diff --git a/test/editor/deserialize-test.js b/test/editor/deserialize-test.js index 1c58a6c40b..be8fe8aeab 100644 --- a/test/editor/deserialize-test.js +++ b/test/editor/deserialize-test.js @@ -148,6 +148,22 @@ describe('editor/deserialize', function() { expect(parts[1]).toStrictEqual({type: "user-pill", text: "Alice", resourceId: "@alice:hs.tld"}); expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); }); + it('user pill with displayname containing backslash', function() { + const html = "Hi Alice\!"; + const parts = normalize(parseEvent(htmlMessage(html), createPartCreator())); + expect(parts.length).toBe(3); + expect(parts[0]).toStrictEqual({type: "plain", text: "Hi "}); + expect(parts[1]).toStrictEqual({type: "user-pill", text: "Alice\\", resourceId: "@alice:hs.tld"}); + expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); + }); + it('user pill with displayname containing closing square bracket', function() { + const html = "Hi Alice]!"; + const parts = normalize(parseEvent(htmlMessage(html), createPartCreator())); + expect(parts.length).toBe(3); + expect(parts[0]).toStrictEqual({type: "plain", text: "Hi "}); + expect(parts[1]).toStrictEqual({type: "user-pill", text: "Alice]", resourceId: "@alice:hs.tld"}); + expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); + }); it('room pill', function() { const html = "Try #room:hs.tld?"; const parts = normalize(parseEvent(htmlMessage(html), createPartCreator())); diff --git a/test/editor/serialize-test.js b/test/editor/serialize-test.js index 7517e46437..d5fb800600 100644 --- a/test/editor/serialize-test.js +++ b/test/editor/serialize-test.js @@ -43,4 +43,16 @@ describe('editor/serialize', function() { const html = htmlSerializeIfNeeded(model, {}); expect(html).toBe("hello world"); }); + it('displaynames ending in a backslash work', function () { + const pc = createPartCreator(); + const model = new EditorModel([pc.userPill("Displayname\\", "@user:server")]); + const html = htmlSerializeIfNeeded(model, {}); + expect(html).toBe("Displayname\"); + }); + it('displaynames containing a closing square bracket work', function () { + const pc = createPartCreator(); + const model = new EditorModel([pc.userPill("Displayname]", "@user:server")]); + const html = htmlSerializeIfNeeded(model, {}); + expect(html).toBe("Displayname]"); + }); }); From c72139fc3f5de58371d3b4e998e1b0b1d8223c3a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 00:49:08 +0100 Subject: [PATCH 187/230] Convert serialize and deserialize to TypeScript Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/editor/{deserialize.js => deserialize.ts} | 36 +++++++++++-------- src/editor/{serialize.js => serialize.ts} | 19 +++++----- 2 files changed, 32 insertions(+), 23 deletions(-) rename src/editor/{deserialize.js => deserialize.ts} (87%) rename src/editor/{serialize.js => serialize.ts} (82%) diff --git a/src/editor/deserialize.js b/src/editor/deserialize.ts similarity index 87% rename from src/editor/deserialize.js rename to src/editor/deserialize.ts index d80a62b981..8878a8877c 100644 --- a/src/editor/deserialize.js +++ b/src/editor/deserialize.ts @@ -1,6 +1,6 @@ /* Copyright 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 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. @@ -15,11 +15,14 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; + import { walkDOMDepthFirst } from "./dom"; import { checkBlockNode } from "../HtmlUtils"; -import {getPrimaryPermalinkEntity} from "../utils/permalinks/Permalinks"; +import { getPrimaryPermalinkEntity } from "../utils/permalinks/Permalinks"; +import { PartCreator } from "./parts"; -function parseAtRoomMentions(text, partCreator) { +function parseAtRoomMentions(text: string, partCreator: PartCreator) { const ATROOM = "@room"; const parts = []; text.split(ATROOM).forEach((textPart, i, arr) => { @@ -37,7 +40,7 @@ function parseAtRoomMentions(text, partCreator) { return parts; } -function parseLink(a, partCreator) { +function parseLink(a: HTMLAnchorElement, partCreator: PartCreator) { const {href} = a; const resourceId = getPrimaryPermalinkEntity(href); // The room/user ID const prefix = resourceId ? resourceId[0] : undefined; // First character of ID @@ -56,11 +59,11 @@ function parseLink(a, partCreator) { } } -function parseCodeBlock(n, partCreator) { +function parseCodeBlock(n: HTMLElement, partCreator: PartCreator) { const parts = []; let language = ""; if (n.firstChild && n.firstChild.nodeName === "CODE") { - for (const className of n.firstChild.classList) { + for (const className of (n.firstChild).classList) { if (className.startsWith("language-")) { language = className.substr("language-".length); break; @@ -77,12 +80,17 @@ function parseCodeBlock(n, partCreator) { return parts; } -function parseHeader(el, partCreator) { +function parseHeader(el: HTMLElement, partCreator: PartCreator) { const depth = parseInt(el.nodeName.substr(1), 10); return partCreator.plain("#".repeat(depth) + " "); } -function parseElement(n, partCreator, lastNode, state) { +interface IState { + listIndex: number[]; + listDepth?: number; +} + +function parseElement(n: HTMLElement, partCreator: PartCreator, lastNode: HTMLElement | undefined, state: IState) { switch (n.nodeName) { case "H1": case "H2": @@ -92,7 +100,7 @@ function parseElement(n, partCreator, lastNode, state) { case "H6": return parseHeader(n, partCreator); case "A": - return parseLink(n, partCreator); + return parseLink(n, partCreator); case "BR": return partCreator.newline(); case "EM": @@ -123,7 +131,7 @@ function parseElement(n, partCreator, lastNode, state) { break; } case "OL": - state.listIndex.push(n.start || 1); + state.listIndex.push((n).start || 1); // fallthrough case "UL": state.listDepth = (state.listDepth || 0) + 1; @@ -174,7 +182,7 @@ function prefixQuoteLines(isFirstNode, parts, partCreator) { } } -function parseHtmlMessage(html, partCreator, isQuotedMessage) { +function parseHtmlMessage(html: string, partCreator: PartCreator, isQuotedMessage: boolean) { // no nodes from parsing here should be inserted in the document, // as scripts in event handlers, etc would be executed then. // we're only taking text, so that is fine @@ -182,7 +190,7 @@ function parseHtmlMessage(html, partCreator, isQuotedMessage) { const parts = []; let lastNode; let inQuote = isQuotedMessage; - const state = { + const state: IState = { listIndex: [], }; @@ -249,7 +257,7 @@ function parseHtmlMessage(html, partCreator, isQuotedMessage) { return parts; } -export function parsePlainTextMessage(body, partCreator, isQuotedMessage) { +export function parsePlainTextMessage(body: string, partCreator: PartCreator, isQuotedMessage: boolean) { const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n, collapses \r\n const parts = lines.reduce((parts, line, i) => { if (isQuotedMessage) { @@ -265,7 +273,7 @@ export function parsePlainTextMessage(body, partCreator, isQuotedMessage) { return parts; } -export function parseEvent(event, partCreator, {isQuotedMessage = false} = {}) { +export function parseEvent(event: MatrixEvent, partCreator: PartCreator, {isQuotedMessage = false} = {}) { const content = event.getContent(); let parts; if (content.format === "org.matrix.custom.html") { diff --git a/src/editor/serialize.js b/src/editor/serialize.ts similarity index 82% rename from src/editor/serialize.js rename to src/editor/serialize.ts index 341d92d3c8..9ff1cfbd80 100644 --- a/src/editor/serialize.js +++ b/src/editor/serialize.ts @@ -1,6 +1,6 @@ /* Copyright 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 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. @@ -17,8 +17,9 @@ limitations under the License. import Markdown from '../Markdown'; import {makeGenericPermalink} from "../utils/permalinks/Permalinks"; +import EditorModel from "./model"; -export function mdSerialize(model) { +export function mdSerialize(model: EditorModel) { return model.parts.reduce((html, part) => { switch (part.type) { case "newline": @@ -35,7 +36,7 @@ export function mdSerialize(model) { }, ""); } -export function htmlSerializeIfNeeded(model, {forceHTML = false} = {}) { +export function htmlSerializeIfNeeded(model: EditorModel, {forceHTML = false} = {}) { const md = mdSerialize(model); const parser = new Markdown(md); if (!parser.isPlainText() || forceHTML) { @@ -43,7 +44,7 @@ export function htmlSerializeIfNeeded(model, {forceHTML = false} = {}) { } } -export function textSerialize(model) { +export function textSerialize(model: EditorModel) { return model.parts.reduce((text, part) => { switch (part.type) { case "newline": @@ -60,11 +61,11 @@ export function textSerialize(model) { }, ""); } -export function containsEmote(model) { +export function containsEmote(model: EditorModel) { return startsWith(model, "/me "); } -export function startsWith(model, prefix) { +export function startsWith(model: EditorModel, prefix: string) { const firstPart = model.parts[0]; // part type will be "plain" while editing, // and "command" while composing a message. @@ -73,18 +74,18 @@ export function startsWith(model, prefix) { firstPart.text.startsWith(prefix); } -export function stripEmoteCommand(model) { +export function stripEmoteCommand(model: EditorModel) { // trim "/me " return stripPrefix(model, "/me "); } -export function stripPrefix(model, prefix) { +export function stripPrefix(model: EditorModel, prefix: string) { model = model.clone(); model.removeText({index: 0, offset: 0}, prefix.length); return model; } -export function unescapeMessage(model) { +export function unescapeMessage(model: EditorModel) { const {parts} = model; if (parts.length) { const firstPart = parts[0]; From f1def8b0de4eadaa6672cb87d3fa3ffc80d6c43b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 00:50:28 +0100 Subject: [PATCH 188/230] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- test/editor/deserialize-test.js | 2 +- test/editor/serialize-test.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/editor/deserialize-test.js b/test/editor/deserialize-test.js index be8fe8aeab..4184552559 100644 --- a/test/editor/deserialize-test.js +++ b/test/editor/deserialize-test.js @@ -149,7 +149,7 @@ describe('editor/deserialize', function() { expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); }); it('user pill with displayname containing backslash', function() { - const html = "Hi Alice\!"; + const html = "Hi Alice\\!"; const parts = normalize(parseEvent(htmlMessage(html), createPartCreator())); expect(parts.length).toBe(3); expect(parts[0]).toStrictEqual({type: "plain", text: "Hi "}); diff --git a/test/editor/serialize-test.js b/test/editor/serialize-test.js index d5fb800600..a69e3598e3 100644 --- a/test/editor/serialize-test.js +++ b/test/editor/serialize-test.js @@ -43,13 +43,13 @@ describe('editor/serialize', function() { const html = htmlSerializeIfNeeded(model, {}); expect(html).toBe("hello world"); }); - it('displaynames ending in a backslash work', function () { + it('displaynames ending in a backslash work', function() { const pc = createPartCreator(); const model = new EditorModel([pc.userPill("Displayname\\", "@user:server")]); const html = htmlSerializeIfNeeded(model, {}); - expect(html).toBe("Displayname\"); + expect(html).toBe("Displayname\\"); }); - it('displaynames containing a closing square bracket work', function () { + it('displaynames containing a closing square bracket work', function() { const pc = createPartCreator(); const model = new EditorModel([pc.userPill("Displayname]", "@user:server")]); const html = htmlSerializeIfNeeded(model, {}); From cb10640eafed873a9dce27c9f357b33c22430b2e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 00:53:35 +0100 Subject: [PATCH 189/230] detslint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/editor/deserialize.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/editor/deserialize.ts b/src/editor/deserialize.ts index 8878a8877c..6680029130 100644 --- a/src/editor/deserialize.ts +++ b/src/editor/deserialize.ts @@ -132,10 +132,10 @@ function parseElement(n: HTMLElement, partCreator: PartCreator, lastNode: HTMLEl } case "OL": state.listIndex.push((n).start || 1); - // fallthrough + /* falls through */ case "UL": state.listDepth = (state.listDepth || 0) + 1; - // fallthrough + /* falls through */ default: // don't textify block nodes we'll descend into if (!checkDescendInto(n)) { @@ -244,7 +244,7 @@ function parseHtmlMessage(html: string, partCreator: PartCreator, isQuotedMessag break; case "OL": state.listIndex.pop(); - // fallthrough + /* falls through */ case "UL": state.listDepth -= 1; break; @@ -259,7 +259,7 @@ function parseHtmlMessage(html: string, partCreator: PartCreator, isQuotedMessag export function parsePlainTextMessage(body: string, partCreator: PartCreator, isQuotedMessage: boolean) { const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n, collapses \r\n - const parts = lines.reduce((parts, line, i) => { + return lines.reduce((parts, line, i) => { if (isQuotedMessage) { parts.push(partCreator.plain(QUOTE_LINE_PREFIX)); } @@ -270,7 +270,6 @@ export function parsePlainTextMessage(body: string, partCreator: PartCreator, is } return parts; }, []); - return parts; } export function parseEvent(event: MatrixEvent, partCreator: PartCreator, {isQuotedMessage = false} = {}) { From 4454db30d67e9ff82848da0a6d242f1452e9f93a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 01:02:08 +0100 Subject: [PATCH 190/230] Escape opening square bracket too Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/editor/deserialize.ts | 2 +- src/editor/serialize.ts | 2 +- test/editor/deserialize-test.js | 8 ++++++++ test/editor/serialize-test.js | 6 ++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/editor/deserialize.ts b/src/editor/deserialize.ts index 6680029130..5322f09f11 100644 --- a/src/editor/deserialize.ts +++ b/src/editor/deserialize.ts @@ -53,7 +53,7 @@ function parseLink(a: HTMLAnchorElement, partCreator: PartCreator) { if (href === a.textContent) { return partCreator.plain(a.textContent); } else { - return partCreator.plain(`[${a.textContent.replace(/[\\\]]/, c => "\\" + c)}](${href})`); + return partCreator.plain(`[${a.textContent.replace(/[[\\\]]/, c => "\\" + c)}](${href})`); } } } diff --git a/src/editor/serialize.ts b/src/editor/serialize.ts index 9ff1cfbd80..d501bdd47e 100644 --- a/src/editor/serialize.ts +++ b/src/editor/serialize.ts @@ -31,7 +31,7 @@ export function mdSerialize(model: EditorModel) { return html + part.text; case "room-pill": case "user-pill": - return html + `[${part.text.replace(/[\\\]]/, c => "\\" + c)}](${makeGenericPermalink(part.resourceId)})`; + return html + `[${part.text.replace(/[[\\\]]/, c => "\\" + c)}](${makeGenericPermalink(part.resourceId)})`; } }, ""); } diff --git a/test/editor/deserialize-test.js b/test/editor/deserialize-test.js index 4184552559..fb97d75752 100644 --- a/test/editor/deserialize-test.js +++ b/test/editor/deserialize-test.js @@ -156,6 +156,14 @@ describe('editor/deserialize', function() { expect(parts[1]).toStrictEqual({type: "user-pill", text: "Alice\\", resourceId: "@alice:hs.tld"}); expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); }); + it('user pill with displayname containing opening square bracket', function() { + const html = "Hi Alice[!"; + const parts = normalize(parseEvent(htmlMessage(html), createPartCreator())); + expect(parts.length).toBe(3); + expect(parts[0]).toStrictEqual({type: "plain", text: "Hi "}); + expect(parts[1]).toStrictEqual({type: "user-pill", text: "Alice[", resourceId: "@alice:hs.tld"}); + expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); + }); it('user pill with displayname containing closing square bracket', function() { const html = "Hi Alice]!"; const parts = normalize(parseEvent(htmlMessage(html), createPartCreator())); diff --git a/test/editor/serialize-test.js b/test/editor/serialize-test.js index a69e3598e3..a114f89de2 100644 --- a/test/editor/serialize-test.js +++ b/test/editor/serialize-test.js @@ -49,6 +49,12 @@ describe('editor/serialize', function() { const html = htmlSerializeIfNeeded(model, {}); expect(html).toBe("Displayname\\"); }); + it('displaynames containing an opening square bracket work', function() { + const pc = createPartCreator(); + const model = new EditorModel([pc.userPill("Displayname[", "@user:server")]); + const html = htmlSerializeIfNeeded(model, {}); + expect(html).toBe("Displayname["); + }); it('displaynames containing a closing square bracket work', function() { const pc = createPartCreator(); const model = new EditorModel([pc.userPill("Displayname]", "@user:server")]); From 9c1939b75679980f14f3ee550af00e65346c1fd0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 02:31:30 +0100 Subject: [PATCH 191/230] match all, not just first instance of tokens to escape Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/editor/deserialize.ts | 2 +- src/editor/serialize.ts | 2 +- test/editor/deserialize-test.js | 4 ++-- test/editor/serialize-test.js | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/editor/deserialize.ts b/src/editor/deserialize.ts index 5322f09f11..48d1d98ae4 100644 --- a/src/editor/deserialize.ts +++ b/src/editor/deserialize.ts @@ -53,7 +53,7 @@ function parseLink(a: HTMLAnchorElement, partCreator: PartCreator) { if (href === a.textContent) { return partCreator.plain(a.textContent); } else { - return partCreator.plain(`[${a.textContent.replace(/[[\\\]]/, c => "\\" + c)}](${href})`); + return partCreator.plain(`[${a.textContent.replace(/[[\\\]]/g, c => "\\" + c)}](${href})`); } } } diff --git a/src/editor/serialize.ts b/src/editor/serialize.ts index d501bdd47e..4d0b8cd03a 100644 --- a/src/editor/serialize.ts +++ b/src/editor/serialize.ts @@ -31,7 +31,7 @@ export function mdSerialize(model: EditorModel) { return html + part.text; case "room-pill": case "user-pill": - return html + `[${part.text.replace(/[[\\\]]/, c => "\\" + c)}](${makeGenericPermalink(part.resourceId)})`; + return html + `[${part.text.replace(/[[\\\]]/g, c => "\\" + c)}](${makeGenericPermalink(part.resourceId)})`; } }, ""); } diff --git a/test/editor/deserialize-test.js b/test/editor/deserialize-test.js index fb97d75752..2bd5d7e4c6 100644 --- a/test/editor/deserialize-test.js +++ b/test/editor/deserialize-test.js @@ -157,11 +157,11 @@ describe('editor/deserialize', function() { expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); }); it('user pill with displayname containing opening square bracket', function() { - const html = "Hi Alice[!"; + const html = "Hi Alice[[!"; const parts = normalize(parseEvent(htmlMessage(html), createPartCreator())); expect(parts.length).toBe(3); expect(parts[0]).toStrictEqual({type: "plain", text: "Hi "}); - expect(parts[1]).toStrictEqual({type: "user-pill", text: "Alice[", resourceId: "@alice:hs.tld"}); + expect(parts[1]).toStrictEqual({type: "user-pill", text: "Alice[[", resourceId: "@alice:hs.tld"}); expect(parts[2]).toStrictEqual({type: "plain", text: "!"}); }); it('user pill with displayname containing closing square bracket', function() { diff --git a/test/editor/serialize-test.js b/test/editor/serialize-test.js index a114f89de2..bd26ae91bb 100644 --- a/test/editor/serialize-test.js +++ b/test/editor/serialize-test.js @@ -51,9 +51,9 @@ describe('editor/serialize', function() { }); it('displaynames containing an opening square bracket work', function() { const pc = createPartCreator(); - const model = new EditorModel([pc.userPill("Displayname[", "@user:server")]); + const model = new EditorModel([pc.userPill("Displayname[[", "@user:server")]); const html = htmlSerializeIfNeeded(model, {}); - expect(html).toBe("Displayname["); + expect(html).toBe("Displayname[["); }); it('displaynames containing a closing square bracket work', function() { const pc = createPartCreator(); From e9c755e73fe87015719dc2f872d5526e22ec1f9a Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 15 Apr 2020 10:25:05 +0100 Subject: [PATCH 192/230] Remove end-to-end message info option when cross-signing is used This end-to-end info dialog repeats info available elsewhere and has not been updated to make sense for cross-signing, triggers old verification methods, etc. For now, this hides the option to present a more consistent UI. Relates to https://github.com/vector-im/riot-web/issues/11752 --- src/components/views/messages/MessageActionBar.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index fbc864caf2..5516ff2146 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -26,6 +26,7 @@ import Modal from '../../../Modal'; import {aboveLeftOf, ContextMenu, ContextMenuButton, useContextMenu} from '../../structures/ContextMenu'; import { isContentActionable, canEditContent } from '../../../utils/EventUtils'; import RoomContext from "../../../contexts/RoomContext"; +import SettingsStore from '../../../settings/SettingsStore'; const OptionsButton = ({mxEvent, getTile, getReplyThread, permalinkCreator, onFocusChange}) => { const [menuDisplayed, button, openMenu, closeMenu] = useContextMenu(); @@ -48,7 +49,7 @@ const OptionsButton = ({mxEvent, getTile, getReplyThread, permalinkCreator, onFo }; let e2eInfoCallback = null; - if (mxEvent.isEncrypted()) { + if (mxEvent.isEncrypted() && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { e2eInfoCallback = onCryptoClick; } From 346b2e8588752f68f70a8df47fa8000a6cb55e44 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 12:21:49 +0100 Subject: [PATCH 193/230] Login block on initialSync with spinners Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/auth/_AuthBody.scss | 18 ++++++++++++ src/components/structures/MatrixChat.js | 23 +++++---------- src/components/structures/auth/Login.js | 33 +++++++++++++++++++--- src/components/views/auth/PasswordLogin.js | 5 ++-- 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index 468a4b3d62..4b2d6b1bf1 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -119,6 +119,24 @@ limitations under the License. margin-right: 0; } +.mx_AuthBody_paddedFooter { + height: 80px; // height of the submit button + register link + padding-top: 28px; + text-align: center; + + .mx_AuthBody_paddedFooter_title { + margin-top: 16px; + font-size: $font-15px; + line-height: $font-24px; + } + + .mx_AuthBody_paddedFooter_subtitle { + margin-top: 8px; + font-size: $font-10px; + line-height: $font-14px; + } +} + .mx_AuthBody_changeFlow { display: block; text-align: center; diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index da416142f8..61b72f650b 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1906,23 +1906,12 @@ export default createReactClass({ this._onLoggedIn(); } - // Test for the master cross-signing key in SSSS as a quick proxy for - // whether cross-signing has been set up on the account. We can't - // really continue until we know whether it's there or not so retry - // if this fails. - let masterKeyInStorage; - while (masterKeyInStorage === undefined) { - try { - masterKeyInStorage = !!await cli.getAccountDataFromServer("m.cross_signing.master"); - } catch (e) { - if (e.errcode === "M_NOT_FOUND") { - masterKeyInStorage = false; - } else { - console.warn("Secret storage account data check failed: retrying...", e); - } - } - } + this.setState({ pendingInitialSync: true }); + await this.firstSyncPromise.promise; + // Test for the master cross-signing key in SSSS as a quick proxy for + // whether cross-signing has been set up on the account. + const masterKeyInStorage = !!cli.getAccountData("m.cross_signing.master"); if (masterKeyInStorage) { // Auto-enable cross-signing for the new session when key found in // secret storage. @@ -1939,6 +1928,7 @@ export default createReactClass({ } else { this._onLoggedIn(); } + this.setState({ pendingInitialSync: false }); return setLoggedInPromise; }, @@ -2060,6 +2050,7 @@ export default createReactClass({ const Login = sdk.getComponent('structures.auth.Login'); view = ( ); }, @@ -629,9 +635,11 @@ export default createReactClass({ render: function() { const Loader = sdk.getComponent("elements.Spinner"); + const InlineSpinner = sdk.getComponent("elements.InlineSpinner"); const AuthHeader = sdk.getComponent("auth.AuthHeader"); const AuthBody = sdk.getComponent("auth.AuthBody"); - const loader = this.isBusy() ?
    : null; + const loader = this.isBusy() && !this.state.busyLoggingIn ? +
    : null; const errorText = this.state.errorText; @@ -658,6 +666,25 @@ export default createReactClass({ ); } + let footer; + if (this.props.isSyncing || this.state.busyLoggingIn) { + footer =
    +
    + + { this.props.isSyncing ? _t("Syncing...") : _t("Signing In...") } +
    + { this.props.isSyncing &&
    + {_t("If you've joined lots of rooms, this might take a while")} +
    } +
    ; + } else { + footer = ( + + { _t('Create account') } + + ); + } + return ( @@ -670,9 +697,7 @@ export default createReactClass({ { serverDeadSection } { this.renderServerComponent() } { this.renderLoginComponentForStep() } - - { _t('Create account') } - + { footer } ); diff --git a/src/components/views/auth/PasswordLogin.js b/src/components/views/auth/PasswordLogin.js index e64b8360c3..d27e4a8259 100644 --- a/src/components/views/auth/PasswordLogin.js +++ b/src/components/views/auth/PasswordLogin.js @@ -43,6 +43,7 @@ export default class PasswordLogin extends React.Component { onPasswordChanged: PropTypes.func, loginIncorrect: PropTypes.bool, disableSubmit: PropTypes.bool, + hideSubmit: PropTypes.bool, serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired, }; @@ -332,11 +333,11 @@ export default class PasswordLogin extends React.Component { disabled={this.props.disableSubmit} /> {forgotPasswordJsx} - + /> }
    ); From 76ce4081cbc0769b0eb702dab26ea539905bbf48 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 12:31:27 +0100 Subject: [PATCH 194/230] i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/en_EN.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3c5be84f20..84c172ea4d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2102,6 +2102,9 @@ "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.", "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.": "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.", + "Syncing...": "Syncing...", + "Signing In...": "Signing In...", + "If you've joined lots of rooms, this might take a while": "If you've joined lots of rooms, this might take a while", "Create account": "Create account", "Failed to fetch avatar URL": "Failed to fetch avatar URL", "Set a display name:": "Set a display name:", From 8b25223026d6406929f4d6ab7d6b6ab091b1007a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 13:45:12 +0100 Subject: [PATCH 195/230] fix onLoggedIn getting called twice Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MatrixChat.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 61b72f650b..519b39d436 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1902,13 +1902,19 @@ export default createReactClass({ const cli = MatrixClientPeg.get(); // We're checking `isCryptoAvailable` here instead of `isCryptoEnabled` // because the client hasn't been started yet. - if (!isCryptoAvailable()) { + const cryptoAvailable = isCryptoAvailable(); + if (!cryptoAvailable) { this._onLoggedIn(); } this.setState({ pendingInitialSync: true }); await this.firstSyncPromise.promise; + if (!cryptoAvailable) { + this.setState({ pendingInitialSync: false }); + return setLoggedInPromise; + } + // Test for the master cross-signing key in SSSS as a quick proxy for // whether cross-signing has been set up on the account. const masterKeyInStorage = !!cli.getAccountData("m.cross_signing.master"); From ac26719b691493e339f2da7c1cf3367a14d464c5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 14:07:37 +0100 Subject: [PATCH 196/230] disable password reset button when spinning Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/auth/_Login.scss | 10 ++++++++++ src/components/structures/auth/Login.js | 2 +- src/components/views/auth/PasswordLogin.js | 21 +++++++++++++-------- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/res/css/structures/auth/_Login.scss b/res/css/structures/auth/_Login.scss index 4ce90cc6bd..02436833a2 100644 --- a/res/css/structures/auth/_Login.scss +++ b/res/css/structures/auth/_Login.scss @@ -89,3 +89,13 @@ limitations under the License. .mx_Login_underlinedServerName { border-bottom: 1px dashed $accent-color; } + +div.mx_AccessibleButton_kind_link.mx_Login_forgot { + // style it as a link + font-size: inherit; + padding: 0; + + &.mx_AccessibleButton_disabled { + cursor: not-allowed; + } +} diff --git a/src/components/structures/auth/Login.js b/src/components/structures/auth/Login.js index 93c93fd5ab..851ea30ba0 100644 --- a/src/components/structures/auth/Login.js +++ b/src/components/structures/auth/Login.js @@ -599,7 +599,7 @@ export default createReactClass({ loginIncorrect={this.state.loginIncorrect} serverConfig={this.props.serverConfig} disableSubmit={this.isBusy()} - hideSubmit={this.props.isSyncing || this.state.busyLoggingIn} + busy={this.props.isSyncing || this.state.busyLoggingIn} /> ); }, diff --git a/src/components/views/auth/PasswordLogin.js b/src/components/views/auth/PasswordLogin.js index d27e4a8259..aeaa91845b 100644 --- a/src/components/views/auth/PasswordLogin.js +++ b/src/components/views/auth/PasswordLogin.js @@ -23,6 +23,7 @@ import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils"; +import AccessibleButton from "../elements/AccessibleButton"; /** * A pure UI component which displays a username/password form. @@ -43,8 +44,8 @@ export default class PasswordLogin extends React.Component { onPasswordChanged: PropTypes.func, loginIncorrect: PropTypes.bool, disableSubmit: PropTypes.bool, - hideSubmit: PropTypes.bool, serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired, + busy: PropTypes.bool, }; static defaultProps = { @@ -266,12 +267,16 @@ export default class PasswordLogin extends React.Component { if (this.props.onForgotPasswordClick) { forgotPasswordJsx = {_t('Not sure of your password? Set a new one', {}, { - a: sub => - {sub} - , + a: sub => ( + + {sub} + + ), })} ; } @@ -333,7 +338,7 @@ export default class PasswordLogin extends React.Component { disabled={this.props.disableSubmit} /> {forgotPasswordJsx} - { !this.props.hideSubmit && Date: Wed, 15 Apr 2020 14:19:47 +0100 Subject: [PATCH 197/230] disable language dropdown too Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/elements/_Dropdown.scss | 4 ++++ src/components/structures/auth/Login.js | 2 +- src/components/views/auth/AuthHeader.js | 7 ++++++- src/components/views/auth/LanguageSelector.js | 6 ++++-- src/components/views/elements/LanguageDropdown.js | 1 + 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/res/css/views/elements/_Dropdown.scss b/res/css/views/elements/_Dropdown.scss index 0dd9656c9c..32a68d5252 100644 --- a/res/css/views/elements/_Dropdown.scss +++ b/res/css/views/elements/_Dropdown.scss @@ -33,6 +33,10 @@ limitations under the License. user-select: none; } +.mx_Dropdown_input.mx_AccessibleButton_disabled { + cursor: not-allowed; +} + .mx_Dropdown_input:focus { border-color: $input-focused-border-color; } diff --git a/src/components/structures/auth/Login.js b/src/components/structures/auth/Login.js index 851ea30ba0..5d3cb69417 100644 --- a/src/components/structures/auth/Login.js +++ b/src/components/structures/auth/Login.js @@ -687,7 +687,7 @@ export default createReactClass({ return ( - +

    {_t('Sign in')} diff --git a/src/components/views/auth/AuthHeader.js b/src/components/views/auth/AuthHeader.js index 133fd41359..6e787ba77c 100644 --- a/src/components/views/auth/AuthHeader.js +++ b/src/components/views/auth/AuthHeader.js @@ -16,12 +16,17 @@ limitations under the License. */ import React from 'react'; +import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import * as sdk from '../../../index'; export default createReactClass({ displayName: 'AuthHeader', + propTypes: { + disableLanguageSelector: PropTypes.bool, + }, + render: function() { const AuthHeaderLogo = sdk.getComponent('auth.AuthHeaderLogo'); const LanguageSelector = sdk.getComponent('views.auth.LanguageSelector'); @@ -29,7 +34,7 @@ export default createReactClass({ return (
    - +
    ); }, diff --git a/src/components/views/auth/LanguageSelector.js b/src/components/views/auth/LanguageSelector.js index 99578d4504..83db5d225b 100644 --- a/src/components/views/auth/LanguageSelector.js +++ b/src/components/views/auth/LanguageSelector.js @@ -28,12 +28,14 @@ function onChange(newLang) { } } -export default function LanguageSelector() { +export default function LanguageSelector({disabled}) { if (SdkConfig.get()['disable_login_language_selector']) return
    ; const LanguageDropdown = sdk.getComponent('views.elements.LanguageDropdown'); - return ; } diff --git a/src/components/views/elements/LanguageDropdown.js b/src/components/views/elements/LanguageDropdown.js index 18a7e95e85..e37109caff 100644 --- a/src/components/views/elements/LanguageDropdown.js +++ b/src/components/views/elements/LanguageDropdown.js @@ -114,6 +114,7 @@ export default class LanguageDropdown extends React.Component { searchEnabled={true} value={value} label={_t("Language Dropdown")} + disabled={this.props.disabled} > { options } ; From 8c2c777e2bec06fa01e4b06088f687870fa4b362 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 15 Apr 2020 17:37:32 +0200 Subject: [PATCH 198/230] disable reemitting on the client for events mapped from the indexer --- src/indexing/EventIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 1226b84b5b..e4e8f26031 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -383,7 +383,7 @@ export default class EventIndex extends EventEmitter { // We have a checkpoint, let us fetch some messages, again, very // conservatively to not bother our homeserver too much. - const eventMapper = client.getEventMapper(); + const eventMapper = client.getEventMapper({preventReEmit: true}); // TODO we need to ensure to use member lazy loading with this // request so we get the correct profiles. let res; From 49e1e6e59fa057f11aeaef08b1300d2b91a30e0b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 17:31:45 +0100 Subject: [PATCH 199/230] null-guard MatrixClientPeg in RoomViewStore Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/stores/RoomViewStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index b32e088a76..841734dfb7 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -159,7 +159,7 @@ class RoomViewStore extends Store { } case 'sync_state': this._setState({ - matrixClientIsReady: MatrixClientPeg.get().isInitialSyncComplete(), + matrixClientIsReady: MatrixClientPeg.get() && MatrixClientPeg.get().isInitialSyncComplete(), }); break; } From a37ecbbb34ef83ef6f38bae2895a95c325401cfe Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Apr 2020 19:24:33 +0100 Subject: [PATCH 200/230] update console.error --- src/utils/strings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/strings.ts b/src/utils/strings.ts index 7d1fa0049d..5856682445 100644 --- a/src/utils/strings.ts +++ b/src/utils/strings.ts @@ -49,7 +49,7 @@ export async function copyPlaintext(text: string): Promise { return successful; } } catch (e) { - console.error(e); + console.error("copyPlaintext failed", e); } return false; } From b4e2daaf46edfac87f1587b95dc63285a88e14fc Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 15 Apr 2020 13:18:42 -0600 Subject: [PATCH 201/230] Convert cross-signing feature flag to setting This is intended as a temporary measure until we're comfortable with removing the flag entirely. --- src/DeviceListener.js | 2 +- src/KeyRequestHandler.js | 4 ++-- .../views/dialogs/keybackup/CreateKeyBackupDialog.js | 2 +- src/components/structures/MatrixChat.js | 8 ++++---- src/components/structures/RightPanel.js | 4 ++-- src/components/structures/RoomView.js | 2 +- src/components/views/dialogs/CreateRoomDialog.js | 4 ++-- src/components/views/dialogs/DeviceVerifyDialog.js | 2 +- src/components/views/dialogs/InviteDialog.js | 2 +- src/components/views/messages/MessageActionBar.js | 2 +- src/components/views/right_panel/UserInfo.js | 10 +++++----- src/components/views/rooms/E2EIcon.js | 4 ++-- src/components/views/rooms/EventTile.js | 2 +- src/components/views/rooms/MemberTile.js | 2 +- src/components/views/rooms/MessageComposer.js | 2 +- src/components/views/rooms/RoomBreadcrumbs.js | 2 +- src/components/views/rooms/RoomHeader.js | 2 +- src/components/views/rooms/RoomTile.js | 6 +++--- src/components/views/settings/KeyBackupPanel.js | 2 +- .../views/settings/tabs/user/LabsUserSettingsTab.js | 1 + .../settings/tabs/user/SecurityUserSettingsTab.js | 2 +- src/createRoom.js | 2 +- src/settings/Settings.js | 4 ++-- src/verification.js | 2 +- 24 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index 21c844e11c..3201e4af45 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -124,7 +124,7 @@ export default class DeviceListener { const cli = MatrixClientPeg.get(); if ( - !SettingsStore.isFeatureEnabled("feature_cross_signing") || + !SettingsStore.getValue("feature_cross_signing") || !await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing") ) return; diff --git a/src/KeyRequestHandler.js b/src/KeyRequestHandler.js index 30f3b7d50e..ceaff0c54d 100644 --- a/src/KeyRequestHandler.js +++ b/src/KeyRequestHandler.js @@ -35,7 +35,7 @@ export default class KeyRequestHandler { handleKeyRequest(keyRequest) { // Ignore own device key requests if cross-signing lab enabled - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { return; } @@ -70,7 +70,7 @@ export default class KeyRequestHandler { handleKeyRequestCancellation(cancellation) { // Ignore own device key requests if cross-signing lab enabled - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { return; } diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 3a480a2579..55419cecff 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -77,7 +77,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { async componentDidMount() { const cli = MatrixClientPeg.get(); const secureSecretStorage = ( - SettingsStore.isFeatureEnabled("feature_cross_signing") && + SettingsStore.getValue("feature_cross_signing") && await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing") ); this.setState({ secureSecretStorage }); diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 519b39d436..1293ccc7e9 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1506,7 +1506,7 @@ export default createReactClass({ }); cli.on("crypto.verification.request", request => { - const isFlagOn = SettingsStore.isFeatureEnabled("feature_cross_signing"); + const isFlagOn = SettingsStore.getValue("feature_cross_signing"); if (!isFlagOn && !request.channel.deviceId) { request.cancel({code: "m.invalid_message", reason: "This client has cross-signing disabled"}); @@ -1556,7 +1556,7 @@ export default createReactClass({ // changing colour. More advanced behaviour will come once // we implement more settings. cli.setGlobalErrorOnUnknownDevices( - !SettingsStore.isFeatureEnabled("feature_cross_signing"), + !SettingsStore.getValue("feature_cross_signing"), ); } }, @@ -1921,10 +1921,10 @@ export default createReactClass({ if (masterKeyInStorage) { // Auto-enable cross-signing for the new session when key found in // secret storage. - SettingsStore.setFeatureEnabled("feature_cross_signing", true); + SettingsStore.setValue("feature_cross_signing", null, SettingLevel.DEVICE, true); this.setStateForNewView({ view: VIEWS.COMPLETE_SECURITY }); } else if ( - SettingsStore.isFeatureEnabled("feature_cross_signing") && + SettingsStore.getValue("feature_cross_signing") && await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing") ) { // This will only work if the feature is set to 'enable' in the config, diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 3c97d2f4ae..f5bdfdf40d 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -219,7 +219,7 @@ export default class RightPanel extends React.Component { break; case RIGHT_PANEL_PHASES.RoomMemberInfo: case RIGHT_PANEL_PHASES.EncryptionPanel: - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { const onClose = () => { dis.dispatch({ action: "view_user", @@ -246,7 +246,7 @@ export default class RightPanel extends React.Component { panel = ; break; case RIGHT_PANEL_PHASES.GroupMemberInfo: - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { const onClose = () => { dis.dispatch({ action: "view_user", diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 78bd34bf7f..179e0aa2e9 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -822,7 +822,7 @@ export default createReactClass({ }); return; } - if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (!SettingsStore.getValue("feature_cross_signing")) { room.hasUnverifiedDevices().then((hasUnverifiedDevices) => { this.setState({ e2eStatus: hasUnverifiedDevices ? "warning" : "verified", diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index f18e28b85e..fa8c7dd30e 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -65,7 +65,7 @@ export default createReactClass({ createOpts.creation_content = {'m.federate': false}; } - if (!this.state.isPublic && SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (!this.state.isPublic && SettingsStore.getValue("feature_cross_signing")) { opts.encryption = this.state.isEncrypted; } @@ -192,7 +192,7 @@ export default createReactClass({ } let e2eeSection; - if (!this.state.isPublic && SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (!this.state.isPublic && SettingsStore.getValue("feature_cross_signing")) { e2eeSection =

    { _t("You can’t disable this later. Bridges & most bots won’t work yet.") }

    diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index 39e391269c..a3f9430476 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -131,7 +131,7 @@ export default class DeviceVerifyDialog extends React.Component { } else { this._verifier = request.verifier; } - } else if (verifyingOwnDevice && SettingsStore.isFeatureEnabled("feature_cross_signing")) { + } else if (verifyingOwnDevice && SettingsStore.getValue("feature_cross_signing")) { this._request = await client.requestVerification(this.props.userId, [ verificationMethods.SAS, SHOW_QR_CODE_METHOD, diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index f0d5443cac..a46fa0df07 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -574,7 +574,7 @@ export default class InviteDialog extends React.PureComponent { const createRoomOptions = {inlineErrors: true}; - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { // Check whether all users have uploaded device keys before. // If so, enable encryption in the new room. const client = MatrixClientPeg.get(); diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index 5516ff2146..0cde90e417 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -49,7 +49,7 @@ const OptionsButton = ({mxEvent, getTile, getReplyThread, permalinkCreator, onFo }; let e2eInfoCallback = null; - if (mxEvent.isEncrypted() && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (mxEvent.isEncrypted() && !SettingsStore.getValue("feature_cross_signing")) { e2eInfoCallback = onCryptoClick; } diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index abe54b355e..862e4f7897 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -63,7 +63,7 @@ const _disambiguateDevices = (devices) => { }; export const getE2EStatus = (cli, userId, devices) => { - if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (!SettingsStore.getValue("feature_cross_signing")) { const hasUnverifiedDevice = devices.some((device) => device.isUnverified()); return hasUnverifiedDevice ? "warning" : "verified"; } @@ -111,7 +111,7 @@ async function openDMForUser(matrixClient, userId) { dmUserId: userId, }; - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { // Check whether all users have uploaded device keys before. // If so, enable encryption in the new room. const usersToDevicesMap = await matrixClient.downloadKeys([userId]); @@ -166,7 +166,7 @@ function DeviceItem({userId, device}) { // cross-signing so that other users can then safely trust you. // For other people's devices, the more general verified check that // includes locally verified devices can be used. - const isVerified = (isMe && SettingsStore.isFeatureEnabled("feature_cross_signing")) ? + const isVerified = (isMe && SettingsStore.getValue("feature_cross_signing")) ? deviceTrust.isCrossSigningVerified() : deviceTrust.isVerified(); @@ -237,7 +237,7 @@ function DevicesSection({devices, userId, loading}) { // cross-signing so that other users can then safely trust you. // For other people's devices, the more general verified check that // includes locally verified devices can be used. - const isVerified = (isMe && SettingsStore.isFeatureEnabled("feature_cross_signing")) ? + const isVerified = (isMe && SettingsStore.getValue("feature_cross_signing")) ? deviceTrust.isCrossSigningVerified() : deviceTrust.isVerified(); @@ -1298,7 +1298,7 @@ const BasicUserInfo = ({room, member, groupId, devices, isRoomEncrypted}) => { const userTrust = cli.checkUserTrust(member.userId); const userVerified = userTrust.isCrossSigningVerified(); const isMe = member.userId === cli.getUserId(); - const canVerify = SettingsStore.isFeatureEnabled("feature_cross_signing") && + const canVerify = SettingsStore.getValue("feature_cross_signing") && homeserverSupportsCrossSigning && !userVerified && !isMe; const setUpdating = (updating) => { diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index a2c99fad99..9189cfdf26 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -20,7 +20,7 @@ import PropTypes from "prop-types"; import classNames from 'classnames'; import {_t, _td} from '../../../languageHandler'; -import {useFeatureEnabled} from "../../../hooks/useSettings"; +import {useFeatureEnabled, useSettingValue} from "../../../hooks/useSettings"; import AccessibleButton from "../elements/AccessibleButton"; import Tooltip from "../elements/Tooltip"; @@ -62,7 +62,7 @@ const E2EIcon = ({isUser, status, className, size, onClick, hideTooltip}) => { }, className); let e2eTitle; - const crossSigning = useFeatureEnabled("feature_cross_signing"); + const crossSigning = useSettingValue("feature_cross_signing"); if (crossSigning && isUser) { e2eTitle = crossSigningUserTitles[status]; } else if (crossSigning && !isUser) { diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 75fbe5caa3..f67877373e 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -323,7 +323,7 @@ export default createReactClass({ // If cross-signing is off, the old behaviour is to scream at the user // as if they've done something wrong, which they haven't - if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (!SettingsStore.getValue("feature_cross_signing")) { this.setState({ verified: E2E_STATE.WARNING, }, this.props.onHeightChanged); diff --git a/src/components/views/rooms/MemberTile.js b/src/components/views/rooms/MemberTile.js index bf2a1bee23..d830624f8a 100644 --- a/src/components/views/rooms/MemberTile.js +++ b/src/components/views/rooms/MemberTile.js @@ -56,7 +56,7 @@ export default createReactClass({ } } - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { const { roomId } = this.props.member; if (roomId) { const isRoomEncrypted = cli.isRoomEncrypted(roomId); diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index c86bcb2ff0..4749742a7d 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -270,7 +270,7 @@ export default class MessageComposer extends React.Component { } renderPlaceholderText() { - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { if (this.state.isQuoting) { if (this.props.e2eStatus) { return _t('Send an encrypted reply…'); diff --git a/src/components/views/rooms/RoomBreadcrumbs.js b/src/components/views/rooms/RoomBreadcrumbs.js index 1d433c9a40..09228c454b 100644 --- a/src/components/views/rooms/RoomBreadcrumbs.js +++ b/src/components/views/rooms/RoomBreadcrumbs.js @@ -364,7 +364,7 @@ export default class RoomBreadcrumbs extends React.Component { } let dmIndicator; - if (this._isDmRoom(r.room) && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (this._isDmRoom(r.room) && !SettingsStore.getValue("feature_cross_signing")) { dmIndicator = ; } diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index d264b087a0..a34ade365b 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -155,7 +155,7 @@ export default createReactClass({ if (!cli.isRoomEncrypted(this.props.room.roomId)) { return; } - if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (!SettingsStore.getValue("feature_cross_signing")) { return; } @@ -488,7 +488,7 @@ export default createReactClass({ let dmOnline; /* Post-cross-signing we don't show DM indicators at all, instead relying on user context to let them know when that is. */ - if (dmUserId && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (dmUserId && !SettingsStore.getValue("feature_cross_signing")) { dmIndicator = ; } diff --git a/src/components/views/settings/KeyBackupPanel.js b/src/components/views/settings/KeyBackupPanel.js index 9d60ed1188..5548768221 100644 --- a/src/components/views/settings/KeyBackupPanel.js +++ b/src/components/views/settings/KeyBackupPanel.js @@ -326,7 +326,7 @@ export default class KeyBackupPanel extends React.PureComponent {
    ); - if (this.state.backupKeyStored && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (this.state.backupKeyStored && !SettingsStore.getValue("feature_cross_signing")) { buttonRow =

    ⚠️ {_t( "Backup key stored in secret storage, but this feature is not " + "enabled on this session. Please enable cross-signing in Labs to " + diff --git a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js index 3e69107159..fe160032ff 100644 --- a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js @@ -62,6 +62,7 @@ export default class LabsUserSettingsTab extends React.Component {

    {flags} + diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js index 3dca6e2490..1cde5d6f87 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js @@ -270,7 +270,7 @@ export default class SecurityUserSettingsTab extends React.Component { // can remove this. const CrossSigningPanel = sdk.getComponent('views.settings.CrossSigningPanel'); let crossSigning; - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { crossSigning = (
    {_t("Cross-signing")} diff --git a/src/createRoom.js b/src/createRoom.js index 66d4d1908e..a39d2c2216 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -227,7 +227,7 @@ export async function ensureDMExists(client, userId) { roomId = existingDMRoom.roomId; } else { let encryption; - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (SettingsStore.getValue("feature_cross_signing")) { encryption = canEncryptToAllUsers(client, [userId]); } roomId = await createRoom({encryption, dmUserId: userId, spinner: false, andView: false}); diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 0d72017878..b539591efd 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -152,10 +152,10 @@ export const SETTINGS = { default: null, }, "feature_cross_signing": { - isFeature: true, + //isFeature: true, displayName: _td("Enable cross-signing to verify per-user instead of per-session (in development)"), supportedLevels: LEVELS_FEATURE, - default: false, + default: true, }, "feature_event_indexing": { isFeature: true, diff --git a/src/verification.js b/src/verification.js index e00e5e05fa..ca839940e5 100644 --- a/src/verification.js +++ b/src/verification.js @@ -27,7 +27,7 @@ import {verificationMethods} from 'matrix-js-sdk/src/crypto'; async function enable4SIfNeeded() { const cli = MatrixClientPeg.get(); - if (!cli.isCryptoEnabled() || !SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (!cli.isCryptoEnabled() || !SettingsStore.getValue("feature_cross_signing")) { return false; } const usk = cli.getCrossSigningId("user_signing"); From bedffdb8e2718fa6748fbe87a188b82bac232b2e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 01:46:32 +0100 Subject: [PATCH 202/230] Fix Message Context Menu options not displaying: block Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/context_menus/_MessageContextMenu.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/views/context_menus/_MessageContextMenu.scss b/res/css/views/context_menus/_MessageContextMenu.scss index d15d566bdb..2ecb93e734 100644 --- a/res/css/views/context_menus/_MessageContextMenu.scss +++ b/res/css/views/context_menus/_MessageContextMenu.scss @@ -19,6 +19,7 @@ limitations under the License. } .mx_MessageContextMenu_field { + display: block; padding: 3px 6px 3px 6px; cursor: pointer; white-space: nowrap; From 15075e4c10a08e19d17bdec6420b93c10a108a5a Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 16 Apr 2020 10:36:19 +0200 Subject: [PATCH 203/230] load twemoji in matrixclient rather than loggedinview --- src/components/structures/LoggedInView.tsx | 3 --- src/components/structures/MatrixChat.js | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 9de2aac8e9..f90ae18f00 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -25,7 +25,6 @@ import { DragDropContext } from 'react-beautiful-dnd'; import {Key, isOnlyCtrlOrCmdKeyEvent, isOnlyCtrlOrCmdIgnoreShiftKeyEvent} from '../../Keyboard'; import PageTypes from '../../PageTypes'; import CallMediaHandler from '../../CallMediaHandler'; -import { fixupColorFonts } from '../../utils/FontManager'; import * as sdk from '../../index'; import dis from '../../dispatcher'; import sessionStore from '../../stores/SessionStore'; @@ -166,8 +165,6 @@ class LoggedInView extends React.PureComponent { this._matrixClient.on("sync", this.onSync); this._matrixClient.on("RoomState.events", this.onRoomStateEvents); - fixupColorFonts(); - this._roomView = React.createRef(); this._resizeContainer = React.createRef(); } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 519b39d436..4b269ceae4 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -66,6 +66,7 @@ import { storeRoomAliasInCache } from '../../RoomAliasCache'; import { defer } from "../../utils/promise"; import ToastStore from "../../stores/ToastStore"; import * as StorageManager from "../../utils/StorageManager"; +import { fixupColorFonts } from '../../utils/FontManager'; /** constants for MatrixChat.state.view */ export const VIEWS = { @@ -244,6 +245,8 @@ export default createReactClass({ this._pageChanging = false; + // load emoji font + fixupColorFonts(); // check we have the right tint applied for this theme. // N.B. we don't call the whole of setTheme() here as we may be // racing with the theme CSS download finishing from index.js From 33391a31105d601ad76eb0da98ab8afaf810a06b Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 16 Apr 2020 09:25:18 +0000 Subject: [PATCH 204/230] Revert "Fix: load Twemoji before login so complete security gets the right emojis during SAS" --- src/components/structures/LoggedInView.tsx | 3 +++ src/components/structures/MatrixChat.js | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index f90ae18f00..9de2aac8e9 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -25,6 +25,7 @@ import { DragDropContext } from 'react-beautiful-dnd'; import {Key, isOnlyCtrlOrCmdKeyEvent, isOnlyCtrlOrCmdIgnoreShiftKeyEvent} from '../../Keyboard'; import PageTypes from '../../PageTypes'; import CallMediaHandler from '../../CallMediaHandler'; +import { fixupColorFonts } from '../../utils/FontManager'; import * as sdk from '../../index'; import dis from '../../dispatcher'; import sessionStore from '../../stores/SessionStore'; @@ -165,6 +166,8 @@ class LoggedInView extends React.PureComponent { this._matrixClient.on("sync", this.onSync); this._matrixClient.on("RoomState.events", this.onRoomStateEvents); + fixupColorFonts(); + this._roomView = React.createRef(); this._resizeContainer = React.createRef(); } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 4b269ceae4..519b39d436 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -66,7 +66,6 @@ import { storeRoomAliasInCache } from '../../RoomAliasCache'; import { defer } from "../../utils/promise"; import ToastStore from "../../stores/ToastStore"; import * as StorageManager from "../../utils/StorageManager"; -import { fixupColorFonts } from '../../utils/FontManager'; /** constants for MatrixChat.state.view */ export const VIEWS = { @@ -245,8 +244,6 @@ export default createReactClass({ this._pageChanging = false; - // load emoji font - fixupColorFonts(); // check we have the right tint applied for this theme. // N.B. we don't call the whole of setTheme() here as we may be // racing with the theme CSS download finishing from index.js From 3933c4c31cb19cc1d300a52228ff2a3d84171cb1 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 16 Apr 2020 11:35:54 +0200 Subject: [PATCH 205/230] ensure twemoji font is loaded when showing SAS emojis --- src/components/views/verification/VerificationShowSas.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 0a8947f2c2..edf860c4c2 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -20,6 +20,7 @@ import { _t, _td } from '../../../languageHandler'; import {PendingActionSpinner} from "../right_panel/EncryptionInfo"; import AccessibleButton from "../elements/AccessibleButton"; import DialogButtons from "../elements/DialogButtons"; +import { fixupColorFonts } from '../../../utils/FontManager'; function capFirst(s) { return s.charAt(0).toUpperCase() + s.slice(1); @@ -44,6 +45,13 @@ export default class VerificationShowSas extends React.Component { }; } + componentWillMount() { + // As this component is also used before login (during complete security), + // also make sure we have a working emoji font to display the SAS emojis here. + // This is also done from LoggedInView. + fixupColorFonts(); + } + onMatchClick = () => { this.setState({ pending: true }); this.props.onDone(); From a9a2999ccc433bc19df083e6f8a551feca9b8fc3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 12:26:12 +0100 Subject: [PATCH 206/230] Use `recovery passphrase` and `recovery key` everywhere Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../keybackup/CreateKeyBackupDialog.js | 14 +++--- .../keybackup/NewRecoveryMethodDialog.js | 3 +- .../keybackup/RecoveryMethodRemovedDialog.js | 2 +- .../CreateSecretStorageDialog.js | 16 +++---- .../structures/auth/SetupEncryptionBody.js | 2 +- .../keybackup/RestoreKeyBackupDialog.js | 4 +- .../AccessSecretStorageDialog.js | 14 +++--- src/i18n/strings/en_EN.json | 47 +++++++++---------- 8 files changed, 49 insertions(+), 53 deletions(-) diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 7e5e0afb79..29e68243ee 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -262,7 +262,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { let helpText; if (this.state.zxcvbnResult) { if (this.state.zxcvbnResult.score >= PASSWORD_MIN_SCORE) { - helpText = _t("Great! This passphrase looks strong enough."); + helpText = _t("Great! This recovery passphrase looks strong enough."); } else { const suggestions = []; for (let i = 0; i < this.state.zxcvbnResult.feedback.suggestions.length; ++i) { @@ -287,7 +287,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { )}

    {_t( "We'll store an encrypted copy of your keys on our server. " + - "Protect your backup with a passphrase to keep it secure.", + "Protect your backup with a recovery passphrase to keep it secure.", )}

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

    @@ -297,7 +297,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { onChange={this._onPassPhraseChange} value={this.state.passPhrase} className="mx_CreateKeyBackupDialog_passPhraseInput" - placeholder={_t("Enter a passphrase...")} + placeholder={_t("Enter a recovery passphrase...")} autoFocus={true} />
    @@ -354,7 +354,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return

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

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

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

    {_t( "Keep a copy of it somewhere secure, like a password manager or even a safe.", @@ -479,7 +479,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { case PHASE_PASSPHRASE: return _t('Secure your backup with a passphrase'); case PHASE_PASSPHRASE_CONFIRM: - return _t('Confirm your passphrase'); + return _t('Confirm your recovery passphrase'); case PHASE_OPTOUT_CONFIRM: return _t('Warning!'); case PHASE_SHOWKEY: diff --git a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js index 6588ff5191..d41c8c53ef 100644 --- a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js +++ b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js @@ -57,8 +57,7 @@ export default class NewRecoveryMethodDialog extends React.PureComponent { ; const newMethodDetected =

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

    ; const hackWarning =

    {_t( diff --git a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js index c5222dafd5..95fcb96967 100644 --- a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js +++ b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js @@ -55,7 +55,7 @@ export default class RecoveryMethodRemovedDialog extends React.PureComponent { >

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

    {_t( diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index cfad49c38d..b876ed57b5 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -462,7 +462,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { let helpText; if (this.state.zxcvbnResult) { if (this.state.zxcvbnResult.score >= PASSWORD_MIN_SCORE) { - helpText = _t("Great! This passphrase looks strong enough."); + helpText = _t("Great! This recovery passphrase looks strong enough."); } else { // We take the warning from zxcvbn or failing that, the first // suggestion. In practice The first is generally the most relevant @@ -491,7 +491,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { "granting them access to encrypted messages and marking them as trusted for other users.", )}

    {_t( - "Secure your encryption keys with a passphrase. For maximum security " + + "Secure your encryption keys with a recovery passphrase. For maximum security " + "this should be different to your account password:", )}

    @@ -501,7 +501,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { className="mx_CreateSecretStorageDialog_passPhraseField" onChange={this._onPassPhraseChange} value={this.state.passPhrase} - label={_t("Enter a passphrase")} + label={_t("Enter a recovery passphrase")} autoFocus={true} autoComplete="new-password" /> @@ -512,7 +512,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
    @@ -569,7 +569,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return

    {_t( - "Enter your passphrase a second time to confirm it.", + "Enter your recovery passphrase a second time to confirm it.", )}

    @@ -604,7 +604,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { return

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

    {_t( "Keep a copy of it somewhere secure, like a password manager or even a safe.", @@ -703,7 +703,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { case PHASE_PASSPHRASE: return _t('Set up encryption'); case PHASE_PASSPHRASE_CONFIRM: - return _t('Confirm passphrase'); + return _t('Confirm recovery passphrase'); case PHASE_CONFIRM_SKIP: return _t('Are you sure?'); case PHASE_SHOWKEY: diff --git a/src/components/structures/auth/SetupEncryptionBody.js b/src/components/structures/auth/SetupEncryptionBody.js index a982957ed0..e6302a4685 100644 --- a/src/components/structures/auth/SetupEncryptionBody.js +++ b/src/components/structures/auth/SetupEncryptionBody.js @@ -116,7 +116,7 @@ export default class SetupEncryptionBody extends React.Component { "granting it access to encrypted messages.", )}

    {_t( - "If you can’t access one, ", + "If you can’t access one, ", {}, { button: sub =>

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

    ; @@ -291,7 +291,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { title = _t("Incorrect recovery passphrase"); content =

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

    ; diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index e3a7d7f532..4c0c608ad6 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -119,14 +119,13 @@ export default class AccessSecretStorageDialog extends React.PureComponent { if (hasPassphrase && !this.state.forceRecoveryKey) { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - title = _t("Enter secret storage passphrase"); + title = _t("Enter recovery passphrase"); let keyStatus; if (this.state.keyMatches === false) { keyStatus =
    {"\uD83D\uDC4E "}{_t( - "Unable to access secret storage. Please verify that you " + - "entered the correct passphrase.", + "Unable to access. Please verify that you entered the correct recovery passphrase.", )}
    ; } else { @@ -141,7 +140,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { )}

    {_t( "Access your secure message history and your cross-signing " + - "identity for verifying other sessions by entering your passphrase.", + "identity for verifying other sessions by entering your recovery passphrase.", )}

    @@ -164,7 +163,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { /> {_t( - "If you've forgotten your passphrase you can "+ + "If you've forgotten your recovery passphrase you can "+ "use your recovery key or " + "set up new recovery options." , {}, { @@ -183,7 +182,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { })}
    ; } else { - title = _t("Enter secret storage recovery key"); + title = _t("Enter recovery key"); const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); @@ -193,8 +192,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } else if (this.state.keyMatches === false) { keyStatus =
    {"\uD83D\uDC4E "}{_t( - "Unable to access secret storage. Please verify that you " + - "entered the correct recovery key.", + "Unable to access. Please verify that you entered the correct recovery key.", )}
    ; } else if (this.state.recoveryKeyValid) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 84c172ea4d..dcd24b91de 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1778,32 +1778,30 @@ "Remember my selection for this widget": "Remember my selection for this widget", "Allow": "Allow", "Deny": "Deny", - "Enter secret storage passphrase": "Enter secret storage passphrase", - "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Unable to access secret storage. Please verify that you entered the correct passphrase.", + "Enter recovery passphrase": "Enter recovery passphrase", + "Unable to access. Please verify that you entered the correct recovery passphrase.": "Unable to access. Please verify that you entered the correct recovery passphrase.", "Warning: You should only access secret storage from a trusted computer.": "Warning: You should only access secret storage from a trusted computer.", - "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.", - "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.", - "Enter secret storage recovery key": "Enter secret storage recovery key", - "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Unable to access secret storage. Please verify that you entered the correct recovery key.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.", + "Enter recovery key": "Enter recovery key", + "Unable to access. Please verify that you entered the correct recovery key.": "Unable to access. Please verify that you entered the correct recovery key.", "This looks like a valid recovery key!": "This looks like a valid recovery key!", "Not a valid recovery key": "Not a valid recovery key", "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.", "If you've forgotten your recovery key you can .": "If you've forgotten your recovery key you can .", "Unable to load backup status": "Unable to load backup status", "Recovery key mismatch": "Recovery key mismatch", - "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.", + "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.", "Incorrect recovery passphrase": "Incorrect recovery passphrase", - "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.", + "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.", "Unable to restore backup": "Unable to restore backup", "No backup found!": "No backup found!", "Backup restored": "Backup restored", "Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!", "Restored %(sessionCount)s session keys": "Restored %(sessionCount)s session keys", - "Enter recovery passphrase": "Enter recovery passphrase", "Warning: you should only set up key backup from a trusted computer.": "Warning: you should only set up key backup from a trusted computer.", "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Access your secure message history and set up secure messaging by entering your recovery passphrase.", "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options", - "Enter recovery key": "Enter recovery key", "Warning: You should only set up key backup from a trusted computer.": "Warning: You should only set up key backup from a trusted computer.", "Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.", "If you've forgotten your recovery key you can ": "If you've forgotten your recovery key you can ", @@ -2119,7 +2117,7 @@ "Registration Successful": "Registration Successful", "Create your account": "Create your account", "Use an existing session to verify this one, granting it access to encrypted messages.": "Use an existing session to verify this one, granting it access to encrypted messages.", - "If you can’t access one, ": "If you can’t access one, ", + "If you can’t access one, ": "If you can’t access one, ", "Use your other device to continue…": "Use your other device to continue…", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", "Your new session is now verified. Other users will see it as trusted.": "Your new session is now verified. Other users will see it as trusted.", @@ -2182,18 +2180,18 @@ "Restore": "Restore", "You'll need to authenticate with the server to confirm the upgrade.": "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 this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", - "Great! This passphrase looks strong enough.": "Great! This passphrase looks strong enough.", + "Great! This recovery passphrase looks strong enough.": "Great! This recovery passphrase looks strong enough.", "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", - "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:", - "Enter a passphrase": "Enter a passphrase", - "Back up my encryption keys, securing them with the same passphrase": "Back up my encryption keys, securing them with the same passphrase", + "Secure your encryption keys with a recovery passphrase. For maximum security this should be different to your account password:": "Secure your encryption keys with a recovery passphrase. For maximum security this should be different to your account password:", + "Enter a recovery passphrase": "Enter a recovery passphrase", + "Back up my encryption keys, securing them with the same recovery passphrase": "Back up my encryption keys, securing them with the same recovery passphrase", "Set up with a recovery key": "Set up with a recovery key", "That matches!": "That matches!", "That doesn't match.": "That doesn't match.", "Go back to set it again.": "Go back to set it again.", - "Enter your passphrase a second time to confirm it.": "Enter your passphrase a second time to confirm it.", - "Confirm your passphrase": "Confirm your passphrase", - "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.", + "Enter your recovery passphrase a second time to confirm it.": "Enter your recovery passphrase a second time to confirm it.", + "Confirm your recovery passphrase": "Confirm your recovery passphrase", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.", "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Keep a copy of it somewhere secure, like a password manager or even a safe.", "Your recovery key": "Your recovery key", "Copy": "Copy", @@ -2205,15 +2203,16 @@ "Copy it to your personal cloud storage": "Copy it to your personal cloud storage", "You can now verify your other devices, and other users to keep your chats safe.": "You can now verify your other devices, and other users to keep your chats safe.", "Upgrade your encryption": "Upgrade your encryption", + "Confirm recovery passphrase": "Confirm recovery passphrase", "Make a copy of your recovery key": "Make a copy of your recovery key", "You're done!": "You're done!", "Unable to set up secret storage": "Unable to set up secret storage", "Retry": "Retry", - "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.", + "We'll store an encrypted copy of your keys on our server. Protect your backup with a recovery passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a recovery passphrase to keep it secure.", "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", - "Enter a passphrase...": "Enter a passphrase...", - "Please enter your passphrase a second time to confirm.": "Please enter your passphrase a second time to confirm.", - "Repeat your passphrase...": "Repeat your passphrase...", + "Enter a recovery passphrase...": "Enter a recovery passphrase...", + "Please enter your recovery passphrase a second time to confirm.": "Please enter your recovery passphrase a second time to confirm.", + "Repeat your recovery passphrase...": "Repeat your recovery passphrase...", "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.", "Set up Secure Message Recovery": "Set up Secure Message Recovery", @@ -2227,13 +2226,13 @@ "Set up": "Set up", "Don't ask again": "Don't ask again", "New Recovery Method": "New Recovery Method", - "A new recovery passphrase and key for Secure Messages have been detected.": "A new recovery passphrase and key for Secure Messages have been detected.", + "A new recovery passphrase and recovery key for Secure Messages have been detected.": "A new recovery passphrase and recovery key for Secure Messages have been detected.", "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", "This session is encrypting history using the new recovery method.": "This session is encrypting history using the new recovery method.", "Go to Settings": "Go to Settings", "Set up Secure Messages": "Set up Secure Messages", "Recovery Method Removed": "Recovery Method Removed", - "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "This session has detected that your recovery passphrase and key for Secure Messages have been removed.", + "This session has detected that your recovery passphrase and recovery key for Secure Messages have been removed.": "This session has detected that your recovery passphrase and recovery key for Secure Messages have been removed.", "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", "If disabled, messages from encrypted rooms won't appear in search results.": "If disabled, messages from encrypted rooms won't appear in search results.", From f65c31383d0c2c1cd3c70446cab545a40e8e84bb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 12:52:35 +0100 Subject: [PATCH 207/230] Copy tweaks with Nad Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/CrossSigningManager.js | 2 +- .../views/dialogs/keybackup/CreateKeyBackupDialog.js | 2 +- .../dialogs/keybackup/NewRecoveryMethodDialog.js | 2 +- .../dialogs/keybackup/RecoveryMethodRemovedDialog.js | 2 +- .../secretstorage/AccessSecretStorageDialog.js | 6 ++---- src/i18n/strings/en_EN.json | 12 ++++++------ src/settings/Settings.js | 2 +- 7 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 07ec776bd1..c37d0f8bf5 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -51,7 +51,7 @@ async function confirmToDismiss(name) { } else if (name === "m.cross_signing.self_signing") { description = _t("If you cancel now, you won't complete verifying your other session."); } else { - description = _t("If you cancel now, you won't complete your secret storage operation."); + description = _t("If you cancel now, you won't complete your operation."); } const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 29e68243ee..b010987036 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -287,7 +287,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { )}

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

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

    diff --git a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js index d41c8c53ef..9e2264a960 100644 --- a/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js +++ b/src/async-components/views/dialogs/keybackup/NewRecoveryMethodDialog.js @@ -57,7 +57,7 @@ export default class NewRecoveryMethodDialog extends React.PureComponent { ; const newMethodDetected =

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

    ; const hackWarning =

    {_t( diff --git a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js index 95fcb96967..c5222dafd5 100644 --- a/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js +++ b/src/async-components/views/dialogs/keybackup/RecoveryMethodRemovedDialog.js @@ -55,7 +55,7 @@ export default class RecoveryMethodRemovedDialog extends React.PureComponent { >

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

    {_t( diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index 4c0c608ad6..f2e7b7e704 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -134,8 +134,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { content =

    {_t( - "Warning: You should only access secret storage " + - "from a trusted computer.", {}, + "Warning: You should only do this on a trusted computer.", {}, { b: sub => {sub} }, )}

    {_t( @@ -207,8 +206,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { content =

    {_t( - "Warning: You should only access secret storage " + - "from a trusted computer.", {}, + "Warning: You should only do this on a trusted computer.", {}, { b: sub => {sub} }, )}

    {_t( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index dcd24b91de..4ee910a1b6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -70,7 +70,7 @@ "Failure to create room": "Failure to create room", "If you cancel now, you won't complete verifying the other user.": "If you cancel now, you won't complete verifying the other user.", "If you cancel now, you won't complete verifying your other session.": "If you cancel now, you won't complete verifying your other session.", - "If you cancel now, you won't complete your secret storage operation.": "If you cancel now, you won't complete your secret storage operation.", + "If you cancel now, you won't complete your operation.": "If you cancel now, you won't complete your operation.", "Cancel entering passphrase?": "Cancel entering passphrase?", "Enter passphrase": "Enter passphrase", "Cancel": "Cancel", @@ -444,7 +444,7 @@ "Send read receipts for messages (requires compatible homeserver to disable)": "Send read receipts for messages (requires compatible homeserver to disable)", "Show previews/thumbnails for images": "Show previews/thumbnails for images", "Enable message search in encrypted rooms": "Enable message search in encrypted rooms", - "Keep secret storage passphrase in memory for this session": "Keep secret storage passphrase in memory for this session", + "Keep recovery passphrase in memory for this session": "Keep recovery passphrase in memory for this session", "How fast should messages be downloaded.": "How fast should messages be downloaded.", "Manually verify all remote sessions": "Manually verify all remote sessions", "Collecting app version information": "Collecting app version information", @@ -1780,7 +1780,7 @@ "Deny": "Deny", "Enter recovery passphrase": "Enter recovery passphrase", "Unable to access. Please verify that you entered the correct recovery passphrase.": "Unable to access. Please verify that you entered the correct recovery passphrase.", - "Warning: You should only access secret storage from a trusted computer.": "Warning: You should only access secret storage from a trusted computer.", + "Warning: You should only do this on a trusted computer.": "Warning: You should only do this on a trusted computer.", "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.", "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.", "Enter recovery key": "Enter recovery key", @@ -2208,7 +2208,7 @@ "You're done!": "You're done!", "Unable to set up secret storage": "Unable to set up secret storage", "Retry": "Retry", - "We'll store an encrypted copy of your keys on our server. Protect your backup with a recovery passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a recovery passphrase to keep it secure.", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.", "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", "Enter a recovery passphrase...": "Enter a recovery passphrase...", "Please enter your recovery passphrase a second time to confirm.": "Please enter your recovery passphrase a second time to confirm.", @@ -2226,13 +2226,13 @@ "Set up": "Set up", "Don't ask again": "Don't ask again", "New Recovery Method": "New Recovery Method", - "A new recovery passphrase and recovery key for Secure Messages have been detected.": "A new recovery passphrase and recovery key for Secure Messages have been detected.", + "A new recovery passphrase and key for Secure Messages have been detected.": "A new recovery passphrase and key for Secure Messages have been detected.", "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", "This session is encrypting history using the new recovery method.": "This session is encrypting history using the new recovery method.", "Go to Settings": "Go to Settings", "Set up Secure Messages": "Set up Secure Messages", "Recovery Method Removed": "Recovery Method Removed", - "This session has detected that your recovery passphrase and recovery key for Secure Messages have been removed.": "This session has detected that your recovery passphrase and recovery key for Secure Messages have been removed.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "This session has detected that your recovery passphrase and key for Secure Messages have been removed.", "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", "If disabled, messages from encrypted rooms won't appear in search results.": "If disabled, messages from encrypted rooms won't appear in search results.", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 0d72017878..317508ca86 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -516,7 +516,7 @@ export const SETTINGS = { }, "keepSecretStoragePassphraseForSession": { supportedLevels: ['device', 'config'], - displayName: _td("Keep secret storage passphrase in memory for this session"), + displayName: _td("Keep recovery passphrase in memory for this session"), default: false, }, "crawlerSleepTime": { From 1fb0f39c84e3a6340ad841acefe982db00ebfc1a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 13:23:01 +0100 Subject: [PATCH 208/230] Replace `Verify this session` and `Complete security` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/auth/CompleteSecurity.js | 12 ++++++------ .../views/dialogs/VerificationRequestDialog.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 06cece0af2..3ef3140298 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -59,17 +59,17 @@ export default class CompleteSecurity extends React.Component { let title; if (phase === PHASE_INTRO) { - icon = ; - title = _t("Complete security"); + icon = ; + title = _t("Verify session"); } else if (phase === PHASE_DONE) { - icon = ; + icon = ; title = _t("Session verified"); } else if (phase === PHASE_CONFIRM_SKIP) { - icon = ; + icon = ; title = _t("Are you sure?"); } else if (phase === PHASE_BUSY) { - icon = ; - title = _t("Complete security"); + icon = ; + title = _t("Verify session"); } else { throw new Error(`Unknown phase ${phase}`); } diff --git a/src/components/views/dialogs/VerificationRequestDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js index 7ff2cb8f50..dcb9168bda 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.js +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -48,7 +48,7 @@ export default class VerificationRequestDialog extends React.Component { const member = this.props.member || otherUserId && MatrixClientPeg.get().getUser(otherUserId); const title = request && request.isSelfVerification ? - _t("Verify this session") : _t("Verification Request"); + _t("Verify session") : _t("Verification Request"); return Date: Thu, 16 Apr 2020 13:28:12 +0100 Subject: [PATCH 209/230] further tweaks by Matthew Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/auth/CompleteSecurity.js | 4 ++-- src/components/views/dialogs/VerificationRequestDialog.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 3ef3140298..95128c0be9 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -60,7 +60,7 @@ export default class CompleteSecurity extends React.Component { if (phase === PHASE_INTRO) { icon = ; - title = _t("Verify session"); + title = _t("Verify this session"); } else if (phase === PHASE_DONE) { icon = ; title = _t("Session verified"); @@ -69,7 +69,7 @@ export default class CompleteSecurity extends React.Component { title = _t("Are you sure?"); } else if (phase === PHASE_BUSY) { icon = ; - title = _t("Verify session"); + title = _t("Verify this session"); } else { throw new Error(`Unknown phase ${phase}`); } diff --git a/src/components/views/dialogs/VerificationRequestDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js index dcb9168bda..3a6e9a2d10 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.js +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -48,7 +48,7 @@ export default class VerificationRequestDialog extends React.Component { const member = this.props.member || otherUserId && MatrixClientPeg.get().getUser(otherUserId); const title = request && request.isSelfVerification ? - _t("Verify session") : _t("Verification Request"); + _t("Verify other session") : _t("Verification Request"); return Date: Thu, 16 Apr 2020 13:34:18 +0100 Subject: [PATCH 210/230] update Create SSSS Dialog copy Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../dialogs/secretstorage/CreateSecretStorageDialog.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index b876ed57b5..b16812a3c0 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -487,12 +487,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { return

    {_t( - "Set up encryption on this session to allow it to verify other sessions, " + - "granting them access to encrypted messages and marking them as trusted for other users.", - )}

    -

    {_t( - "Secure your encryption keys with a recovery passphrase. For maximum security " + - "this should be different to your account password:", + "Set a recovery passphrase to secure encrypted information and recover it if you log out. " + + "This should be different to your account password:", )}

    @@ -512,7 +508,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
    From 8c8509a6035d48e98299e20494043db6f52a20fe Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 13:48:52 +0100 Subject: [PATCH 211/230] i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/en_EN.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4ee910a1b6..ed1fbf6831 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1772,6 +1772,7 @@ "Upload %(count)s other files|one": "Upload %(count)s other file", "Cancel All": "Cancel All", "Upload Error": "Upload Error", + "Verify other session": "Verify other session", "Verification Request": "Verification Request", "A widget would like to verify your identity": "A widget would like to verify your identity", "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.", @@ -2062,7 +2063,6 @@ "Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other", "Could not load user profile": "Could not load user profile", - "Complete security": "Complete security", "Session verified": "Session verified", "Failed to send email": "Failed to send email", "The email address linked to your account must be entered.": "The email address linked to your account must be entered.", @@ -2181,10 +2181,9 @@ "You'll need to authenticate with the server to confirm the upgrade.": "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 this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", "Great! This recovery passphrase looks strong enough.": "Great! This recovery passphrase looks strong enough.", - "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", - "Secure your encryption keys with a recovery passphrase. For maximum security this should be different to your account password:": "Secure your encryption keys with a recovery passphrase. For maximum security this should be different to your account password:", + "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:", "Enter a recovery passphrase": "Enter a recovery passphrase", - "Back up my encryption keys, securing them with the same recovery passphrase": "Back up my encryption keys, securing them with the same recovery passphrase", + "Back up encryption keys": "Back up encryption keys", "Set up with a recovery key": "Set up with a recovery key", "That matches!": "That matches!", "That doesn't match.": "That doesn't match.", From af59c1b5b316024cea882cc8edb972a3abf45a76 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 14:02:32 +0100 Subject: [PATCH 212/230] iterate copy some more Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/secretstorage/CreateSecretStorageDialog.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index b16812a3c0..0cc145fd96 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -508,7 +508,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
    diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ed1fbf6831..cf02e51608 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2183,7 +2183,7 @@ "Great! This recovery passphrase looks strong enough.": "Great! This recovery passphrase looks strong enough.", "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:": "Set a recovery passphrase to secure encrypted information and recover it if you log out. This should be different to your account password:", "Enter a recovery passphrase": "Enter a recovery passphrase", - "Back up encryption keys": "Back up encryption keys", + "Back up encrypted message keys": "Back up encrypted message keys", "Set up with a recovery key": "Set up with a recovery key", "That matches!": "That matches!", "That doesn't match.": "That doesn't match.", From e942a3552550cc5031cc4822b0bfcf99cf65a286 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 14:09:41 +0100 Subject: [PATCH 213/230] Fixxy Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../dialogs/secretstorage/AccessSecretStorageDialog.js | 6 ++++-- src/i18n/strings/en_EN.json | 4 ++-- .../views/dialogs/AccessSecretStorageDialog-test.js | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index f2e7b7e704..7d7edffcbf 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -125,7 +125,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent { if (this.state.keyMatches === false) { keyStatus =
    {"\uD83D\uDC4E "}{_t( - "Unable to access. Please verify that you entered the correct recovery passphrase.", + "Unable to access secret storage. " + + "Please verify that you entered the correct recovery passphrase.", )}
    ; } else { @@ -191,7 +192,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } else if (this.state.keyMatches === false) { keyStatus =
    {"\uD83D\uDC4E "}{_t( - "Unable to access. Please verify that you entered the correct recovery key.", + "Unable to access secret storage. " + + "Please verify that you entered the correct recovery key.", )}
    ; } else if (this.state.recoveryKeyValid) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index cf02e51608..54da81e1ff 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1780,12 +1780,12 @@ "Allow": "Allow", "Deny": "Deny", "Enter recovery passphrase": "Enter recovery passphrase", - "Unable to access. Please verify that you entered the correct recovery passphrase.": "Unable to access. Please verify that you entered the correct recovery passphrase.", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.", "Warning: You should only do this on a trusted computer.": "Warning: You should only do this on a trusted computer.", "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase.", "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options.", "Enter recovery key": "Enter recovery key", - "Unable to access. Please verify that you entered the correct recovery key.": "Unable to access. Please verify that you entered the correct recovery key.", + "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Unable to access secret storage. Please verify that you entered the correct recovery key.", "This looks like a valid recovery key!": "This looks like a valid recovery key!", "Not a valid recovery key": "Not a valid recovery key", "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.", diff --git a/test/components/views/dialogs/AccessSecretStorageDialog-test.js b/test/components/views/dialogs/AccessSecretStorageDialog-test.js index 30512ca4dd..c754a4b607 100644 --- a/test/components/views/dialogs/AccessSecretStorageDialog-test.js +++ b/test/components/views/dialogs/AccessSecretStorageDialog-test.js @@ -100,7 +100,7 @@ describe("AccessSecretStorageDialog", function() { }); expect(notification.props.children).toEqual( ["\uD83D\uDC4E ", "Unable to access secret storage. Please verify that you " + - "entered the correct passphrase."]); + "entered the correct recovery passphrase."]); done(); }); }); From aea7ede7d049b6f7893d8f6103be64b5439543f7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 14:55:43 +0100 Subject: [PATCH 214/230] update PHASE_PASSPHRASE copy Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/keybackup/CreateKeyBackupDialog.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index b010987036..a20f5566e9 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -477,7 +477,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { _titleForPhase(phase) { switch (phase) { case PHASE_PASSPHRASE: - return _t('Secure your backup with a passphrase'); + return _t('Secure your backup with a recovery passphrase'); case PHASE_PASSPHRASE_CONFIRM: return _t('Confirm your recovery passphrase'); case PHASE_OPTOUT_CONFIRM: diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 54da81e1ff..a291065145 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2215,7 +2215,7 @@ "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.", "Set up Secure Message Recovery": "Set up Secure Message Recovery", - "Secure your backup with a passphrase": "Secure your backup with a passphrase", + "Secure your backup with a recovery passphrase": "Secure your backup with a recovery passphrase", "Starting backup...": "Starting backup...", "Success!": "Success!", "Create key backup": "Create key backup", From e1e65a0fe19c536ba8f726ab5465ff9e24c5f1c8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Apr 2020 17:13:33 +0100 Subject: [PATCH 215/230] Make RoomPublishSetting import-skinnable Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/room_settings/RoomPublishSetting.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/views/room_settings/RoomPublishSetting.js b/src/components/views/room_settings/RoomPublishSetting.js index bac2dfc656..6cc3ce26ba 100644 --- a/src/components/views/room_settings/RoomPublishSetting.js +++ b/src/components/views/room_settings/RoomPublishSetting.js @@ -18,7 +18,9 @@ import React from 'react'; import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; import {_t} from "../../../languageHandler"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; +import {replaceableComponent} from "../../../utils/replaceableComponent"; +@replaceableComponent("views.room_settings.RoomPublishSetting") export default class RoomPublishSetting extends React.PureComponent { constructor(props) { super(props); From b5130ca5dcd9111128fd659792febba35cf987b4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 11:12:47 -0600 Subject: [PATCH 216/230] Clean up setting definition to follow surrounding practices It's not perfect, but we're at least okay with it. --- src/i18n/strings/en_EN.json | 2 +- src/settings/Settings.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a291065145..be8f1a7a4a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -399,7 +399,7 @@ "Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)", "Show a presence dot next to DMs in the room list": "Show a presence dot next to DMs in the room list", "Support adding custom themes": "Support adding custom themes", - "Enable cross-signing to verify per-user instead of per-session (in development)": "Enable cross-signing to verify per-user instead of per-session (in development)", + "Enable cross-signing to verify per-user instead of per-session": "Enable cross-signing to verify per-user instead of per-session", "Enable local event indexing and E2EE search (requires restart)": "Enable local event indexing and E2EE search (requires restart)", "Show info about bridges in room settings": "Show info about bridges in room settings", "Show padlocks on invite only rooms": "Show padlocks on invite only rooms", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 232c5d9f66..32ff0a5f94 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -152,9 +152,10 @@ export const SETTINGS = { default: null, }, "feature_cross_signing": { - //isFeature: true, - displayName: _td("Enable cross-signing to verify per-user instead of per-session (in development)"), - supportedLevels: LEVELS_FEATURE, + // XXX: We shouldn't be using the feature prefix for non-feature settings. There is an exception + // for this case though as we're converting a feature to a setting for a temporary safety net. + displayName: _td("Enable cross-signing to verify per-user instead of per-session"), + supportedLevels: ['device', 'config'], // we shouldn't use LEVELS_FEATURE for non-features, so copy it here. default: true, }, "feature_event_indexing": { From 54f8ba4d802ddd02286761efb07254793170bad4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 11:15:12 -0600 Subject: [PATCH 217/230] Remove UI to change the cross-signing setting --- src/components/views/settings/tabs/user/LabsUserSettingsTab.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js index fe160032ff..3e69107159 100644 --- a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js @@ -62,7 +62,6 @@ export default class LabsUserSettingsTab extends React.Component {
    {flags} - From 0fcaaab1d01830ac73d15b6ffb9b3c316e1b9184 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 11:18:54 -0600 Subject: [PATCH 218/230] Appease the linter --- src/components/views/rooms/E2EIcon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 9189cfdf26..5e74656920 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -20,7 +20,7 @@ import PropTypes from "prop-types"; import classNames from 'classnames'; import {_t, _td} from '../../../languageHandler'; -import {useFeatureEnabled, useSettingValue} from "../../../hooks/useSettings"; +import {useSettingValue} from "../../../hooks/useSettings"; import AccessibleButton from "../elements/AccessibleButton"; import Tooltip from "../elements/Tooltip"; From 25fa675f88c783a995992fe6ff6b6638f2822ffe Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 11:46:29 -0600 Subject: [PATCH 219/230] Blind attempt at fixing the end to end tests --- .../CreateSecretStorageDialog.js | 6 ++++- test/end-to-end-tests/src/usecases/signup.js | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 0cc145fd96..a2aa4f27e8 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -614,7 +614,11 @@ export default class CreateSecretStorageDialog extends React.PureComponent { {this._recoveryKey.encodedPrivateKey}
    - + {_t("Copy")} diff --git a/test/end-to-end-tests/src/usecases/signup.js b/test/end-to-end-tests/src/usecases/signup.js index ef8a259091..ffde22f929 100644 --- a/test/end-to-end-tests/src/usecases/signup.js +++ b/test/end-to-end-tests/src/usecases/signup.js @@ -79,6 +79,33 @@ module.exports = async function signup(session, username, password, homeserver) const acceptButton = await session.query('.mx_InteractiveAuthEntryComponents_termsSubmit'); await acceptButton.click(); + //plow through cross-signing setup by entering arbitrary details + //TODO: It's probably important for the tests to know the passphrase + const xsigningPassphrase = 'a7eaXcjpa9!Yl7#V^h$B^%dovHUVX'; // https://xkcd.com/221/ + let passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input'); + await session.replaceInputText(passphraseField, xsigningPassphrase); + let xsignContButton = await session.query('.mx_CreateSecretStorageDialog_passPhraseContainer .mx_Dialog_primary'); + await xsignContButton.click(); + + //repeat passphrase entry + passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input'); + await session.replaceInputText(passphraseField, xsigningPassphrase); + xsignContButton = await session.query('.mx_CreateSecretStorageDialog_passPhraseContainer .mx_Dialog_primary'); + await xsignContButton.click(); + + //ignore the recovery key + //TODO: It's probably important for the tests to know the recovery key + const copyButton = await session.query('.mx_CreateSecretStorageDialog_recoveryKeyButtons_copyBtn'); + await copyButton.click(); + + //acknowledge that we copied the recovery key to a safe place + const copyContinueButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_primary'); + await copyContinueButton.click(); + + //acknowledge that we're done cross-signing setup and our keys are safe + const doneOkButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_primary'); + await doneOkButton.click(); + //wait for registration to finish so the hash gets set //onhashchange better? From 5769b07a92e478f820fe0a9a955a4509c28c9554 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 12:04:01 -0600 Subject: [PATCH 220/230] Select the right continue button There's no buttons in the field. --- test/end-to-end-tests/src/usecases/signup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/end-to-end-tests/src/usecases/signup.js b/test/end-to-end-tests/src/usecases/signup.js index ffde22f929..e686ebdb7d 100644 --- a/test/end-to-end-tests/src/usecases/signup.js +++ b/test/end-to-end-tests/src/usecases/signup.js @@ -84,13 +84,13 @@ module.exports = async function signup(session, username, password, homeserver) const xsigningPassphrase = 'a7eaXcjpa9!Yl7#V^h$B^%dovHUVX'; // https://xkcd.com/221/ let passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input'); await session.replaceInputText(passphraseField, xsigningPassphrase); - let xsignContButton = await session.query('.mx_CreateSecretStorageDialog_passPhraseContainer .mx_Dialog_primary'); + let xsignContButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_buttons .mx_Dialog_primary'); await xsignContButton.click(); //repeat passphrase entry passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input'); await session.replaceInputText(passphraseField, xsigningPassphrase); - xsignContButton = await session.query('.mx_CreateSecretStorageDialog_passPhraseContainer .mx_Dialog_primary'); + xsignContButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_buttons .mx_Dialog_primary'); await xsignContButton.click(); //ignore the recovery key From f4a5361b14c62dc7aba9ae7d0073210ff06b1bfc Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 12:13:05 -0600 Subject: [PATCH 221/230] Wait a bit before continuing with the passphrase The continue button is probably no-oping due to being disabled. --- test/end-to-end-tests/src/usecases/signup.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/end-to-end-tests/src/usecases/signup.js b/test/end-to-end-tests/src/usecases/signup.js index e686ebdb7d..aa9f6b7efa 100644 --- a/test/end-to-end-tests/src/usecases/signup.js +++ b/test/end-to-end-tests/src/usecases/signup.js @@ -84,12 +84,14 @@ module.exports = async function signup(session, username, password, homeserver) const xsigningPassphrase = 'a7eaXcjpa9!Yl7#V^h$B^%dovHUVX'; // https://xkcd.com/221/ let passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input'); await session.replaceInputText(passphraseField, xsigningPassphrase); + await session.delay(1000); // give it a second to analyze our passphrase for security let xsignContButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_buttons .mx_Dialog_primary'); await xsignContButton.click(); //repeat passphrase entry passphraseField = await session.query('.mx_CreateSecretStorageDialog_passPhraseField input'); await session.replaceInputText(passphraseField, xsigningPassphrase); + await session.delay(1000); // give it a second to analyze our passphrase for security xsignContButton = await session.query('.mx_CreateSecretStorageDialog .mx_Dialog_buttons .mx_Dialog_primary'); await xsignContButton.click(); From d04af1f3a8e6c4e11723915298494a6449432f86 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 12:23:22 -0600 Subject: [PATCH 222/230] Disable e2e tests for now --- .../src/scenarios/e2e-encryption.js | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/test/end-to-end-tests/src/scenarios/e2e-encryption.js b/test/end-to-end-tests/src/scenarios/e2e-encryption.js index 2f08acf417..a764b85db6 100644 --- a/test/end-to-end-tests/src/scenarios/e2e-encryption.js +++ b/test/end-to-end-tests/src/scenarios/e2e-encryption.js @@ -15,35 +15,41 @@ See the License for the specific language governing permissions and limitations under the License. */ -const sendMessage = require('../usecases/send-message'); -const acceptInvite = require('../usecases/accept-invite'); -const invite = require('../usecases/invite'); -const {receiveMessage} = require('../usecases/timeline'); -const {createRoom} = require('../usecases/create-room'); -const changeRoomSettings = require('../usecases/room-settings'); -const {startSasVerifcation, acceptSasVerification} = require('../usecases/verify'); -const assert = require('assert'); +// TODO: Update test for cross signing -module.exports = async function e2eEncryptionScenarios(alice, bob) { - console.log(" creating an e2e encrypted room and join through invite:"); - const room = "secrets"; - await createRoom(bob, room); - await changeRoomSettings(bob, {encryption: true}); - // await cancelKeyBackup(bob); - await invite(bob, "@alice:localhost"); - await acceptInvite(alice, room); - // do sas verifcation - bob.log.step(`starts SAS verification with ${alice.username}`); - const bobSasPromise = startSasVerifcation(bob, alice.username); - const aliceSasPromise = acceptSasVerification(alice, bob.username); - // wait in parallel, so they don't deadlock on each other - const [bobSas, aliceSas] = await Promise.all([bobSasPromise, aliceSasPromise]); - assert.deepEqual(bobSas, aliceSas); - bob.log.done(`done (match for ${bobSas.join(", ")})`); - const aliceMessage = "Guess what I just heard?!"; - await sendMessage(alice, aliceMessage); - await receiveMessage(bob, {sender: "alice", body: aliceMessage, encrypted: true}); - const bobMessage = "You've got to tell me!"; - await sendMessage(bob, bobMessage); - await receiveMessage(alice, {sender: "bob", body: bobMessage, encrypted: true}); +module.exports = async function() { + console.log(" this is supposed to be an e2e test, but it's broken"); }; + +// const sendMessage = require('../usecases/send-message'); +// const acceptInvite = require('../usecases/accept-invite'); +// const invite = require('../usecases/invite'); +// const {receiveMessage} = require('../usecases/timeline'); +// const {createRoom} = require('../usecases/create-room'); +// const changeRoomSettings = require('../usecases/room-settings'); +// const {startSasVerifcation, acceptSasVerification} = require('../usecases/verify'); +// const assert = require('assert'); +// +// module.exports = async function e2eEncryptionScenarios(alice, bob) { +// console.log(" creating an e2e encrypted room and join through invite:"); +// const room = "secrets"; +// await createRoom(bob, room); +// await changeRoomSettings(bob, {encryption: true}); +// // await cancelKeyBackup(bob); +// await invite(bob, "@alice:localhost"); +// await acceptInvite(alice, room); +// // do sas verifcation +// bob.log.step(`starts SAS verification with ${alice.username}`); +// const bobSasPromise = startSasVerifcation(bob, alice.username); +// const aliceSasPromise = acceptSasVerification(alice, bob.username); +// // wait in parallel, so they don't deadlock on each other +// const [bobSas, aliceSas] = await Promise.all([bobSasPromise, aliceSasPromise]); +// assert.deepEqual(bobSas, aliceSas); +// bob.log.done(`done (match for ${bobSas.join(", ")})`); +// const aliceMessage = "Guess what I just heard?!"; +// await sendMessage(alice, aliceMessage); +// await receiveMessage(bob, {sender: "alice", body: aliceMessage, encrypted: true}); +// const bobMessage = "You've got to tell me!"; +// await sendMessage(bob, bobMessage); +// await receiveMessage(alice, {sender: "bob", body: bobMessage, encrypted: true}); +// }; From 4af33d91ebd4d84e5e8796985ab951a5d1dd294d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 12:26:08 -0600 Subject: [PATCH 223/230] Track the issue number too --- test/end-to-end-tests/src/scenarios/e2e-encryption.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/end-to-end-tests/src/scenarios/e2e-encryption.js b/test/end-to-end-tests/src/scenarios/e2e-encryption.js index a764b85db6..f30b814644 100644 --- a/test/end-to-end-tests/src/scenarios/e2e-encryption.js +++ b/test/end-to-end-tests/src/scenarios/e2e-encryption.js @@ -16,6 +16,7 @@ limitations under the License. */ // TODO: Update test for cross signing +// https://github.com/vector-im/riot-web/issues/13226 module.exports = async function() { console.log(" this is supposed to be an e2e test, but it's broken"); From 1deece3fb55e69e12653e8d98b28189b9654d8e4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 12:41:48 -0600 Subject: [PATCH 224/230] Short-circuit all end to end tests --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 7ba69c4272..4204b87b5a 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,8 @@ "lint:types": "tsc --noEmit --jsx react", "lint:style": "stylelint 'res/css/**/*.scss'", "test": "jest", - "test:e2e": "./test/end-to-end-tests/run.sh --riot-url http://localhost:8080" + "test:e2e": "echo 'The tests are broken with cross-signing. Fix them: https://github.com/vector-im/riot-web/issues/13226'", + "test:e2e_real": "./test/end-to-end-tests/run.sh --riot-url http://localhost:8080" }, "dependencies": { "@babel/runtime": "^7.8.3", From 3614170906b3289774b7e8d023e3e129a94b2d61 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 12:46:34 -0600 Subject: [PATCH 225/230] Disable scripts in CI too --- scripts/ci/end-to-end-tests.sh | 46 ++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/scripts/ci/end-to-end-tests.sh b/scripts/ci/end-to-end-tests.sh index 2f907dffa2..fa1f2b983f 100755 --- a/scripts/ci/end-to-end-tests.sh +++ b/scripts/ci/end-to-end-tests.sh @@ -13,25 +13,29 @@ handle_error() { trap 'handle_error' ERR +echo "Tests are disabled, see https://github.com/vector-im/riot-web/issues/13226" +exit 0 -echo "--- Building Riot" -scripts/ci/layered-riot-web.sh -cd ../riot-web -riot_web_dir=`pwd` -CI_PACKAGE=true yarn build -cd ../matrix-react-sdk -# run end to end tests -pushd test/end-to-end-tests -ln -s $riot_web_dir riot/riot-web -# PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh -# CHROME_PATH=$(which google-chrome-stable) ./run.sh -echo "--- Install synapse & other dependencies" -./install.sh -# install static webserver to server symlinked local copy of riot -./riot/install-webserver.sh -rm -r logs || true -mkdir logs -echo "+++ Running end-to-end tests" -TESTS_STARTED=1 -./run.sh --no-sandbox --log-directory logs/ -popd +#TODO: Uncomment all of this in https://github.com/vector-im/riot-web/issues/13226 + +#echo "--- Building Riot" +#scripts/ci/layered-riot-web.sh +#cd ../riot-web +#riot_web_dir=`pwd` +#CI_PACKAGE=true yarn build +#cd ../matrix-react-sdk +## run end to end tests +#pushd test/end-to-end-tests +#ln -s $riot_web_dir riot/riot-web +## PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh +## CHROME_PATH=$(which google-chrome-stable) ./run.sh +#echo "--- Install synapse & other dependencies" +#./install.sh +## install static webserver to server symlinked local copy of riot +#./riot/install-webserver.sh +#rm -r logs || true +#mkdir logs +#echo "+++ Running end-to-end tests" +#TESTS_STARTED=1 +#./run.sh --no-sandbox --log-directory logs/ +#popd From 9e18dbc0dc20fddad451b6e4eee48a03a6b3c422 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 16 Apr 2020 21:08:14 +0100 Subject: [PATCH 226/230] Fix key backup debug panel The type changed so it thought it was not stored when it was --- src/components/views/settings/KeyBackupPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/KeyBackupPanel.js b/src/components/views/settings/KeyBackupPanel.js index 5548768221..fa3fa03c74 100644 --- a/src/components/views/settings/KeyBackupPanel.js +++ b/src/components/views/settings/KeyBackupPanel.js @@ -75,7 +75,7 @@ export default class KeyBackupPanel extends React.PureComponent { async _checkKeyBackupStatus() { try { const {backupInfo, trustInfo} = await MatrixClientPeg.get().checkKeyBackup(); - const backupKeyStored = await MatrixClientPeg.get().isKeyBackupKeyStored(); + const backupKeyStored = Boolean(await MatrixClientPeg.get().isKeyBackupKeyStored()); this.setState({ backupInfo, backupSigStatus: trustInfo, From 6d46ef548e27bda21006e4bd024ef697549e5965 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 16:26:29 -0600 Subject: [PATCH 227/230] Enable tests again to catch failures --- package.json | 3 +-- scripts/ci/end-to-end-tests.sh | 47 +++++++++++++++------------------- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 4204b87b5a..7ba69c4272 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,7 @@ "lint:types": "tsc --noEmit --jsx react", "lint:style": "stylelint 'res/css/**/*.scss'", "test": "jest", - "test:e2e": "echo 'The tests are broken with cross-signing. Fix them: https://github.com/vector-im/riot-web/issues/13226'", - "test:e2e_real": "./test/end-to-end-tests/run.sh --riot-url http://localhost:8080" + "test:e2e": "./test/end-to-end-tests/run.sh --riot-url http://localhost:8080" }, "dependencies": { "@babel/runtime": "^7.8.3", diff --git a/scripts/ci/end-to-end-tests.sh b/scripts/ci/end-to-end-tests.sh index fa1f2b983f..1233677db4 100755 --- a/scripts/ci/end-to-end-tests.sh +++ b/scripts/ci/end-to-end-tests.sh @@ -13,29 +13,24 @@ handle_error() { trap 'handle_error' ERR -echo "Tests are disabled, see https://github.com/vector-im/riot-web/issues/13226" -exit 0 - -#TODO: Uncomment all of this in https://github.com/vector-im/riot-web/issues/13226 - -#echo "--- Building Riot" -#scripts/ci/layered-riot-web.sh -#cd ../riot-web -#riot_web_dir=`pwd` -#CI_PACKAGE=true yarn build -#cd ../matrix-react-sdk -## run end to end tests -#pushd test/end-to-end-tests -#ln -s $riot_web_dir riot/riot-web -## PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh -## CHROME_PATH=$(which google-chrome-stable) ./run.sh -#echo "--- Install synapse & other dependencies" -#./install.sh -## install static webserver to server symlinked local copy of riot -#./riot/install-webserver.sh -#rm -r logs || true -#mkdir logs -#echo "+++ Running end-to-end tests" -#TESTS_STARTED=1 -#./run.sh --no-sandbox --log-directory logs/ -#popd +echo "--- Building Riot" +scripts/ci/layered-riot-web.sh +cd ../riot-web +riot_web_dir=`pwd` +CI_PACKAGE=true yarn build +cd ../matrix-react-sdk +# run end to end tests +pushd test/end-to-end-tests +ln -s $riot_web_dir riot/riot-web +# PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh +# CHROME_PATH=$(which google-chrome-stable) ./run.sh +echo "--- Install synapse & other dependencies" +./install.sh +# install static webserver to server symlinked local copy of riot +./riot/install-webserver.sh +rm -r logs || true +mkdir logs +echo "+++ Running end-to-end tests" +TESTS_STARTED=1 +./run.sh --no-sandbox --log-directory logs/ +popd From a5f5f759cb83cbd03e53e3a2a826134c34cd52d4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 16 Apr 2020 16:27:43 -0600 Subject: [PATCH 228/230] Create unencrypted rooms by default in e2e-tests Otherwise the lazy loading test will try to join the room after the encrypted messages have already been sent, making them invisible. See https://github.com/vector-im/riot-web/issues/13226#issuecomment-614928362 --- src/components/views/dialogs/CreateRoomDialog.js | 7 ++++++- src/components/views/elements/LabelledToggleSwitch.js | 6 +++++- test/end-to-end-tests/src/usecases/create-room.js | 8 ++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index fa8c7dd30e..74e006354b 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -194,7 +194,12 @@ export default createReactClass({ let e2eeSection; if (!this.state.isPublic && SettingsStore.getValue("feature_cross_signing")) { e2eeSection = - +

    { _t("You can’t disable this later. Bridges & most bots won’t work yet.") }

    ; } diff --git a/src/components/views/elements/LabelledToggleSwitch.js b/src/components/views/elements/LabelledToggleSwitch.js index ecd4d39bf8..78beb2aa91 100644 --- a/src/components/views/elements/LabelledToggleSwitch.js +++ b/src/components/views/elements/LabelledToggleSwitch.js @@ -35,6 +35,9 @@ export default class LabelledToggleSwitch extends React.Component { // True to put the toggle in front of the label // Default false. toggleInFront: PropTypes.bool, + + // Additional class names to append to the switch. Optional. + className: PropTypes.string, }; render() { @@ -50,8 +53,9 @@ export default class LabelledToggleSwitch extends React.Component { secondPart = temp; } + const classes = `mx_SettingsFlag ${this.props.className || ""}`; return ( -
    +
    {firstPart} {secondPart}
    diff --git a/test/end-to-end-tests/src/usecases/create-room.js b/test/end-to-end-tests/src/usecases/create-room.js index 140748bca7..ab2d9b69b9 100644 --- a/test/end-to-end-tests/src/usecases/create-room.js +++ b/test/end-to-end-tests/src/usecases/create-room.js @@ -20,7 +20,7 @@ async function openRoomDirectory(session) { await roomDirectoryButton.click(); } -async function createRoom(session, roomName) { +async function createRoom(session, roomName, encrypted=false) { session.log.step(`creates room "${roomName}"`); const roomListHeaders = await session.queryAll('.mx_RoomSubList_labelContainer'); @@ -33,10 +33,14 @@ async function createRoom(session, roomName) { const addRoomButton = await roomsHeader.$(".mx_RoomSubList_addRoom"); await addRoomButton.click(); - const roomNameInput = await session.query('.mx_CreateRoomDialog_name input'); await session.replaceInputText(roomNameInput, roomName); + if (!encrypted) { + const encryptionToggle = await session.query('.mx_CreateRoomDialog_e2eSwitch .mx_ToggleSwitch'); + await encryptionToggle.click(); + } + const createButton = await session.query('.mx_Dialog_primary'); await createButton.click(); From c3ff75d18f55831488706a022aa68de93ef63e72 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 17 Apr 2020 11:04:52 +0100 Subject: [PATCH 229/230] Don't break spills over multiple lines, ellipsis them at max-1-line Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/elements/_RichText.scss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss index e3f88cc779..42e14525bf 100644 --- a/res/css/views/elements/_RichText.scss +++ b/res/css/views/elements/_RichText.scss @@ -14,8 +14,10 @@ } a.mx_Pill { - word-break: break-all; - display: inline; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + max-width: 100%; } /* More specific to override `.markdown-body a` text-decoration */ From 4d91dc5bba5388897fcf317a7ef193380983ae86 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 17 Apr 2020 12:30:09 +0100 Subject: [PATCH 230/230] iterate pills in rich text styling Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/elements/_RichText.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss index 42e14525bf..e01b1f8938 100644 --- a/res/css/views/elements/_RichText.scss +++ b/res/css/views/elements/_RichText.scss @@ -17,7 +17,8 @@ a.mx_Pill { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; - max-width: 100%; + vertical-align: text-bottom; + max-width: calc(100% - 1ch); } /* More specific to override `.markdown-body a` text-decoration */