From 5ef0eece9a4ee9134560e9f3757f8138610051f8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 14 May 2018 16:09:22 +0100 Subject: [PATCH 001/480] refactor and sort Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomSettings.js | 65 +++++++++++++++------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index 658f99223e..f1aba322e2 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -695,26 +695,51 @@ module.exports = React.createClass({ relatedGroupsEvent={this.props.room.currentState.getStateEvents('m.room.related_groups', '')} />; - let userLevelsSection; + let privilegedUsersSection = <div>{ _t('No users have specific privileges in this room') }.</div>; // default + let mutedUsersSection; if (Object.keys(userLevels).length) { - userLevelsSection = - <div> - <h3>{ _t('Privileged Users') }</h3> - <ul className="mx_RoomSettings_userLevels"> - { Object.keys(userLevels).map(function(user, i) { - return ( - <li className="mx_RoomSettings_userLevel" key={user}> - { _t("%(user)s is a %(userRole)s", { - user: user, - userRole: <PowerSelector value={userLevels[user]} disabled={true} />, - }) } - </li> - ); + const privilegedUsers = []; + const mutedUsers = []; + + Object.keys(userLevels).forEach(function(user) { + if (userLevels[user] > defaultUserLevel) { // privileged + privilegedUsers.push(<li className="mx_RoomSettings_userLevel" key={user}> + { _t("%(user)s is a %(userRole)s", { + user: user, + userRole: <PowerSelector value={userLevels[user]} disabled={true} />, }) } - </ul> - </div>; - } else { - userLevelsSection = <div>{ _t('No users have specific privileges in this room') }.</div>; + </li>); + } else if (userLevels[user] < defaultUserLevel) { // muted + mutedUsers.push(<li className="mx_RoomSettings_userLevel" key={user}> + { _t("%(user)s is a %(userRole)s", { + user: user, + userRole: <PowerSelector value={userLevels[user]} disabled={true} />, + }) } + </li>); + } + }); + + privilegedUsers.sort((a, b) => userLevels[b.key] - userLevels[a.key]); + mutedUsers.sort((a, b) => userLevels[a.key] - userLevels[b.key]); + + if (privilegedUsers.length) { + privilegedUsersSection = + <div> + <h3>{ _t('Privileged Users') }</h3> + <ul className="mx_RoomSettings_userLevels"> + { privilegedUsers } + </ul> + </div>; + } + if (mutedUsers.length) { + mutedUsersSection = + <div> + <h3>{ _t('Muted Users') }</h3> + <ul className="mx_RoomSettings_userLevels"> + { mutedUsers } + </ul> + </div>; + } } const banned = this.props.room.getMembersWithMembership("ban"); @@ -979,8 +1004,8 @@ module.exports = React.createClass({ { unfederatableSection } </div> - { userLevelsSection } - + { privilegedUsersSection } + { mutedUsersSection } { bannedUsersSection } <h3>{ _t('Advanced') }</h3> From 06e1acdf04f2a91ee25decd443ec5de489cb320c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 14 May 2018 16:11:42 +0100 Subject: [PATCH 002/480] run i18n-gen and i18n-prune Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/bg.json | 7 ---- src/i18n/strings/ca.json | 6 --- src/i18n/strings/cs.json | 5 --- src/i18n/strings/da.json | 1 - src/i18n/strings/de_DE.json | 7 ---- src/i18n/strings/el.json | 5 --- src/i18n/strings/en_EN.json | 70 +++++++++++++++++------------------ src/i18n/strings/en_US.json | 5 --- src/i18n/strings/eo.json | 6 --- src/i18n/strings/es.json | 3 -- src/i18n/strings/eu.json | 7 ---- src/i18n/strings/fi.json | 4 -- src/i18n/strings/fr.json | 7 ---- src/i18n/strings/gl.json | 7 ---- src/i18n/strings/he.json | 1 - src/i18n/strings/hu.json | 7 ---- src/i18n/strings/it.json | 7 ---- src/i18n/strings/ja.json | 1 - src/i18n/strings/ko.json | 5 --- src/i18n/strings/lv.json | 6 --- src/i18n/strings/nl.json | 7 ---- src/i18n/strings/pl.json | 6 --- src/i18n/strings/pt.json | 5 --- src/i18n/strings/pt_BR.json | 5 --- src/i18n/strings/ru.json | 7 ---- src/i18n/strings/sk.json | 7 ---- src/i18n/strings/sq.json | 1 - src/i18n/strings/sr.json | 7 ---- src/i18n/strings/sv.json | 1 - src/i18n/strings/th.json | 3 -- src/i18n/strings/tr.json | 5 --- src/i18n/strings/uk.json | 1 - src/i18n/strings/zh_Hans.json | 7 ---- src/i18n/strings/zh_Hant.json | 7 ---- 34 files changed, 34 insertions(+), 202 deletions(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index dc48b0ba59..7356b62fda 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -532,8 +532,6 @@ "You should not yet trust it to secure data": "Все още не трябва да се доверявате на това, че ще защити Вашите данни", "Invalid file%(extra)s": "Невалиден файл%(extra)s", "Error decrypting image": "Грешка при разшифроване на снимка", - "This image cannot be displayed.": "Тази снимка не може да бъде показана.", - "Image '%(Body)s' cannot be displayed.": "Снимката '%(Body)s' не може да бъде показана.", "Error decrypting video": "Грешка при разшифроване на видео", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s промени аватара на %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s премахна аватара на стаята.", @@ -713,9 +711,7 @@ "Ignore request": "Игнорирай поканата", "Loading device info...": "Зареждане на информация за устройството...", "Encryption key request": "Заявка за ключ за шифроване", - "Otherwise, <a>click here</a> to send a bug report.": "В противен случай, <a>натиснете тук</a>, за да изпратите съобщение за грешка.", "Unable to restore session": "Неуспешно възстановяване на сесията", - "Continue anyway": "Продължи въпреки това", "Invalid Email Address": "Невалиден имейл адрес", "This doesn't appear to be a valid email address": "Това не изглежда да е валиден имейл адрес", "Please check your email and click on the link it contains. Once this is done, click continue.": "Моля, проверете своя имейл адрес и натиснете връзката, която той съдържа. След като направите това, натиснете продължи.", @@ -962,7 +958,6 @@ "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.": "Сигурни ли сте, че искате да премахнете (изтриете) това събитие? Забележете, че ако изтриете събитие за промяна на името на стая или тема, това може да обърне промяната.", "To verify that this device 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 device matches the key below:": "За да потвърдите, че на това устройство може да се вярва, моля свържете се със собственика му по друг начин (напр. на живо или чрез телефонен разговор) и го попитайте дали ключът, който той вижда в неговите настройки на потребителя за това устройство, съвпада с ключа по-долу:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ако съвпада, моля натиснете бутона за потвърждение по-долу. Ако не, то тогава някой друг имитира това устройство и вероятно искате вместо това да натиснете бутона за черен списък.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Засякохме грешка при опита за възстановяване на предишната Ви сесия. Ако продължите, ще трябва да влезете в профила си отново. Шифрованата история на чата няма да бъде четима.", "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.": "Ако преди сте използвали по-нова версия на Riot, Вашата сесия може да не бъде съвместима с текущата версия. Затворете този прозорец и се върнете в по-новата версия.", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Това ще бъде името на профила Ви на <span></span> Home сървъра, или можете да изберете <a>друг сървър</a>.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Препоръчваме Ви да минете през процеса за потвърждение за всяко устройство, за да потвърдите, че принадлежат на легитимен собственик. Ако предпочитате, можете да изпратите съобщение без потвърждение.", @@ -996,7 +991,6 @@ "Join this community": "Присъединете се в тази общност", "Leave this community": "Напуснете тази общност", "Stickerpack": "Пакет със стикери", - "Sticker Messages": "Съобщения със стикери", "You don't currently have any stickerpacks enabled": "В момента нямате включени пакети със стикери", "Add a stickerpack": "Добави пакет със стикери", "Hide Stickers": "Скрий стикери", @@ -1108,7 +1102,6 @@ "Notify me for anything else": "Извести ме за всичко останало", "When I'm invited to a room": "Когато ме поканят в стая", "Keywords": "Ключови думи", - "<a>Click here</a> to create a GitHub issue.": "<a>Натиснете тук</a>, за да създадете GitHub issue.", "Can't update user notification settings": "Неуспешно обновяване на потребителски настройки за известяване", "Notify for all other messages/rooms": "Извести ме за всички други съобщения/стаи", "Unable to look up room ID from server": "Стая с такъв идентификатор не е намерена на сървъра", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index b95c4914b1..514c6e66fe 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -499,8 +499,6 @@ "Download %(text)s": "Baixa %(text)s", "Invalid file%(extra)s": "Fitxer invàlid%(extra)s", "Error decrypting image": "S'ha produït un error en desencriptar la imatge", - "Image '%(Body)s' cannot be displayed.": "La imatge '%(Body)s' no es pot mostrar.", - "This image cannot be displayed.": "Aquesta imatge no es pot mostrar.", "Error decrypting video": "S'ha produït un error en desencriptar el vídeo", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha canviat el seu avatar per a la sala %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha eliminat l'avatar de la sala.", @@ -694,9 +692,7 @@ "Ignore request": "Ignora la sol·licitud", "Loading device info...": "S'està carregant la informació del dispositiu...", "Encryption key request": "Sol·licitud de claus", - "Otherwise, <a>click here</a> to send a bug report.": "D'una altra manera, <a>click here</a> per a enviar un informe d'error.", "Unable to restore session": "No s'ha pogut restaurar la sessió", - "Continue anyway": "Continua de totes maneres", "Invalid Email Address": "El correu electrònic no és vàlid", "This doesn't appear to be a valid email address": "Aquest no sembla ser un correu electrònic vàlid", "Verification Pending": "Verificació pendent", @@ -714,7 +710,6 @@ "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Aquest serà el nom del seu compte al <span></span> servidor amfitrió, o bé trieu-ne un altre <a>different server</a>.", "If you already have a Matrix account you can <a>log in</a> instead.": "Si ja teniu un compte a Matrix, podeu <a>log in</a>.", "Block users on other matrix homeservers from joining this room": "Impedeix als usuaris d'altres servidors de Matrix d'entrar a aquesta sala", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Hem trobat un error en intentar restaurar la vostra sessió anterior. Si continueu, haureu d'iniciar la sessió de nou i l'historial de xat encriptat serà il·legible.", "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.": "Si anteriorment heu utilitzat un versió de Riot més recent, la vostra sessió podría ser incompatible amb aquesta versió. Tanqueu aquesta finestra i torneu a la versió més recent.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Actualment teniu a la llista negre els dispositius no verificats; per enviar missatges a aquests dispositius, els heu de verificar abans.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Recomanem que dugueu a terme el procès de verificació per a cada dispositiu per tal de confirmar que són del legítim propietari, però podeu enviar el missatge sense verificar-ho si ho preferiu.", @@ -986,7 +981,6 @@ "Notify me for anything else": "Notifica'm per a qualsevol altra cosa", "View Source": "Mostra el codi", "Keywords": "Paraules clau", - "<a>Click here</a> to create a GitHub issue.": "<a>Clica aquí</a> per crear una issue a GitHub.", "Can't update user notification settings": "No es poden actualitzar els paràmetres de les notificacions de l'usuari", "Notify for all other messages/rooms": "Notifica per a tots els altres missatges o sales", "Unable to look up room ID from server": "No s'ha pogut cercar l'ID de la sala en el servidor", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index d19f17e097..a80b9daf64 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -262,7 +262,6 @@ "olm version:": "verze olm:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Jakmile je jednou šifrování v místnosti zapnuto, nelze už vypnout (prozatím)", "Only people who have been invited": "Pouze lidé, kteří byli pozváni", - "Otherwise, <a>click here</a> to send a bug report.": "V opačném případě <a>klikněte zde</a> a pošlete hlášení o chybě.", "Password": "Heslo", "Password:": "Heslo:", "Passwords can't be empty": "Hesla nemohou být prázdná", @@ -494,8 +493,6 @@ "You need to be able to invite users to do that.": "Pro tuto akci musíte mít právo zvát uživatele.", "Delete Widget": "Smazat widget", "Error decrypting image": "Chyba při dešifrování obrázku", - "Image '%(Body)s' cannot be displayed.": "Obrázek '%(Body)s' nemůže být zobrazen.", - "This image cannot be displayed.": "Tento obrázek nelze zobrazit.", "Error decrypting video": "Chyba při dešifrování videa", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstranil/a avatar místnosti.", "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s změnil/a avatar místnosti na <img/>", @@ -808,9 +805,7 @@ "Ignore request": "Ignorovat žádost", "Encryption key request": "Žádost o šifrovací klíč", "Unable to restore session": "Nelze obnovit relaci", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Při pokusu o obnovení vaší předcházející relace se vyskytla chyba. Pokud budete pokračovat musíte se znovu přihlásit a historie šifrovaného rozhovoru nebude již dostupná.", "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.": "Pokud jste se v minulosti již přihlásili s novější verzi programu Riot, vaše relace nemusí být kompatibilní s touto verzí. Zavřete prosím toto okno a přihlaste se znovu pomocí nové verze.", - "Continue anyway": "Přesto pokračovat", "Please check your email and click on the link it contains. Once this is done, click continue.": "Prosím, zkontrolujte si email a klikněte na odkaz ve zprávě, kterou jsme vám zaslali. V případě, že jste tak již učinili, klikněte na tlačítko Pokračovat.", "This will allow you to reset your password and receive notifications.": "Toto vám umožní obnovit si heslo a přijímat oznámení emailem.", "Skip": "Přeskočit", diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 19fc7d06c6..2a59530d5a 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -393,7 +393,6 @@ "There are advanced notifications which are not shown here": "Der er avancerede meddelelser, som ikke vises her", "%(count)s Members|other": "%(count)s medlemmer", "Logs sent": "Logfiler sendt", - "<a>Click here</a> to create a GitHub issue.": "<a>Klik her</a> for at oprette et GitHub-issue.", "Reply": "Besvar", "All messages (noisy)": "Alle meddelelser (højlydt)", "GitHub issue link:": "Link til GitHub issue:", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 21d40dd86d..f2f4e103f7 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -431,7 +431,6 @@ "Verify device": "Gerät verifizieren", "I verify that the keys match": "Ich bestätige, dass die Schlüssel identisch sind", "Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen", - "Continue anyway": "Trotzdem fortfahren", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Nicht verifizierte Geräte werden aktuell blockiert und auf die Sperrliste gesetzt. Um Nachrichten an diese Geräte senden zu können, müssen diese zunächst verifiziert werden.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" enthält Geräte, die du bislang noch nicht gesehen hast.", "Unknown devices": "Unbekannte Geräte", @@ -458,8 +457,6 @@ "What does this mean?": "Was bedeutet das?", "Error decrypting audio": "Audio-Entschlüsselung fehlgeschlagen", "Error decrypting image": "Bild-Entschlüsselung fehlgeschlagen", - "Image '%(Body)s' cannot be displayed.": "Das Bild '%(Body)s' kann nicht angezeigt werden.", - "This image cannot be displayed.": "Dieses Bild kann nicht angezeigt werden.", "Error decrypting video": "Video-Entschlüsselung fehlgeschlagen", "Import room keys": "Raum-Schlüssel importieren", "File to import": "Zu importierende Datei", @@ -480,7 +477,6 @@ "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dies wird dein Benutzerkonto dauerhaft unbenutzbar machen. Du wirst nicht in der Lage sein, dich mit derselben Benutzer-ID erneut zu registrieren.", "To verify that this device 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 device matches the key below:": "Um sicherzustellen, dass diesem Gerät vertraut werden kann, kontaktiere bitte den Eigentümer des Geräts über ein anderes Kommunikationsmittel (z.B. im persönlichen Gespräch oder durch einen Telefonanruf) und vergewissere dich, dass der Schlüssel, den der Eigentümer in den Benutzer-Einstellungen für dieses Gerät sieht, mit dem folgenden Schlüssel identisch ist:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Wenn er identisch ist, bitte den Bestätigen-Button unten verwenden. Falls er nicht identisch sein sollte, hat eine Fremdperson Kontrolle über dieses Gerät und es sollte gesperrt werden.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Bei der Wiederherstellung deiner letzten Sitzung ist ein Fehler aufgetreten. Um fortzufahren, musst du dich erneut anmelden. Ein zuvor verschlüsselter Chatverlauf wird in der Folge nicht mehr lesbar sein.", "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.": "Wenn du zuvor eine aktuellere Version von Riot verwendet hast, ist deine Sitzung eventuell inkompatibel mit dieser Version. Bitte schließe dieses Fenster und kehre zur aktuelleren Version zurück.", "Blacklist": "Blockieren", "Unblacklist": "Entblockieren", @@ -590,7 +586,6 @@ "Last seen": "Zuletzt gesehen", "Level:": "Berechtigungslevel:", "No display name": "Kein Anzeigename", - "Otherwise, <a>click here</a> to send a bug report.": "Alternativ <a>hier klicken</a>, um einen Fehlerbericht zu senden.", "Private Chat": "Privater Chat", "Public Chat": "Öffentlicher Chat", "Reason: %(reasonText)s": "Grund: %(reasonText)s", @@ -995,7 +990,6 @@ "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Änderungen am <bold1>Namen</bold1> und <bold2>Bild</bold2> deiner Community werden evtl. erst nach 30 Minuten von anderen Nutzern gesehen werden.", "Join this community": "Community beitreten", "Leave this community": "Community verlassen", - "Sticker Messages": "Sticker-Nachrichten", "You don't currently have any stickerpacks enabled": "Du hast aktuell keine Stickerpacks aktiviert", "Add a stickerpack": "Füge ein Stickerpack hinzu", "Hide Stickers": "Sticker verbergen", @@ -1110,7 +1104,6 @@ "What's new?": "Was ist neu?", "Notify me for anything else": "Über alles andere benachrichtigen", "When I'm invited to a room": "Wenn ich in einen Raum eingeladen werde", - "<a>Click here</a> to create a GitHub issue.": "<a>Klicke hier</a> um ein GithHub-Problem zu erstellen.", "Can't update user notification settings": "Benachrichtigungs-Einstellungen des Benutzers konnten nicht aktualisiert werden", "Notify for all other messages/rooms": "Benachrichtigungen für alle anderen Mitteilungen/Räume aktivieren", "Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index b5acd8855e..9817010e38 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -384,7 +384,6 @@ "Device key": "Κλειδί συσκευής", "Verify device": "Επιβεβαίωση συσκευής", "Unable to restore session": "Αδυναμία επαναφοράς συνεδρίας", - "Continue anyway": "Συνέχεια οπωσδήποτε", "Unknown devices": "Άγνωστες συσκευές", "Unknown Address": "Άγνωστη διεύθυνση", "Blacklist": "Μαύρη λίστα", @@ -402,8 +401,6 @@ "What does this mean?": "Τι σημαίνει αυτό;", "Error decrypting audio": "Σφάλμα κατά την αποκρυπτογράφηση του ήχου", "Error decrypting image": "Σφάλμα κατά την αποκρυπτογράφηση της εικόνας", - "Image '%(Body)s' cannot be displayed.": "Η εικόνα '%(Body)s' δεν μπορεί να εμφανιστεί.", - "This image cannot be displayed.": "Αυτή η εικόνα δεν μπορεί να εμφανιστεί.", "Error decrypting video": "Σφάλμα κατά την αποκρυπτογράφηση του βίντεο", "Add an Integration": "Προσθήκη ενσωμάτωσης", "URL Previews": "Προεπισκόπηση συνδέσμων", @@ -462,7 +459,6 @@ "No users have specific privileges in this room": "Κανένας χρήστης δεν έχει συγκεκριμένα δικαιώματα σε αυτό το δωμάτιο", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Μόλις ενεργοποιηθεί η κρυπτογράφηση για ένα δωμάτιο, δεν μπορεί να απενεργοποιηθεί ξανά (για τώρα)", "Only people who have been invited": "Μόνο άτομα που έχουν προσκληθεί", - "Otherwise, <a>click here</a> to send a bug report.": "Διαφορετικά, κάντε <a>κλικ εδώ</a> για να αποστείλετε μια αναφορά σφάλματος.", "%(senderName)s placed a %(callType)s call.": "Ο %(senderName)s πραγματοποίησε μια %(callType)s κλήση.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία και κάντε κλικ στον σύνδεσμο που περιέχει. Μόλις γίνει αυτό, κάντε κλίκ στο κουμπί συνέχεια.", "Refer a friend to Riot:": "Πείτε για το Riot σε έναν φίλο σας:", @@ -621,7 +617,6 @@ "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Με αυτόν τον τρόπο, ο λογαριασμός σας θα είναι μόνιμα αχρησιμοποίητος. Δεν θα μπορείτε να εγγραφείτε ξανά με το ίδιο αναγνωριστικό χρήστη.", "To verify that this device 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 device matches the key below:": "Για να βεβαιωθείτε ότι είναι αξιόπιστη αυτή η συσκευή, επικοινωνήστε με τον κάτοχο της χρησιμοποιώντας άλλα μέσα (π.χ. προσωπικά ή μέσω τηλεφώνου) και ρωτήστε εάν το κλειδί που βλέπετε στις ρυθμίσεις χρήστη για αυτήν τη συσκευή ταιριάζει με το παρακάτω κλειδί:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Εάν ταιριάζει, πατήστε το κουμπί επιβεβαίωσης παρακάτω. Εάν όχι, τότε κάποιος άλλος παρακολουθεί αυτή τη συσκευή και ίσως θέλετε να πατήσετε το κουμπί της μαύρης λίστας.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Παρουσιάστηκε ένα σφάλμα κατά την προσπάθεια επαναφοράς της προηγούμενης συνεδρίας. Αν συνεχίσετε, θα χρειαστεί να συνδεθείτε ξανά και το κρυπτογραφημένο ιστορικό συνομιλιών θα είναι μη αναγνώσιμο.", "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.": "Αν χρησιμοποιούσατε προηγουμένως μια πιο πρόσφατη έκδοση του Riot, η συνεδρία σας ίσως είναι μη συμβατή με αυτήν την έκδοση. Κλείστε αυτό το παράθυρο και επιστρέψτε στην πιο πρόσφατη έκδοση.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Αυτήν τη στιγμή βάζετε σε μαύρη λίστα μη επιβαιωμένες συσκευές. Για να στείλετε μηνύματα σε αυτές τις συσκευές, πρέπει να τις επιβεβαιώσετε.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Σας συνιστούμε να ολοκληρώσετε τη διαδικασία επαλήθευσης για κάθε συσκευή και να επιβεβαιώσετε ότι ανήκουν στον νόμιμο κάτοχό της, αλλά εάν προτιμάτε μπορείτε να στείλετε ξανά το μήνυμα χωρίς επαλήθευση.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 9b932ef2b6..d38259cdbf 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -41,6 +41,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -80,6 +84,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -178,11 +183,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -190,7 +190,6 @@ "Message Replies": "Message Replies", "Message Pinning": "Message Pinning", "Tag Panel": "Tag Panel", - "Sticker Messages": "Sticker Messages", "Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing", "Use compact timeline layout": "Use compact timeline layout", "Hide removed messages": "Hide removed messages", @@ -297,6 +296,29 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -393,11 +415,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -490,9 +512,10 @@ "To kick users, you must be a": "To kick users, you must be a", "To ban users, you must be a": "To ban users, you must be a", "To remove other users' messages, you must be a": "To remove other users' messages, you must be a", - "Privileged Users": "Privileged Users", - "%(user)s is a %(userRole)s": "%(user)s is a %(userRole)s", "No users have specific privileges in this room": "No users have specific privileges in this room", + "%(user)s is a %(userRole)s": "%(user)s is a %(userRole)s", + "Privileged Users": "Privileged Users", + "Muted Users": "Muted Users", "Banned users": "Banned users", "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers", "Leave room": "Leave room", @@ -528,29 +551,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -566,8 +566,6 @@ "Download %(text)s": "Download %(text)s", "Invalid file%(extra)s": "Invalid file%(extra)s", "Error decrypting image": "Error decrypting image", - "This image cannot be displayed.": "This image cannot be displayed.", - "Image '%(Body)s' cannot be displayed.": "Image '%(Body)s' cannot be displayed.", "Error decrypting video": "Error decrypting video", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", @@ -815,8 +813,8 @@ "Encryption key request": "Encryption key request", "Sign out": "Sign out", "Log out and remove encryption keys?": "Log out and remove encryption keys?", - "Send Logs": "Send Logs", "Clear Storage and Sign Out": "Clear Storage and Sign Out", + "Send Logs": "Send Logs", "Refresh": "Refresh", "Unable to restore session": "Unable to restore session", "We encountered an error trying to restore your previous session.": "We encountered an error trying to restore your previous session.", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index a3184fdc38..e316f72e80 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -509,10 +509,8 @@ "In future this verification process will be more sophisticated.": "In future this verification process will be more sophisticated.", "Verify device": "Verify device", "I verify that the keys match": "I verify that the keys match", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.", "Unable to restore session": "Unable to restore session", "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.": "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.", - "Continue anyway": "Continue anyway", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contains devices that you haven't seen before.", @@ -558,8 +556,6 @@ "What does this mean?": "What does this mean?", "Error decrypting audio": "Error decrypting audio", "Error decrypting image": "Error decrypting image", - "Image '%(Body)s' cannot be displayed.": "Image '%(Body)s' cannot be displayed.", - "This image cannot be displayed.": "This image cannot be displayed.", "Error decrypting video": "Error decrypting video", "Add an Integration": "Add an Integration", "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?": "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?", @@ -608,7 +604,6 @@ "Last seen": "Last seen", "Level:": "Level:", "No display name": "No display name", - "Otherwise, <a>click here</a> to send a bug report.": "Otherwise, <a>click here</a> to send a bug report.", "Private Chat": "Private Chat", "Public Chat": "Public Chat", "Reason: %(reasonText)s": "Reason: %(reasonText)s", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index cc8de81fa9..fae7d6cfa8 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -475,8 +475,6 @@ "Download %(text)s": "Elŝuti %(text)s", "Invalid file%(extra)s": "Malvalida dosiero%(extra)s", "Error decrypting image": "Eraro malĉifrante bildon", - "Image '%(Body)s' cannot be displayed.": "Bildo ‹%(Body)s› ne montreblas.", - "This image cannot be displayed.": "Ĉi tiu bildo ne montreblas.", "Error decrypting video": "Eraro malĉifrante videon", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s forigis la ĉambran profilbildon.", "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s agordis la ĉambran profilbildon al <img/>", @@ -673,11 +671,8 @@ "Ignore request": "Malatenti peton", "Loading device info...": "Enleganta informojn pri aparato…", "Encryption key request": "Peto por ĉifra ŝlosilo", - "Otherwise, <a>click here</a> to send a bug report.": "Alie, <a>klaku ĉi tie</a> por sendi cimraporton.", "Unable to restore session": "Seanco ne restaŭreblas", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Okazis eraron dum restaŭro de via antaŭa seanco. Se vi daŭrigos, vi devos denove saluti, kaj ĉifrita babila historio estos nelegebla.", "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.": "Se vi antaŭe uzis pli novan version de Riot, via seanco eble ne kongruos kun ĉi tiu versio. Fermu ĉi tiun fenestron kaj revenu al la pli nova versio.", - "Continue anyway": "Tamen daŭrigi", "Invalid Email Address": "Malvalida retpoŝtadreso", "This doesn't appear to be a valid email address": "Tio ĉi ne ŝajnas esti valida retpoŝtadreso", "Verification Pending": "Atendanta kontrolon", @@ -1107,7 +1102,6 @@ "Checking for an update...": "Serĉanta ĝisdatigojn…", "There are advanced notifications which are not shown here": "Ekzistas specialaj sciigoj, kiuj ne montriĝas ĉi tie", "Logs sent": "Protokolo sendiĝis", - "<a>Click here</a> to create a GitHub issue.": "<a>Klaku ĉi tie</a> por krei raporton ĉe GitHub.", "GitHub issue link:": "Ligilo al raporto ĉe GitHub:", "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.": "Sencimigaj protokoloj enhavas informojn pri uzo de aplikaĵo, inkluzive vian salutnomon, la identigilojn aŭ nomojn de la ĉambroj aŭ grupoj kiujn vi vizitis, kaj la salutnomojn de aliaj uzantoj. Ili ne enhavas mesaĝojn.", "Failed to send logs: ": "Malsukcesis sendi protokolon: ", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 07b38d7566..7ec0e821db 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -250,7 +250,6 @@ "Verify device": "Verifique el dispositivo", "I verify that the keys match": "Confirmo que las claves coinciden", "Unable to restore session": "No se puede recuperar la sesión", - "Continue anyway": "Continuar igualmente", "Room Colour": "Color de la sala", "Room contains unknown devices": "La sala contiene dispositivos desconocidos", "Room name (optional)": "Nombre de la sala (opcional)", @@ -344,7 +343,6 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Una vez se active el cifrado en esta sala, no podrá ser desactivado (por ahora)", "Only people who have been invited": "Sólo usuarios que han sido invitados", "Operation failed": "Falló la operación", - "Otherwise, <a>click here</a> to send a bug report.": "También puede <a>pulsar aquí</a> para enviar un informe de fallos.", "Password": "Contraseña", "Password:": "Contraseña:", "Passwords can't be empty": "Las contraseñas no pueden estar en blanco", @@ -696,7 +694,6 @@ "What's new?": "¿Qué hay de nuevo?", "Notify me for anything else": "Notificarme para cualquier otra cosa", "When I'm invited to a room": "Cuando estoy invitado a una sala", - "<a>Click here</a> to create a GitHub issue.": "<a>Haz click aquí</a> para crear una incidencia en Github.", "Can't update user notification settings": "No se puede actualizar la configuración de notificaciones del usuario", "Notify for all other messages/rooms": "Notificar para todos los demás mensajes/salas", "Unable to look up room ID from server": "No se puede buscar el ID de la sala desde el servidor", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index e478c3270b..4015d703ce 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -327,7 +327,6 @@ "No users have specific privileges in this room": "Ez dago gela honetan baimen zehatzik duen erabiltzailerik", "olm version:": "olm bertsioa:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Behin gela batean zifratzea gaituta ezin da gero desgaitu (oraingoz)", - "Otherwise, <a>click here</a> to send a bug report.": "Bestela, <a>bidali arazte-txosten bat</a>.", "Server may be unavailable, overloaded, or you hit a bug.": "Agian zerbitzaria ez dago eskuragarri, edo gainezka dago, edo akats bat aurkitu duzu.", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Oraingoz pasahitza aldatzeak gailu guztietako muturretik muturrerako zifratze-gakoak berrezarriko ditu, eta ezin izango dituzu zifratutako txatetako historialak irakurri ez badituzu aurretik zure gelako gakoak esportatzen eta aldaketa eta gero berriro inportatzen. Etorkizunean hau hobetuko da.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Segurtasunagatik, saioa amaitzeak nabigatzaile honetako muturretik muturrerako zifratze gako guztiak ezabatuko ditu. Zure elkarrizketen historiala deszifratzeko gai izan nahi baduzu etorkizuneko Riot saioetan, esportatu zure gelako gakoen babes-kopia bat.", @@ -574,10 +573,8 @@ "To verify that this device 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 device matches the key below:": "Gailu hau fidagarria dela egiaztatzeko, kontaktatu bere jabea beste medio bat erabiliz (adib. aurrez aurre edo telefonoz deituz) eta galdetu beraien erabiltzaile-ezarpenetan bere gailurako ikusten duen gakoa hemen beheko bera den:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta blokeatu beharko zenuke.", "In future this verification process will be more sophisticated.": "etorkizunean egiaztaketa metodoa hobetuko da.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Errore bat gertatu da zure aurreko saioa berreskuratzen saiatzean. Jarraitzen baduzu berriro hasi beharko duzu saioa eta ezin izango duzu irakurri zifratutako historiala.", "Unable to restore session": "Ezin izan da saioa berreskuratu", "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.": "Aurretik Riot bertsio berriago bat erabili baduzu, zure saioa bertsio honekin bateraezina izan daiteke. Itxi leiho hau eta itzuli bertsio berriagora.", - "Continue anyway": "Jarraitu hala ere", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Gailu bakoitzaren egiaztaketa prozesua jarraitzea aholkatzen dizugu, benetako jabeari dagozkiela baieztatzeko, baina mezua egiaztatu gabe birbidali dezakezu ere.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" gelan aurretik ikusi ez dituzun gailuak daude.", "Unknown devices": "Gailu ezezagunak", @@ -600,8 +597,6 @@ "What does this mean?": "Zer esan nahi du honek?", "Error decrypting audio": "Errorea audioa deszifratzean", "Error decrypting image": "Errorea audioa deszifratzean", - "Image '%(Body)s' cannot be displayed.": "Ezin da '%(Body)s' irudia bistaratu.", - "This image cannot be displayed.": "Irudi hau ezin da bistaratu.", "Error decrypting video": "Errorea bideoa deszifratzean", "Add an Integration": "Gehitu integrazioa", "Removed or unknown message type": "Kenduta edo mezu mota ezezaguna", @@ -996,7 +991,6 @@ "Join this community": "Elkartu komunitate honetara", "Leave this community": "Atera komunitate honetatik", "Stickerpack": "Eranskailu-multzoa", - "Sticker Messages": "Eranskailu mezuak", "You don't currently have any stickerpacks enabled": "Ez duzu eranskailu multzorik aktibatuta", "Add a stickerpack": "Gehitu eranskailu-multzoa", "Hide Stickers": "Ezkutatu eranskailuak", @@ -1110,7 +1104,6 @@ "What's new?": "Zer dago berri?", "Notify me for anything else": "Jakinarazi beste edozer", "When I'm invited to a room": "Gela batetara gonbidatzen nautenean", - "<a>Click here</a> to create a GitHub issue.": "<a>Egin klik hemen</a> GitHub-en arazoaren berri emateko.", "Can't update user notification settings": "Ezin dira erabiltzailearen jakinarazpenen ezarpenak eguneratu", "Notify for all other messages/rooms": "Jakinarazi beste mezu/gela guztiak", "Unable to look up room ID from server": "Ezin izan da gelaren IDa zerbitzarian bilatu", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 7f7ac9729f..0f05b697a6 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -440,7 +440,6 @@ "Verify device": "Varmenna laite", "I verify that the keys match": "Totean että avaimet vastaavat toisiaan", "Unable to restore session": "Istunnon palautus epäonnistui", - "Continue anyway": "Jatka kuitenkin", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s poisti huoneen nimen.", "Changes to who can read history will only apply to future messages in this room": "Muutokset koskien ketkä voivat lukea historian koskevat vain uusia viestejä", "<a>Click here</a> to join the discussion!": "<a>Paina tästä</a> liittyäksesi keskusteluun", @@ -517,7 +516,6 @@ "Failed to change power level": "Oikeustason muuttaminen epäonnistui", "'%(alias)s' is not a valid format for an address": "'%(alias)s' ei ole oikean muotoinen osoitteelle", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ei ole oikean muotoinen aliakselle", - "Otherwise, <a>click here</a> to send a bug report.": "Paina muutoin <a>tästä</a> lähettääksesi virheraportin.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ole hyvä ja tarkista sähköpostisi ja seuraa sen sisältämää linkkiä. Kun olet valmis, paina jatka.", "Power level must be positive integer.": "Oikeustason pitää olla positiivinen kokonaisluku.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Salasanan uudelleenalustus uudelleenalustaa myös päästä päähän-salausavaimet kaikilla laitteilla, jolloin vanhojen viestien lukeminen ei ole enään mahdollista, ellet ensin vie huoneavaimet ja tuo ne takaisin jälkeenpäin. Tämä tulee muuttumaan tulevaisuudessa.", @@ -576,8 +574,6 @@ "What does this mean?": "Mitä tämä tarkoittaa?", "Error decrypting audio": "Äänen salauksen purku epäonnistui", "Error decrypting image": "Kuvan salauksen purku epäonnistui", - "Image '%(Body)s' cannot be displayed.": "Kuva '%(Body)s' ei voida näyttää.", - "This image cannot be displayed.": "Tätä kuvaa ei voida näyttää.", "Error decrypting video": "Videon salauksen purku epäonnistui", "Add an Integration": "Lisää integraatio", "Removed or unknown message type": "Poistettu tai tuntematon viestityyppi", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 9c0f3f98e8..0787a06134 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -443,10 +443,8 @@ "In future this verification process will be more sophisticated.": "À l’avenir ce processus de vérification sera plus sophistiqué.", "Verify device": "Vérifier cet appareil", "I verify that the keys match": "J’ai vérifié que les clés correspondaient", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Nous avons rencontré une erreur en essayant de rétablir votre session précédente. Si vous continuez, vous devrez vous identifier à nouveau et l’historique de vos discussions chiffrées sera illisible.", "Unable to restore session": "Impossible de restaurer la session", "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.": "Si vous avez utilisé une version plus récente de Riot précédemment, votre session risque d’être incompatible avec cette version. Fermez cette fenêtre et retournez à la version plus récente.", - "Continue anyway": "Continuer quand même", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Vous êtes en train d’ajouter à la liste noire des appareils non-vérifiés ; pour envoyer des messages à ces appareils vous devez les vérifier.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Nous vous recommandons d’effectuer le processus de vérification pour tous les appareils afin de confirmer qu’ils appartiennent à leurs propriétaires légitimes, mais vous pouvez renvoyer le(s) message(s) sans vérifier si vous préférez.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contient des appareils que vous n'avez encore jamais vus.", @@ -478,8 +476,6 @@ "What does this mean?": "Qu’est ce que cela signifie ?", "Error decrypting audio": "Erreur lors du déchiffrement de l’audio", "Error decrypting image": "Erreur lors du déchiffrement de l’image", - "Image '%(Body)s' cannot be displayed.": "L'image \"%(Body)s\" ne peut pas être affichée.", - "This image cannot be displayed.": "Cette image ne peut pas être affichée.", "Error decrypting video": "Erreur lors du déchiffrement de la vidéo", "Add an Integration": "Ajouter une intégration", "URL Previews": "Aperçus des liens", @@ -579,7 +575,6 @@ "Incoming video call from %(name)s": "Appel vidéo entrant de %(name)s", "Incoming voice call from %(name)s": "Appel vocal entrant de %(name)s", "No display name": "Pas de nom affiché", - "Otherwise, <a>click here</a> to send a bug report.": "Sinon, <a>cliquer ici</a> pour envoyer un rapport d'erreur.", "Private Chat": "Discussion privée", "Public Chat": "Discussion publique", "Reason: %(reasonText)s": "Raison : %(reasonText)s", @@ -996,7 +991,6 @@ "Join this community": "Rejoindre cette communauté", "Leave this community": "Quitter cette communauté", "Stickerpack": "Pack de stickers", - "Sticker Messages": "Messages sticker", "You don't currently have any stickerpacks enabled": "Vous n'avez activé aucun pack de stickers pour l'instant", "Add a stickerpack": "Ajouter un pack de stickers", "Hide Stickers": "Masquer les stickers", @@ -1158,7 +1152,6 @@ "Preparing to send logs": "Préparation d'envoi des rapports", "Missing roomId.": "Identifiant de salon manquant.", "Picture": "Image", - "<a>Click here</a> to create a GitHub issue.": "<a>Cliquez ici</a> pour créer un signalement sur GitHub.", "Popout widget": "Détacher le widget", "Every page you use in the app": "Toutes les pages que vous utilisez dans l'application", "e.g. <CurrentPageURL>": "par ex. <CurrentPageURL>", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 06bff9eb76..6c329b5454 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -475,8 +475,6 @@ "Download %(text)s": "Baixar %(text)s", "Invalid file%(extra)s": "Ficheiro non válido %(extra)s", "Error decrypting image": "Fallo ao descifrar a imaxe", - "Image '%(Body)s' cannot be displayed.": "Imaxe '%(Body)s' non pode ser mostrada.", - "This image cannot be displayed.": "Esta imaxe non se pode ser mostrada.", "Error decrypting video": "Fallo descifrando vídeo", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s cambiou o avatar para %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s eliminou o avatar da sala.", @@ -674,11 +672,8 @@ "Ignore request": "Ignorar petición", "Loading device info...": "Cargando información do dispositivo...", "Encryption key request": "Petición de chave de cifrado", - "Otherwise, <a>click here</a> to send a bug report.": "Se non, <a>pulse aquí</a> para enviar un informe de fallo.", "Unable to restore session": "Non se puido restaurar a sesión", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Atopamos un erro intentando restablecer a sesión anterior. Si continúa, deberá conectarse de novo, e a parte cifrada do chat non será lexible.", "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.": "Si anteriormente utilizou unha versión máis recente de Riot, a súa sesión podería non ser compatible con esta versión. Peche esta ventá e volte a versión máis recente.", - "Continue anyway": "Continuar igualmente", "Invalid Email Address": "Enderezo de email non válido", "This doesn't appear to be a valid email address": "Este non semella ser un enderezo de email válido", "Verification Pending": "Verificación pendente", @@ -996,7 +991,6 @@ "Submit debug logs": "Enviar informes de depuración", "Opens the Developer Tools dialog": "Abre o cadro de Ferramentas de Desenvolvedoras", "Stickerpack": "Peganitas", - "Sticker Messages": "Mensaxes pegadas", "You don't currently have any stickerpacks enabled": "Non ten paquetes de pegatinas habilitados", "Add a stickerpack": "Engadir un paquete de pegatinas", "Hide Stickers": "Agochar pegatinas", @@ -1110,7 +1104,6 @@ "What's new?": "Qué hai de novo?", "Notify me for anything else": "Notificarme todo o demáis", "When I'm invited to a room": "Cando son convidado a unha sala", - "<a>Click here</a> to create a GitHub issue.": "<a>Pulse aquí</a> para crear un reporte en GitHub.", "Can't update user notification settings": "Non se poden actualizar os axutes de notificación", "Notify for all other messages/rooms": "Notificar para todas as outras mensaxes/salas", "Unable to look up room ID from server": "Non se puido atopar o ID da sala do servidor", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 7e747428a6..dbae2858a9 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -195,7 +195,6 @@ "What's new?": "מה חדש?", "Notify me for anything else": "התראה לי על כל דבר אחר", "When I'm invited to a room": "מתי אני מוזמן לחדר", - "<a>Click here</a> to create a GitHub issue.": "<a>הקלק כאן <a/>ליצירת דווח תקלה ב: GitHub .", "Can't update user notification settings": "לא ניתן לעדכן הגדרות התראה למשתמש", "Notify for all other messages/rooms": "התראה לכל שאר ההודעות/החדרים", "Unable to look up room ID from server": "לא ניתן לאתר מזהה חדר על השרת", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index c2b8af12ee..15691712db 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -279,7 +279,6 @@ "olm version:": "olm verzió:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Ha egyszer bekapcsolod a titkosítást a szobába utána nem lehet kikapcsolni (egyenlőre)", "Only people who have been invited": "Csak akiket meghívtak", - "Otherwise, <a>click here</a> to send a bug report.": "Különben hiba jelentés küldéséhez <a>kattints ide</a>.", "Password": "Jelszó", "Password:": "Jelszó:", "Passwords can't be empty": "A jelszó nem lehet üres", @@ -562,7 +561,6 @@ "Verify device": "Eszköz ellenőrzése", "I verify that the keys match": "Megerősítem, hogy a kulcsok egyeznek", "Unable to restore session": "A kapcsolatot nem lehet visszaállítani", - "Continue anyway": "Mindenképpen tovább", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" szobában olyan eszközök vannak amiket még nem láttál.", "Unknown devices": "Ismeretlen eszköz", "Unknown Address": "Ismeretlen cím", @@ -585,8 +583,6 @@ "What does this mean?": "Ez mit jelent?", "Error decrypting audio": "Hiba a hang visszafejtésénél", "Error decrypting image": "Hiba a kép visszafejtésénél", - "Image '%(Body)s' cannot be displayed.": "'%(Body)s' képet nem lehet megjeleníteni.", - "This image cannot be displayed.": "Ezt a képet nem lehet megjeleníteni.", "Error decrypting video": "Hiba a videó visszafejtésénél", "Add an Integration": "Integráció hozzáadása", "Removed or unknown message type": "Eltávolított üzenet vagy ismeretlen üzenet típus", @@ -621,7 +617,6 @@ "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.": "Biztos hogy eltávolítod (törlöd) ezt az eseményt? Figyelem, ha törlöd vagy megváltoztatod a szoba nevét vagy a témát ez a változtatás érvényét vesztheti.", "To verify that this device 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 device matches the key below:": "Az eszköz megbízhatóságának ellenőrzéséhez, lépj kapcsolatba a tulajdonossal valami más csatornán (pl. személyesen vagy telefon hívással) és kérdezd meg, hogy a kulcs amit a Felhasználói Beállításoknál látnak az eszközhöz megegyezik-e a kulccsal itt:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ha megegyezik, nyomd meg az megerősítő gombot alul. Ha nem akkor valaki más használja az eszközt és inkább a Feketelista gombot szeretnéd használni.", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Az előző kapcsolat visszaállításánál hibára akadtunk. Ha folytatod újra be kell jelentkezned és a titkosított csevegések olvashatatlanok lesznek.", "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.": "Ha egy újabb Riot verziót használtál valószínűleg ez kapcsolat nem lesz kompatibilis vele. Zárd be az ablakot és térj vissza az újabb verzióhoz.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Jelenleg fekete listára teszel minden ismeretlen eszközt. Ha üzenetet szeretnél küldeni ezekre az eszközökre először ellenőrizned kell őket.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Azt javasoljuk, hogy menj végig ellenőrző folyamaton minden eszköznél, hogy meg megerősítsd minden eszköz a jogos tulajdonosához tartozik, de újraküldheted az üzenetet ellenőrzés nélkül, ha úgy szeretnéd.", @@ -996,7 +991,6 @@ "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "A közösséget <bold1>name</bold1> és <bold2>avatar</bold2> érintő változások legfeljebb 30 percig nem lesznek láthatók más felhasználók számára.", "Leave this community": "Közösség elhagyása", "Stickerpack": "Matrica csomag", - "Sticker Messages": "Matrica üzenetek", "You don't currently have any stickerpacks enabled": "Nincs engedélyezett matrica csomagod", "Add a stickerpack": "Matrica csomag hozzáadása", "Hide Stickers": "Matricák elrejtése", @@ -1109,7 +1103,6 @@ "What's new?": "Mik az újdonságok?", "Notify me for anything else": "Értesíts minden egyéb esetben", "When I'm invited to a room": "Amikor meghívnak egy szobába", - "<a>Click here</a> to create a GitHub issue.": "<a>Kattints ide</a> GitHub hibajegy nyitásához .", "Can't update user notification settings": "Nem lehet frissíteni az értesítési beállításokat", "Notify for all other messages/rooms": "Értesítés minden más üzenethez/szobához", "Unable to look up room ID from server": "Nem lehet a szoba azonosítóját megkeresni a szerveren", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index ba7417bcc8..b660231915 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -521,8 +521,6 @@ "Download %(text)s": "Scarica %(text)s", "Invalid file%(extra)s": "File non valido %(extra)s", "Error decrypting image": "Errore decifratura immagine", - "This image cannot be displayed.": "Questa immagine non può essere visualizzata.", - "Image '%(Body)s' cannot be displayed.": "L'immagine '%(Body)s' non può essere visualizzata.", "Error decrypting video": "Errore decifratura video", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha cambiato l'avatar per %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha rimosso l'avatar della stanza.", @@ -714,11 +712,8 @@ "Ignore request": "Ignora la richiesta", "Loading device info...": "Caricamento info dispositivo...", "Encryption key request": "Richiesta chiave di cifratura", - "Otherwise, <a>click here</a> to send a bug report.": "Altrimenti <a>clicca qui</a> per inviare una segnalazione di errore.", "Unable to restore session": "Impossibile ripristinare la sessione", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente. Se continui, dovrai accedere di nuovo e la cronologia della chat criptata sarà illeggibile.", "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.": "Se hai usato precedentemente una versione più recente di Riot, la tua sessione potrebbe essere incompatibile con questa versione. Chiudi questa finestra e torna alla versione più recente.", - "Continue anyway": "Continua comunque", "Invalid Email Address": "Indirizzo email non valido", "This doesn't appear to be a valid email address": "Questo non sembra essere un indirizzo email valido", "Verification Pending": "In attesa di verifica", @@ -993,7 +988,6 @@ "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Le modifiche al <bold1>nome</bold1> e all'<bold2>avatar</bold2> effettuate alla tua comunità potrebbero non essere visibili agli altri utenti per i prossimi 30 minuti.", "Join this community": "Unisciti a questa comunità", "Leave this community": "Esci da questa comunità", - "Sticker Messages": "Messaggi adesivi", "You don't currently have any stickerpacks enabled": "Non hai ancora alcun pacchetto di adesivi attivato", "Add a stickerpack": "Aggiungi un pacchetto di adesivi", "Who can join this community?": "Chi può unirsi a questa comunità?", @@ -1104,7 +1098,6 @@ "What's new?": "Cosa c'è di nuovo?", "Notify me for anything else": "Notificami per qualsiasi altra cosa", "When I'm invited to a room": "Quando vengo invitato/a in una stanza", - "<a>Click here</a> to create a GitHub issue.": "<a>Clicca qui</a> per creare una segnalazione su GitHub.", "Can't update user notification settings": "Impossibile aggiornare le impostazioni di notifica dell'utente", "Notify for all other messages/rooms": "Notifica per tutti gli altri messaggi/stanze", "Unable to look up room ID from server": "Impossibile consultare l'ID stanza dal server", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 013790aa80..3908ede0e2 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -210,7 +210,6 @@ "Failed to send custom event.": "カスタムイベントの送信に失敗しました。", "What's new?": "新着", "Notify me for anything else": "他の場合についても通知する", - "<a>Click here</a> to create a GitHub issue.": "<a>ここをクリック</a> してGithubの問題を報告してください。", "Notify for all other messages/rooms": "他のすべてのメッセージ又は部屋について通知する", "Unable to look up room ID from server": "サーバから部屋IDを検索できません", "Couldn't find a matching Matrix room": "一致するMatrixの部屋を見つけることができませんでした", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index ff5ebd72d7..f0b8cc454f 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -286,7 +286,6 @@ "Phone": "전화", "Once encryption is enabled for a room it cannot be turned off again (for now)": "방을 암호화하면 암호화를 도중에 끌 수 없어요. (현재로서는)", "Only people who have been invited": "초대받은 사람만", - "Otherwise, <a>click here</a> to send a bug report.": "그 밖에는, <a>여기를 눌러</a> 오류 보고서를 보내주세요.", "%(senderName)s placed a %(callType)s call.": "%(senderName)s님이 %(callType)s 전화를 걸었어요.", "Please check your email and click on the link it contains. Once this is done, click continue.": "이메일을 확인하시고 그 안에 있는 주소를 누르세요. 이 일을 하고 나서, 계속하기를 누르세요.", "Power level must be positive integer.": "권한 등급은 양의 정수여야만 해요.", @@ -569,10 +568,8 @@ "In future this verification process will be more sophisticated.": "앞으로는 이 확인 과정이 더 정교해질 거에요.", "Verify device": "인증한 장치", "I verify that the keys match": "키가 맞는 걸 확인했어요", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "이전 세션을 복구하는 도중 오류가 일어났어요. 계속하시려면, 다시 로그인하셔야 하고, 암호화한 기록은 읽을 수 없게 될 거에요.", "Unable to restore session": "세션을 복구할 수 없어요", "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.": "이전에 더 최근 버전의 라이엇을 쓰셨다면, 이 버전과 맞지 않을 거에요. 창을 닫고 더 최근 버전으로 돌아가세요.", - "Continue anyway": "무시하고 계속하기", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "현재 인증하지 않은 장치를 요주의로 지정하셨어요. 이 장치들에 메시지를 보내려면 인증을 해야 해요.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "각 장치가 알맞은 소유자에게 속해 있는지 인증 과정을 거치길 추천하지만, 원하신다면 그러지 않고 메시지를 다시 보내실 수 있어요.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\"에 본 적 없는 장치가 있어요.", @@ -601,8 +598,6 @@ "Identity server URL": "ID 서버 URL", "Error decrypting audio": "음성 해독 오류", "Error decrypting image": "사진 해독 오류", - "Image '%(Body)s' cannot be displayed.": "'%(Body)s' 사진을 보여드릴 수 없어요.", - "This image cannot be displayed.": "이 사진을 보여드릴 수 없어요.", "Error decrypting video": "영상 해독 오류", "Add an Integration": "통합 추가", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "타사 사이트로 이동하는데 %(integrationsUrl)s에서 쓰도록 계정을 인증할 수 있어요. 계속하시겠어요?", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 6282d40daf..17238aa206 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -272,7 +272,6 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Tiklīdz istabai tiks iespējota šifrēšana, tā vairs nebūs atslēdzama (pašlaik)", "Only people who have been invited": "Vienīgi cilvēki, kuri uzaicināti", "Operation failed": "Darbība neizdevās", - "Otherwise, <a>click here</a> to send a bug report.": "pretējā gadījumā, <a>klikšķini šeit</a>, lai nosūtītu paziņojumu par kļūdu.", "Password": "Parole", "Password:": "Parole:", "Passwords can't be empty": "Paroles nevar būt tukšas", @@ -350,7 +349,6 @@ "Failed to invite the following users to the %(roomName)s room:": "Neizdevās uzaicināt sekojošos lietotājus uz %(roomName)s istabu:", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" atrodas ierīces, kuras Tu neesi iepriekš redzējis/usi.", "You are registering with %(SelectedTeamName)s": "Tu reģistrējies ar %(SelectedTeamName)s", - "Image '%(Body)s' cannot be displayed.": "Attēlu '%(Body)s' nav iespējams parādīt.", "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?": "Notiek Tevis novirzīšana uz ārēju trešās puses vietni. Tu vari atļaut savam kontam piekļuvi ar %(integrationsUrl)s. Vai vēlies turpināt?", "Ongoing conference call%(supportedText)s.": "Notiekošs konferences zvans %(supportedText)s.", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s dzēsa istabas avataru.", @@ -515,7 +513,6 @@ "Nov": "Nov.", "Dec": "Dec.", "Set a display name:": "Iestatīt attēloto vārdu:", - "This image cannot be displayed.": "Šo attēlu nav iespējams parādīt.", "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s nomainīja istabas avataru uz <img/>", "Upload an avatar:": "Augšuplādē avataru (profila attēlu):", "This server does not support authentication with a phone number.": "Šis serveris neatbalsta autentifikāciju pēc telefona numura.", @@ -582,10 +579,8 @@ "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ja tā sakrīt, tad nospied zemāk esošo verifikācijas pogu . Ja nesakrīt, tad kāds cits ir piekļuvis šai ierīcei un šādā gadījumā Tu, iespējams, vēlies izmantot \"melnais saraksts\" iespēju.", "Verify device": "Verificēt ierīci", "I verify that the keys match": "Es apstiprinu, ka atslēgas sakrīt", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Atgadījās kļūda, mēģinot atjaunot tavu iepriekšējo sesiju. Ja vēlies turpināt, Tev ir jāpierakstās no jauna, taču šifrētā čata ziņu vēsture nebūs izlasāma.", "Unable to restore session": "Nav iespējams atjaunot sesiju", "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.": "Ja Tu iepriekš izmantoji jaunāku Riot versiju, tava sesija var nebūt saderīga ar šo versiju. Aizver šo logu un atgriezies jaunākajā versijā.", - "Continue anyway": "Turpināt jebkurā gadījumā", "Unknown devices": "Nezināmas ierīces", "Unknown Address": "Nezināma adrese", "Unblacklist": "Atbloķēšanas saraksts", @@ -1097,7 +1092,6 @@ "What's new?": "Kas jauns?", "Notify me for anything else": "Paziņot man par jebko citu", "When I'm invited to a room": "Kad esmu uzaicināts/a istabā", - "<a>Click here</a> to create a GitHub issue.": "<a>Nospied šeit</a> lai izveidotu GitHub problēmpaziņojumu.", "Can't update user notification settings": "Neizdodas atjaunot lietotāja paziņojumu iestatījumus", "Notify for all other messages/rooms": "Paziņot par visām citām ziņām/istabām", "Unable to look up room ID from server": "Nav iespējams no servera iegūt istabas Id", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index e96280f2e4..1ddcda076e 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -329,7 +329,6 @@ "New passwords must match each other.": "Nieuwe wachtwoorden moeten overeenkomen.", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Zodra versleuteling in een ruimte is ingeschakeld kan het niet meer worden uitgeschakeld (kan later wijzigen)", "Only people who have been invited": "Alleen personen die zijn uitgenodigd", - "Otherwise, <a>click here</a> to send a bug report.": "Klik anders <a>hier</a> om een foutmelding te versturen.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Bekijk je e-mail en klik op de link die het bevat. Zodra dit klaar is, klik op verder gaan.", "Power level must be positive integer.": "Machtsniveau moet een positief geheel getal zijn.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s heeft zijn of haar weergavenaam (%(oldDisplayName)s) verwijderd.", @@ -573,10 +572,8 @@ "In future this verification process will be more sophisticated.": "In de toekomst zal dit verificatie proces meer geraffineerd zijn.", "Verify device": "Apparaat verifiëren", "I verify that the keys match": "Ik verifieer dat de sleutels overeenkomen", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "We ervaren een fout terwijl er wordt geprobeerd om de vorige sessie te herstellen. Als je doorgaat moet je opnieuw inloggen en versleutelde gespreksgeschiedenis zal onleesbaar zijn.", "Unable to restore session": "Het is niet mogelijk om de sessie te herstellen", "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.": "Als je eerst gebruik hebt gemaakt van een recentere versie van Riot, dan is je sessie misschien onverenigbaar met deze versie. Sluit dit scherm en ga terug naar de recentere versie.", - "Continue anyway": "Toch doorgaan", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We raden je aan om door het verificatieproces van elk apparaat te gaan om te bevestigen dat ze tot de legitieme eigenaar behoren maar je kan het bericht versturen zonder te verifiëren als je dat liever doet.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" bevat apparaten die je nog niet eerder hebt gezien.", "Unknown devices": "Onbekende apparaten", @@ -602,8 +599,6 @@ "What does this mean?": "Wat betekent dit?", "Error decrypting audio": "Fout met het ontsleutelen van de audio", "Error decrypting image": "Fout met het ontsleutelen van de afbeelding", - "Image '%(Body)s' cannot be displayed.": "Afbeelding '%(Body)s' kan niet worden weergeven.", - "This image cannot be displayed.": "Deze afbeelding kan niet worden weergeven.", "Error decrypting video": "Fout met het ontsleutelen van de video", "Add an Integration": "Voeg een integratie toe", "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?": "Je wordt zo naar een derde-partij-website verbonden zodat je het account kan legitimeren voor gebruik met %(integrationsUrl)s. Wil je doorgaan?", @@ -986,7 +981,6 @@ "Failed to remove tag %(tagName)s from room": "Het is niet gelukt om de label %(tagName)s van de ruimte te verwijderen", "Failed to add tag %(tagName)s to room": "Het is niet gelukt om de label %(tagName)s aan deze ruimte toe te voegen", "Stickerpack": "Stickerpakket", - "Sticker Messages": "Sticker Berichten", "You don't currently have any stickerpacks enabled": "Je hebt momenteel geen stickerpakketten aan staan", "Add a stickerpack": "Stickerpakket toevoegen", "Hide Stickers": "Stickers verbergen", @@ -1151,7 +1145,6 @@ "Checking for an update...": "Aan het kijken voor een update...", "There are advanced notifications which are not shown here": "Er zijn geavanceerde notificaties die hier niet getoond worden", "Logs sent": "Logs verstuurd", - "<a>Click here</a> to create a GitHub issue.": "<a>Klik hier</a> om een Github opgave in te dienen.", "GitHub issue link:": "GitHub opgave link:", "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.": "Debug logs bevatten applicatie-gebruik data inclusief je gebruikersnaam, de ID's of namen van de ruimtes en groepen die je hebt bezocht en de gebruikersnamen van andere gebruikers. Ze bevatten geen berichten.", "Failed to send logs: ": "Het is niet gelukt om de logs te versturen: ", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 445d3ad025..8d7c5d11da 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -11,7 +11,6 @@ "Start chatting": "Rozpocznij konwersację", "Start Chatting": "Rozpocznij Konwersację", "Updates": "Aktualizacje", - "This image cannot be displayed.": "Ten obrazek nie może zostać wyświetlony.", "Default server": "Domyślny serwer", "Add User": "Dodaj użytkownika", "Verify...": "Zweryfikuj...", @@ -347,7 +346,6 @@ "olm version:": "wersja olm:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Po włączeniu szyfrowania w pokoju nie można go ponownie wyłączyć (póki co)", "Only people who have been invited": "Tylko ludzie, którzy zostali zaproszeni", - "Otherwise, <a>click here</a> to send a bug report.": "W przeciwnym razie, <a>kliknij tutaj</a> by wysłać raport o błędzie.", "Password": "Hasło", "Password:": "Hasło:", "Passwords can't be empty": "Hasła nie mogą być puste", @@ -607,10 +605,8 @@ "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Jeśli klucz pasuje, naciśnij na przycisk \"Zweryfikuj\" poniżej. Jeśli nie, to ktoś inny najprawdopodobniej przejmuje lub podszywa się pod to urządzenie i powinieneś nacisnąć przycisk dodania do czarnej listy.", "In future this verification process will be more sophisticated.": "W przyszłości proces weryfikacji będzie bardziej skomplikowany.", "I verify that the keys match": "Upewnię się, że klucze się zgadzają", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Napotkaliśmy błąd podczas próby przywrócenia Twojej poprzedniej sesji. Aby kontynuować, musisz zalogować się ponownie, a zaszyfrowana historia czatu nie będzie do odczytania.", "Unable to restore session": "Przywrócenie sesji jest niemożliwe", "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.": "Jeśli wcześniej używałeś/aś nowszej wersji Riot, Twoja sesja może być niekompatybilna z tą wersją. Zamknij to okno i powróć do nowszej wersji.", - "Continue anyway": "Kontynuuj mimo to", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Aktualnie wpisujesz niezweryfikowane urządzenia na czarną listę; aby wysłać wiadomość do tych urządzeń musisz je zweryfikować.", "Riot collects anonymous analytics to allow us to improve the application.": "Riot zbiera anonimowe dane analityczne, aby umożliwić nam rozwijanie aplikacji.", "Verifies a user, device, and pubkey tuple": "Weryfikuje użytkownika, urządzenie i krotkę kluczy publicznych", @@ -632,7 +628,6 @@ "What does this mean?": "Co to znaczy?", "Error decrypting audio": "Błąd deszyfrowania audio", "Error decrypting image": "Błąd deszyfrowania obrazu", - "Image '%(Body)s' cannot be displayed.": "Obraz '%(Body)s' nie może zostać wyświetlony.", "Error decrypting video": "Błąd deszyfrowania wideo", "Removed or unknown message type": "Usunięto lub nieznany typ wiadomości", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Próbowano załadować konkretny punkt na osi czasu w tym pokoju, ale nie nie można go znaleźć.", @@ -883,7 +878,6 @@ "What's new?": "Co nowego?", "Notify me for anything else": "Powiadom mnie o całej reszcie", "When I'm invited to a room": "Kiedy zostanę zaproszony do pokoju", - "<a>Click here</a> to create a GitHub issue.": "<a>Kliknij tutaj</a> aby założyć wątek na GitHubie dot. problemu.", "Can't update user notification settings": "Nie można zaktualizować ustawień powiadomień użytkownika", "Notify for all other messages/rooms": "Powiadamiaj o wszystkich innych wiadomośsciach/pokojach", "Unable to look up room ID from server": "Nie można wyszukać ID pokoju na serwerze", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 12339e6757..229d4f32a1 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -443,10 +443,8 @@ "In future this verification process will be more sophisticated.": "No futuro, este processo de verificação será mais sofisticado.", "Verify device": "Verificar o dispositivo", "I verify that the keys match": "Eu confirmo que as chaves são iguais", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Encontramos um erro tentando restaurar sua sessão anterior. Se você continuar, terá que fazer login novamente, e o histórico da conversa criptografada se tornará ilegível.", "Unable to restore session": "Não foi possível restaurar a sessão", "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.": "Se você já usou antes uma versão mais recente do Riot, a sua sessão pode ser incompatível com esta versão. Feche esta janela e tente abrir com a versão mais recente.", - "Continue anyway": "Continuar de qualquer maneira", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Você está atualmente bloqueando dispositivos não verificados. Para enviar mensagens para estes dispositivos, você necessita antes verificá-los.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Nós recomendamos que você passe pelo processo de verificação para cada dispositivo para confirmar que eles pertencem às pessoas que efetivamente são suas donas, mas você pode reenviar a mensagem sem verificar isso, se assim o desejar.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contém dispositivos que você não viu antes.", @@ -478,8 +476,6 @@ "What does this mean?": "O que isso significa?", "Error decrypting audio": "Erro ao descriptografar o áudio", "Error decrypting image": "Erro ao descriptografar a imagem", - "Image '%(Body)s' cannot be displayed.": "A imagem '%(Body)s' não pode ser exibida.", - "This image cannot be displayed.": "Esta imagem não pode ser exibida.", "Error decrypting video": "Erro ao descriptografar o vídeo", "Add an Integration": "Adicionar uma integração", "Removed or unknown message type": "Mensagem removida ou de tipo desconhecido", @@ -560,7 +556,6 @@ "You have been kicked from %(roomName)s by %(userName)s.": "Você foi removido(a) da sala %(roomName)s por %(userName)s.", "Undecryptable": "Não é possível descriptografar", "Incoming video call from %(name)s": "Chamada de vídeo de %(name)s recebida", - "Otherwise, <a>click here</a> to send a bug report.": "Caso contrário, <a>clique aqui</a> para enviar um relatório de erros.", "To link to a room it must have <a>an address</a>.": "Para produzir um link para uma sala, ela necessita ter <a>um endereço</a>.", "Your home server does not support device management.": "O seu Servidor de Base não suporta o gerenciamento de dispositivos.", "Alias (optional)": "Apelido (opcional)", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 9a4739357e..a3333de2f2 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -445,10 +445,8 @@ "In future this verification process will be more sophisticated.": "No futuro, este processo de verificação será mais sofisticado.", "Verify device": "Verificar o dispositivo", "I verify that the keys match": "Eu confirmo que as chaves são iguais", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Encontramos um erro tentando restaurar sua sessão anterior. Se você continuar, terá que fazer login novamente, e o histórico da conversa criptografada se tornará ilegível.", "Unable to restore session": "Não foi possível restaurar a sessão", "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.": "Se você já usou antes uma versão mais recente do Riot, a sua sessão pode ser incompatível com esta versão. Feche esta janela e tente abrir com a versão mais recente.", - "Continue anyway": "Continuar de qualquer maneira", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Você está atualmente bloqueando dispositivos não verificados. Para enviar mensagens para estes dispositivos, você necessita antes verificá-los.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Nós recomendamos que você passe pelo processo de verificação para cada dispositivo para confirmar que eles pertencem às pessoas que efetivamente são suas donas, mas você pode reenviar a mensagem sem verificar isso, se assim o desejar.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contém dispositivos que você não viu antes.", @@ -480,8 +478,6 @@ "What does this mean?": "O que isso significa?", "Error decrypting audio": "Erro ao descriptografar o áudio", "Error decrypting image": "Erro ao descriptografar a imagem", - "Image '%(Body)s' cannot be displayed.": "A imagem '%(Body)s' não pode ser exibida.", - "This image cannot be displayed.": "Esta imagem não pode ser exibida.", "Error decrypting video": "Erro ao descriptografar o vídeo", "Add an Integration": "Adicionar uma integração", "Removed or unknown message type": "Mensagem removida ou de tipo desconhecido", @@ -590,7 +586,6 @@ "Last seen": "Último uso", "Level:": "Nível:", "No display name": "Sem nome público de usuária(o)", - "Otherwise, <a>click here</a> to send a bug report.": "Caso contrário, <a>clique aqui</a> para enviar um relatório de erros.", "Private Chat": "Conversa privada", "Public Chat": "Conversa pública", "Reason: %(reasonText)s": "Justificativa: %(reasonText)s", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 2e6bdf45f0..c27580979e 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -492,10 +492,8 @@ "In future this verification process will be more sophisticated.": "В будущем процесс проверки будет усовершенствован.", "Verify device": "Проверить устройство", "I verify that the keys match": "Я подтверждаю, что ключи совпадают", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Произошла ошибка при попытке восстановить предыдущий сеанс. Если продолжить, потребуется снова войти в систему, а зашифрованная история чата будет нечитаема.", "Unable to restore session": "Восстановление сессии не удалось", "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.": "Если вы использовали более новую версию Riot, то ваша сессия может быть несовместима с текущей. Закройте это окно и вернитесь к использованию более новой версии.", - "Continue anyway": "Все равно продолжить", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "У вас включено занесение непроверенных устройств в черный список. Для отправки сообщений на эти устройства вам необходимо их проверить.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Мы рекомендуем вам выполнить процедуру проверки каждого устройства, чтобы удостовериться, что они принадлежат их законному владельцу, но вы можете переотправить сообщение без проверки, если хотите.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" содержит неподтвержденные устройства.", @@ -523,8 +521,6 @@ "What does this mean?": "Что это значит?", "Error decrypting audio": "Ошибка расшифровки аудиозаписи", "Error decrypting image": "Ошибка расшифровки изображения", - "Image '%(Body)s' cannot be displayed.": "Изображение '%(Body)s' не может быть отображено.", - "This image cannot be displayed.": "Не удается показать изображение.", "Error decrypting video": "Ошибка расшифровки видео", "Add an Integration": "Добавить интеграцию", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Вы будете перенаправлены на внешний сайт, чтобы войти в свою учетную запись для использования с %(integrationsUrl)s. Продолжить?", @@ -586,7 +582,6 @@ "Last seen": "Последний вход", "Level:": "Уровень:", "No display name": "Нет отображаемого имени", - "Otherwise, <a>click here</a> to send a bug report.": "В противном случае, <a> нажмите </a> 2 для отправки отчета об ошибке.", "Private Chat": "Приватный чат", "Public Chat": "Публичный чат", "Reason: %(reasonText)s": "Причина: %(reasonText)s", @@ -998,7 +993,6 @@ "Who can join this community?": "Кто может присоединиться к этому сообществу?", "Everyone": "Все", "Stickerpack": "Стикеры", - "Sticker Messages": "Стикеры", "Add a stickerpack": "Добавить стикеры", "Hide Stickers": "Скрыть стикеры", "Show Stickers": "Показать стикеры", @@ -1109,7 +1103,6 @@ "What's new?": "Что нового?", "Notify me for anything else": "Уведомлять во всех остальных случаях", "When I'm invited to a room": "Приглашения в комнаты", - "<a>Click here</a> to create a GitHub issue.": "<a>Нажмите здесь</a> для создания запроса о проблеме на GitHub.", "Can't update user notification settings": "Не удалось обновить пользовательские настройки оповещения", "Notify for all other messages/rooms": "Уведомлять обо всех остальных сообщениях и комнатах", "Unable to look up room ID from server": "Не удалось найти ID комнаты на сервере", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 142b5dfea9..523cabaa68 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -423,8 +423,6 @@ "Download %(text)s": "Stiahnuť %(text)s", "Invalid file%(extra)s": "Neplatný súbor%(extra)s", "Error decrypting image": "Chyba pri dešifrovaní obrázka", - "Image '%(Body)s' cannot be displayed.": "Nie je možné zobraziť obrázok '%(Body)s'.", - "This image cannot be displayed.": "Tento obrázok nie je možné zobraziť.", "Error decrypting video": "Chyba pri dešifrovaní videa", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmenil obrázok miestnosti %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstránil obrázok miestnosti.", @@ -611,11 +609,8 @@ "Ignore request": "Ignorovať žiadosť", "Loading device info...": "Načítanie informácií o zariadení...", "Encryption key request": "Žiadosť o šifrovacie kľúče", - "Otherwise, <a>click here</a> to send a bug report.": "inak <a>kliknutím sem</a> nahláste chybu.", "Unable to restore session": "Nie je možné obnoviť reláciu", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Pri pokuse o obnovenie vašej predchádzajúcej relácie sa vyskytla chyba. Ak budete pokračovať, musíte sa znovu prihlásiť, a história šifrovaných konverzácii nebude viac čitateľná.", "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.": "Ak ste sa v minulosti prihlásili s novšou verziou programu Riot, vaša relácia nemusí byť kompatibilná s touto verziou. Zatvorte prosím toto okno a vráťte sa cez najnovšiu verziu Riot.", - "Continue anyway": "Napriek tomu pokračovať", "Invalid Email Address": "Nesprávna emailová adresa", "This doesn't appear to be a valid email address": "Zdá sa, že toto nie je platná emailová adresa", "Verification Pending": "Nedokončené overenie", @@ -996,7 +991,6 @@ "Submit debug logs": "Odoslať ladiace záznamy", "Opens the Developer Tools dialog": "Otvorí dialóg nástroje pre vývojárov", "Stickerpack": "Balíček nálepiek", - "Sticker Messages": "Správy s nálepkami", "You don't currently have any stickerpacks enabled": "Momentálne nemáte aktívne žiadne balíčky s nálepkami", "Add a stickerpack": "Pridať balíček s nálepkami", "Hide Stickers": "Skryť nálepky", @@ -1109,7 +1103,6 @@ "What's new?": "Čo je nové?", "Notify me for anything else": "Oznamovať mi všetko ostatné", "When I'm invited to a room": "Pozvania vstúpiť do miestnosti", - "<a>Click here</a> to create a GitHub issue.": "<a>Kliknutím sem</a> nám pošlete hlásenie o chybe cez Github.", "Can't update user notification settings": "Nie je možné aktualizovať používateľské nastavenia oznamovania", "Notify for all other messages/rooms": "oznamovať všetky ostatné správy / miestnosti", "Unable to look up room ID from server": "Nie je možné vyhľadať ID miestnosti na servery", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 9dbb76396e..2936695a6d 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -246,7 +246,6 @@ "Can't update user notification settings": "S’përditësohen dot rregullime njoftimi të përdoruesit", "Notify for all other messages/rooms": "Njoftim për krejt mesazhet/dhomat e tjera", "Unable to look up room ID from server": "S’arrihet të kërkohet ID dhome nga shërbyesi", - "<a>Click here</a> to create a GitHub issue.": "<a>Klikoni këtu</a> që të hapni një çështje në GitHub.", "Couldn't find a matching Matrix room": "S’u gjet dot një dhomë Matrix me përputhje", "Invite to this room": "Ftoje te kjo dhomë", "You cannot delete this message. (%(code)s)": "S’mund ta fshini këtë mesazh. (%(code)s)", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 5c91838e3e..dc39bb8cdd 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -480,8 +480,6 @@ "Download %(text)s": "Преузми %(text)s", "Invalid file%(extra)s": "Неисправна датотека %(extra)s", "Error decrypting image": "Грешка при дешифровању слике", - "Image '%(Body)s' cannot be displayed.": "Слика „%(Body)s“ се не може приказати.", - "This image cannot be displayed.": "Ова слика се не може приказати.", "Error decrypting video": "Грешка при дешифровању видеа", "%(senderDisplayName)s changed the avatar for %(roomName)s": "Корисник %(senderDisplayName)s је променио аватара собе %(roomName)s", "%(senderDisplayName)s removed the room avatar.": "Корисник %(senderDisplayName)s је уклонио аватара собе.", @@ -682,11 +680,8 @@ "Ignore request": "Занемари захтев", "Loading device info...": "Учитавам податке о уређају...", "Encryption key request": "Захтев за кључ шифровања", - "Otherwise, <a>click here</a> to send a bug report.": "У супротном, <a>кликните овде</a> да бисте послали извештај о грешци.", "Unable to restore session": "Не могу да повратим сесију", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Наишли смо на грешку приликом опоравка ваше претходне сесије. Ако наставите, мораћете да се пријавите поново и ваш шифровани историјат ћаскања неће бити читљив.", "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.": "Ако сте претходно користили новије издање Riot-а, ваша сесија може бити некомпатибилна са овим издањем. Затворите овај прозор и вратите се на новије издање.", - "Continue anyway": "Ипак настави", "Invalid Email Address": "Неисправна мејл адреса", "This doesn't appear to be a valid email address": "Изгледа да ово није исправна мејл адреса", "Verification Pending": "Чека се на проверу", @@ -1137,7 +1132,6 @@ "Your device resolution": "Резолуција вашег уређаја", "Popout widget": "Виџет за искакање", "Missing roomId.": "Недостаје roomId.", - "Sticker Messages": "Поруке са налепницама", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Видео корисник %(displayName)s (%(userName)s) у %(dateTime)s", "You don't currently have any stickerpacks enabled": "Тренутно немате омогућено било које паковање са налепницама", "Add a stickerpack": "Додај паковање са налепницама", @@ -1151,7 +1145,6 @@ "Failed to send logs: ": "Нисам успео да пошаљем записнике: ", "Submit debug logs": "Пошаљи записнике за поправљање грешака", "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.": "Записници за поправљање грешака садрже податке о коришћењу апликације међу којима се налази ваше корисничко име, ИБ-јеви или алијаси посећених соба или група и корисничка имена других корисника. Не садрже саме поруке.", - "<a>Click here</a> to create a GitHub issue.": "<a>Кликните овде</a> да бисте пријавили проблем на Гитхабу (GitHub).", "GitHub issue link:": "Веза до проблема на Гитхабу:", "Notes:": "Напомене:", "Unable to join community": "Не могу да приступим заједници", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 42c06615cb..4456cd1c2d 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -268,7 +268,6 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "När kryptering aktiveras i ett rum kan det inte deaktiveras (tills vidare)", "Only people who have been invited": "Endast inbjudna", "Operation failed": "Handlingen misslyckades", - "Otherwise, <a>click here</a> to send a bug report.": "Annars kan du <a>klicka här</a> för att skicka en buggrapport.", "Password": "Lösenord", "Password:": "Lösenord:", "Passwords can't be empty": "Lösenorden kan inte vara tomma", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 17ba4d461f..6fa7febabd 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -407,7 +407,6 @@ "Custom level": "กำหนดระดับเอง", "No display name": "ไม่มีชื่อที่แสดง", "Only people who have been invited": "เฉพาะบุคคลที่ได้รับเชิญ", - "Otherwise, <a>click here</a> to send a bug report.": "หรือ<a>คลิกที่นี่</a>เพื่อรายงานจุดบกพร่อง", "Power level must be positive integer.": "ระดับอำนาจต้องเป็นจำนวนเต็มบวก", "%(roomName)s does not exist.": "ไม่มีห้อง %(roomName)s อยู่จริง", "To link to a room it must have <a>an address</a>.": "ห้องต้องมี<a>ที่อยู่</a>ก่อน ถึงจะลิงก์ได้", @@ -430,8 +429,6 @@ "What does this mean?": "นี่แปลว่าอะไร?", "Error decrypting audio": "เกิดข้อผิดพลาดในการถอดรหัสเสียง", "Error decrypting image": "เกิดข้อผิดพลาดในการถอดรหัสรูป", - "Image '%(Body)s' cannot be displayed.": "ไม่สามารถแสดงรูป '%(Body)s' ได้", - "This image cannot be displayed.": "ไม่สามารถแสดงรูปนี้ได้", "Error decrypting video": "เกิดข้อผิดพลาดในการถอดรหัสวิดิโอ", "Fetching third party location failed": "การเรียกข้อมูลตำแหน่งจากบุคคลที่สามล้มเหลว", "A new version of Riot is available.": "มี Riot เวอร์ชั่นใหม่", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index d890ed634e..451383bc02 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -268,7 +268,6 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Bu oda için şifreleme etkinleştirildikten sonra tekrar kapatılamaz (şimdilik)", "Only people who have been invited": "Sadece davet edilmiş insanlar", "Operation failed": "Operasyon başarısız oldu", - "Otherwise, <a>click here</a> to send a bug report.": "Aksi taktirde , bir hata raporu göndermek için <a> buraya tıklayın </a>.", "Password": "Şifre", "Password:": "Şifre:", "Passwords can't be empty": "Şifreler boş olamaz", @@ -566,10 +565,8 @@ "In future this verification process will be more sophisticated.": "Gelecekte bu doğrulama işlemi daha gelişmiş olacak.", "Verify device": "Cihazı Doğrula", "I verify that the keys match": "Anahtarların uyuştuğunu doğruluyorum", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Önceki oturumunuzu geri getirmeye çalışırken bir hata ile karşılaşdık . Devam ederseniz , tekrar oturum açmanız gerekecek , ve şifreli sohbet geçmişi okunamıyor hale gelecek.", "Unable to restore session": "Oturum geri yüklenemiyor", "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.": "Eğer daha önce Riot'un daha yeni bir versiyonunu kullandıysanız , oturumunuz bu sürümle uyumsuz olabilir . Bu pencereyi kapatın ve daha yeni sürüme geri dönün.", - "Continue anyway": "Her halükarda devam et", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Şu anda doğrulanmamış cihazları kara listeye alıyorsunuz , bu cihazlara mesaj göndermek için onları doğrulamanız gerekir.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Her cihazın yasal sahiplerine ait olduklarını doğrulamak için doğrulama işlemini gerçekleştirmenizi öneririz, ancak tercih edip onaylamadan iletiyi tekrar gönderebilirsiniz.", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" daha önce görmediğiniz cihazları içeriyor.", @@ -601,8 +598,6 @@ "What does this mean?": "Bu ne anlama geliyor ?", "Error decrypting audio": "Ses şifre çözme hatası", "Error decrypting image": "Resim şifre çözme hatası", - "Image '%(Body)s' cannot be displayed.": "'%(Body)s' Resmi görüntülenemiyor.", - "This image cannot be displayed.": "Bu görüntü görüntülenemiyor.", "Error decrypting video": "Video şifre çözme hatası", "Add an Integration": "Entegrasyon ekleyin", "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?": "Hesabınızı %(integrationsUrl)s ile kullanmak üzere doğrulayabilmeniz için üçüncü taraf bir siteye götürülmek üzeresiniz. Devam etmek istiyor musunuz ?", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index cb7809814a..bed499adc3 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -208,7 +208,6 @@ "What's new?": "Що нового?", "Notify me for anything else": "Сповіщати мене про будь-що інше", "View Source": "Переглянути джерело", - "<a>Click here</a> to create a GitHub issue.": "<a>Нажміть тут</a> для створення запитання по проблемі на GitHub.", "Can't update user notification settings": "Неможливо оновити налаштування користувацьких сповіщень", "Notify for all other messages/rooms": "Сповіщати щодо всіх повідомлень/кімнат", "Unable to look up room ID from server": "Неможливо знайти ID кімнати на сервері", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 2bbb5b1cc8..3f474cd337 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -303,7 +303,6 @@ "No more results": "没有更多结果", "olm version:": "olm 版本:", "Only people who have been invited": "只有被邀请的人", - "Otherwise, <a>click here</a> to send a bug report.": "否则,<a>点击这里</a>发送一个错误报告。", "Privacy warning": "隐私警告", "Private Chat": "私聊", "Privileged Users": "特权用户", @@ -360,7 +359,6 @@ "Verify device": "验证设备", "I verify that the keys match": "我验证密钥匹配", "Unable to restore session": "无法恢复会话", - "Continue anyway": "无论如何都继续", "Blacklist": "列入黑名单", "Unverify": "取消验证", "ex. @bob:example.com": "例如 @bob:example.com", @@ -595,7 +593,6 @@ "Confirm Removal": "确认移除", "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "这将会导致您的账户永远无法使用。你将无法重新注册同样的用户 ID。", "Verifies a user, device, and pubkey tuple": "验证一个用户、设备和密钥元组", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "我们在尝试恢复你之前的会话时遇到了一个错误。如果你继续,你将需要重新登录,加密的聊天历史将会不可读。", "Unknown devices": "未知设备", "Unknown Address": "未知地址", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 删除了他们的昵称 (%(oldDisplayName)s).", @@ -613,8 +610,6 @@ "Home server URL": "主服务器 URL", "Identity server URL": "身份认证服务器 URL", "What does this mean?": "这是什么意思?", - "Image '%(Body)s' cannot be displayed.": "图像 '%(Body)s' 无法显示。", - "This image cannot be displayed.": "图像无法显示。", "Add an Integration": "添加一个集成", "Removed or unknown message type": "被移除或未知的消息类型", "Ongoing conference call%(supportedText)s.": "正在进行的会议通话 %(supportedText)s.", @@ -809,7 +804,6 @@ "Disable Community Filter Panel": "停用社区面板", "Opt out of analytics": "退出统计分析服务", "Stickerpack": "贴图集", - "Sticker Messages": "贴图消息", "You don't currently have any stickerpacks enabled": "您目前没有启用任何贴纸包", "Add a stickerpack": "添加贴图集", "Your key share request has been sent - please check your other devices for key share requests.": "已请求共享密钥 - 请在您的其他设备上进行确认。", @@ -1082,7 +1076,6 @@ "What's new?": "有什么新闻?", "Notify me for anything else": "通知所有消息", "When I'm invited to a room": "当我被邀请进入聊天室", - "<a>Click here</a> to create a GitHub issue.": "<a>点击这里</a> 创建一个 GitHub issue.", "Can't update user notification settings": "不能更新用户通知设置", "Notify for all other messages/rooms": "为所有其他消息/聊天室显示通知", "Unable to look up room ID from server": "无法在服务器上找到聊天室 ID", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 6f5ef68735..053031c677 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -221,8 +221,6 @@ "What does this mean?": "它代表什麼意思?", "Error decrypting audio": "解密音檔出錯", "Error decrypting image": "解密圖片出錯", - "Image '%(Body)s' cannot be displayed.": "圖片 '%(Body)s' 無法顯示。", - "This image cannot be displayed.": "這張圖片無法顯示。", "Error decrypting video": "解密影片出錯", "Add an Integration": "新增整合器", "Ongoing conference call%(supportedText)s.": "%(supportedText)s 正在進行會議通話。", @@ -360,7 +358,6 @@ "olm version:": "olm 版本:", "Once encryption is enabled for a room it cannot be turned off again (for now)": "這個房間只要啟用加密就不能再關掉了(從現在開始)", "Only people who have been invited": "僅有被邀請的夥伴", - "Otherwise, <a>click here</a> to send a bug report.": "否則,請<a>點選此處</a>來傳送錯誤報告。", "Password": "密碼", "Password:": "密碼:", "Passwords can't be empty": "密碼不能為空", @@ -590,10 +587,8 @@ "In future this verification process will be more sophisticated.": "在未來,這個過程會更加複雜。", "Verify device": "驗證裝置", "I verify that the keys match": "我驗證金鑰相符", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "我們在嘗試復原您的前一個工作階段中遇到了錯誤。若您繼續,您將會需要再次登入,而加密的聊天歷史也將會無法讀取。", "Unable to restore session": "無法復原工作階段", "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.": "若您先前使用過較新版本的 Riot,您的工作階段可能與此版本不相容。關閉此視窗並回到較新的版本。", - "Continue anyway": "無論如何都繼續", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "您目前正把未驗證的裝置列入黑名單;要傳送訊息到這些裝置,您必須先驗證它們。", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "我們建議您對每一個裝置執行驗證過程以確認它們屬於其合法擁有者,但若您想要的話,您也可以重新傳送訊息而不必驗證它們。", "\"%(RoomName)s\" contains devices that you haven't seen before.": "「%(RoomName)s」包含了您先前沒看過的裝置。", @@ -996,7 +991,6 @@ "Join this community": "加入此社群", "Leave this community": "離開此社群", "Stickerpack": "貼圖包", - "Sticker Messages": "貼圖訊息", "You don't currently have any stickerpacks enabled": "您目前未啟用任何貼圖包", "Add a stickerpack": "新增貼圖包", "Hide Stickers": "隱藏貼圖", @@ -1110,7 +1104,6 @@ "Notify me for anything else": "所有消息都通知我", "View Source": "檢視來源", "Keywords": "關鍵字", - "<a>Click here</a> to create a GitHub issue.": "<a>點選這裡</a>來建立 GitHub 問題回報。", "Can't update user notification settings": "無法更新使用者的通知設定", "Notify for all other messages/rooms": "通知其他所有的訊息/聊天室", "Unable to look up room ID from server": "無法從伺服器找到聊天室 ID", From a88cbef331c89d21bc878e31c0e2976d27ce5d81 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 14 May 2018 16:22:28 +0100 Subject: [PATCH 003/480] tidy and switch to lexicographic sorting Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomSettings.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index f1aba322e2..059e07ffdb 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -719,8 +719,14 @@ module.exports = React.createClass({ } }); - privilegedUsers.sort((a, b) => userLevels[b.key] - userLevels[a.key]); - mutedUsers.sort((a, b) => userLevels[a.key] - userLevels[b.key]); + // comparator for sorting PL users lexicographically on PL descending, MXID ascending. (case-insensitive) + const comparator = (a, b) => { + const plDiff = userLevels[b.key] - userLevels[a.key]; + return plDiff !== 0 ? plDiff : a.key.toLocaleLowerCase().localeCompare(b.key.toLocaleLowerCase()); + }; + + privilegedUsers.sort(comparator); + mutedUsers.sort(comparator); if (privilegedUsers.length) { privilegedUsersSection = From f5c67229a46648268aefd3b3206c54c8227818a3 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Mon, 14 May 2018 23:41:38 +0000 Subject: [PATCH 004/480] Translated using Weblate (Swedish) Currently translated at 69.0% (811 of 1175 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 | 95 ++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 18 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index e987ed29e2..a35509e1b4 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -135,7 +135,7 @@ "Failed to save settings": "Det gick inte att spara inställningarna", "Failed to send email": "Det gick inte att skicka epost", "Failed to send request.": "Det gick inte att sända begäran.", - "Failed to set avatar.": "Det gick inte att sätta profilbilden.", + "Failed to set avatar.": "Misslyckades med att ange avatar.", "Failed to set display name": "Det gick inte att sätta namnet", "Failed to set up conference call": "Det gick inte att starta konferenssamtalet", "Failed to toggle moderator status": "Det gick inte att växla moderator-status", @@ -181,7 +181,7 @@ "Guest access is disabled on this Home Server.": "Gäståtkomst är inte aktiverat på den här hemservern.", "Guests cannot join this room even if explicitly invited.": "Gäster kan inte gå med i det här rummet fastän de är uttryckligen inbjudna.", "Hangup": "Lägg på", - "Hide read receipts": "Göm kvitteringar", + "Hide read receipts": "Dölj läskvitton", "Hide Text Formatting Toolbar": "Göm textformatteringsverktygsfältet", "Historical": "Historiska", "Home": "Hem", @@ -293,7 +293,7 @@ "Reject invitation": "Avvisa inbjudan", "Rejoin": "Gå med tillbaka", "Remote addresses for this room:": "Fjärradresser för det här rummet:", - "Remove Contact Information?": "Ta bort kontaktinformation?", + "Remove Contact Information?": "Ta bort kontaktuppgifter?", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s tog bort sitt visningsnamn (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s tog bort sin profilbild.", "Remove": "Ta bort", @@ -403,18 +403,18 @@ "Thu": "Tors", "Fri": "Fre", "Sat": "Lör", - "Jan": "Jan", - "Feb": "Feb", - "Mar": "Mar", - "Apr": "Apr", - "May": "Maj", - "Jun": "Jun", - "Jul": "Juli", - "Aug": "Aug", - "Sep": "Sep", - "Oct": "Okt", - "Nov": "Nov", - "Dec": "Dec", + "Jan": "jan", + "Feb": "feb", + "Mar": "mar", + "Apr": "apr", + "May": "maj", + "Jun": "jun", + "Jul": "jul", + "Aug": "aug", + "Sep": "sep", + "Oct": "okt", + "Nov": "nov", + "Dec": "dec", "Name or matrix ID": "Namn eller matrix ID", "Invite to Community": "", "Unable to enable Notifications": "Det går inte att aktivera Notifieringar", @@ -647,8 +647,8 @@ "Offline": "Offline", "(~%(count)s results)|other": "(~%(count)s resultat)", "(~%(count)s results)|one": "(~%(count)s resultat)", - "Upload avatar": "Ladda upp profilbild", - "Remove avatar": "Ta bort profilbild", + "Upload avatar": "Ladda upp avatar", + "Remove avatar": "Ta bort avatar", "This invitation was sent to an email address which is not associated with this account:": "Den här inbjudan skickades till en epostadress som inte är kopplad till detta konto:", "To link to a room it must have <a>an address</a>.": "För att länka till ett rum behöver det <a>en adress</a>.", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nivå %(powerLevelNumber)s)", @@ -752,5 +752,64 @@ "This will allow you to reset your password and receive notifications.": "Det här låter dig återställa lösenordet och ta emot aviseringar.", "You have no visible notifications": "Du har inga synliga aviseringar", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ditt lösenord har ändrats. Du kommer inte att få push-aviseringar på andra enheter förrän du har loggat in på dem igen", - "Failed to upload image": "Det gick inte att ladda upp bild" + "Failed to upload image": "Det gick inte att ladda upp bild", + "New Password": "Nytt lösenord", + "Do you want to set an email address?": "Vill du ange en epostadress?", + "Your home server does not support device management.": "Din hemserver stöder inte enhetshantering.", + "Unable to load device list": "Det gick inte att ladda enhetslista", + "Delete %(count)s devices|other": "Ta bort %(count)s enheter", + "Delete %(count)s devices|one": "Ta bort enhet", + "Device Name": "Enhetsnamn", + "Select devices": "Välj enheter", + "Disable Emoji suggestions while typing": "Inaktivera Emoji-förslag medan du skriver", + "Use compact timeline layout": "Använd kompakt chattlayout", + "Not a valid Riot keyfile": "Inte en giltig Riot-nyckelfil", + "Authentication check failed: incorrect password?": "Autentiseringskontroll misslyckades: felaktigt lösenord?", + "Always show encryption icons": "Visa alltid krypteringsikoner", + "Disable big emoji in chat": "Inaktivera stor emoji i chatt", + "Hide avatars in user and room mentions": "Dölj avatarer i användar- och rumsnämningar", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s bytte avatar för %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s tog bort rummets avatar.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s ändrade rummets avatar till <img/>", + "Automatically replace plain text Emoji": "Ersätt text-emojis automatiskt", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(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 %(time)s", + "You seem to be uploading files, are you sure you want to quit?": "Du verkar ladda upp filer, är du säker på att du vill avsluta?", + "You seem to be in a call, are you sure you want to quit?": "Du verkar vara i ett samtal, är du säker på att du vill avsluta?", + "Active call": "Aktivt samtal", + "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Visa enheter</showDevicesText>, <sendAnywayText>skicka ändå</sendAnywayText> eller <cancelText>avbryt</cancelText>.", + "%(count)s of your messages have not been sent.|one": "Ditt meddelande skickades inte.", + "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Skicka om alla</resendText> eller <cancelText>ångra alla</cancelText> nu. Du kan även välja enskilda meddelanden för att skicka om eller ångra.", + "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Skicka om meddelande</resendText> eller <cancelText>ångra meddelande</cancelText> nu.", + "Connectivity to the server has been lost.": "Anslutning till servern har brutits.", + "Sent messages will be stored until your connection has returned.": "Skickade meddelanden kommer att lagras tills anslutningen är tillbaka.", + "There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Det är ingen annan här! Vill du <inviteText>bjuda in någon</inviteText> eller <nowarnText>sluta varna om det tomma rummet</nowarnText>?", + "Unknown room %(roomId)s": "Okänt rum %(roomId)s", + "Room": "Rum", + "Clear filter": "Töm filter", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Försökte ladda en viss punkt i det här rummets tidslinje, men du har inte behörighet att visa det aktuella meddelandet.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Försökte ladda en specifik punkt i det här rummets tidslinje, men kunde inte hitta den.", + "Success": "Det lyckades", + "Unable to remove contact information": "Det gick inte att ta bort kontaktuppgifter", + "Autocomplete Delay (ms):": "Autokompletteringsfördröjning (ms):", + "Ignored Users": "Ignorerade användare", + "These are experimental features that may break in unexpected ways": "Detta är experimentell funktionalitet som kan sluta fungera helt oväntat", + "Use with caution": "Använd med försiktighet", + "To return to your account in future you need to set a password": "För att återvända till ditt konto i framtiden måste du ange ett lösenord", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Ett epostmeddelande har skickats till %(emailAddress)s. När du har öppnat länken i det, klicka nedan.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Observera att du loggar in på %(hs)s-servern, inte matrix.org.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Denna hemserver erbjuder inga inloggningsflöden som stöds av den här klienten.", + "Upload new:": "Ladda upp ny:", + "Copied!": "Kopierat!", + "Failed to copy": "Det gick inte att kopiera", + "Removed or unknown message type": "Borttagen eller okänd meddelandetyp", + "Message removed by %(userId)s": "Meddelande borttaget av %(userId)s", + "Message removed": "Meddelande borttaget", + "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robotkontrollen är för närvarande inte tillgänglig för skrivbordsversionen - vänligen använd en <a>webbläsare</a>", + "This Home Server would like to make sure you are not a robot": "Den här hemservern vill bekräfta att du inte är en robot", + "Sign in with CAS": "Logga in med CAS", + "Unknown devices": "Okända enheter", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" innehåller enheter som du inte har sett tidigare." } From 05c469399d10927509640f84c42f97d27083dc8c Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Tue, 8 May 2018 09:26:45 +0000 Subject: [PATCH 005/480] Translated using Weblate (Basque) Currently translated at 100.0% (1172 of 1172 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index e478c3270b..93acd5fbc2 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1176,5 +1176,6 @@ "Unable to reply": "Ezin erantzun", "At this time it is not possible to reply with an emote.": "Une honetan ezin da irriabartxo batekin erantzun.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Ezin izan da erantzundako gertaera kargatu, edo ez dago edo ez duzu ikusteko baimenik.", - "Collapse Reply Thread": "Tolestu erantzun-haria" + "Collapse Reply Thread": "Tolestu erantzun-haria", + "Enable widget screenshots on supported widgets": "Gaitu trepeten pantaila-argazkiak onartzen duten trepetetan" } From 5b26a56b9ab7c7afc4af918f9d912fc1bee9e096 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Wed, 16 May 2018 09:42:07 +0000 Subject: [PATCH 006/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1172 of 1172 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 2a2b90f59f..9322865c7a 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1167,5 +1167,15 @@ "At this time it is not possible to reply with a file so this will be sent without being a reply.": "В момента не може да се отговаря с файл, така че това ще се изпрати без да бъде отговор.", "Unable to reply": "Не може да се отговори", "At this time it is not possible to reply with an emote.": "В момента не може да се отговори с емотикона.", - "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не може да се зареди събитието, на което е отговорено. Или не съществува или нямате достъп да го видите." + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не може да се зареди събитието, на което е отговорено. Или не съществува или нямате достъп да го видите.", + "Popout widget": "Изкарай в нов прозорец", + "Log out and remove encryption keys?": "Изход и изтриване на ключовете за шифроване?", + "Clear Storage and Sign Out": "Изчисти запазените данни и излез", + "Send Logs": "Изпрати логове", + "Refresh": "Опресни", + "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.": "Изчистване на запазените данни в браузъра може да поправи проблема, но ще Ви изкара от профила и ще направи шифрованите съобщения нечетими.", + "Collapse Reply Thread": "Свий отговорите", + "Enable widget screenshots on supported widgets": "Включи скрийншоти за поддържащи ги приспособления", + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Бъговете по Riot се следят в GitHub: <a>създайте проблем в GitHub</a>." } From c5c3c51cf0bd9908ff9fc3ad6b50c55572f94492 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Wed, 16 May 2018 09:55:27 +0000 Subject: [PATCH 007/480] Translated using Weblate (Swedish) Currently translated at 69.9% (820 of 1172 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 | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index a35509e1b4..edb7f4b065 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -347,7 +347,7 @@ "Start authentication": "Starta autentisering", "Start Chat": "Starta en chatt", "Cancel": "Avbryt", - "Create new room": "Nytt rum", + "Create new room": "Skapa nytt rum", "Custom Server Options": "Egna serverinställningar", "Dismiss": "Avvisa", "powered by Matrix": "drivs av Matrix", @@ -361,7 +361,7 @@ "Delete widget": "Ta bort widget", "Define the power level of a user": "Definiera anseende för en användare", "Do you want to load widget from URL:": "Vill du ladda widgeten från URL:", - "Edit": "Editera", + "Edit": "Ändra", "Enable automatic language detection for syntax highlighting": "Aktivera automatisk språkdetektering för syntaxmarkering", "Integrations Error": "Integrationsfel", "Publish this room to the public in %(domain)s's room directory?": "Publicera rummet i den offentliga rumskatalogen på %(domain)s?", @@ -417,14 +417,14 @@ "Dec": "dec", "Name or matrix ID": "Namn eller matrix ID", "Invite to Community": "", - "Unable to enable Notifications": "Det går inte att aktivera Notifieringar", - "Failed to invite user": "Misslyckades med att bjuda in användaren", + "Unable to enable Notifications": "Det går inte att aktivera aviseringar", + "Failed to invite user": "Det gick inte att bjuda in användaren", "The information being sent to us to help make Riot.im better includes:": "Informationen som skickas till oss för att hjälpa Riot.im att bli bättre inkluderar:", "Review Devices": "Granska enheter", "Answer Anyway": "Svara ändå", "VoIP is unsupported": "VoIP stöds ej", "Who would you like to add to this room?": "Vem vill du lägga till i det här rummet?", - "Failed to invite": "Misslyckades med att bjuda in", + "Failed to invite": "Inbjudan misslyckades", "You need to be logged in.": "Du måste vara inloggad.", "You need to be able to invite users to do that.": "Du måste kunna bjuda in användare för att göra det.", "You are not in this room.": "Du är inte i det här rummet.", @@ -791,7 +791,7 @@ "Clear filter": "Töm filter", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Försökte ladda en viss punkt i det här rummets tidslinje, men du har inte behörighet att visa det aktuella meddelandet.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Försökte ladda en specifik punkt i det här rummets tidslinje, men kunde inte hitta den.", - "Success": "Det lyckades", + "Success": "Slutfört", "Unable to remove contact information": "Det gick inte att ta bort kontaktuppgifter", "Autocomplete Delay (ms):": "Autokompletteringsfördröjning (ms):", "Ignored Users": "Ignorerade användare", @@ -811,5 +811,14 @@ "This Home Server would like to make sure you are not a robot": "Den här hemservern vill bekräfta att du inte är en robot", "Sign in with CAS": "Logga in med CAS", "Unknown devices": "Okända enheter", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" innehåller enheter som du inte har sett tidigare." + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" innehåller enheter som du inte har sett tidigare.", + "Delete Widget": "Ta bort widget", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Widget tas bort för alla användare i rummet. Är du säker på att du vill ta bort den?", + "Minimize apps": "Minimera appar", + "Picture": "Bild", + "Blacklist": "Svartlista", + "Unblacklist": "Ta bort svartlistning", + "Failed to invite the following users to %(groupId)s:": "Det gick inte att bjuda in följande användare till %(groupId)s:", + "Failed to invite users to %(groupId)s": "Det gick inte att bjuda in användare till %(groupId)s", + "This room is not public. You will not be able to rejoin without an invite.": "Detta rum är inte offentligt. Du kommer inte kunna gå med igen utan en inbjudan." } From 123c4d0f6c027c6b74db273486d4d230c3217908 Mon Sep 17 00:00:00 2001 From: random <dictionary@tutamail.com> Date: Wed, 16 May 2018 15:51:37 +0000 Subject: [PATCH 008/480] Translated using Weblate (Italian) Currently translated at 99.1% (1162 of 1172 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 ba7417bcc8..82382a3967 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1151,5 +1151,21 @@ "Collapse panel": "Riduci pannello", "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!": "Con il tuo attuale browser, l'aspetto e la sensazione generale dell'applicazione potrebbero essere completamente sbagliati e alcune delle funzionalità potrebbero non funzionare. Se vuoi provare comunque puoi continuare, ma non riceverai aiuto per qualsiasi problema tu possa riscontrare!", "Checking for an update...": "Controllo aggiornamenti...", - "There are advanced notifications which are not shown here": "Ci sono notifiche avanzate che non sono mostrate qui" + "There are advanced notifications which are not shown here": "Ci sono notifiche avanzate che non sono mostrate qui", + "Every page you use in the app": "Ogni pagina che usi nell'app", + "e.g. <CurrentPageURL>": "es. <CurrentPageURL>", + "Your User Agent": "Il tuo User Agent", + "Your device resolution": "La risoluzione del dispositivo", + "Missing roomId.": "ID stanza mancante.", + "Always show encryption icons": "Mostra sempre icone di cifratura", + "Enable widget screenshots on supported widgets": "Attiva le schermate dei widget sui widget supportati", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Al momento non è possibile rispondere con un file quindi verrà inviato senza essere una risposta.", + "Unable to reply": "Impossibile rispondere", + "At this time it is not possible to reply with an emote.": "Al momento non è possibile rispondere con una emoticon.", + "Picture": "Immagine", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Impossibile caricare l'evento a cui si è risposto, o non esiste o non hai il permesso di visualizzarlo.", + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Gli errori di Riot sono monitorati su GitHub: <a>segnala un problema su GitHub</a>.", + "Log out and remove encryption keys?": "Disconnettere e rimuovere le chiavi di cifratura?", + "Refresh": "Aggiorna", + "We encountered an error trying to restore your previous session.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente." } From d9236a58487beaa6ac7a814663e0f01b84009330 Mon Sep 17 00:00:00 2001 From: strix aluco <strixaluco@rocketmail.com> Date: Wed, 16 May 2018 16:09:18 +0000 Subject: [PATCH 009/480] Translated using Weblate (Ukrainian) Currently translated at 23.1% (271 of 1172 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index cb7809814a..c3ff95b938 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -265,5 +265,11 @@ "To return to your account in future you need to set a password": "Щоб мати змогу користуватись обліковкою у майбутньому, треба зазначити пароль", "Logged in as:": "Ви зайшли як:", "click to reveal": "натисніть щоб побачити", - "Homeserver is": "Домашній сервер —" + "Homeserver is": "Домашній сервер —", + "The version of Riot.im": "Версія Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Чи увійшли ви, чи ні (ми не зберігаємо ваше ім'я користувача)", + "Your language of choice": "Обрана мова", + "Which officially provided instance you are using, if any": "Яким офіційно наданим примірником ви користуєтесь (якщо користуєтесь)", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Чи використовуєте ви режим Richtext у редакторі Rich Text Editor", + "Your homeserver's URL": "URL адреса вашого домашнього серверу" } From b28ed6075bbf65fdb78bd09e4773ab2a6f25a936 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 17 May 2018 18:15:34 +0100 Subject: [PATCH 010/480] Implement slightly hacky CSS soln. to thumbnail sizing As the slightly nicer alternative to fixupHeight being applied once we actually have a timelineWidth. The niceness comes from not needing timelineWidth, which means we can implement at render time with CSS. (Despite still calculating aspect ratios when we render.) --- res/css/views/messages/_MImageBody.scss | 13 +++- src/components/views/messages/MImageBody.js | 66 ++++++--------------- 2 files changed, 29 insertions(+), 50 deletions(-) diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 1c809f0743..9f0e77f765 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -20,5 +20,14 @@ limitations under the License. } .mx_MImageBody_thumbnail { - max-width: 100%; -} \ No newline at end of file + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; +} + +.mx_MImageBody_thumbnail_container { + overflow: hidden; + position: relative; +} diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 6cc492acf8..87fe8d906c 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -21,15 +21,15 @@ import PropTypes from 'prop-types'; import { MatrixClient } from 'matrix-js-sdk'; import MFileBody from './MFileBody'; -import ImageUtils from '../../../ImageUtils'; import Modal from '../../../Modal'; import sdk from '../../../index'; -import dis from '../../../dispatcher'; import { decryptFile } from '../../../utils/DecryptFile'; import Promise from 'bluebird'; import { _t } from '../../../languageHandler'; import SettingsStore from "../../../settings/SettingsStore"; +const THUMBNAIL_MAX_HEIGHT = 600; + export default class extends React.Component { displayName: 'MImageBody' @@ -48,14 +48,12 @@ export default class extends React.Component { constructor(props) { super(props); - this.onAction = this.onAction.bind(this); this.onImageError = this.onImageError.bind(this); this.onImageLoad = this.onImageLoad.bind(this); this.onImageEnter = this.onImageEnter.bind(this); this.onImageLeave = this.onImageLeave.bind(this); this.onClientSync = this.onClientSync.bind(this); this.onClick = this.onClick.bind(this); - this.fixupHeight = this.fixupHeight.bind(this); this._isGif = this._isGif.bind(this); this.state = { @@ -140,7 +138,6 @@ export default class extends React.Component { } onImageLoad() { - this.fixupHeight(); this.props.onWidgetLoad(); } @@ -176,7 +173,6 @@ export default class extends React.Component { } componentDidMount() { - this.dispatcherRef = dis.register(this.onAction); const content = this.props.mxEvent.getContent(); if (content.file !== undefined && this.state.decryptedUrl === null) { let thumbnailPromise = Promise.resolve(null); @@ -217,7 +213,6 @@ export default class extends React.Component { componentWillUnmount() { this.unmounted = true; - dis.unregister(this.dispatcherRef); this.context.matrixClient.removeListener('sync', this.onClientSync); this._afterComponentWillUnmount(); @@ -234,50 +229,25 @@ export default class extends React.Component { _afterComponentWillUnmount() { } - onAction(payload) { - if (payload.action === "timeline_resize") { - this.fixupHeight(); - } - } - - fixupHeight() { - if (!this.refs.image) { - console.warn(`Refusing to fix up height on ${this.displayName} with no image element`); - return; - } - - const content = this.props.mxEvent.getContent(); - const timelineWidth = this.refs.body.offsetWidth; - const maxHeight = 600; // let images take up as much width as they can so long as the height doesn't exceed 600px. - // the alternative here would be 600*timelineWidth/800; to scale them down to fit inside a 4:3 bounding box - - // FIXME: this will break on clientside generated thumbnails (as per e2e rooms) - // which may well be much smaller than the 800x600 bounding box. - - // FIXME: It will also break really badly for images with broken or missing thumbnails - - // FIXME: Because we don't know what size of thumbnail the server's actually going to send - // us, we can't even really layout the page nicely for it. Instead we have to assume - // it'll target 800x600 and we'll downsize if needed to make things fit. - - // console.log("trying to fit image into timelineWidth of " + this.refs.body.offsetWidth + " or " + this.refs.body.clientWidth); - let thumbHeight = null; - if (content.info) { - thumbHeight = ImageUtils.thumbHeight(content.info.w, content.info.h, timelineWidth, maxHeight); - } - this.refs.image.style.height = thumbHeight + "px"; - // console.log("Image height now", thumbHeight); - } - _messageContent(contentUrl, thumbUrl, content) { + const maxHeight = Math.min(THUMBNAIL_MAX_HEIGHT, content.info.h); + const maxWidth = content.info.w * maxHeight / content.info.h; const thumbnail = ( <a href={contentUrl} onClick={this.onClick}> - <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" - alt={content.body} - onError={this.onImageError} - onLoad={this.onImageLoad} - onMouseEnter={this.onImageEnter} - onMouseLeave={this.onImageLeave} /> + <div className="mx_MImageBody_thumbnail_container" style={{ "max-height": maxHeight + "px" }} > + { /* Calculate aspect ratio, using %padding will size _container correctly */ } + <div style={{ paddingBottom: (100 * content.info.h / content.info.w) + '%' }}></div> + + { /* Thumbnail CSS class resizes to exactly container size with inline CSS + to restrict width */ } + <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" + style={{ "max-width": maxWidth + "px" }} + alt={content.body} + onError={this.onImageError} + onLoad={this.onImageLoad} + onMouseEnter={this.onImageEnter} + onMouseLeave={this.onImageLeave} /> + </div> </a> ); From bbcf2fea53d81cb344e36e21221c298be46e30d5 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 18 May 2018 09:47:49 +0100 Subject: [PATCH 011/480] Fix e2e image thumbnail spinner containing box correct size --- src/components/views/messages/MImageBody.js | 55 ++++++++++----------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 87fe8d906c..f1454d1ac5 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -232,7 +232,29 @@ export default class extends React.Component { _messageContent(contentUrl, thumbUrl, content) { const maxHeight = Math.min(THUMBNAIL_MAX_HEIGHT, content.info.h); const maxWidth = content.info.w * maxHeight / content.info.h; - const thumbnail = ( + + let img = null; + // e2e image hasn't been decrypted yet + if (content.file !== undefined && this.state.decryptedUrl === null) { + img = <div className="mx_MImageBody_thumbnail" ref="image" style={{ + "display": "flex", + "alignItems": "center", + "width": "100%", + }}> + <img src="img/spinner.gif" alt={content.body} width="32" height="32" style={{ + "margin": "auto", + }} /> + </div>; + } else if (thumbUrl && !this.state.imgError) { + img = <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" + style={{ "max-width": maxWidth + "px" }} + alt={content.body} + onError={this.onImageError} + onLoad={this.onImageLoad} + onMouseEnter={this.onImageEnter} + onMouseLeave={this.onImageLeave} />; + } + const thumbnail = img ? <a href={contentUrl} onClick={this.onClick}> <div className="mx_MImageBody_thumbnail_container" style={{ "max-height": maxHeight + "px" }} > { /* Calculate aspect ratio, using %padding will size _container correctly */ } @@ -240,20 +262,13 @@ export default class extends React.Component { { /* Thumbnail CSS class resizes to exactly container size with inline CSS to restrict width */ } - <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" - style={{ "max-width": maxWidth + "px" }} - alt={content.body} - onError={this.onImageError} - onLoad={this.onImageLoad} - onMouseEnter={this.onImageEnter} - onMouseLeave={this.onImageLeave} /> + { img } </div> - </a> - ); + </a> : null; return ( <span className="mx_MImageBody" ref="body"> - { thumbUrl && !this.state.imgError ? thumbnail : '' } + { thumbnail } <MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} /> </span> ); @@ -271,24 +286,6 @@ export default class extends React.Component { ); } - if (content.file !== undefined && this.state.decryptedUrl === null) { - // Need to decrypt the attachment - // The attachment is decrypted in componentDidMount. - // For now add an img tag with a spinner. - return ( - <span className="mx_MImageBody" ref="body"> - <div className="mx_MImageBody_thumbnail" ref="image" style={{ - "display": "flex", - "alignItems": "center", - "width": "100%", - }}> - <img src="img/spinner.gif" alt={content.body} width="32" height="32" style={{ - "margin": "auto", - }} /> - </div> - </span> - ); - } const contentUrl = this._getContentUrl(); let thumbUrl; From b41b9aa4facd2e4767d993f1d173ec9fdbc03c37 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 18 May 2018 09:58:52 +0100 Subject: [PATCH 012/480] Remove fixupHeight call from MStickerBody --- src/components/views/messages/MStickerBody.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/views/messages/MStickerBody.js b/src/components/views/messages/MStickerBody.js index 3a412fc2e2..cdb60f0074 100644 --- a/src/components/views/messages/MStickerBody.js +++ b/src/components/views/messages/MStickerBody.js @@ -40,7 +40,6 @@ export default class MStickerBody extends MImageBody { } _onImageLoad() { - this.fixupHeight(); this.setState({ placeholderClasses: 'mx_MStickerBody_placeholder_invisible', }); @@ -110,8 +109,6 @@ export default class MStickerBody extends MImageBody { // The pixel size of sticker images is generally larger than their intended display // size so they render at native reolution on HiDPI displays. We therefore need to // explicity set the size so they render at the intended size. - // XXX: This will be clobberred when we run fixupHeight(), but we need to do it - // here otherwise the stickers are momentarily displayed at the pixel size. const imageStyle = { height: content.info.h, // leave the browser the calculate the width automatically From d11442de0434282c70052327420ab359de9bd161 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 18 May 2018 10:15:59 +0100 Subject: [PATCH 013/480] Adjust comment --- src/components/views/messages/MImageBody.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index f1454d1ac5..f98432a166 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -260,8 +260,7 @@ export default class extends React.Component { { /* Calculate aspect ratio, using %padding will size _container correctly */ } <div style={{ paddingBottom: (100 * content.info.h / content.info.w) + '%' }}></div> - { /* Thumbnail CSS class resizes to exactly container size with inline CSS - to restrict width */ } + { /* mx_MImageBody_thumbnail resizes img to exactly container size */ } { img } </div> </a> : null; From 7e7e2a747313d2d9d45d67bb5019b1fc0b7ef20a Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 18 May 2018 10:27:22 +0100 Subject: [PATCH 014/480] Add more comments to explain thumbnail sizing --- res/css/views/messages/_MImageBody.scss | 4 ++++ src/components/views/messages/MImageBody.js | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 9f0e77f765..9667337f5a 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -28,6 +28,10 @@ limitations under the License. } .mx_MImageBody_thumbnail_container { + // Prevent the padding-bottom (added inline in MImageBody.js) from + // effecting elements below the container. overflow: hidden; + + // Make sure the _thumbnail is positioned relative to the _container position: relative; } diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index f98432a166..656bd02840 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -230,7 +230,10 @@ export default class extends React.Component { } _messageContent(contentUrl, thumbUrl, content) { + // The maximum height of the thumbnail as it is rendered as an <img> const maxHeight = Math.min(THUMBNAIL_MAX_HEIGHT, content.info.h); + // The maximum width of the thumbnail, as dictated by it's natural + // maximum height. const maxWidth = content.info.w * maxHeight / content.info.h; let img = null; @@ -246,6 +249,8 @@ export default class extends React.Component { }} /> </div>; } else if (thumbUrl && !this.state.imgError) { + // Restrict the width of the thumbnail here, otherwise it will fill the container + // which has the same width as the timeline img = <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" style={{ "max-width": maxWidth + "px" }} alt={content.body} From 6b559aaf40378d59fb5e94483833845a87fc4106 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Thu, 17 May 2018 18:41:24 +0000 Subject: [PATCH 015/480] Translated using Weblate (Russian) Currently translated at 99.8% (1170 of 1172 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 | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index f766069b16..24e9750698 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1,6 +1,6 @@ { "Account": "Аккаунт", - "Add email address": "Добавить адрес email", + "Add email address": "Добавить email", "Add phone number": "Добавить номер телефона", "Admin": "Администратор", "Advanced": "Подробности", @@ -39,7 +39,7 @@ "Display name": "Отображаемое имя", "Displays action": "Отображение действий", "Ed25519 fingerprint": "Ed25519 отпечаток", - "Email, name or matrix ID": "Email-адрес, имя или идентификатор", + "Email, name or matrix ID": "Email, имя или matrix ID", "Emoji": "Смайлы", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Зашифрованные сообщения не будут видны в клиентах, еще не поддерживающих сквозное шифрование", "Encrypted room": "Зашифрованная комната", @@ -47,7 +47,7 @@ "End-to-end encryption is in beta and may not be reliable": "Сквозное шифрование сейчас в бета-тестировании и может не работать", "Error": "Ошибка", "Event information": "Информация о событии", - "Export E2E room keys": "Экспорт ключей сквозного шифрования", + "Export E2E room keys": "Экспорт ключей шифрования", "Failed to change password. Is your password correct?": "Не удалось сменить пароль. Вы правильно ввели текущий пароль?", "Failed to leave room": "Не удалось выйти из комнаты", "Failed to reject invitation": "Не удалось отклонить приглашение", @@ -64,9 +64,9 @@ "Historical": "Архив", "Homeserver is": "Домашний сервер это", "Identity Server is": "Сервер идентификации это", - "I have verified my email address": "Я подтвердил свой адрес email", - "Import E2E room keys": "Импорт ключей сквозного шифрования", - "Invalid Email Address": "Недопустимый адрес email", + "I have verified my email address": "Я подтвердил свой email", + "Import E2E room keys": "Импорт ключей шифрования", + "Invalid Email Address": "Недопустимый email", "Invite new room members": "Пригласить в комнату новых участников", "Invites": "Приглашения", "Invites user with given id to current room": "Приглашает пользователя с заданным ID в текущую комнату", @@ -103,9 +103,9 @@ "Settings": "Настройки", "Start a chat": "Начать разговор", "Start Chat": "Начать разговор", - "Unable to add email address": "Не удается добавить адрес email", + "Unable to add email address": "Не удается добавить email", "Unable to remove contact information": "Не удалось удалить контактную информацию", - "Unable to verify email address.": "Не удалось проверить адрес email.", + "Unable to verify email address.": "Не удалось проверить email.", "Unban": "Разблокировать", "Unencrypted room": "Нешифрованная комната", "unencrypted": "без шифрования", @@ -159,7 +159,7 @@ "Failed to lookup current room": "Не удалось найти текущую комнату", "Failed to send request.": "Не удалось отправить запрос.", "Failed to set up conference call": "Не удалось сделать конференц-звонок", - "Failed to verify email address: make sure you clicked the link in the email": "Не удалось проверить email-адрес: убедитесь, что вы перешли по ссылке в письме", + "Failed to verify email address: make sure you clicked the link in the email": "Не удалось проверить email: убедитесь, что вы перешли по ссылке в письме", "Failure to create room": "Не удалось создать комнату", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "для %(userId)s с %(fromPowerLevel)s на %(toPowerLevel)s", "click to reveal": "нажмите для открытия", @@ -185,7 +185,7 @@ "Set a display name:": "Введите отображаемое имя:", "Passwords don't match.": "Пароли не совпадают.", "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Пароль слишком короткий (мин. %(MIN_PASSWORD_LENGTH)s).", - "This doesn't look like a valid email address.": "Это не похоже на допустимый адрес email.", + "This doesn't look like a valid email address.": "Это не похоже на допустимый email.", "This server does not support authentication with a phone number.": "Этот сервер не поддерживает аутентификацию с помощью номера телефона.", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Имена пользователей могут содержать только буквы, цифры, точки, дефисы и символы подчеркивания.", "An unknown error occurred.": "Произошла неизвестная ошибка.", @@ -224,7 +224,7 @@ "Thu": "Чт", "Fri": "Пт", "Sat": "Сб", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш email-адрес не связан ни с одним пользователем на этом сервере.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш email не связан ни с одним пользователем на этом сервере.", "To use it, just wait for autocomplete results to load and tab through them.": "Чтобы воспользоваться этой функцией, дождитесь загрузки результатов в окне автодополнения, а затем используйте Tab для прокрутки.", "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включил(а) в комнате сквозное шифрование (алгоритм %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s разблокировал(а) %(targetName)s.", @@ -337,7 +337,7 @@ "Success": "Успех", "The default role for new room members is": "Права по умолчанию для новых участников комнаты", "The main address for this room is": "Основной адрес этой комнаты", - "This email address is already in use": "Этот email-адрес уже используется", + "This email address is already in use": "Этот email уже используется", "This email address was not found": "Этот адрес электронной почты не найден", "The email address linked to your account must be entered.": "Необходимо ввести адрес электронной почты, связанный с вашей учетной записью.", "The file '%(fileName)s' failed to upload": "Не удалось отправить файл '%(fileName)s'", @@ -404,8 +404,8 @@ "Device ID:": "ID устройства:", "device id: ": "ID устройства: ", "Device key:": "Ключ устройства:", - "Email address": "Email-адрес", - "Email address (optional)": "Email-адрес (необязательно)", + "Email address": "Email", + "Email address (optional)": "Email (необязательно)", "Error decrypting attachment": "Ошибка расшифровки вложения", "Export": "Экспорт", "Failed to set avatar.": "Не удалось установить аватар.", @@ -510,11 +510,11 @@ "Sign in with CAS": "Войти с помощью CAS", "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Вы можете войти на другой сервер Matrix, указав его URL-адрес.", "This allows you to use this app with an existing Matrix account on a different home server.": "Это позволяет использовать приложение с учетной записью Matrix на другом сервере.", - "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Кроме того, можно выбрать другой сервер идентификации, однако в таком случае вы, скорее всего, не сможете взаимодействовать с пользователями посредством их email-адресов.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Кроме того, можно выбрать другой сервер идентификации, однако в таком случае вы, скорее всего, не сможете взаимодействовать с пользователями посредством их emailов.", "Please check your email to continue registration.": "Чтобы продолжить регистрацию, проверьте электронную почту.", "Token incorrect": "Неверный код проверки", "Please enter the code it contains:": "Введите полученный код:", - "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Если не указать email-адрес, вы не сможете при необходимости сбросить свой пароль. Уверены?", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Если не указать email, вы не сможете при необходимости сбросить свой пароль. Уверены?", "You are registering with %(SelectedTeamName)s": "Вы регистрируетесь в %(SelectedTeamName)s", "Default server": "Сервер по умолчанию", "Custom server": "Другой сервер", @@ -603,7 +603,7 @@ "Seen by %(userName)s at %(dateTime)s": "Прочитано %(userName)s в %(dateTime)s", "Send anyway": "Отправить в любом случае", "Show Text Formatting Toolbar": "Показать инструменты форматирования текста", - "This invitation was sent to an email address which is not associated with this account:": "Это приглашение было отправлено на email-адрес, не связанный с вашей учетной записью:", + "This invitation was sent to an email address which is not associated with this account:": "Это приглашение было отправлено на email, не связанный с вашей учетной записью:", "To link to a room it must have <a>an address</a>.": "Чтобы иметь возможность ссылаться на комнату, ей нужно присвоить <a>адрес</a>.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Не удалось установить, что адрес в этом приглашении соответствует вашей учетной записи.", "Undecryptable": "Невозможно расшифровать", @@ -619,7 +619,7 @@ "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Не удается подключиться к домашнему серверу - проверьте подключение, убедитесь, что ваш <a>SSL-сертификат домашнего сервера</a> является доверенным и что расширение браузера не блокирует запросы.", "You have been banned from %(roomName)s by %(userName)s.": "%(userName)s заблокировал(а) вас в %(roomName)s.", "You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s выгнал(а) вас из %(roomName)s.", - "You may wish to login with a different account, or add this email to this account.": "При желании вы можете войти в систему под другим именем или привязать этот email-адрес к вашей учетной записи.", + "You may wish to login with a different account, or add this email to this account.": "При желании вы можете войти в систему под другим именем или привязать этот email к вашей учетной записи.", "Your home server does not support device management.": "Ваш сервер не поддерживает управление устройствами.", "(could not connect media)": "(сбой подключения)", "(no answer)": "(нет ответа)", @@ -628,7 +628,7 @@ "Not a valid Riot keyfile": "Недействительный файл ключей Riot", "Your browser does not support the required cryptography extensions": "Ваш браузер не поддерживает требуемые криптографические расширения", "Authentication check failed: incorrect password?": "Ошибка аутентификации: возможно, неправильный пароль?", - "Do you want to set an email address?": "Хотите указать email-адрес?", + "Do you want to set an email address?": "Хотите указать email?", "This will allow you to reset your password and receive notifications.": "Это позволит при необходимости сбросить пароль и получать уведомления.", "Press <StartChatButton> to start a chat with someone": "Нажмите <StartChatButton>, чтобы начать разговор с кем-либо", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Вы еще не вошли ни в одну из комнат! Нажмите <CreateRoomButton>, чтобы создать комнату, или <RoomDirectoryButton>, чтобы посмотреть каталог комнат", @@ -745,7 +745,7 @@ "Failed to add the following rooms to %(groupId)s:": "Не удалось добавить эти комнаты в %(groupId)s:", "Matrix ID": "Matrix ID", "Matrix Room ID": "Matrix ID комнаты", - "email address": "адрес email", + "email address": "email", "Try using one of the following valid address types: %(validTypesList)s.": "Попробуйте использовать один из следующих допустимых типов адресов: %(validTypesList)s.", "You have entered an invalid address.": "Введен неправильный адрес.", "Unpin Message": "Открепить сообщение", @@ -953,7 +953,7 @@ "Send a message (unencrypted)…": "Отправить сообщение (нешифрованное)…", "Replying": "Отвечает", "Minimize apps": "Свернуть приложения", - "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Конфиденциальность важна для нас, поэтому мы не собираем никаких личных или идентифицируемых данных для нашей аналитики.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Конфиденциальность важна для нас, поэтому мы не собираем никаких личных или идентифицирующих данных для нашей аналитики.", "Learn more about how we use analytics.": "Подробнее о том, как мы используем аналитику.", "The information being sent to us to help make Riot.im better includes:": "Информация, отправляемая нам, чтобы помочь нам сделать Riot.im лучше, включает в себя:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Если на этой странице встречаются сведения личного характера, например имя комнаты, имя пользователя или группы, они удаляются перед отправкой на сервер.", @@ -1017,7 +1017,7 @@ "Friday": "Пятница", "Update": "Обновить", "What's New": "Что изменилось", - "Add an email address above to configure email notifications": "Добавьте email-адрес выше для настройки email-уведомлений", + "Add an email address above to configure email notifications": "Добавьте email выше для настройки уведомлений", "Expand panel": "Развернуть панель", "On": "Включить", "%(count)s Members|other": "%(count)s членов", @@ -1073,7 +1073,7 @@ "Tuesday": "Вторник", "Enter keywords separated by a comma:": "Введите ключевые слова, разделенные запятой:", "Search…": "Поиск…", - "You have successfully set a password and an email address!": "Вы успешно установили пароль и адрес email!", + "You have successfully set a password and an email address!": "Вы успешно установили пароль и email!", "Remove %(name)s from the directory?": "Удалить %(name)s из каталога?", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует многие передовые возможности браузера, некоторые из которых недоступны или являются экспериментальным в вашем текущем браузере.", "Developer Tools": "Инструменты разработчика", @@ -1082,7 +1082,7 @@ "Explore Account Data": "Просмотр данных аккаунта", "All messages (noisy)": "Все сообщения (со звуком)", "Saturday": "Суббота", - "Remember, you can always set an email address in user settings if you change your mind.": "Помните, что вы всегда сможете задать адрес email в настройках пользователя, если передумаете.", + "Remember, you can always set an email address in user settings if you change your mind.": "Помните, что вы всегда сможете задать email в настройках пользователя, если передумаете.", "Direct Chat": "Прямой чат", "The server may be unavailable or overloaded": "Сервер, вероятно, недоступен или перегружен", "Reject": "Отклонить", @@ -1141,7 +1141,7 @@ "Mentions only": "Только при упоминаниях", "Wednesday": "Среда", "You can now return to your account after signing out, and sign in on other devices.": "Теперь вы сможете вернуться к своей учетной записи после выхода из системы и войти на других устройствах.", - "Enable email notifications": "Включить уведомления по email", + "Enable email notifications": "Включить уведомления на email", "Event Type": "Тип мероприятия", "Download this file": "Скачать файл", "Pin Message": "Закрепить сообщение", From 40e9091724d0cfb41823db2b180f95a41d1bfc54 Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Fri, 18 May 2018 09:46:58 +0000 Subject: [PATCH 016/480] Translated using Weblate (Hungarian) Currently translated at 99.7% (1172 of 1175 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 b7d0561c34..c27f76737f 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1177,5 +1177,6 @@ "At this time it is not possible to reply with an emote.": "Jelenleg nem lehet emodzsival válaszolni.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nem lehet betölteni azt az eseményt amire válaszoltál, mert vagy nem létezik, vagy nincs jogod megnézni.", "Collapse Reply Thread": "Beszélgetés szál becsukása", - "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése" + "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése", + "Send analytics data": "Analitikai adatok küldése" } From 23ea8ca91743241d67ca7257e667597d762f5eee Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Fri, 18 May 2018 09:51:16 +0000 Subject: [PATCH 017/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1175 of 1175 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index c27f76737f..096989f514 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1178,5 +1178,8 @@ "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nem lehet betölteni azt az eseményt amire válaszoltál, mert vagy nem létezik, vagy nincs jogod megnézni.", "Collapse Reply Thread": "Beszélgetés szál becsukása", "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése", - "Send analytics data": "Analitikai adatok küldése" + "Send analytics data": "Analitikai adatok küldése", + "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ. (Nézd meg a <PolicyLink>sütikről és titoktartási irányelvekről</PolicyLink> szóló leírást).", + "Help improve Riot by sending usage data? This will use a cookie.": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ.", + "Yes please": "Igen, kérlek" } From 6699c4faed2cb5e9bf43afecfac8b34f86b20a52 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 18 May 2018 11:29:30 +0100 Subject: [PATCH 018/480] Spelling/grammar --- res/css/views/messages/_MImageBody.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 9667337f5a..5eef236b26 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -29,7 +29,7 @@ limitations under the License. .mx_MImageBody_thumbnail_container { // Prevent the padding-bottom (added inline in MImageBody.js) from - // effecting elements below the container. + // affecting elements below the container. overflow: hidden; // Make sure the _thumbnail is positioned relative to the _container From 015093b371074c1318fa140c166585c4c68b6778 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 18 May 2018 11:33:33 +0100 Subject: [PATCH 019/480] Move inline style to stylesheet --- res/css/views/messages/_MImageBody.scss | 10 ++++++++++ src/components/views/messages/MImageBody.js | 10 ++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 5eef236b26..64821434dd 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -35,3 +35,13 @@ limitations under the License. // Make sure the _thumbnail is positioned relative to the _container position: relative; } + +.mx_MImageBody_thumbnail_spinner { + display: flex; + align-items: center; + width: 100%; +} + +.mx_MImageBody_thumbnail_spinner img { + margin: auto; +} diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 656bd02840..d9108a2fe1 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -239,14 +239,8 @@ export default class extends React.Component { let img = null; // e2e image hasn't been decrypted yet if (content.file !== undefined && this.state.decryptedUrl === null) { - img = <div className="mx_MImageBody_thumbnail" ref="image" style={{ - "display": "flex", - "alignItems": "center", - "width": "100%", - }}> - <img src="img/spinner.gif" alt={content.body} width="32" height="32" style={{ - "margin": "auto", - }} /> + img = <div className="mx_MImageBody_thumbnail mx_MImageBody_thumbnail_spinner" ref="image"> + <img src="img/spinner.gif" alt={content.body} width="32" height="32" /> </div>; } else if (thumbUrl && !this.state.imgError) { // Restrict the width of the thumbnail here, otherwise it will fill the container From f79a8f5a5342aa7e2a23bb62caaad21d3fb054af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Fri, 18 May 2018 12:37:28 +0000 Subject: [PATCH 020/480] Translated using Weblate (French) Currently translated at 100.0% (1175 of 1175 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 4ff8900965..c9d8fcae69 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1177,5 +1177,9 @@ "At this time it is not possible to reply with an emote.": "Pour le moment il n'est pas possible de répondre avec un émoji.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Impossible de charger l'événement auquel il a été répondu, soit il n'existe pas, soit vous n'avez pas l'autorisation de le voir.", "Collapse Reply Thread": "Dévoiler le fil de réponse", - "Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge" + "Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge", + "Send analytics data": "Envoyer les données analytiques", + "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", + "Help improve Riot by sending usage data? This will use a cookie.": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie.", + "Yes please": "Oui, s'il vous plaît" } From b19a9969fe2965e99cfc593eb751fba4d05bd634 Mon Sep 17 00:00:00 2001 From: Klaus Marx <km@slsx.de> Date: Fri, 18 May 2018 10:27:30 +0000 Subject: [PATCH 021/480] Translated using Weblate (German) Currently translated at 99.7% (1172 of 1175 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4464940c69..66dc3a7b81 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1177,5 +1177,6 @@ "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Den Browser-Speicher zu löschen kann das Problem lösen, wird dich aber abmelden und verschlüsselte Chats unlesbar machen.", "Collapse Reply Thread": "Antwort-Thread zusammenklappen", "At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.", - "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren" + "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren", + "Send analytics data": "Analysedaten senden" } From bd10768c9e6dc2cf99f020f071cb2d4a66044230 Mon Sep 17 00:00:00 2001 From: Krombel <krombel@krombel.de> Date: Fri, 18 May 2018 13:47:07 +0000 Subject: [PATCH 022/480] Translated using Weblate (German) Currently translated at 100.0% (1175 of 1175 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 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 66dc3a7b81..a8f72e7fa1 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -977,7 +977,7 @@ "Did you know: you can use communities to filter your Riot.im experience!": "Wusstest du: Du kannst Communities nutzen um deine Riot.im-Erfahrung zu filtern!", "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.": "Um einen Filter zu setzen, siehe einen Community-Bild auf das Filter-Panel ganz links. Du kannst jederzeit auf einen Avatar im Filter-Panel klicken um nur die Räume und Personen aus der Community zu sehen.", "Clear filter": "Filter zurücksetzen", - "Disable Community Filter Panel": "Deaktivere Community-Filter-Panel", + "Disable Community Filter Panel": "Deaktiviere Community-Filter-Panel", "Your key share request has been sent - please check your other devices for key share requests.": "Deine Schlüssel-Teil-Anfragen wurden gesendet. Bitte prüfe deine anderen Geräte auf die Schlüssel-Teil-Anfragen.", "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Schlüssel-Anfragen wurden automatisch zu den anderen Geräten gesendet. Wenn du diese Anfragen auf deinen anderen Geräten abgelehnt oder verpasst hast, klicke hier um die Schlüssel für diese Sitzung erneut anzufragen.", "If your other devices do not have the key for this message you will not be able to decrypt them.": "Wenn deine anderen Geräte keine Schlüssel für diese Nachricht haben, wirst du diese nicht entschlüsseln können.", @@ -1178,5 +1178,8 @@ "Collapse Reply Thread": "Antwort-Thread zusammenklappen", "At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.", "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren", - "Send analytics data": "Analysedaten senden" + "Send analytics data": "Analysedaten senden", + "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden. (Siehe unsere <PolicyLink>Datenschutzerklärung</PolicyLink>).", + "Help improve Riot by sending usage data? This will use a cookie.": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden.", + "Yes please": "Ja, bitte" } From 35ab573bc54c56911a6f566ce6227289658e6e22 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki <nekomanma@pixiv.co.jp> Date: Mon, 21 May 2018 18:44:00 +0900 Subject: [PATCH 023/480] Update sinon to 5.0.7 --- package-lock.json | 2353 +++++++++-------- package.json | 2 +- .../structures/TimelinePanel-test.js | 2 +- 3 files changed, 1210 insertions(+), 1147 deletions(-) diff --git a/package-lock.json b/package-lock.json index f183f1635d..97ed7b5dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,25 @@ { "name": "matrix-react-sdk", - "version": "0.12.2", + "version": "0.12.4", "lockfileVersion": 1, "requires": true, "dependencies": { + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, "accepts": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", "dev": true, "requires": { - "mime-types": "2.1.17", + "mime-types": "~2.1.11", "negotiator": "0.6.1" } }, @@ -26,7 +35,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -44,14 +53,14 @@ "dev": true }, "ajv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", - "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -66,9 +75,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -106,8 +115,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "argparse": { @@ -116,7 +125,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" }, "dependencies": { "sprintf-js": { @@ -133,7 +142,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -148,8 +157,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-slice": { @@ -164,7 +173,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -238,9 +247,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" }, "babel-cli": { "version": "6.26.0", @@ -248,21 +257,21 @@ "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.11.0", - "convert-source-map": "1.5.0", - "fs-readdir-recursive": "1.0.0", - "glob": "7.1.2", - "lodash": "4.17.4", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "chokidar": "^1.6.1", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" }, "dependencies": { "glob": { @@ -271,12 +280,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -287,9 +296,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -298,25 +307,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" } }, "babel-eslint": { @@ -325,11 +334,11 @@ "integrity": "sha1-UpNBn+NnLWZZjTJ9qWlFZ7pqXy8=", "dev": true, "requires": { - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash.assign": "4.2.0", - "lodash.pickby": "4.6.0" + "babel-traverse": "^6.0.20", + "babel-types": "^6.0.19", + "babylon": "^6.0.18", + "lodash.assign": "^4.0.0", + "lodash.pickby": "^4.0.0" } }, "babel-generator": { @@ -338,14 +347,14 @@ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -354,9 +363,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-builder-react-jsx": { @@ -365,9 +374,9 @@ "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" } }, "babel-helper-call-delegate": { @@ -376,10 +385,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -388,10 +397,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -400,9 +409,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -411,11 +420,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -424,8 +433,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -434,8 +443,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -444,8 +453,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -454,9 +463,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -465,11 +474,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -478,12 +487,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -492,8 +501,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-loader": { @@ -502,10 +511,10 @@ "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", "dev": true, "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "find-cache-dir": "^0.1.1", + "loader-utils": "^0.2.16", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" } }, "babel-messages": { @@ -514,7 +523,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-add-module-exports": { @@ -529,7 +538,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { @@ -580,10 +589,10 @@ "integrity": "sha1-Ruo+fFr2KXgqyfHtG3zTj4Qlr9Q=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0" + "babel-helper-function-name": "^6.8.0", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-template": "^6.9.0", + "babel-traverse": "^6.10.4" } }, "babel-plugin-transform-async-to-generator": { @@ -592,9 +601,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-properties": { @@ -603,10 +612,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -615,7 +624,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -624,7 +633,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -633,11 +642,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -646,15 +655,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -663,8 +672,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -673,7 +682,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -682,8 +691,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -692,7 +701,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -701,9 +710,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -712,7 +721,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -721,9 +730,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -732,10 +741,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -744,9 +753,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -755,9 +764,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -766,8 +775,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -776,12 +785,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -790,8 +799,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -800,7 +809,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -809,9 +818,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -820,7 +829,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -829,7 +838,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -838,9 +847,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -849,9 +858,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -860,8 +869,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -870,8 +879,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-react-display-name": { @@ -880,7 +889,7 @@ "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx": { @@ -889,9 +898,9 @@ "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-self": { @@ -900,8 +909,8 @@ "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-source": { @@ -910,8 +919,8 @@ "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { @@ -920,7 +929,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-runtime": { @@ -929,7 +938,7 @@ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-strict-mode": { @@ -938,8 +947,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-polyfill": { @@ -948,9 +957,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -967,30 +976,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, "babel-preset-es2016": { @@ -999,7 +1008,7 @@ "integrity": "sha1-+QC/k+LrwNJ235uKtZck6/2Vn4s=", "dev": true, "requires": { - "babel-plugin-transform-exponentiation-operator": "6.24.1" + "babel-plugin-transform-exponentiation-operator": "^6.24.1" } }, "babel-preset-es2017": { @@ -1008,8 +1017,8 @@ "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", "dev": true, "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1" + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.24.1" } }, "babel-preset-flow": { @@ -1018,7 +1027,7 @@ "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "dev": true, "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" + "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, "babel-preset-react": { @@ -1027,12 +1036,12 @@ "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" } }, "babel-register": { @@ -1041,13 +1050,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -1055,8 +1064,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1065,11 +1074,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1078,15 +1087,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1095,10 +1104,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1142,7 +1151,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "better-assert": { @@ -1189,28 +1198,23 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.15" + "type-is": "~1.6.15" } }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=" - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1220,9 +1224,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browser-encrypt-attachment": { @@ -1247,7 +1251,7 @@ "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "browserify-zlib": { @@ -1256,7 +1260,7 @@ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", "dev": true, "requires": { - "pako": "0.2.9" + "pako": "~0.2.0" }, "dependencies": { "pako": { @@ -1273,9 +1277,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "builtin-status-codes": { @@ -1296,7 +1300,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsite": { @@ -1328,8 +1332,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -1338,11 +1342,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "chokidar": { @@ -1351,15 +1355,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "circular-json": { @@ -1379,7 +1383,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-width": { @@ -1394,8 +1398,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -1436,15 +1440,15 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "^4.5.0" } }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1464,10 +1468,10 @@ "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.28.1.tgz", "integrity": "sha1-Buq41SM4uDn6Gi11rwCF7tGxvq4=", "requires": { - "entities": "1.1.1", - "mdurl": "1.0.1", - "minimist": "1.2.0", - "string.prototype.repeat": "0.2.0" + "entities": "~ 1.1.1", + "mdurl": "~ 1.0.1", + "minimist": "~ 1.2.0", + "string.prototype.repeat": "^0.2.0" } }, "component-bind": { @@ -1499,9 +1503,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "connect": { @@ -1512,7 +1516,7 @@ "requires": { "debug": "2.6.9", "finalhandler": "1.0.6", - "parseurl": "1.3.2", + "parseurl": "~1.3.2", "utils-merge": "1.0.1" } }, @@ -1522,7 +1526,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -1563,11 +1567,11 @@ "resolved": "https://registry.npmjs.org/counterpart/-/counterpart-0.18.3.tgz", "integrity": "sha512-tli4qPAFeYB34LvvCc/1xYRLCWjf4WsUt6sXfpggDfGDKoI8rhnabz0SljDoBpAK8z1u8GBCg0YDkbvWb16uUQ==", "requires": { - "date-names": "0.1.10", - "except": "0.1.3", - "extend": "3.0.1", - "pluralizers": "0.1.6", - "sprintf-js": "1.1.1" + "date-names": "^0.1.9", + "except": "^0.1.3", + "extend": "^3.0.0", + "pluralizers": "^0.1.6", + "sprintf-js": "^1.0.3" } }, "create-react-class": { @@ -1575,24 +1579,9 @@ "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==" - } + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "crypto-browserify": { @@ -1619,7 +1608,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.35" + "es5-ext": "^0.10.9" } }, "dashdash": { @@ -1627,7 +1616,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "date-names": { @@ -1668,8 +1657,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "del": { @@ -1678,13 +1667,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -1704,7 +1693,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "di": { @@ -1713,14 +1702,20 @@ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "doctrine": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "dom-serialize": { @@ -1729,10 +1724,10 @@ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.1", - "void-elements": "2.0.1" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, "dom-serializer": { @@ -1740,8 +1735,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -1767,7 +1762,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -1775,8 +1770,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "draft-js": { @@ -1784,9 +1779,9 @@ "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.0-alpha.tgz", "integrity": "sha1-MtshCPkn6bhEbaH3nkR1wrf4aK4=", "requires": { - "fbjs": "0.8.16", - "immutable": "3.7.6", - "object-assign": "4.1.1" + "fbjs": "^0.8.12", + "immutable": "~3.7.4", + "object-assign": "^4.1.0" } }, "draft-js-export-html": { @@ -1794,7 +1789,7 @@ "resolved": "https://registry.npmjs.org/draft-js-export-html/-/draft-js-export-html-0.6.0.tgz", "integrity": "sha1-zIDwVExD0Kf+28U8DLCRToCQ92k=", "requires": { - "draft-js-utils": "1.2.0" + "draft-js-utils": ">=0.2.0" } }, "draft-js-export-markdown": { @@ -1802,7 +1797,7 @@ "resolved": "https://registry.npmjs.org/draft-js-export-markdown/-/draft-js-export-markdown-0.3.0.tgz", "integrity": "sha1-hjkOA86vHTR/xhaGerf1Net2v0I=", "requires": { - "draft-js-utils": "1.2.0" + "draft-js-utils": ">=0.2.0" } }, "draft-js-utils": { @@ -1816,7 +1811,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -1847,7 +1842,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" } }, "engine.io": { @@ -1944,9 +1939,9 @@ "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.2.0", - "tapable": "0.1.10" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" }, "dependencies": { "memory-fs": { @@ -1974,7 +1969,7 @@ "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "dev": true, "requires": { - "prr": "0.0.0" + "prr": "~0.0.0" } }, "es-abstract": { @@ -1983,11 +1978,11 @@ "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -1996,9 +1991,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -2007,8 +2002,8 @@ "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -2017,9 +2012,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2028,12 +2023,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -2042,11 +2037,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -2055,8 +2050,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -2065,10 +2060,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -2089,10 +2084,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -2101,41 +2096,41 @@ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.9", - "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.5.1", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.5", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.1", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" }, "dependencies": { "glob": { @@ -2144,12 +2139,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "user-home": { @@ -2158,7 +2153,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } } } @@ -2181,7 +2176,7 @@ "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "^4.15.0" } }, "eslint-plugin-react": { @@ -2190,10 +2185,10 @@ "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", "dev": true, "requires": { - "doctrine": "2.1.0", - "has": "1.0.1", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.0" + "doctrine": "^2.0.2", + "has": "^1.0.1", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.0" }, "dependencies": { "doctrine": { @@ -2202,7 +2197,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } } } @@ -2213,8 +2208,8 @@ "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", "dev": true, "requires": { - "acorn": "5.1.2", - "acorn-jsx": "3.0.1" + "acorn": "^5.1.1", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -2229,7 +2224,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -2238,8 +2233,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -2266,8 +2261,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "eventemitter3": { @@ -2302,9 +2297,9 @@ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" }, "dependencies": { "braces": { @@ -2313,7 +2308,7 @@ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, "requires": { - "expand-range": "0.1.1" + "expand-range": "^0.1.0" } }, "expand-range": { @@ -2322,8 +2317,8 @@ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" } }, "is-number": { @@ -2346,7 +2341,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2355,7 +2350,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "expect": { @@ -2364,13 +2359,13 @@ "integrity": "sha1-1Fj+TFYAQDa64yMkFqP2Nh8E+WU=", "dev": true, "requires": { - "define-properties": "1.1.2", - "has": "1.0.1", - "is-equal": "1.5.5", - "is-regex": "1.0.4", - "object-inspect": "1.3.0", - "object-keys": "1.0.11", - "tmatch": "2.0.1" + "define-properties": "~1.1.2", + "has": "^1.0.1", + "is-equal": "^1.5.1", + "is-regex": "^1.0.3", + "object-inspect": "^1.1.0", + "object-keys": "^1.0.9", + "tmatch": "^2.0.1" } }, "extend": { @@ -2384,7 +2379,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extsprintf": { @@ -2393,9 +2388,14 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -2408,7 +2408,7 @@ "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", "requires": { - "fbjs": "0.8.16" + "fbjs": "^0.8.4" } }, "fbjs": { @@ -2416,13 +2416,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" }, "dependencies": { "core-js": { @@ -2438,8 +2438,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { @@ -2448,8 +2448,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-saver": { @@ -2474,11 +2474,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "finalhandler": { @@ -2488,12 +2488,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" } }, "find-cache-dir": { @@ -2502,9 +2502,9 @@ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-up": { @@ -2513,8 +2513,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "flat-cache": { @@ -2523,10 +2523,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "flow-parser": { @@ -2540,9 +2540,9 @@ "resolved": "https://registry.npmjs.org/flux/-/flux-2.1.1.tgz", "integrity": "sha1-LGrGUtQzdIiWhInGWG86/yajjqQ=", "requires": { - "fbemitter": "2.1.1", + "fbemitter": "^2.0.0", "fbjs": "0.1.0-alpha.7", - "immutable": "3.7.6" + "immutable": "^3.7.4" }, "dependencies": { "core-js": { @@ -2555,9 +2555,9 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.1.0-alpha.7.tgz", "integrity": "sha1-rUMIuPIy+zxzYDNJ6nJdHpw5Mjw=", "requires": { - "core-js": "1.2.7", - "promise": "7.3.1", - "whatwg-fetch": "0.9.0" + "core-js": "^1.0.0", + "promise": "^7.0.3", + "whatwg-fetch": "^0.9.0" } }, "whatwg-fetch": { @@ -2572,7 +2572,7 @@ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.3.tgz", "integrity": "sha512-sT5Ip9nyAIxWq8Apt1Fdv6yTci5GotaOtO5Ro1/+F3PizttNBcCYz8j/Qze54PPFK73KUbOqh++HUCiyNPqvhA==", "requires": { - "tabbable": "1.1.2" + "tabbable": "^1.0.3" } }, "focus-trap-react": { @@ -2580,7 +2580,7 @@ "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-3.1.2.tgz", "integrity": "sha512-MoQmONoy9gRPyrC5DGezkcOMGgx7MtIOAQDHe098UtL2sA2vmucJwEmQisb+8LRXNYFHxuw5zJ1oLFeKu4Mteg==", "requires": { - "focus-trap": "2.4.3" + "focus-trap": "^2.0.1" } }, "for-in": { @@ -2595,7 +2595,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -2616,22 +2616,13 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "1.1.2" + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" } }, "fs-access": { @@ -2640,7 +2631,7 @@ "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { - "null-check": "1.0.0" + "null-check": "^1.0.0" } }, "fs-readdir-recursive": { @@ -2662,8 +2653,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.36" }, "dependencies": { "abbrev": { @@ -2699,8 +2690,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -2744,7 +2735,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { @@ -2752,15 +2743,16 @@ "bundled": true, "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { "version": "2.10.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -2768,7 +2760,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, @@ -2799,7 +2791,7 @@ "bundled": true, "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -2823,7 +2815,7 @@ "dev": true, "optional": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -2832,7 +2824,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2875,7 +2867,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -2916,10 +2908,10 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -2928,9 +2920,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -2939,14 +2931,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "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" } }, "getpass": { @@ -2955,7 +2947,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2971,12 +2963,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { @@ -3021,7 +3013,8 @@ "hoek": { "version": "2.16.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "http-signature": { "version": "1.1.1", @@ -3029,9 +3022,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { @@ -3039,8 +3032,8 @@ "bundled": true, "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3085,7 +3078,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -3106,7 +3099,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -3187,15 +3180,15 @@ "dev": true, "optional": true, "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "^2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -3214,10 +3207,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3242,7 +3235,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3320,13 +3313,13 @@ "bundled": true, "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -3335,28 +3328,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { @@ -3364,7 +3357,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -3405,15 +3398,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -3467,9 +3460,9 @@ "bundled": true, "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -3478,14 +3471,14 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { @@ -3544,7 +3537,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3566,7 +3559,8 @@ "integrity": "sha1-luQg/efvARrEnCWKYhMU/ldlNvk=" }, "gemini-scrollbar": { - "version": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" + "version": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b", + "from": "gemini-scrollbar@github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" }, "generate-function": { "version": "2.0.0", @@ -3580,7 +3574,7 @@ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" } }, "getpass": { @@ -3588,7 +3582,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "gfm.css": { @@ -3601,11 +3595,11 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -3614,8 +3608,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -3624,7 +3618,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { @@ -3639,12 +3633,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "glob": { @@ -3653,12 +3647,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -3679,8 +3673,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has": { @@ -3689,7 +3683,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -3698,7 +3692,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-binary": { @@ -3730,16 +3724,6 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "sntp": "2.0.2" - } - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -3762,8 +3746,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "htmlparser2": { @@ -3771,12 +3755,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.6.2", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "http-errors": { @@ -3788,7 +3772,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.3.1" + "statuses": ">= 1.3.1 < 2" } }, "http-proxy": { @@ -3797,8 +3781,8 @@ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "dev": true, "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" } }, "http-signature": { @@ -3806,9 +3790,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -3855,8 +3839,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3870,19 +3854,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" } }, "interpret": { @@ -3896,7 +3880,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "is-arrow-function": { @@ -3905,7 +3889,7 @@ "integrity": "sha1-Kb4sLY2UUIUri7r7Y1unuNjofsI=", "dev": true, "requires": { - "is-callable": "1.1.3" + "is-callable": "^1.0.4" } }, "is-binary-path": { @@ -3914,7 +3898,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.10.0" + "binary-extensions": "^1.0.0" } }, "is-boolean-object": { @@ -3953,17 +3937,17 @@ "integrity": "sha1-XoXxlX4FKIMkf+s4aWWju6Ffuz0=", "dev": true, "requires": { - "has": "1.0.1", - "is-arrow-function": "2.0.3", - "is-boolean-object": "1.0.0", - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-generator-function": "1.0.6", - "is-number-object": "1.0.3", - "is-regex": "1.0.4", - "is-string": "1.0.4", - "is-symbol": "1.0.1", - "object.entries": "1.0.4" + "has": "^1.0.1", + "is-arrow-function": "^2.0.3", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.3", + "is-date-object": "^1.0.1", + "is-generator-function": "^1.0.6", + "is-number-object": "^1.0.3", + "is-regex": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.1", + "object.entries": "^1.0.4" } }, "is-equal-shallow": { @@ -3972,7 +3956,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -3993,7 +3977,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -4002,7 +3986,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-generator-function": { @@ -4017,7 +4001,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-my-json-valid": { @@ -4026,10 +4010,10 @@ "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-number": { @@ -4038,7 +4022,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-number-object": { @@ -4059,7 +4043,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -4068,7 +4052,7 @@ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-posix-bracket": { @@ -4095,7 +4079,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-resolvable": { @@ -4104,7 +4088,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "1.0.3" + "tryit": "^1.0.1" } }, "is-stream": { @@ -4160,8 +4144,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "1.1.1" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "isstream": { @@ -4185,8 +4169,8 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -4221,8 +4205,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -4245,7 +4230,8 @@ "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true }, "jsonpointer": { "version": "4.0.1", @@ -4270,42 +4256,48 @@ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "array-includes": "3.0.3" + "array-includes": "^3.0.3" } }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "dev": true + }, "karma": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", "dev": true, "requires": { - "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "1.7.0", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.5", - "core-js": "2.5.1", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.16.2", - "isbinaryfile": "3.0.2", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.4.1", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.1.5", - "range-parser": "1.2.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^3.8.0", + "log4js": "^0.6.31", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", "socket.io": "1.7.3", - "source-map": "0.5.7", + "source-map": "^0.5.3", "tmp": "0.0.31", - "useragent": "2.2.1" + "useragent": "^2.1.12" }, "dependencies": { "glob": { @@ -4314,12 +4306,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "lodash": { @@ -4336,8 +4328,8 @@ "integrity": "sha1-TG1wDRY6nTTGGO/YeRi+SeekqMk=", "dev": true, "requires": { - "fs-access": "1.0.1", - "which": "1.3.0" + "fs-access": "^1.0.0", + "which": "^1.2.1" } }, "karma-cli": { @@ -4346,7 +4338,7 @@ "integrity": "sha1-ys6oQ3Hs4Zh2JlyPoQLru5/uSow=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "^1.1.6" } }, "karma-junit-reporter": { @@ -4355,7 +4347,7 @@ "integrity": "sha1-SSojZyj+TJKqz0GfzQEQpDJ+nX8=", "dev": true, "requires": { - "path-is-absolute": "1.0.1", + "path-is-absolute": "^1.0.0", "xmlbuilder": "3.1.0" } }, @@ -4377,7 +4369,7 @@ "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.2" } }, "karma-spec-reporter": { @@ -4386,7 +4378,7 @@ "integrity": "sha1-SDDccUihVcfXoYbmMjOaDYD63sM=", "dev": true, "requires": { - "colors": "1.1.2" + "colors": "^1.1.2" } }, "karma-summary-reporter": { @@ -4395,7 +4387,7 @@ "integrity": "sha1-nHQKJLYL+RNes59acylsTM0Q2Zs=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.1.3" } }, "karma-webpack": { @@ -4404,11 +4396,11 @@ "integrity": "sha1-OdX9Lt7qPMPvW0BZibN9Ww5qO04=", "dev": true, "requires": { - "async": "0.9.2", - "loader-utils": "0.2.17", - "lodash": "3.10.1", - "source-map": "0.1.43", - "webpack-dev-middleware": "1.12.0" + "async": "~0.9.0", + "loader-utils": "^0.2.5", + "lodash": "^3.8.0", + "source-map": "^0.1.41", + "webpack-dev-middleware": "^1.0.11" }, "dependencies": { "lodash": { @@ -4423,7 +4415,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -4434,7 +4426,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } }, "lazy-cache": { @@ -4449,8 +4441,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "linkifyjs": { @@ -4458,9 +4450,9 @@ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-2.1.5.tgz", "integrity": "sha512-8FqxPXQDLjI2nNHlM7eGewxE6DHvMbtiW0AiXzm0s4RkTwVZYRDTeVXkiRxLHTd4CuRBQY/JPtvtqJWdS7gHyA==", "requires": { - "jquery": "3.2.1", - "react": "15.6.2", - "react-dom": "15.6.2" + "jquery": ">=1.9.0", + "react": ">=0.14.0", + "react-dom": ">=0.14.0" } }, "loader-utils": { @@ -4469,10 +4461,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, "lodash": { @@ -4491,6 +4483,12 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.pickby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", @@ -4503,8 +4501,8 @@ "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" + "readable-stream": "~1.0.2", + "semver": "~4.3.3" }, "dependencies": { "isarray": { @@ -4519,10 +4517,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -4534,10 +4532,9 @@ } }, "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", + "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==" }, "longest": { "version": "1.0.1", @@ -4550,7 +4547,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { @@ -4560,16 +4557,16 @@ "dev": true }, "matrix-js-sdk": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-0.10.1.tgz", - "integrity": "sha512-BLo+Okn2o///TyWBKtjFXvhlD32vGfr10eTE51hHx/jwaXO82VyGMzMi+IDPS4SDYUbvXI7PpamECeh9TXnV2w==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-0.10.2.tgz", + "integrity": "sha512-7o9a+4wWmxoW4cfdGVLGjZgTFLpWf/I0UqyicIzdV73qotYIO/q6k1bLf1+G0hgwZ/umwke4CB7GemxvvvxMcA==", "requires": { - "another-json": "0.2.0", - "babel-runtime": "6.26.0", - "bluebird": "3.5.1", - "browser-request": "0.3.3", - "content-type": "1.0.4", - "request": "2.83.0" + "another-json": "^0.2.0", + "babel-runtime": "^6.26.0", + "bluebird": "^3.5.0", + "browser-request": "^0.3.3", + "content-type": "^1.0.2", + "request": "^2.53.0" } }, "matrix-mock-request": { @@ -4578,8 +4575,8 @@ "integrity": "sha1-2aWrqNPYJG6I/3YyWYuZwUE/QjI=", "dev": true, "requires": { - "bluebird": "3.5.1", - "expect": "1.20.2" + "bluebird": "^3.5.0", + "expect": "^1.20.2" } }, "matrix-react-test-utils": { @@ -4588,8 +4585,8 @@ "integrity": "sha1-tUiETQ6+M46hucjxZHTDDRfDvfQ=", "dev": true, "requires": { - "react": "15.6.2", - "react-dom": "15.6.2" + "react": "^15.6.1", + "react-dom": "^15.6.1" } }, "mdurl": { @@ -4614,8 +4611,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "micromatch": { @@ -4624,19 +4621,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mime": { @@ -4655,7 +4652,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.30.0" } }, "minimatch": { @@ -4663,7 +4660,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -4728,12 +4725,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "growl": { @@ -4754,7 +4751,7 @@ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -4790,13 +4787,34 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "nise": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.3.tgz", + "integrity": "sha512-v1J/FLUB9PfGqZLGDBhQqODkbLotP0WtLo9R4EJY2PPu5f5Xg4o0rA8FDlmrjFSv9vBBKcfnOSpfYYuu5RTHqg==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "just-extend": "^1.1.27", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "lolex": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.6.0.tgz", + "integrity": "sha512-e1UtIo1pbrIqEXib/yMjHciyqkng5lc0rrIbytgjmRgDR9+2ceNIAcwOWSgylRjoEP9VdVguCSRwnNmlbnOUwA==", + "dev": true + } + } + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "node-libs-browser": { @@ -4805,28 +4823,28 @@ "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.1.4", + "buffer": "^4.9.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", "crypto-browserify": "3.3.0", - "domain-browser": "1.1.7", - "events": "1.1.1", + "domain-browser": "^1.1.1", + "events": "^1.0.0", "https-browserify": "0.0.1", - "os-browserify": "0.2.1", + "os-browserify": "^0.2.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.4", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.0.5", + "stream-browserify": "^2.0.1", + "stream-http": "^2.3.1", + "string_decoder": "^0.10.25", + "timers-browserify": "^2.0.2", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -4844,7 +4862,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "null-check": { @@ -4893,10 +4911,10 @@ "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1", - "has": "1.0.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" } }, "object.omit": { @@ -4905,8 +4923,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "on-finished": { @@ -4923,7 +4941,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -4937,8 +4955,8 @@ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { @@ -4954,12 +4972,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" }, "dependencies": { "wordwrap": { @@ -5000,9 +5018,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" } }, "pako": { @@ -5022,10 +5040,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parsejson": { @@ -5034,7 +5052,7 @@ "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseqs": { @@ -5043,7 +5061,7 @@ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseuri": { @@ -5052,7 +5070,7 @@ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseurl": { @@ -5073,7 +5091,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -5093,6 +5111,23 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "pbkdf2-compat": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", @@ -5122,7 +5157,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -5131,7 +5166,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pluralize": { @@ -5185,7 +5220,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "prop-types": { @@ -5193,9 +5228,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "prr": { @@ -5236,7 +5271,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", "requires": { - "performance-now": "2.1.0" + "performance-now": "^2.1.0" } }, "raf-schd": { @@ -5250,8 +5285,8 @@ "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -5260,7 +5295,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5269,7 +5304,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } @@ -5280,7 +5315,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } @@ -5308,11 +5343,11 @@ "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", "requires": { - "create-react-class": "15.6.2", - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "create-react-class": "^15.6.0", + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" } }, "react-addons-css-transition-group": { @@ -5331,16 +5366,16 @@ "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-4.0.1.tgz", "integrity": "sha512-d73RMu4QOFCyjUELLWFyY/EuclnfqulI9pECx+2gIuJvV0ycf1uR88o+1x0RSB9ILD70inHMzCBKNkWVbbt+vA==", "requires": { - "babel-runtime": "6.26.0", - "invariant": "2.2.2", - "memoize-one": "3.1.1", - "prop-types": "15.6.0", - "raf-schd": "2.1.1", - "react-motion": "0.5.2", - "react-redux": "5.0.7", - "redux": "3.7.2", - "redux-thunk": "2.2.0", - "reselect": "3.0.1" + "babel-runtime": "^6.26.0", + "invariant": "^2.2.2", + "memoize-one": "^3.0.1", + "prop-types": "^15.6.0", + "raf-schd": "^2.1.0", + "react-motion": "^0.5.2", + "react-redux": "^5.0.6", + "redux": "^3.7.2", + "redux-thunk": "^2.2.0", + "reselect": "^3.0.1" } }, "react-dom": { @@ -5348,14 +5383,15 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" } }, "react-gemini-scrollbar": { "version": "github:matrix-org/react-gemini-scrollbar#5e97aef7e034efc8db1431f4b0efe3b26e249ae9", + "from": "react-gemini-scrollbar@github:matrix-org/react-gemini-scrollbar#5e97aef7e034efc8db1431f4b0efe3b26e249ae9", "requires": { "gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" } @@ -5365,9 +5401,9 @@ "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", "requires": { - "performance-now": "0.2.0", - "prop-types": "15.6.0", - "raf": "3.4.0" + "performance-now": "^0.2.0", + "prop-types": "^15.5.8", + "raf": "^3.1.0" }, "dependencies": { "performance-now": { @@ -5382,12 +5418,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", "requires": { - "hoist-non-react-statics": "2.5.0", - "invariant": "2.2.2", - "lodash": "4.17.10", - "lodash-es": "4.17.10", - "loose-envify": "1.3.1", - "prop-types": "15.6.0" + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.0.0", + "lodash": "^4.17.5", + "lodash-es": "^4.17.5", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.0" }, "dependencies": { "lodash": { @@ -5402,13 +5438,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -5417,10 +5453,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "readline2": { @@ -5429,8 +5465,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", "mute-stream": "0.0.5" } }, @@ -5440,7 +5476,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "^1.1.6" } }, "redux": { @@ -5448,10 +5484,10 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "lodash": "4.17.4", - "lodash-es": "4.17.10", - "loose-envify": "1.3.1", - "symbol-observable": "1.2.0" + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" } }, "redux-thunk": { @@ -5476,9 +5512,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -5487,7 +5523,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regexp-quote": { @@ -5501,9 +5537,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -5518,7 +5554,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -5553,36 +5589,34 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "require-json": { @@ -5597,8 +5631,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "requires-port": { @@ -5618,7 +5652,7 @@ "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-from": { @@ -5633,8 +5667,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "right-align": { @@ -5643,7 +5677,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -5652,7 +5686,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" }, "dependencies": { "glob": { @@ -5661,12 +5695,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -5683,7 +5717,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.3.0" } }, "rx-lite": { @@ -5698,9 +5732,9 @@ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", "dev": true }, "sanitize-html": { @@ -5708,9 +5742,9 @@ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.14.1.tgz", "integrity": "sha1-cw/6Ikm98YMz7/5FsoYXPJxa0Lg=", "requires": { - "htmlparser2": "3.9.2", + "htmlparser2": "^3.9.0", "regexp-quote": "0.0.0", - "xtend": "4.0.1" + "xtend": "^4.0.0" } }, "semver": { @@ -5748,9 +5782,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.0.4", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, "dependencies": { "glob": { @@ -5759,26 +5793,52 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } }, "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.7.tgz", + "integrity": "sha512-GvNLrwpvLZ8jIMZBUhHGUZDq5wlUdceJWyHvZDmqBxnjazpxY1L0FNbGBX6VpcOEoQ8Q4XMWFzm2myJMvx+VjA==", "dev": true, "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": "0.10.3" + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "lolex": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.6.0.tgz", + "integrity": "sha512-e1UtIo1pbrIqEXib/yMjHciyqkng5lc0rrIbytgjmRgDR9+2ceNIAcwOWSgylRjoEP9VdVguCSRwnNmlbnOUwA==", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "slash": { @@ -5793,11 +5853,6 @@ "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, - "sntp": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", - "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=" - }, "socket.io": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", @@ -5958,9 +6013,9 @@ "integrity": "sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw==", "dev": true, "requires": { - "async": "2.6.0", - "loader-utils": "0.2.17", - "source-map": "0.6.1" + "async": "^2.5.0", + "loader-utils": "~0.2.2", + "source-map": "~0.6.1" }, "dependencies": { "async": { @@ -5969,7 +6024,7 @@ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "^4.14.0" } }, "source-map": { @@ -5986,7 +6041,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "sprintf-js": { @@ -5995,18 +6050,18 @@ "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "statuses": { @@ -6021,8 +6076,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -6031,11 +6086,11 @@ "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "string-width": { @@ -6044,9 +6099,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string.prototype.repeat": { @@ -6059,21 +6114,16 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -6110,12 +6160,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", "slice-ansi": "0.0.4", - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ajv": { @@ -6124,8 +6174,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -6146,8 +6196,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -6156,7 +6206,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -6167,6 +6217,12 @@ "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", "dev": true }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, "text-encoding-utf-8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.1.tgz", @@ -6196,7 +6252,7 @@ "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmatch": { @@ -6211,7 +6267,7 @@ "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.1" } }, "to-array": { @@ -6233,11 +6289,11 @@ "dev": true }, "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "trim-right": { @@ -6263,7 +6319,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -6278,9 +6334,15 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -6288,7 +6350,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.17" + "mime-types": "~2.1.15" } }, "typedarray": { @@ -6308,10 +6370,10 @@ "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", "dev": true, "requires": { - "async": "0.2.10", - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "async": { @@ -6368,8 +6430,8 @@ "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", "dev": true, "requires": { - "lru-cache": "2.2.4", - "tmp": "0.0.31" + "lru-cache": "2.2.x", + "tmp": "0.0.x" } }, "util": { @@ -6401,9 +6463,9 @@ "dev": true }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "v8flags": { "version": "2.1.1", @@ -6411,13 +6473,14 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "1.1.1" + "user-home": "^1.1.1" } }, "velocity-vector": { "version": "github:vector-im/velocity#059e3b2348f1110888d033974d3109fd5a3af00f", + "from": "velocity-vector@github:vector-im/velocity#059e3b2348f1110888d033974d3109fd5a3af00f", "requires": { - "jquery": "3.2.1" + "jquery": ">= 1.4.3" } }, "verror": { @@ -6425,9 +6488,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vm-browserify": { @@ -6451,7 +6514,7 @@ "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins=", "dev": true, "requires": { - "foreachasync": "3.0.0" + "foreachasync": "^3.0.0" } }, "watchpack": { @@ -6460,9 +6523,9 @@ "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", "dev": true, "requires": { - "async": "0.9.2", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" + "async": "^0.9.0", + "chokidar": "^1.0.0", + "graceful-fs": "^4.1.2" } }, "webpack": { @@ -6471,21 +6534,21 @@ "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", "dev": true, "requires": { - "acorn": "3.3.0", - "async": "1.5.2", - "clone": "1.0.2", - "enhanced-resolve": "0.9.1", - "interpret": "0.6.6", - "loader-utils": "0.2.17", - "memory-fs": "0.3.0", - "mkdirp": "0.5.1", - "node-libs-browser": "0.7.0", - "optimist": "0.6.1", - "supports-color": "3.2.3", - "tapable": "0.1.10", - "uglify-js": "2.7.5", - "watchpack": "0.2.9", - "webpack-core": "0.6.9" + "acorn": "^3.0.0", + "async": "^1.3.0", + "clone": "^1.0.2", + "enhanced-resolve": "~0.9.0", + "interpret": "^0.6.4", + "loader-utils": "^0.2.11", + "memory-fs": "~0.3.0", + "mkdirp": "~0.5.0", + "node-libs-browser": "^0.7.0", + "optimist": "~0.6.0", + "supports-color": "^3.1.0", + "tapable": "~0.1.8", + "uglify-js": "~2.7.3", + "watchpack": "^0.2.1", + "webpack-core": "~0.6.9" }, "dependencies": { "acorn": { @@ -6512,8 +6575,8 @@ "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", "dev": true, "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "supports-color": { @@ -6522,7 +6585,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -6533,8 +6596,8 @@ "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", "dev": true, "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" }, "dependencies": { "source-map": { @@ -6543,7 +6606,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -6554,11 +6617,11 @@ "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", "dev": true, "requires": { - "memory-fs": "0.4.1", - "mime": "1.4.1", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" + "memory-fs": "~0.4.1", + "mime": "^1.3.4", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" } }, "whatwg-fetch": { @@ -6572,7 +6635,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "window-size": { @@ -6597,7 +6660,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "ws": { @@ -6606,8 +6669,8 @@ "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", "dev": true, "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "options": ">=0.0.5", + "ultron": "1.0.x" } }, "wtf-8": { @@ -6622,7 +6685,7 @@ "integrity": "sha1-LIaIjy1OrehQ+jjKf3Ij9yCVFuE=", "dev": true, "requires": { - "lodash": "3.10.1" + "lodash": "^3.5.0" }, "dependencies": { "lodash": { @@ -6650,9 +6713,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } }, diff --git a/package.json b/package.json index 60f65f4c39..5864b35fc4 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "react-addons-test-utils": "^15.4.0", "require-json": "0.0.1", "rimraf": "^2.4.3", - "sinon": "^1.17.3", + "sinon": "^5.0.7", "source-map-loader": "^0.2.3", "walk": "^2.3.9", "webpack": "^1.12.14" diff --git a/test/components/structures/TimelinePanel-test.js b/test/components/structures/TimelinePanel-test.js index 74037d2926..ea62d427bc 100644 --- a/test/components/structures/TimelinePanel-test.js +++ b/test/components/structures/TimelinePanel-test.js @@ -235,7 +235,7 @@ describe('TimelinePanel', function() { // now, if we update the events, there shouldn't be any // more requests. - client.paginateEventTimeline.reset(); + client.paginateEventTimeline.resetHistory(); panel.forceUpdate(); expect(messagePanel.props.backPaginating).toBe(false); setTimeout(() => { From 836dc8b0ef2b3d086747c85fbcdd885d7102304c Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Mon, 21 May 2018 16:59:13 +0100 Subject: [PATCH 024/480] Factor out all shared logic between MStickerBody and MImageBody The benefits of this: - One code path for determining spinner/placeholder and it's position for loading images/stickers. This includes spinner used in e2e decryption of images. - Very small definition for MStickerBody, only overriding the minimal differences is has from MImageBody. The disadvantages: - Slightly more complicated MImageBody, but hopefully not less readable. --- res/css/views/messages/_MImageBody.scss | 11 +- res/css/views/messages/_MStickerBody.scss | 32 +--- src/components/views/messages/MImageBody.js | 89 ++++++++-- src/components/views/messages/MStickerBody.js | 162 ++++-------------- 4 files changed, 111 insertions(+), 183 deletions(-) diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 64821434dd..4c763c5991 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -37,11 +37,12 @@ limitations under the License. } .mx_MImageBody_thumbnail_spinner { - display: flex; - align-items: center; - width: 100%; + position: absolute; + left: 50%; + top: 50%; } -.mx_MImageBody_thumbnail_spinner img { - margin: auto; +// Inner img and TintableSvg should be centered around 0, 0 +.mx_MImageBody_thumbnail_spinner > * { + transform: translate(-50%, -50%); } diff --git a/res/css/views/messages/_MStickerBody.scss b/res/css/views/messages/_MStickerBody.scss index 3e6bbe5aa4..e4977bcc34 100644 --- a/res/css/views/messages/_MStickerBody.scss +++ b/res/css/views/messages/_MStickerBody.scss @@ -14,33 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -.mx_MStickerBody { - display: block; - margin-right: 34px; - min-height: 110px; - padding: 20px 0; +.mx_MStickerBody_wrapper { + padding: 20px 0px; } -.mx_MStickerBody_image_container { - display: inline-block; - position: relative; -} - -.mx_MStickerBody_image { - max-width: 100%; - opacity: 0; -} - -.mx_MStickerBody_image_visible { - opacity: 1; -} - -.mx_MStickerBody_placeholder { - position: absolute; - opacity: 1; -} - -.mx_MStickerBody_placeholder_invisible { - transition: 500ms; - opacity: 0; +.mx_MStickerBody_tooltip { + position: absolute; + top: 50%; } diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index d9108a2fe1..03dad5e439 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -62,6 +62,8 @@ export default class extends React.Component { decryptedBlob: null, error: null, imgError: false, + imgLoaded: false, + hover: false, }; } @@ -116,6 +118,8 @@ export default class extends React.Component { } onImageEnter(e) { + this.setState({ hover: true }); + if (!this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { return; } @@ -124,6 +128,8 @@ export default class extends React.Component { } onImageLeave(e) { + this.setState({ hover: false }); + if (!this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) { return; } @@ -139,6 +145,7 @@ export default class extends React.Component { onImageLoad() { this.props.onWidgetLoad(); + this.setState({ imgLoaded: true }); } _getContentUrl() { @@ -237,14 +244,22 @@ export default class extends React.Component { const maxWidth = content.info.w * maxHeight / content.info.h; let img = null; + let placeholder = null; + // e2e image hasn't been decrypted yet if (content.file !== undefined && this.state.decryptedUrl === null) { - img = <div className="mx_MImageBody_thumbnail mx_MImageBody_thumbnail_spinner" ref="image"> - <img src="img/spinner.gif" alt={content.body} width="32" height="32" /> - </div>; - } else if (thumbUrl && !this.state.imgError) { + placeholder = <img src="img/spinner.gif" alt={content.body} width="32" height="32" />; + } else if (!this.state.imgLoaded) { + // Deliberately, getSpinner is left unimplemented here, MStickerBody overides + placeholder = this.getPlaceholder(); + } + + const showPlaceholder = Boolean(placeholder); + + if (thumbUrl && !this.state.imgError) { // Restrict the width of the thumbnail here, otherwise it will fill the container // which has the same width as the timeline + // mx_MImageBody_thumbnail resizes img to exactly container size img = <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" style={{ "max-width": maxWidth + "px" }} alt={content.body} @@ -253,23 +268,54 @@ export default class extends React.Component { onMouseEnter={this.onImageEnter} onMouseLeave={this.onImageLeave} />; } - const thumbnail = img ? - <a href={contentUrl} onClick={this.onClick}> - <div className="mx_MImageBody_thumbnail_container" style={{ "max-height": maxHeight + "px" }} > - { /* Calculate aspect ratio, using %padding will size _container correctly */ } - <div style={{ paddingBottom: (100 * content.info.h / content.info.w) + '%' }}></div> - { /* mx_MImageBody_thumbnail resizes img to exactly container size */ } + const thumbnail = ( + <div className="mx_MImageBody_thumbnail_container" style={{ "max-height": maxHeight + "px" }} > + { /* Calculate aspect ratio, using %padding will size _container correctly */ } + <div style={{ paddingBottom: (100 * content.info.h / content.info.w) + '%' }}></div> + + <div className="mx_MImageBody_thumbnail" style={{ + "display": showPlaceholder ? undefined : 'none', + // Constrain width here so that spinner appears central to the loaded thumbnail + "max-width": content.info.w + "px", + }}> + <div className="mx_MImageBody_thumbnail_spinner"> + { placeholder } + </div> + </div> + + <div style={{display: !showPlaceholder ? undefined : 'none'}}> { img } </div> - </a> : null; - return ( - <span className="mx_MImageBody" ref="body"> - { thumbnail } - <MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} /> - </span> - ); + { this.state.hover && this.getTooltip() } + </div> + ); + + return this.wrapImage(contentUrl, thumbnail); + } + + // Overidden by MStickerBody + wrapImage(contentUrl, children) { + return <a href={contentUrl} onClick={this.onClick}> + {children} + </a>; + } + + // Overidden by MStickerBody + getPlaceholder() { + // MImageBody doesn't show a placeholder whilst the image loads, (but it could do) + return null; + } + + // Overidden by MStickerBody + getTooltip() { + return null; + } + + // Overidden by MStickerBody + getFileBody() { + return <MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} />; } render() { @@ -284,7 +330,6 @@ export default class extends React.Component { ); } - const contentUrl = this._getContentUrl(); let thumbUrl; if (this._isGif() && SettingsStore.getValue("autoplayGifsAndVideos")) { @@ -293,6 +338,12 @@ export default class extends React.Component { thumbUrl = this._getThumbUrl(); } - return this._messageContent(contentUrl, thumbUrl, content); + const thumbnail = this._messageContent(contentUrl, thumbUrl, content); + const fileBody = this.getFileBody(); + + return <span className="mx_MImageBody" ref="body"> + { thumbnail } + { fileBody } + </span>; } } diff --git a/src/components/views/messages/MStickerBody.js b/src/components/views/messages/MStickerBody.js index cdb60f0074..d9ed668e42 100644 --- a/src/components/views/messages/MStickerBody.js +++ b/src/components/views/messages/MStickerBody.js @@ -18,141 +18,39 @@ limitations under the License. import MImageBody from './MImageBody'; import sdk from '../../../index'; -import TintableSVG from '../elements/TintableSvg'; export default class MStickerBody extends MImageBody { - displayName: 'MStickerBody' - - constructor(props) { - super(props); - - this._onMouseEnter = this._onMouseEnter.bind(this); - this._onMouseLeave = this._onMouseLeave.bind(this); - this._onImageLoad = this._onImageLoad.bind(this); - } - - _onMouseEnter() { - this.setState({showTooltip: true}); - } - - _onMouseLeave() { - this.setState({showTooltip: false}); - } - - _onImageLoad() { - this.setState({ - placeholderClasses: 'mx_MStickerBody_placeholder_invisible', - }); - const hidePlaceholderTimer = setTimeout(() => { - this.setState({ - placeholderVisible: false, - imageClasses: 'mx_MStickerBody_image_visible', - }); - }, 500); - this.setState({hidePlaceholderTimer}); - if (this.props.onWidgetLoad) { - this.props.onWidgetLoad(); - } - } - - _afterComponentDidMount() { - if (this.refs.image.complete) { - // Image already loaded - this.setState({ - placeholderVisible: false, - placeholderClasses: '.mx_MStickerBody_placeholder_invisible', - imageClasses: 'mx_MStickerBody_image_visible', - }); - } else { - // Image not already loaded - this.setState({ - placeholderVisible: true, - placeholderClasses: '', - imageClasses: '', - }); - } - } - - _afterComponentWillUnmount() { - if (this.state.hidePlaceholderTimer) { - clearTimeout(this.state.hidePlaceholderTimer); - this.setState({hidePlaceholderTimer: null}); - } - } - - _messageContent(contentUrl, thumbUrl, content) { - let tooltip; - const tooltipBody = ( - this.props.mxEvent && - this.props.mxEvent.getContent() && - this.props.mxEvent.getContent().body) ? - this.props.mxEvent.getContent().body : null; - if (this.state.showTooltip && tooltipBody) { - const RoomTooltip = sdk.getComponent('rooms.RoomTooltip'); - tooltip = <RoomTooltip - className='mx_RoleButton_tooltip' - label={tooltipBody} />; - } - - const gutterSize = 0; - let placeholderSize = 75; - let placeholderFixupHeight = '100px'; - let placeholderTop = 0; - let placeholderLeft = 0; - - if (content.info) { - placeholderTop = Math.floor((content.info.h/2) - (placeholderSize/2)) + 'px'; - placeholderLeft = Math.floor((content.info.w/2) - (placeholderSize/2) + gutterSize) + 'px'; - placeholderFixupHeight = content.info.h + 'px'; - } - - // The pixel size of sticker images is generally larger than their intended display - // size so they render at native reolution on HiDPI displays. We therefore need to - // explicity set the size so they render at the intended size. - const imageStyle = { - height: content.info.h, - // leave the browser the calculate the width automatically - }; - - placeholderSize = placeholderSize + 'px'; - - // Body 'ref' required by MImageBody - return ( - <span className='mx_MStickerBody' ref='body' - style={{ - height: placeholderFixupHeight, - }}> - <div className={'mx_MStickerBody_image_container'}> - { this.state.placeholderVisible && - <div - className={'mx_MStickerBody_placeholder ' + this.state.placeholderClasses} - style={{ - top: placeholderTop, - left: placeholderLeft, - }} - > - <TintableSVG - src={'img/icons-show-stickers.svg'} - width={placeholderSize} - height={placeholderSize} /> - </div> } - <img - className={'mx_MStickerBody_image ' + this.state.imageClasses} - src={contentUrl} - style={imageStyle} - ref='image' - alt={content.body} - onLoad={this._onImageLoad} - onMouseEnter={this._onMouseEnter} - onMouseLeave={this._onMouseLeave} - /> - { tooltip } - </div> - </span> - ); - } - // Empty to prevent default behaviour of MImageBody onClick() { } + + // MStickerBody doesn't need a wrapping `<a href=...>`, but it does need extra padding + // which is added by mx_MStickerBody_wrapper + wrapImage(contentUrl, children) { + return <div className="mx_MStickerBody_wrapper"> { children } </div>; + } + + // Placeholder to show in place of the sticker image if + // img onLoad hasn't fired yet. + getPlaceholder() { + const TintableSVG = sdk.getComponent('elements.TintableSvg'); + return <TintableSVG src="img/icons-show-stickers.svg" width="75" height="75" />; + } + + // Tooltip to show on mouse over + getTooltip() { + const content = this.props.mxEvent && this.props.mxEvent.getContent(); + + if (!content || !content.body || !content.info || !content.info.w) return null; + + const RoomTooltip = sdk.getComponent('rooms.RoomTooltip'); + return <div style={{left: content.info.w + 'px'}} className="mx_MStickerBody_tooltip"> + <RoomTooltip label={content.body} /> + </div>; + } + + // Don't show "Download this_file.png ..." + getFileBody() { + return null; + } } From ae10491f95c7411a3a74c5271df5c1a066a71f8e Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 22 May 2018 09:28:41 +0100 Subject: [PATCH 025/480] Space between sentences in 'leave room' warning --- src/components/structures/MatrixChat.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 051b9ed10b..91d5ee8970 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -957,6 +957,7 @@ export default React.createClass({ if (rule !== "public") { warnings.push(( <span className="warning" key="non_public_warning"> + {' '/* Whitespace, otherwise the sentences get smashed together */ } { _t("This room is not public. You will not be able to rejoin without an invite.") } </span> )); From a0bc681052c38f9d3529bc29d8874926dbe14621 Mon Sep 17 00:00:00 2001 From: random <dictionary@tutamail.com> Date: Fri, 18 May 2018 10:16:41 +0000 Subject: [PATCH 026/480] Translated using Weblate (Italian) Currently translated at 99.4% (1169 of 1175 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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 82382a3967..b8b8cd7394 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1167,5 +1167,13 @@ "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Gli errori di Riot sono monitorati su GitHub: <a>segnala un problema su GitHub</a>.", "Log out and remove encryption keys?": "Disconnettere e rimuovere le chiavi di cifratura?", "Refresh": "Aggiorna", - "We encountered an error trying to restore your previous session.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente." + "We encountered an error trying to restore your previous session.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente.", + "Send analytics data": "Invia dati statistici", + "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie. (Vedi la nostra <PolicyLink>politica sui cookie e sulla privacy</PolicyLink>).", + "Help improve Riot by sending usage data? This will use a cookie.": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie.", + "Yes please": "Sì grazie", + "Clear Storage and Sign Out": "Elimina lo storage e disconnetti", + "Send Logs": "Invia i log", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Eliminare lo storage del browser potrebbe risolvere il problema, ma verrai disconnesso e la cronologia delle chat criptate sarà illeggibile.", + "Collapse Reply Thread": "Riduci finestra di risposta" } From 38f446a364f1be9def92e0ee6a1dd81ebf665c52 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Fri, 18 May 2018 12:27:59 +0000 Subject: [PATCH 027/480] Translated using Weblate (Russian) Currently translated at 99.8% (1173 of 1175 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, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 24e9750698..87fb79108e 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1175,5 +1175,9 @@ "Unable to reply": "Не удается ответить", "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": "Включить скриншоты виджета в поддерживаемых виджетах", - "Collapse Reply Thread": "Ответить с цитированием" + "Collapse Reply Thread": "Ответить с цитированием", + "Send analytics data": "Отправить данные аналитики", + "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie. (См. наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", + "Help improve Riot by sending usage data? This will use a cookie.": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie.", + "Yes please": "Да, пожалуйста" } From e4f8c09c32d9a03567de9a1e9a1954928915e29b Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 22 May 2018 10:43:16 +0100 Subject: [PATCH 028/480] Only include placeholder in DOM when necessary --- src/components/views/messages/MImageBody.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index f27124238e..e2316b2fcc 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -276,15 +276,16 @@ export default class extends React.Component { { /* Calculate aspect ratio, using %padding will size _container correctly */ } <div style={{ paddingBottom: (100 * content.info.h / content.info.w) + '%' }}></div> - <div className="mx_MImageBody_thumbnail" style={{ - "display": showPlaceholder ? undefined : 'none', - // Constrain width here so that spinner appears central to the loaded thumbnail - "max-width": content.info.w + "px", - }}> - <div className="mx_MImageBody_thumbnail_spinner"> - { placeholder } + { showPlaceholder && + <div className="mx_MImageBody_thumbnail" style={{ + // Constrain width here so that spinner appears central to the loaded thumbnail + "max-width": content.info.w + "px", + }}> + <div className="mx_MImageBody_thumbnail_spinner"> + { placeholder } + </div> </div> - </div> + } <div style={{display: !showPlaceholder ? undefined : 'none'}}> { img } From fb5dd4a410e25e8ea145d9f6cd7ebae74e67f3d9 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 22 May 2018 10:46:10 +0100 Subject: [PATCH 029/480] Remove spurious fixupHeight --- src/components/views/messages/MImageBody.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index e2316b2fcc..083dc342db 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -211,7 +211,6 @@ export default class extends React.Component { }); }).done(); } - this.fixupHeight(); this._afterComponentDidMount(); } From 31dcd85c08c3f625b4950a353909c80347104114 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 22 May 2018 15:45:58 +0100 Subject: [PATCH 030/480] Add customisable cancel button to QuestionDialog --- src/components/views/dialogs/QuestionDialog.js | 1 + src/components/views/elements/DialogButtons.js | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/QuestionDialog.js b/src/components/views/dialogs/QuestionDialog.js index 7e11677310..21d3a54bc2 100644 --- a/src/components/views/dialogs/QuestionDialog.js +++ b/src/components/views/dialogs/QuestionDialog.js @@ -67,6 +67,7 @@ export default React.createClass({ { this.props.description } </div> <DialogButtons primaryButton={this.props.button || _t('OK')} + cancelButton={this.props.cancelButton} onPrimaryButtonClick={this.onOk} primaryButtonClass={primaryButtonClass} focus={this.props.focus} diff --git a/src/components/views/elements/DialogButtons.js b/src/components/views/elements/DialogButtons.js index 267127568d..baf831415f 100644 --- a/src/components/views/elements/DialogButtons.js +++ b/src/components/views/elements/DialogButtons.js @@ -29,6 +29,9 @@ module.exports = React.createClass({ // The primary button which is styled differently and has default focus. primaryButton: PropTypes.node.isRequired, + // A node to insert into the cancel button instead of default "Cancel" + cancelButton: PropTypes.node, + // onClick handler for the primary button. onPrimaryButtonClick: PropTypes.func.isRequired, @@ -60,9 +63,9 @@ module.exports = React.createClass({ primaryButtonClassName += " " + this.props.primaryButtonClass; } let cancelButton; - if (this.props.hasCancel) { + if (this.props.cancelButton || this.props.hasCancel) { cancelButton = <button onClick={this._onCancelClick} disabled={this.props.disabled}> - { _t("Cancel") } + { this.props.cancelButton || _t("Cancel") } </button>; } return ( From e602213806980f775e941a1b458fceb7212e962b Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 22 May 2018 15:47:05 +0100 Subject: [PATCH 031/480] Add concept of priority modal to modal manager --- src/Modal.js | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/Modal.js b/src/Modal.js index 2565d5c73b..06a96824a7 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -81,7 +81,11 @@ class ModalManager { constructor() { this._counter = 0; - /** list of the modals we have stacked up, with the most recent at [0] */ + // The modal to prioritise over all others. If this is set, only show + // this modal. Remove all other modals from the stack when this modal + // is closed. + this._priorityModal = null; + // A list of the modals we have stacked up, with the most recent at [0] this._modals = [ /* { elem: React component for this dialog @@ -105,18 +109,18 @@ class ModalManager { return container; } - createTrackedDialog(analyticsAction, analyticsInfo, Element, props, className) { + createTrackedDialog(analyticsAction, analyticsInfo, ...rest) { Analytics.trackEvent('Modal', analyticsAction, analyticsInfo); - return this.createDialog(Element, props, className); + return this.createDialog(...rest); } - createDialog(Element, props, className) { - return this.createDialogAsync((cb) => {cb(Element);}, props, className); + createDialog(Element, ...rest) { + return this.createDialogAsync((cb) => {cb(Element);}, ...rest); } - createTrackedDialogAsync(analyticsAction, analyticsInfo, loader, props, className) { + createTrackedDialogAsync(analyticsAction, analyticsInfo, ...rest) { Analytics.trackEvent('Modal', analyticsAction, analyticsInfo); - return this.createDialogAsync(loader, props, className); + return this.createDialogAsync(...rest); } /** @@ -137,8 +141,13 @@ class ModalManager { * component. (We will also pass an 'onFinished' property.) * * @param {String} className CSS class to apply to the modal wrapper + * + * @param {boolean} isPriorityModal if true, this modal will be displayed regardless + * of other modals that are currently in the stack. + * Also, when closed, all modals will be removed + * from the stack. */ - createDialogAsync(loader, props, className) { + createDialogAsync(loader, props, className, isPriorityModal) { const self = this; const modal = {}; @@ -151,6 +160,14 @@ class ModalManager { if (i >= 0) { self._modals.splice(i, 1); } + + if (self._priorityModal === modal) { + self._priorityModal = null; + + // XXX: This is destructive + self._modals = []; + } + self._reRender(); }; @@ -167,7 +184,12 @@ class ModalManager { modal.onFinished = props ? props.onFinished : null; modal.className = className; - this._modals.unshift(modal); + if (isPriorityModal) { + // XXX: This is destructive + this._priorityModal = modal; + } else { + this._modals.unshift(modal); + } this._reRender(); return {close: closeDialog}; @@ -188,7 +210,7 @@ class ModalManager { } _reRender() { - if (this._modals.length == 0) { + if (this._modals.length == 0 && !this._priorityModal) { // If there is no modal to render, make all of Riot available // to screen reader users again dis.dispatch({ @@ -205,7 +227,7 @@ class ModalManager { action: 'aria_hide_main_app', }); - const modal = this._modals[0]; + const modal = this._priorityModal ? this._priorityModal : this._modals[0]; const dialog = ( <div className={"mx_Dialog_wrapper " + (modal.className ? modal.className : '')}> <div className="mx_Dialog"> From c249bee9b53f4718319f7bcc9128059709e55260 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 22 May 2018 16:09:54 +0100 Subject: [PATCH 032/480] Grammar --- src/components/views/messages/MImageBody.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 083dc342db..c210c64318 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -240,7 +240,7 @@ export default class extends React.Component { _messageContent(contentUrl, thumbUrl, content) { // The maximum height of the thumbnail as it is rendered as an <img> const maxHeight = Math.min(THUMBNAIL_MAX_HEIGHT, content.info.h); - // The maximum width of the thumbnail, as dictated by it's natural + // The maximum width of the thumbnail, as dictated by its natural // maximum height. const maxWidth = content.info.w * maxHeight / content.info.h; From 538979a4ee7b6f9e4d92e57749e35a2bcc5d8689 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 22 May 2018 17:13:45 +0100 Subject: [PATCH 033/480] Fix MVideoBody spinner --- src/components/views/messages/MVideoBody.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/views/messages/MVideoBody.js b/src/components/views/messages/MVideoBody.js index 5365daee03..37fc94d1ed 100644 --- a/src/components/views/messages/MVideoBody.js +++ b/src/components/views/messages/MVideoBody.js @@ -147,12 +147,7 @@ module.exports = React.createClass({ // For now add an img tag with a spinner. return ( <span className="mx_MVideoBody" ref="body"> - <div className="mx_MImageBody_thumbnail" ref="image" style={{ - "display": "flex", - "align-items": "center", - "justify-items": "center", - "width": "100%", - }}> + <div className="mx_MImageBody_thumbnail mx_MImageBody_thumbnail_spinner" ref="image"> <img src="img/spinner.gif" alt={content.body} width="16" height="16" /> </div> </span> From 658e88c30f5521c087f63be5b1e132522e92fdab Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 22 May 2018 15:47:31 +0100 Subject: [PATCH 034/480] Implement consent/terms and conditions dialog for /_matrix/consent flow --- src/components/structures/MatrixChat.js | 22 ++++++++++++++++++++++ src/i18n/strings/en_EN.json | 3 +++ 2 files changed, 25 insertions(+) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 91d5ee8970..96e721f7ca 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1232,6 +1232,28 @@ export default React.createClass({ action: 'logout', }); }); + cli.on('no_consent', function(message, consentUri) { + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + Modal.createTrackedDialog('No Consent Dialog', '', QuestionDialog, { + title: _t('Terms and Conditions'), + description: <div> + <p> { _t( + 'To continue using the %(homeserverDomain)s homeserver ' + + 'you must review and agree to our terms and conditions.', + { homeserverDomain: cli.getDomain() }, + ) } + </p> + </div>, + button: _t('Review terms and conditions'), + cancelButton: _t('Dismiss'), + onFinished: (confirmed) => { + if (confirmed) { + window.open(consentUri, '_blank'); + } + }, + }, null, true); + }); + cli.on("accountData", function(ev) { if (ev.getType() === 'im.vector.web.settings') { if (ev.getContent() && ev.getContent().theme) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 239b45c32e..f3e3d6b097 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -943,6 +943,9 @@ "Failed to leave room": "Failed to leave room", "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", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.", + "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.", "Logout": "Logout", From c9c3cf55dea03f97c00239821b50d899c7acdfb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Tue, 22 May 2018 17:08:52 +0000 Subject: [PATCH 035/480] Translated using Weblate (French) Currently translated at 100.0% (1176 of 1176 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 88c5e0ab07..048dcd9d81 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1174,5 +1174,6 @@ "Send analytics data": "Envoyer les données analytiques", "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", "Help improve Riot by sending usage data? This will use a cookie.": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie.", - "Yes please": "Oui, s'il vous plaît" + "Yes please": "Oui, s'il vous plaît", + "Muted Users": "Utilisateurs ignorés" } From 6df3371c6c562fa006bb2cddbd6b3cdb4cb8e8cc Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Tue, 22 May 2018 19:14:54 +0100 Subject: [PATCH 036/480] Add a "reload widget" button. --- res/img/button-refresh.svg | 12 ++++++++++++ src/components/views/elements/AppTile.js | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 res/img/button-refresh.svg diff --git a/res/img/button-refresh.svg b/res/img/button-refresh.svg new file mode 100644 index 0000000000..b4990a2147 --- /dev/null +++ b/res/img/button-refresh.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="612px" height="612px" viewBox="0 90 612 612" enable-background="new 0 90 612 612" xml:space="preserve"> +<path stroke="#76CFA6" fill="#76CFA6" stroke-width="40" stroke-miterlimit="10" d="M517.593,435.2c-9.204,0-17.093,7.053-17.811,16.257 + c-8.247,99.33-91.8,176.786-193.401,176.786c-106.98,0-194.119-86.54-194.119-192.923c0-104.71,84.389-190.294,189.098-192.924 + c2.75-0.12,4.901,2.032,4.901,4.781v60.124c0,15.061,16.614,24.146,29.404,16.137l114.989-80.444 + c11.953-7.53,11.953-24.862,0-32.393l-114.869-79.369c-12.79-8.009-29.405,1.076-29.405,16.137v54.626 + c0,2.629-2.032,4.781-4.661,4.781C176.929,209.286,76.522,310.649,76.522,435.32c0,126.225,102.917,228.424,229.858,228.424 + c120.487,0,219.221-91.681,229.022-209.299C536.359,444.046,527.992,435.2,517.593,435.2L517.593,435.2z"/> +</svg> diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 0895ede636..4f7a3e298d 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -55,6 +55,7 @@ export default class AppTile extends React.Component { this._grantWidgetPermission = this._grantWidgetPermission.bind(this); this._revokeWidgetPermission = this._revokeWidgetPermission.bind(this); this._onPopoutWidgetClick = this._onPopoutWidgetClick.bind(this); + this._onReloadWidgetClick = this._onReloadWidgetClick.bind(this); } /** @@ -519,6 +520,11 @@ export default class AppTile extends React.Component { { target: '_blank', href: this._getSafeUrl(), rel: 'noopener noreferrer'}).click(); } + _onReloadWidgetClick(e) { + // Reload iframe in this way to avoid cross-origin restrictions + this.refs.appFrame.src = this.refs.appFrame.src; + } + render() { let appTileBody; @@ -606,6 +612,7 @@ export default class AppTile extends React.Component { const showPictureSnapshotButton = this._hasCapability('m.capability.screenshot') && this.props.show; const showPictureSnapshotIcon = 'img/camera_green.svg'; const popoutWidgetIcon = 'img/button-new-window.svg'; + const reloadWidgetIcon = 'img/button-refresh.svg'; const windowStateIcon = (this.props.show ? 'img/minimize.svg' : 'img/maximize.svg'); return ( @@ -624,6 +631,16 @@ export default class AppTile extends React.Component { { this.props.showTitle && this._getTileTitle() } </span> <span className="mx_AppTileMenuBarWidgets"> + { /* Reload widget */ } + { this.props.showReload && <TintableSvgButton + src={reloadWidgetIcon} + className="mx_AppTileMenuBarWidget mx_AppTileMenuBarWidgetPadding" + title={_t('Reload widget')} + onClick={this._onReloadWidgetClick} + width="10" + height="10" + /> } + { /* Popout widget */ } { this.props.showPopout && <TintableSvgButton src={popoutWidgetIcon} @@ -707,6 +724,11 @@ AppTile.propTypes = { showDelete: PropTypes.bool, // Optionally hide the popout widget icon showPopout: PropTypes.bool, + // Optionally show the reload widget icon + // This is not currently intended for use with production widgets. However + // it can be useful when developing persistent widgets in order to avoid + // having to reload all of riot to get new widget content. + showReload: PropTypes.bool, // Widget capabilities to allow by default (without user confirmation) // NOTE -- Use with caution. This is intended to aid better integration / UX // basic widget capabilities, e.g. injecting sticker message events. @@ -726,6 +748,7 @@ AppTile.defaultProps = { showMinimise: true, showDelete: true, showPopout: true, + showReload: false, handleMinimisePointerEvents: false, whitelistCapabilities: [], userWidget: false, From 97f57edba7d2083611a368dd2ec5ce3b827505fd Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Fri, 18 May 2018 09:51:44 +0000 Subject: [PATCH 037/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1176 of 1176 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 44324384af..6341b4468e 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1174,5 +1174,6 @@ "Send analytics data": "Analitikai adatok küldése", "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ. (Nézd meg a <PolicyLink>sütikről és titoktartási irányelvekről</PolicyLink> szóló leírást).", "Help improve Riot by sending usage data? This will use a cookie.": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ.", - "Yes please": "Igen, kérlek" + "Yes please": "Igen, kérlek", + "Muted Users": "Elnémított felhasználók" } From 975332633b1b4bec108f3a3535d8f4546e4bc098 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 23 May 2018 00:26:55 +0100 Subject: [PATCH 038/480] Translation. --- src/i18n/strings/en_EN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 239b45c32e..ea2749b404 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -103,6 +103,7 @@ "You need to be logged in.": "You need to be logged in.", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "Unable to create widget.": "Unable to create widget.", + "Reload widget": "Reload widget", "Missing roomId.": "Missing roomId.", "Failed to send request.": "Failed to send request.", "This room is not recognised.": "This room is not recognised.", From ab5a4f58a259e6d98b81c33130686b1a27926452 Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Tue, 22 May 2018 23:56:17 +0000 Subject: [PATCH 039/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1176 of 1176 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index a2e8d669c9..649caefd35 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1170,5 +1170,10 @@ "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.": "清除您瀏覽器的儲存的東西也許可以修復問題,但會將您登出並造成任何已加密的聊天都無法讀取。", "Collapse Reply Thread": "摺疊回覆討論串", - "Enable widget screenshots on supported widgets": "在支援的小工具上啟用小工具螢幕快照" + "Enable widget screenshots on supported widgets": "在支援的小工具上啟用小工具螢幕快照", + "Send analytics data": "傳送分析資料", + "Muted Users": "已靜音的使用者", + "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。(參見我們的 <PolicyLink>cookie 與隱私政策</PolicyLink>)。", + "Help improve Riot by sending usage data? This will use a cookie.": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。", + "Yes please": "好的,請" } From 424dea1d4aeafa6267d971050a87d880a77f9a53 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Wed, 23 May 2018 08:57:55 +0000 Subject: [PATCH 040/480] Translated using Weblate (Swedish) Currently translated at 77.2% (909 of 1176 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 | 97 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index f583dfd271..6a0bd10025 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -74,7 +74,7 @@ "Continue": "Fortsätt", "Could not connect to the integration server": "Det gick inte att ansluta till integrationsservern", "Create an account": "Skapa ett konto", - "Create Room": "Skapa ett rum", + "Create Room": "Skapa rum", "Cryptography": "Kryptografi", "Current password": "Nuvarande lösenord", "Curve25519 identity key": "Curve25519 -identitetsnyckel", @@ -107,7 +107,7 @@ "Email address (optional)": "Epostadress (valfri)", "Email, name or matrix ID": "Epostadress, namn, eller Matrix-ID", "Emoji": "Emoji", - "Enable encryption": "Sätt på kryptering", + "Enable encryption": "Aktivera kryptering", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Krypterade meddelanden syns inte på klienter som inte ännu stöder kryptering", "Encrypted room": "Krypterat rum", "%(senderName)s ended the call.": "%(senderName)s avslutade samtalet.", @@ -307,7 +307,7 @@ "Room %(roomId)s not visible": "Rummet %(roomId)s är inte synligt", "Room Colour": "Rumsfärg", "Room contains unknown devices": "Det finns okända enheter i rummet", - "Room name (optional)": "Rummets namn (valfri)", + "Room name (optional)": "Rumsnamn (valfri)", "%(roomName)s does not exist.": "%(roomName)s finns inte.", "%(roomName)s is not accessible at this time.": "%(roomName)s är inte tillgängligt för tillfället.", "Rooms": "Rum", @@ -819,5 +819,94 @@ "Unblacklist": "Ta bort svartlistning", "Failed to invite the following users to %(groupId)s:": "Det gick inte att bjuda in följande användare till %(groupId)s:", "Failed to invite users to %(groupId)s": "Det gick inte att bjuda in användare till %(groupId)s", - "This room is not public. You will not be able to rejoin without an invite.": "Detta rum är inte offentligt. Du kommer inte kunna gå med igen utan en inbjudan." + "This room is not public. You will not be able to rejoin without an invite.": "Detta rum är inte offentligt. Du kommer inte kunna gå med igen utan en inbjudan.", + "Ignores a user, hiding their messages from you": "Ignorerar en användare och döljer dess meddelanden för dig", + "Stops ignoring a user, showing their messages going forward": "Slutar ignorera en användare och visar dess meddelanden för framöver", + "Opens the Developer Tools dialog": "Öppna dialogrutan Utvecklarverktyg", + "Notify the whole room": "Meddela hela rummet", + "Room Notification": "Rumsavisering", + "Users": "Användare", + "unknown device": "okänd enhet", + "verified": "verifierad", + "Verification": "Verifiering", + "User ID": "Användar-ID", + "unencrypted": "okrypterad", + "Export room keys": "Exportera rumsnycklar", + "Import room keys": "Importera rumsnycklar", + "File to import": "Fil att importera", + "Which officially provided instance you are using, if any": "Vilken officiellt tillhandahållen instans du använder, om någon", + "(unknown failure: %(reason)s)": "(okänt fel: %(reason)s)", + "(could not connect media)": "(det gick inte ansluta media)", + " (unsupported)": " (stöds ej)", + "Drop file here to upload": "Släpp fil här för att ladda upp", + "Ongoing conference call%(supportedText)s.": "Pågående konferenssamtal%(supportedText)s.", + "%(senderName)s sent an image": "%(senderName)s skickade en bild", + "%(senderName)s sent a video": "%(senderName)s skickade en video", + "%(senderName)s uploaded a file": "%(senderName)s laddade upp en fil", + "Options": "Alternativ", + "Unencrypted message": "Okrypterat meddelande", + "Verified": "Verifierad", + "Unverified": "Overifierad", + "Replying": "Svarar", + "Drop here to favourite": "Släpp här för att favorisera", + "Drop here to tag direct chat": "Släpp här för att göra till direkt-chatt", + "Drop here to restore": "Släpp här för att återställa", + "Drop here to demote": "Släpp här för att göra till låg prioritet", + "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Du är inte i något rum ännu! Tryck <CreateRoomButton> för att skapa ett rum eller <RoomDirectoryButton> för att bläddra i katalogen", + "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Vill du <acceptText>acceptera</acceptText> eller <declineText>avböja</declineText> denna inbjudan?", + "You have been invited to join this room by %(inviterName)s": "Du har blivit inbjuden att gå med i rummet av %(inviterName)s", + "Kick this user?": "Kicka användaren?", + "To send messages, you must be a": "För att skicka meddelanden, måste du vara", + "To invite users into the room, you must be a": "För att bjuda in användare i rummet, måste du vara", + "To configure the room, you must be a": "För att konfigurera rummet, måste du vara", + "To kick users, you must be a": "För att kicka användare, måste du vara", + "To ban users, you must be a": "För att banna användare, måste du vara", + "To remove other users' messages, you must be a": "För att ta bort andra användares meddelanden, måste du vara", + "%(user)s is a %(userRole)s": "%(user)s är %(userRole)s", + "You have been kicked from %(roomName)s by %(userName)s.": "Du har blivit kickad från %(roomName)s av %(userName)s.", + "You have been kicked from this room by %(userName)s.": "Du har blivit kickad från detta rum av %(userName)s.", + "You have been banned from %(roomName)s by %(userName)s.": "Du har blivit bannad från %(roomName)s av %(userName)s.", + "You have been banned from this room by %(userName)s.": "Du har blivit bannad från detta rum av %(userName)s.", + "This room": "Detta rum", + "You are trying to access %(roomName)s.": "Du försöker komma åt %(roomName)s.", + "You are trying to access a room.": "Du försöker komma åt ett rum.", + "This is a preview of this room. Room interactions have been disabled": "Detta är en förhandsvisning av rummet. Rumsinteraktioner har inaktiverats", + "To change the room's avatar, you must be a": "För att ändra rummets avatar, måste du vara", + "To change the room's name, you must be a": "För att ändra rummets namn, måste du vara", + "To change the room's main address, you must be a": "För att ändra rummets huvudadress, måste du vara", + "To change the room's history visibility, you must be a": "För att ändra visning av rummets historik, måste du vara", + "To change the permissions in the room, you must be a": "För att ändra behörigheter i rummet, måste du vara", + "To change the topic, you must be a": "För att ändra ämnet, måste du vara", + "To modify widgets in the room, you must be a": "För att ändra widgets i rummet, måste du vara", + "Banned by %(displayName)s": "Bannad av %(displayName)s", + "The visibility of existing history will be unchanged": "Synlighet av befintlig historik förblir oförändrad", + "You should not yet trust it to secure data": "Du bör ännu inte lita på att den säkrar data", + "(warning: cannot be disabled again!)": "(varning: kan inte inaktiveras igen!)", + "Muted Users": "Dämpade användare", + "This room is not accessible by remote Matrix servers": "Detta rum är inte tillgängligt för externa Matrix-servrar", + "To send events of type <eventType/>, you must be a": "För att skicka händelser av typen <eventType/>, måste du vara", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Det gick inte att ladda händelsen som svarades på, antingen finns den inte eller så har du inte behörighet att se den.", + "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.": "Är du säker på att du vill ta bort den här händelsen? Observera att om du tar bort en rumsnamns- eller ämnesändring kan det ångra ändringen.", + "Send Custom Event": "Skicka anpassad händelse", + "You must specify an event type!": "Du måste ange en händelsetyp!", + "Event sent!": "Händelse skickad!", + "Failed to send custom event.": "Det gick inte att skicka anpassad händelse.", + "Event Type": "Händelsetyp", + "Event Content": "Händelseinnehåll", + "Example": "Exempel", + "example": "exempel", + "Create": "Skapa", + "Advanced options": "Avancerade alternativ", + "Block users on other matrix homeservers from joining this room": "Blockera användare på andra Matrix-hemservrar från att gå med i detta rum", + "This setting cannot be changed later!": "Den här inställningen kan inte ändras senare!", + "Unknown error": "Okänt fel", + "Incorrect password": "Felaktigt lösenord", + "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Detta kommer att göra ditt konto permanent oanvändbart. Du kommer inte att kunna registrera samma användar-ID igen.", + "This action is irreversible.": "Denna åtgärd går inte att ångra.", + "To verify that this device 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 device matches the key below:": "För att verifiera att denna enhet kan litas på, vänligen kontakta ägaren på annat sätt (t ex personligen eller med ett telefonsamtal) och fråga om nyckeln ägaren har i sina användarinställningar för enheten matchar nyckeln nedan:", + "Device name": "Enhetsnamn", + "Device key": "Enhetsnyckel", + "Verify device": "Verifiera enhet", + "I verify that the keys match": "Jag verifierar att nycklarna matchar", + "In future this verification process will be more sophisticated.": "I framtiden kommer denna verifieringsprocess att bli mer sofistikerad." } From ef686a966d5c57d74b55c3a1a13a0e9747d56532 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 23 May 2018 10:46:32 +0100 Subject: [PATCH 041/480] Add cookie warning to widget warning (AppPermission) --- src/components/views/elements/AppPermission.js | 5 +++++ src/i18n/strings/en_EN.json | 1 + 2 files changed, 6 insertions(+) diff --git a/src/components/views/elements/AppPermission.js b/src/components/views/elements/AppPermission.js index ef08c8355b..c45006be3a 100644 --- a/src/components/views/elements/AppPermission.js +++ b/src/components/views/elements/AppPermission.js @@ -52,6 +52,10 @@ export default class AppPermission extends React.Component { e2eWarningText = <span className='mx_AppPermissionWarningTextLabel'>{ _t('NOTE: Apps are not end-to-end encrypted') }</span>; } + const cookieWarning = + <span className='mx_AppPermissionWarningTextLabel'> + { _t('Warning: This widget might use cookies.') } + </span>; return ( <div className='mx_AppPermissionWarning'> <div className='mx_AppPermissionWarningImage'> @@ -60,6 +64,7 @@ export default class AppPermission extends React.Component { <div className='mx_AppPermissionWarningText'> <span className='mx_AppPermissionWarningTextLabel'>{ _t('Do you want to load widget from URL:') }</span> <span className='mx_AppPermissionWarningTextURL'>{ this.state.curlBase }</span> { e2eWarningText } + { cookieWarning } </div> <input className='mx_AppPermissionButton' diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 5c7ec05a2b..7df8ae2161 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -653,6 +653,7 @@ "Warning": "Warning", "Unknown Address": "Unknown Address", "NOTE: Apps are not end-to-end encrypted": "NOTE: Apps are not end-to-end encrypted", + "Warning: This widget might use cookies.": "Warning: This widget might use cookies.", "Do you want to load widget from URL:": "Do you want to load widget from URL:", "Allow": "Allow", "Delete Widget": "Delete Widget", From a6e7a8106c0b5bc94053de2640b2f9ff09808fdb Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Wed, 23 May 2018 09:42:21 +0000 Subject: [PATCH 042/480] Translated using Weblate (Swedish) Currently translated at 78.2% (923 of 1179 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 6a0bd10025..0247b5c080 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -908,5 +908,19 @@ "Device key": "Enhetsnyckel", "Verify device": "Verifiera enhet", "I verify that the keys match": "Jag verifierar att nycklarna matchar", - "In future this verification process will be more sophisticated.": "I framtiden kommer denna verifieringsprocess att bli mer sofistikerad." + "In future this verification process will be more sophisticated.": "I framtiden kommer denna verifieringsprocess att bli mer sofistikerad.", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Om det matchar, tryck på verifieringsknappen nedan. Om inte så är det risk att någon annan försöker avlyssna enheten och då vill du förmodligen trycka på svartlistsknappen istället.", + "State Key": "Lägesnyckel", + "Send Account Data": "Skicka kontodata", + "Explore Account Data": "Utforska kontodata", + "Toolbox": "Verktygslåda", + "Developer Tools": "Utvecklarverktyg", + "Unverify": "Ta bort verifiering", + "Verify...": "Verifiera...", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Du har lagt till en ny enhet '%(displayName)s', som begär krypteringsnycklar.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Din overifierade enhet '%(displayName)s' begär krypteringsnycklar.", + "Start verification": "Starta verifiering", + "Share without verifying": "Dela utan att verifiera", + "Ignore request": "Ignorera begäran", + "Loading device info...": "Laddar enhetsinfo..." } From b9f597b75f1a816deece2e955bd68e0cda62f4be Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Wed, 23 May 2018 10:15:48 +0000 Subject: [PATCH 043/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1180 of 1180 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 6341b4468e..27363baf0f 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1175,5 +1175,9 @@ "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ. (Nézd meg a <PolicyLink>sütikről és titoktartási irányelvekről</PolicyLink> szóló leírást).", "Help improve Riot by sending usage data? This will use a cookie.": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ.", "Yes please": "Igen, kérlek", - "Muted Users": "Elnémított felhasználók" + "Muted Users": "Elnémított felhasználók", + "Warning: This widget might use cookies.": "Figyelmeztetés: Ez a kisalkalmazás sütiket (cookies) használhat.", + "Terms and Conditions": "Általános Szerződési Feltételek", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.", + "Review terms and conditions": "Általános Szerződési Feltételek elolvasása" } From 94f7d1b2246613412af71d0f0da182de6512584b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Wed, 23 May 2018 10:42:04 +0000 Subject: [PATCH 044/480] Translated using Weblate (French) Currently translated at 100.0% (1180 of 1180 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 048dcd9d81..a08e5ee250 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1175,5 +1175,9 @@ "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", "Help improve Riot by sending usage data? This will use a cookie.": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie.", "Yes please": "Oui, s'il vous plaît", - "Muted Users": "Utilisateurs ignorés" + "Muted Users": "Utilisateurs ignorés", + "Warning: This widget might use cookies.": "Avertissement : ce widget utilise peut-être des cookies.", + "Terms and Conditions": "Conditions générales", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Pour continuer à utiliser le serveur d'accueil %(homeserverDomain)s, vous devez lire et accepter nos conditions générales.", + "Review terms and conditions": "Voir les conditions générales" } From ba3dd0c87ad34433bcb5e9bfe59eca0bcb8bd865 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 23 May 2018 13:35:42 +0100 Subject: [PATCH 045/480] Refactor onOk to async function --- .../views/dialogs/DeactivateAccountDialog.js | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index 87228b4733..f41f37e075 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -47,19 +47,17 @@ export default class DeactivateAccountDialog extends React.Component { }); } - _onOk() { + async _onOk() { // This assumes that the HS requires password UI auth // for this endpoint. In reality it could be any UI auth. this.setState({busy: true}); - MatrixClientPeg.get().deactivateAccount({ - type: 'm.login.password', - user: MatrixClientPeg.get().credentials.userId, - password: this._passwordField.value, - }).done(() => { - Analytics.trackEvent('Account', 'Deactivate Account'); - Lifecycle.onLoggedOut(); - this.props.onFinished(false); - }, (err) => { + try { + await MatrixClientPeg.get().deactivateAccount({ + type: 'm.login.password', + user: MatrixClientPeg.get().credentials.userId, + password: this._passwordField.value, + }); + } catch (err) { let errStr = _t('Unknown error'); // https://matrix.org/jira/browse/SYN-744 if (err.httpStatus == 401 || err.httpStatus == 403) { @@ -70,7 +68,11 @@ export default class DeactivateAccountDialog extends React.Component { busy: false, errStr: errStr, }); - }); + return; + } + Analytics.trackEvent('Account', 'Deactivate Account'); + Lifecycle.onLoggedOut(); + this.props.onFinished(false); } _onCancel() { From b1249899680f57448e94ca2df83d834a4c6e5a15 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 23 May 2018 16:33:32 +0100 Subject: [PATCH 046/480] Implement erasure option upon deactivation --- .../views/dialogs/DeactivateAccountDialog.js | 103 ++++++++++++++++-- src/i18n/strings/en_EN.json | 9 +- 2 files changed, 101 insertions(+), 11 deletions(-) diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index f41f37e075..104419f2ef 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -33,10 +33,21 @@ export default class DeactivateAccountDialog extends React.Component { this._onOk = this._onOk.bind(this); this._onCancel = this._onCancel.bind(this); this._onPasswordFieldChange = this._onPasswordFieldChange.bind(this); + this._onEraseFieldChange = this._onEraseFieldChange.bind(this); + + const deactivationPreferences = + MatrixClientPeg.get().getAccountData('im.riot.account_deactivation_preferences'); + + const shouldErase = ( + deactivationPreferences && + deactivationPreferences.getContent() && + deactivationPreferences.getContent().shouldErase + ) || false; this.state = { confirmButtonEnabled: false, busy: false, + shouldErase, errStr: null, }; } @@ -47,16 +58,54 @@ export default class DeactivateAccountDialog extends React.Component { }); } + _onEraseFieldChange(ev) { + this.setState({ + shouldErase: ev.target.checked, + }); + } + async _onOk() { - // This assumes that the HS requires password UI auth - // for this endpoint. In reality it could be any UI auth. this.setState({busy: true}); + + // Before we deactivate the account insert an event into + // the user's account data indicating that they wish to be + // erased from the homeserver. + // + // We do this because the API for erasing after deactivation + // might not be supported by the connected homeserver. Leaving + // an indication in account data is only best-effort, and + // in the worse case, the HS maintainer would have to run a + // script to erase deactivated accounts that have shouldErase + // set to true in im.riot.account_deactivation_preferences. + // + // Note: The preferences are scoped to Riot, hence the + // "im.riot..." event type. + // + // Note: This may have already been set on previous attempts + // where, for example, the user entered the wrong password. + // This is fine because the UI always indicates the preference + // prior to us calling `deactivateAccount`. try { - await MatrixClientPeg.get().deactivateAccount({ + await MatrixClientPeg.get().setAccountData('im.riot.account_deactivation_preferences', { + shouldErase: this.state.shouldErase, + }); + } catch (err) { + this.setState({ + busy: false, + errStr: _t('Failed to indicate account erasure'), + }); + return; + } + + 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', user: MatrixClientPeg.get().credentials.userId, password: this._passwordField.value, - }); + }; + await MatrixClientPeg.get().deactivateAccount(auth, this.state.shouldErase); } catch (err) { let errStr = _t('Unknown error'); // https://matrix.org/jira/browse/SYN-744 @@ -70,6 +119,7 @@ export default class DeactivateAccountDialog extends React.Component { }); return; } + Analytics.trackEvent('Account', 'Deactivate Account'); Lifecycle.onLoggedOut(); this.props.onFinished(false); @@ -107,21 +157,56 @@ export default class DeactivateAccountDialog extends React.Component { onFinished={this.props.onFinished} onEnterPressed={this.onOk} titleClass="danger" - title={_t("Deactivate Account")}> + title={_t("Deactivate Account")} + > <div className="mx_Dialog_content"> - <p>{ _t("This will make your account permanently unusable. You will not be able to re-register the same user ID.") }</p> + <p>{ _t( + "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. " + + "<b>This action is irreversible.</b>", + {}, + { b: (sub) => <b> { sub } </b> }, + ) }</p> - <p>{ _t("This action is irreversible.") }</p> + <p>{ _t( + "Deactivating your account <b>does not by default erase messages you have sent.</b> " + + "If you would like to erase your messages, please tick the box below.", + {}, + { b: (sub) => <b> { sub } </b> }, + ) }</p> - <p>{ _t("To continue, please enter your password.") }</p> + <p>{ _t( + "Message visibility in Matrix is similar to email. " + + "Erasing your messages means that messages have you sent will not be shared with " + + "any new or unregistered users, but registered users who already had access to " + + "these messages will still have access to their copy.", + ) }</p> - <p>{ _t("Password") }:</p> + <p>{ _t("To continue, please enter your password:") }</p> <input type="password" + placeholder={_t("password")} onChange={this._onPasswordFieldChange} ref={(e) => {this._passwordField = e;}} className={passwordBoxClass} /> + + <p> + <label for="mx_DeactivateAccountDialog_erase_account_input">{ _t( + "Please erase all messages I have sent when my account is deactivated. " + + "(Warning: this will cause future users to see an incomplete view of conversations, " + + "which is a bad experience).", + ) } + <input + id="mx_DeactivateAccountDialog_erase_account_input" + type="checkbox" + checked={this.state.shouldErase} + onChange={this._onEraseFieldChange} + /> + </label> + </p> + { error } </div> <div className="mx_Dialog_buttons"> diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 7df8ae2161..a384a7c212 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -781,11 +781,16 @@ "Advanced options": "Advanced options", "Block users on other matrix homeservers from joining this room": "Block users on other matrix homeservers from joining this room", "This setting cannot be changed later!": "This setting cannot be changed later!", + "Failed to indicate account erasure": "Failed to indicate account erasure", "Unknown error": "Unknown error", "Incorrect password": "Incorrect password", "Deactivate Account": "Deactivate Account", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "This will make your account permanently unusable. You will not be able to re-register the same user ID.", - "This action is irreversible.": "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. <b>This action is irreversible.</b>": "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. <b>This action is irreversible.</b>", + "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.", + "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.", + "To continue, please enter your password:": "To continue, please enter your password:", + "password": "password", + "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).", "To verify that this device 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 device matches the key below:": "To verify that this device 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 device matches the key below:", "Device name": "Device name", "Device key": "Device key", From 9f9cde12cead6ca442a480a694417655c389e8ec Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 23 May 2018 17:18:33 +0100 Subject: [PATCH 047/480] Make devTools styling more consistent and easier to edit event data. --- res/css/views/dialogs/_DevtoolsDialog.scss | 18 ++++++++++++++++-- src/components/views/dialogs/DevtoolsDialog.js | 10 +++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/res/css/views/dialogs/_DevtoolsDialog.scss b/res/css/views/dialogs/_DevtoolsDialog.scss index 8918373ecf..a8e25bb08b 100644 --- a/res/css/views/dialogs/_DevtoolsDialog.scss +++ b/res/css/views/dialogs/_DevtoolsDialog.scss @@ -14,8 +14,18 @@ See the License for the specific language governing permissions and limitations under the License. */ +.mx_DevTools_content { + margin: 10px 0; +} + .mx_DevTools_RoomStateExplorer_button, .mx_DevTools_RoomStateExplorer_query { margin-bottom: 10px; + max-width: 684px; + width: 100%; +} + +.mx_DevTools_LabalCell { + font-weight: bold; } .mx_DevTools_label_left { @@ -38,7 +48,6 @@ limitations under the License. .mx_DevTools_inputLabelCell { - padding-bottom: 21px; display: table-cell; font-weight: bold; padding-right: 24px; @@ -46,7 +55,6 @@ limitations under the License. .mx_DevTools_inputCell { display: table-cell; - padding-bottom: 21px; width: 240px; } @@ -62,6 +70,12 @@ limitations under the License. font-size: 16px; } +.mx_DevTools_textarea { + font-size: 12px; + min-height: 250px; + width: 100%; +} + .mx_DevTools_tgl { display: none; diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js index 1d3c8ecc09..f2a969ef41 100644 --- a/src/components/views/dialogs/DevtoolsDialog.js +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -132,17 +132,17 @@ class SendCustomEvent extends GenericEditor { } return <div> - <div className="mx_Dialog_content"> + <div className="mx_DevTools_content"> { this.textInput('eventType', _t('Event Type')) } { this.state.isStateEvent && this.textInput('stateKey', _t('State Key')) } <br /> - <div className="mx_UserSettings_profileLabelCell"> + <div className="mx_DevTools_LabalCell"> <label htmlFor="evContent"> { _t('Event Content') } </label> </div> <div> - <textarea id="evContent" onChange={this._onChange} value={this.state.evContent} className="mx_TextInputDialog_input" cols="63" rows="5" /> + <textarea id="evContent" onChange={this._onChange} value={this.state.evContent} className="mx_DevTools_textarea" /> </div> </div> <div className="mx_Dialog_buttons"> @@ -227,7 +227,7 @@ class SendAccountData extends GenericEditor { <label htmlFor="evContent"> { _t('Event Content') } </label> </div> <div> - <textarea id="evContent" onChange={this._onChange} value={this.state.evContent} className="mx_TextInputDialog_input" cols="63" rows="5" /> + <textarea id="evContent" onChange={this._onChange} value={this.state.evContent} className="mx_DevTools_textarea" /> </div> </div> <div className="mx_Dialog_buttons"> @@ -485,7 +485,7 @@ class AccountDataExplorer extends DevtoolsComponent { } return <div className="mx_ViewSource"> - <div className="mx_Dialog_content"> + <div className="mx_DevTools_content"> <SyntaxHighlight className="json"> { JSON.stringify(this.state.event.event, null, 2) } </SyntaxHighlight> From 2a9859c7b64dae3d3d345945757b76178aaf8ae7 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 23 May 2018 17:40:15 +0100 Subject: [PATCH 048/480] Styling for consistency. --- res/css/views/dialogs/_DevtoolsDialog.scss | 2 ++ src/components/views/dialogs/DevtoolsDialog.js | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/res/css/views/dialogs/_DevtoolsDialog.scss b/res/css/views/dialogs/_DevtoolsDialog.scss index a8e25bb08b..4ae71eed5d 100644 --- a/res/css/views/dialogs/_DevtoolsDialog.scss +++ b/res/css/views/dialogs/_DevtoolsDialog.scss @@ -72,7 +72,9 @@ limitations under the License. .mx_DevTools_textarea { font-size: 12px; + max-width: 624px; min-height: 250px; + padding: 10px; width: 100%; } diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js index f2a969ef41..1566302e42 100644 --- a/src/components/views/dialogs/DevtoolsDialog.js +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -138,7 +138,7 @@ class SendCustomEvent extends GenericEditor { <br /> - <div className="mx_DevTools_LabalCell"> + <div className="mx_DevTools_inputLabelCell"> <label htmlFor="evContent"> { _t('Event Content') } </label> </div> <div> @@ -219,11 +219,11 @@ class SendAccountData extends GenericEditor { } return <div> - <div className="mx_Dialog_content"> + <div className="mx_DevTools_content"> { this.textInput('eventType', _t('Event Type')) } <br /> - <div className="mx_UserSettings_profileLabelCell"> + <div className="mx_DevTools_inputLabelCell"> <label htmlFor="evContent"> { _t('Event Content') } </label> </div> <div> From 7db31835b42f3a658518ad0bc9a311a4472f4a8a Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 23 May 2018 18:24:52 +0100 Subject: [PATCH 049/480] Remove unused / misspelt class. --- res/css/views/dialogs/_DevtoolsDialog.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/res/css/views/dialogs/_DevtoolsDialog.scss b/res/css/views/dialogs/_DevtoolsDialog.scss index 4ae71eed5d..084225397f 100644 --- a/res/css/views/dialogs/_DevtoolsDialog.scss +++ b/res/css/views/dialogs/_DevtoolsDialog.scss @@ -24,10 +24,6 @@ limitations under the License. width: 100%; } -.mx_DevTools_LabalCell { - font-weight: bold; -} - .mx_DevTools_label_left { float: left; } From 7da51f2bd4e400fba3259103950af895f7779380 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Wed, 23 May 2018 18:40:48 +0100 Subject: [PATCH 050/480] Remove max-width restriction (no longer makes sense). --- res/css/views/dialogs/_DevtoolsDialog.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/res/css/views/dialogs/_DevtoolsDialog.scss b/res/css/views/dialogs/_DevtoolsDialog.scss index 084225397f..a4a868bd11 100644 --- a/res/css/views/dialogs/_DevtoolsDialog.scss +++ b/res/css/views/dialogs/_DevtoolsDialog.scss @@ -20,7 +20,6 @@ limitations under the License. .mx_DevTools_RoomStateExplorer_button, .mx_DevTools_RoomStateExplorer_query { margin-bottom: 10px; - max-width: 684px; width: 100%; } From 7b00982a3533661959ebed82ca20eec18b5c3aa3 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Wed, 23 May 2018 20:29:15 +0000 Subject: [PATCH 051/480] Translated using Weblate (Swedish) Currently translated at 81.1% (957 of 1180 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 | 50 +++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 0247b5c080..f2a26c2e90 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -40,7 +40,7 @@ "Blacklisted": "Svartlistad", "%(senderName)s banned %(targetName)s.": "%(senderName)s bannade %(targetName)s.", "Banned users": "Bannade användare", - "Bans user with given id": "Bannar användaren med givet ID", + "Bans user with given id": "Bannar användaren med givet id", "Ban": "Banna", "Attachment": "Bilaga", "Call Timeout": "Samtalstimeout", @@ -97,7 +97,7 @@ "Direct chats": "Direkta chattar", "Disinvite": "Häv inbjudan", "Display name": "Namn", - "Displays action": "Visar handling", + "Displays action": "Visar åtgärd", "Don't send typing notifications": "Sänd inte \"skriver\"-status", "Download %(text)s": "Ladda ner %(text)s", "Drop here to tag %(section)s": "Dra hit för att tagga %(section)s", @@ -227,10 +227,10 @@ "Login as guest": "Logga in som gäst", "Logout": "Logga ut", "Low priority": "Lågprioritet", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde framtida rumshistorik synligt åt alla rumsmedlemmar fr.o.m att de bjöds in.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde framtida rumshistorik synligt åt alla rumsmedlemmar fr.o.m. att de gick med som medlem.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde framtida rumshistorik synligt åt alla rumsmedlemmar.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde framtida rumshistorik synligt åt vem som helst.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar från att de bjöds in.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar fr.o.m. att de gick med som medlem.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde framtida rumshistorik synligt för alla.", "Manage Integrations": "Hantera integrationer", "Markdown is disabled": "Markdown är inaktiverat", "Markdown is enabled": "Markdown är aktiverat", @@ -505,7 +505,7 @@ "Direct Chat": "Direkt-chatt", "The server may be unavailable or overloaded": "Servern kan vara överbelastad eller inte tillgänglig", "Reject": "Avvisa", - "Failed to set Direct Message status of room": "Det gick inte att sätta Direkt meddelande-status på rummet", + "Failed to set Direct Message status of room": "Det gick inte att ställa in direktmeddelandestatus för rummet", "Monday": "måndag", "Remove from Directory": "Ta bort från katalogen", "Enable them now": "Sätt på nu", @@ -922,5 +922,39 @@ "Start verification": "Starta verifiering", "Share without verifying": "Dela utan att verifiera", "Ignore request": "Ignorera begäran", - "Loading device info...": "Laddar enhetsinfo..." + "Loading device info...": "Laddar enhetsinfo...", + "Encryption key request": "Begäran av krypteringsnyckel", + "Log out and remove encryption keys?": "Logga ut och ta bort krypteringsnycklar?", + "Clear Storage and Sign Out": "Rensa lagring och logga ut", + "Send Logs": "Skicka loggar", + "Refresh": "Uppdatera", + "Unable to restore session": "Det gick inte att återställa sessionen", + "We encountered an error trying to restore your previous session.": "Ett fel uppstod vid återställning av din tidigare session.", + "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.": "Om du nyligen har använt en senare version av Riot kan din session vara inkompatibel med den här versionen. Stäng det här fönstret och använd senare versionen istället.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Att rensa webbläsarens lagring kan lösa problemet, men då loggas du ut och krypterad chatthistorik blir oläslig.", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "För tillfället svartlistar du overifierade enheter. För att skicka meddelanden till dessa enheter måste du verifiera dem.", + "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Vi rekommenderar att du går igenom verifieringsprocessen för varje enhet för att bekräfta att de tillhör sina rätta ägare, men du kan skicka meddelandet utan att verifiera om du föredrar det.", + "Collapse Reply Thread": "Dölj svarstråd", + "Terms and Conditions": "Villkor", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "För att fortsätta använda hemservern %(homeserverDomain)s måste du granska och godkänna våra villkor.", + "Review terms and conditions": "Granska villkoren", + "Old cryptography data detected": "Gammal krypteringsdata upptäckt", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det finns okända enheter i rummet: om du fortsätter utan att verifiera dem, är det möjligt att någon kan avlyssna ditt samtal.", + "Unable to capture screen": "Det gick inte att ta skärmdump", + "Failed to add the following rooms to %(groupId)s:": "Det gick inte att lägga till följande rum till %(groupId)s:", + "Missing roomId.": "Rums-ID saknas.", + "This room is not recognised.": "Detta rum känns inte igen.", + "Usage": "Användning", + "Sets the room topic": "Ställer in rumsämne", + "Unrecognised room alias:": "Oigenkänt rumsalias:", + "Unknown (user, device) pair:": "Okänt (användare, enhet) par:", + "WARNING: Device already verified, but keys do NOT MATCH!": "VARNING: Enhet redan verifierad, men nycklarna MATCHAR INTE!", + "Verified key": "Verifierad nyckel", + "Unrecognised command:": "Oigenkänt kommando:", + "Unbans user with given id": "Avbannar användare med givet id", + "Verifies a user, device, and pubkey tuple": "Verifierar en användare, enhet och nycklar", + "VoIP conference started.": "VoIP-konferens startad.", + "VoIP conference finished.": "VoIP-konferens avslutad.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern." } From 3f229d5c55b08a8eb6f66186d1b083dcc0eba181 Mon Sep 17 00:00:00 2001 From: stuve20 <stuve20@gmail.com> Date: Wed, 23 May 2018 20:33:08 +0000 Subject: [PATCH 052/480] Translated using Weblate (Swedish) Currently translated at 81.1% (958 of 1180 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index f2a26c2e90..cf7b4941a8 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -956,5 +956,6 @@ "VoIP conference started.": "VoIP-konferens startad.", "VoIP conference finished.": "VoIP-konferens avslutad.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern." + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern.", + "The remote side failed to pick up": "Mottagaren misslyckades med att svara" } From a0e3ec53070c4e256086e85d04def3ed197216de Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Wed, 23 May 2018 20:34:43 +0000 Subject: [PATCH 053/480] Translated using Weblate (Swedish) Currently translated at 81.1% (958 of 1180 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index cf7b4941a8..dbaba6037f 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -957,5 +957,5 @@ "VoIP conference finished.": "VoIP-konferens avslutad.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern.", - "The remote side failed to pick up": "Mottagaren misslyckades med att svara" + "The remote side failed to pick up": "Mottagaren kunde inte svara" } From cc79384839ddf841744fca5ceaf6e11bfd41d6ba Mon Sep 17 00:00:00 2001 From: Matthew Hodgson <matthew@matrix.org> Date: Thu, 24 May 2018 01:57:22 +0100 Subject: [PATCH 054/480] fix https://github.com/vector-im/riot-web/issues/6643 --- src/components/views/rooms/MemberList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/MemberList.js b/src/components/views/rooms/MemberList.js index 3dfcd38cbd..6f6188e0b5 100644 --- a/src/components/views/rooms/MemberList.js +++ b/src/components/views/rooms/MemberList.js @@ -270,7 +270,7 @@ module.exports = React.createClass({ // console.log("comparing " + this.memberString(memberA) + " and " + this.memberString(memberB)); - if (userA.currentlyActive && userB.currentlyActive) { + if ((userA.currentlyActive && userB.currentlyActive) || !this._showPresence) { // console.log(memberA.name + " and " + memberB.name + " are both active"); if (memberA.powerLevel === memberB.powerLevel) { // console.log(memberA + " and " + memberB + " have same power level"); From 16987c3ef2f48031790b978a6859ccb65db82a06 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Thu, 24 May 2018 07:02:42 +0000 Subject: [PATCH 055/480] Translated using Weblate (Basque) Currently translated at 100.0% (1180 of 1180 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 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index b2ffa480c3..c8fe678f87 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1170,5 +1170,14 @@ "At this time it is not possible to reply with an emote.": "Une honetan ezin da irriabartxo batekin erantzun.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Ezin izan da erantzundako gertaera kargatu, edo ez dago edo ez duzu ikusteko baimenik.", "Collapse Reply Thread": "Tolestu erantzun-haria", - "Enable widget screenshots on supported widgets": "Gaitu trepeten pantaila-argazkiak onartzen duten trepetetan" + "Enable widget screenshots on supported widgets": "Gaitu trepeten pantaila-argazkiak onartzen duten trepetetan", + "Send analytics data": "Bidali datu analitikoak", + "Muted Users": "Mutututako erabiltzaileak", + "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du. (Ikusi gure <PolicyLink>Cookie eta pribatutasun politikak</PolicyLink>).", + "Help improve Riot by sending usage data? This will use a cookie.": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du.", + "Yes please": "Bai mesedez", + "Warning: This widget might use cookies.": "Abisua: Trepeta honek cookie-ak erabili litzake.", + "Terms and Conditions": "Termino eta baldintzak", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "%(homeserverDomain)s hasiera-zerbitzaria erabiltzen jarraitzeko gure termino eta baldintzak irakurri eta onartu behar dituzu.", + "Review terms and conditions": "Irakurri termino eta baldintzak" } From 03684f272074a74d04fcfbf77d804a279d5da2b8 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Wed, 23 May 2018 14:56:48 +0000 Subject: [PATCH 056/480] Translated using Weblate (Russian) Currently translated at 99.8% (1178 of 1180 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 304af044bd..b98996355d 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1172,5 +1172,10 @@ "Send analytics data": "Отправить данные аналитики", "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie. (См. наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", "Help improve Riot by sending usage data? This will use a cookie.": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie.", - "Yes please": "Да, пожалуйста" + "Yes please": "Да, пожалуйста", + "Muted Users": "Приглушенные пользователи", + "Warning: This widget might use cookies.": "Внимание: этот виджет может использовать cookie.", + "Terms and Conditions": "Условия и положения", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Для продолжения использования сервера %(homeserverDomain)s вы должны ознакомиться и принять условия и положения.", + "Review terms and conditions": "Просмотр условий и положений" } From 8907469f06eb164c0fb2d08e39be649b6bf47868 Mon Sep 17 00:00:00 2001 From: stuve20 <stuve20@gmail.com> Date: Wed, 23 May 2018 20:37:06 +0000 Subject: [PATCH 057/480] Translated using Weblate (Swedish) Currently translated at 81.2% (959 of 1180 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index dbaba6037f..0f898a3374 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -957,5 +957,6 @@ "VoIP conference finished.": "VoIP-konferens avslutad.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern.", - "The remote side failed to pick up": "Mottagaren kunde inte svara" + "The remote side failed to pick up": "Mottagaren kunde inte svara", + "Room name or alias": "Rumsnamn eller alias" } From a2946b0796e42ac8a0c82440cc1586d7294bf041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Thu, 24 May 2018 10:07:30 +0000 Subject: [PATCH 058/480] Translated using Weblate (French) Currently translated at 100.0% (1185 of 1185 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index a08e5ee250..635a3254cc 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1179,5 +1179,12 @@ "Warning: This widget might use cookies.": "Avertissement : ce widget utilise peut-être des cookies.", "Terms and Conditions": "Conditions générales", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Pour continuer à utiliser le serveur d'accueil %(homeserverDomain)s, vous devez lire et accepter nos conditions générales.", - "Review terms and conditions": "Voir les conditions générales" + "Review terms and conditions": "Voir les conditions générales", + "Failed to indicate account erasure": "Échec de notification de la suppression du compte", + "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. <b>This action is irreversible.</b>": "Cela rendra votre compte inutilisable de façon permanente. Vous ne pourrez plus vous connecter et ne pourrez plus vous enregistrer avec le même identifiant d'utilisateur. <b>Cette action est irréversible.</b>", + "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Désactiver votre compte <b>ne supprime pas les messages que vous avez envoyés par défaut.</b> Si vous souhaitez supprimer vos messages, cochez la case ci-dessous.", + "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Supprimer vos messages signifie que les messages que vous avez envoyés ne seront pas partagés avec de nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à vos messages continueront d'en avoir une copie.", + "To continue, please enter your password:": "Pour continuer, veuillez renseigner votre mot de passe :", + "password": "mot de passe", + "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Veuillez supprimer tous les messages que j'ai envoyé quand mon compte est désactivé. (Attention : les futurs utilisateurs verront alors des conversations incomplètes, ce qui est une mauvaise expérience)." } From 2e67eecf3d0c31bf1f579ec266de44647edac214 Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Thu, 24 May 2018 10:21:06 +0000 Subject: [PATCH 059/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1185 of 1185 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 27363baf0f..792e37a83d 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1179,5 +1179,12 @@ "Warning: This widget might use cookies.": "Figyelmeztetés: Ez a kisalkalmazás sütiket (cookies) használhat.", "Terms and Conditions": "Általános Szerződési Feltételek", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.", - "Review terms and conditions": "Általános Szerződési Feltételek elolvasása" + "Review terms and conditions": "Általános Szerződési Feltételek elolvasása", + "Failed to indicate account erasure": "A fiók törlésének jelzése sikertelen", + "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. <b>This action is irreversible.</b>": "Ezzel a felhasználói fiókod végleg használhatatlanná válik. Nem tudsz bejelentkezni, és senki más sem fog tudni újra regisztrálni ugyanezzel az azonosítóval. <b>Ez a művelet visszafordíthatatlan.</b>", + "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "A felhasználói fiók felfüggesztése <b>alapértelmezetten nem töröli semelyik általad küldött üzenetet.</b> Ha az elküldött üzeneteidet törölni szeretnéd pipáld be a jelölőnégyzetet alul.", + "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Az üzenetek láthatósága a Matrixban olyan mint az e-mail. Az üzeneted törlése azt jelenti, hogy amit elküldtél már nem lesz megosztva új- vagy vendég felhasználóval, de azok a regisztrált felhasználók akik már látták az üzenetet továbbra is hozzáférnek a saját példányukhoz.", + "To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:", + "password": "jelszó", + "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Töröld az összes üzenetet amit küldtem amikor felfüggeszted a felhasználói fiókomat. (Figyelem: ezzel a jövőbeni felhasználók csak részleges beszélgetést láthatnak majd, ami rosszul eshet)." } From dca1217a4573b01718afd2b5e4e9ce5e278257a5 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 24 May 2018 11:50:45 +0100 Subject: [PATCH 060/480] Change wording and appearance of Deactivate Account dialog --- res/css/_components.scss | 1 + .../dialogs/_DeactivateAccountDialog.scss | 23 +++++++ .../views/dialogs/DeactivateAccountDialog.js | 66 +++++++++++-------- src/i18n/strings/en_EN.json | 8 +-- 4 files changed, 65 insertions(+), 33 deletions(-) create mode 100644 res/css/views/dialogs/_DeactivateAccountDialog.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 50e8eb11d1..2734939ae3 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -34,6 +34,7 @@ @import "./views/dialogs/_ConfirmUserActionDialog.scss"; @import "./views/dialogs/_CreateGroupDialog.scss"; @import "./views/dialogs/_CreateRoomDialog.scss"; +@import "./views/dialogs/_DeactivateAccountDialog.scss"; @import "./views/dialogs/_DevtoolsDialog.scss"; @import "./views/dialogs/_EncryptedEventDialog.scss"; @import "./views/dialogs/_GroupAddressPicker.scss"; diff --git a/res/css/views/dialogs/_DeactivateAccountDialog.scss b/res/css/views/dialogs/_DeactivateAccountDialog.scss new file mode 100644 index 0000000000..dc76da5b15 --- /dev/null +++ b/res/css/views/dialogs/_DeactivateAccountDialog.scss @@ -0,0 +1,23 @@ +/* +Copyright 2018 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. +*/ + +.mx_DeactivateAccountDialog .mx_Dialog_content { + margin-bottom: 30px; +} + +.mx_DeactivateAccountDialog .mx_DeactivateAccountDialog_input_section { + margin-top: 60px; +} diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index 104419f2ef..761a1e4209 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -162,50 +162,58 @@ export default class DeactivateAccountDialog extends React.Component { <div className="mx_Dialog_content"> <p>{ _t( "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. " + + "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. " + "<b>This action is irreversible.</b>", {}, { b: (sub) => <b> { sub } </b> }, ) }</p> <p>{ _t( - "Deactivating your account <b>does not by default erase messages you have sent.</b> " + - "If you would like to erase your messages, please tick the box below.", + "Deactivating your account <b>does not by default cause us to forget messages you " + + "have sent.</b> " + + "If you would like us to forget your messages, please tick the box below.", {}, { b: (sub) => <b> { sub } </b> }, ) }</p> <p>{ _t( "Message visibility in Matrix is similar to email. " + - "Erasing your messages means that messages have you sent will not be shared with " + - "any new or unregistered users, but registered users who already had access to " + - "these messages will still have access to their copy.", + "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.", ) }</p> - <p>{ _t("To continue, please enter your password:") }</p> - <input - type="password" - placeholder={_t("password")} - onChange={this._onPasswordFieldChange} - ref={(e) => {this._passwordField = e;}} - className={passwordBoxClass} - /> + <div className="mx_DeactivateAccountDialog_input_section"> + <p> + <label htmlFor="mx_DeactivateAccountDialog_erase_account_input"> + <input + id="mx_DeactivateAccountDialog_erase_account_input" + type="checkbox" + checked={this.state.shouldErase} + onChange={this._onEraseFieldChange} + /> + { _t( + "Please forget all messages I have sent when my account is deactivated " + + "(<b>Warning:</b> this will cause future users to see an incomplete view " + + "of conversations)", + {}, + { b: (sub) => <b>{ sub }</b> }, + ) } + </label> + </p> - <p> - <label for="mx_DeactivateAccountDialog_erase_account_input">{ _t( - "Please erase all messages I have sent when my account is deactivated. " + - "(Warning: this will cause future users to see an incomplete view of conversations, " + - "which is a bad experience).", - ) } - <input - id="mx_DeactivateAccountDialog_erase_account_input" - type="checkbox" - checked={this.state.shouldErase} - onChange={this._onEraseFieldChange} - /> - </label> - </p> + <p>{ _t("To continue, please enter your password:") }</p> + <input + type="password" + placeholder={_t("password")} + onChange={this._onPasswordFieldChange} + ref={(e) => {this._passwordField = e;}} + className={passwordBoxClass} + /> + </div> { error } </div> diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a384a7c212..093073f149 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -785,12 +785,12 @@ "Unknown error": "Unknown error", "Incorrect password": "Incorrect password", "Deactivate Account": "Deactivate Account", - "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. <b>This action is irreversible.</b>": "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. <b>This action is irreversible.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.", + "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. <b>This action is irreversible.</b>": "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. <b>This action is irreversible.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> 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 (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)", "To continue, please enter your password:": "To continue, please enter your password:", "password": "password", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).", "To verify that this device 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 device matches the key below:": "To verify that this device 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 device matches the key below:", "Device name": "Device name", "Device key": "Device key", From 4c38d7a5cd244be1f5b0abe51fddb033eee94af7 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Thu, 24 May 2018 10:40:44 +0000 Subject: [PATCH 061/480] Translated using Weblate (Basque) Currently translated at 100.0% (1185 of 1185 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index c8fe678f87..67aad82e36 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1179,5 +1179,12 @@ "Warning: This widget might use cookies.": "Abisua: Trepeta honek cookie-ak erabili litzake.", "Terms and Conditions": "Termino eta baldintzak", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "%(homeserverDomain)s hasiera-zerbitzaria erabiltzen jarraitzeko gure termino eta baldintzak irakurri eta onartu behar dituzu.", - "Review terms and conditions": "Irakurri termino eta baldintzak" + "Review terms and conditions": "Irakurri termino eta baldintzak", + "Failed to indicate account erasure": "Ezin izan da kontuaren ezabaketa jakinarazi", + "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. <b>This action is irreversible.</b>": "Honek zure kontua betiko erabilgaitz bihurtuko du. Ezin izango duzu saioa hasi, eta beste inork ezin izango du erabiltzaile ID bera erabili. <b>Ez dago ekintza hau desegiterik.</b>", + "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Zure kontua desaktibatzean <b>ez dira lehenetsita zuk bidalitako mezuak ezabatuko.</b> Zuk bidalitako mezuak ezabatu nahi badituzu, markatu beheko kutxa.", + "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Matrix-eko mezuen ikusgaitasuna, e-mail mezuen antzekoa da. Zure mezuak ezabatzeak esan nahi du bidali dituzun mezuak ez direla erabiltzaile berriekin partekatuko, baina aurretik zure mezuak jaso dituzten erabiltzaile erregistratuek bere kopia izango dute.", + "To continue, please enter your password:": "Jarraitzeko, sartu zure pasahitza:", + "password": "pasahitza", + "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Ezabatu bidali ditudan mezu guztiak nire kontua desaktibatzean. (Abisua: Etorkizuneko erabiltzaileek elkarrizketa partzialak ikusiko dituzte, esperientzia kaskarra sortuz)." } From 8dcf43a88dabdb7f316c7e4d9c0750bec63f3edf Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 24 May 2018 12:08:05 +0100 Subject: [PATCH 062/480] gen-i18n --- src/i18n/strings/en_EN.json | 60 ++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 093073f149..8dc5b8e630 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -41,10 +41,6 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -84,7 +80,6 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", - "Unnamed Room": "Unnamed Room", "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", @@ -183,6 +178,11 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", + "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -296,29 +296,6 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -415,11 +392,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -551,6 +528,29 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", From e0a3debb7ad7f26f035c647e0a3ad1f38e69633e Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 24 May 2018 12:08:22 +0100 Subject: [PATCH 063/480] prune-i18n --- src/i18n/strings/bg.json | 3 --- src/i18n/strings/ca.json | 3 --- src/i18n/strings/cs.json | 3 --- src/i18n/strings/de_DE.json | 3 --- src/i18n/strings/el.json | 3 --- src/i18n/strings/en_US.json | 3 --- src/i18n/strings/eo.json | 3 --- src/i18n/strings/es.json | 2 -- src/i18n/strings/eu.json | 3 --- src/i18n/strings/fi.json | 3 --- src/i18n/strings/fr.json | 3 --- src/i18n/strings/gl.json | 3 --- src/i18n/strings/hu.json | 3 --- src/i18n/strings/it.json | 3 --- src/i18n/strings/ja.json | 1 - src/i18n/strings/ko.json | 3 --- src/i18n/strings/lv.json | 3 --- src/i18n/strings/nl.json | 3 --- src/i18n/strings/pl.json | 3 --- src/i18n/strings/pt.json | 3 --- src/i18n/strings/pt_BR.json | 3 --- src/i18n/strings/ru.json | 3 --- src/i18n/strings/sk.json | 3 --- src/i18n/strings/sr.json | 3 --- src/i18n/strings/tr.json | 3 --- src/i18n/strings/zh_Hans.json | 3 --- src/i18n/strings/zh_Hant.json | 3 --- 27 files changed, 78 deletions(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 331581f893..20a0832b38 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -223,7 +223,6 @@ "Automatically replace plain text Emoji": "Автоматично откриване и заместване на емотикони в текста", "Mirror local video feed": "Показвай ми огледално моя видео образ", "Disable Peer-to-Peer for 1:1 calls": "Изключване на Peer-to-Peer в 1:1 разговор", - "Opt out of analytics": "Отказване от събиране на статистически данни", "Never send encrypted messages to unverified devices from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства", "Never send encrypted messages to unverified devices in this room from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства в тази стая", "Enable inline URL previews by default": "Включване по подразбиране на URL прегледи", @@ -695,8 +694,6 @@ "Incorrect password": "Неправилна парола", "Deactivate Account": "Деактивация на профила", "Deactivate my account": "Деактивирай моя профил", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Това ще направи профила Ви перманентно неизползваем. Няма да можете да се регистрирате отново със същия потребителски идентификатор.", - "This action is irreversible.": "Това действие е необратимо.", "Device name": "Име на устройство", "Device key": "Ключ на устройство", "In future this verification process will be more sophisticated.": "В бъдеще този процес на потвърждение ще бъде по-лесен.", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 514c6e66fe..407b9f61d4 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -348,7 +348,6 @@ "Hide Text Formatting Toolbar": "Amaga la barra d'eines de format de text", "Server error": "S'ha produït un error al servidor", "Mirror local video feed": "Mostra el vídeo local com un mirall", - "Opt out of analytics": "No acceptis analítiques", "Server unavailable, overloaded, or something else went wrong.": "El servidor no està disponible, està sobrecarregat o alguna altra cosa no ha funcionat correctament.", "Command error": "S'ha produït un error en l'ordre", "bold": "negreta", @@ -675,8 +674,6 @@ "Unknown error": "S'ha produït un error desconegut", "Incorrect password": "Contrasenya incorrecta", "Deactivate Account": "Desactivar el compte", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Això farà que el vostre compte no es pugui utilitzar mai més. No podreu tornar a registrar la mateixa identificació d'usuari.", - "This action is irreversible.": "Aquesta acció és irreversible.", "To verify that this device 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 device matches the key below:": "Per verificar que es pot confiar en aquest dispositiu, poseu-vos en contacte amb el propietari mitjançant altres mitjans (per exemple, en persona o amb una trucada telefònica) i pregunteu-li si la clau que veuen a la configuració del seu usuari, aquest dispositiu coincideix amb la següent clau:", "Device name": "Nom del dispositiu", "Device key": "Clau del dispositiu", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index a80b9daf64..33c7a3d5f1 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -647,7 +647,6 @@ "Disable big emoji in chat": "Zakázat velké Emoji v konverzaci", "Mirror local video feed": "Zrcadlit lokání video", "Disable Peer-to-Peer for 1:1 calls": "Zakázat Peer-to-Peer pro 1:1 hovory", - "Opt out of analytics": "Odhlásit se z analytiky údajů", "Never send encrypted messages to unverified devices from this device": "Z tohoto zařízení nikdy neodesílat šifrované zprávy na neověřená zařízení", "Enable inline URL previews by default": "Nastavit povolení náhledů URL adres jako výchozí", "Enable URL previews for this room (only affects you)": "Povolit náhledy URL adres pro tuto místnost (ovlivňuje pouze vás)", @@ -789,8 +788,6 @@ "This setting cannot be changed later!": "Toto nastavení nelze v budoucnu změnit!", "Unknown error": "Neznámá chyba", "Incorrect password": "Nesprávné heslo", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Toto způsobí, že váš účet nebude již nikdy použitelný. Zároveň nebude možné se znovu zaregistrovat pod stejným uživatelským ID.", - "This action is irreversible.": "Tuto operaci nebude možné vrátit zpět.", "To verify that this device 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 device matches the key below:": "Pokud si chcete ověřit, zda je zařízení skutečně důvěryhodné, kontaktujte vlastníka jiným způsobem (např. osobně anebo telefonicky) a zeptejte se ho na klíč, který má pro toto zařízení zobrazený v nastavení a zda se shoduje s klíčem zobrazeným níže:", "Device name": "Název zařízení", "Device key": "Klíč zařízení", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index eaa6781e15..c8e01819bd 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -423,7 +423,6 @@ "Confirm Removal": "Entfernen bestätigen", "Unknown error": "Unbekannter Fehler", "Incorrect password": "Ungültiges Passwort", - "This action is irreversible.": "Diese Aktion kann nicht rückgängig gemacht werden.", "To continue, please enter your password.": "Zum fortfahren bitte Passwort eingeben.", "Device name": "Geräte-Name", "Device key": "Geräte-Schlüssel", @@ -465,7 +464,6 @@ "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.": "Dieser Prozess erlaubt es dir, die Schlüssel für die in verschlüsselten Räumen empfangenen Nachrichten in eine lokale Datei zu exportieren. In Zukunft wird es möglich sein, diese Datei in einen anderen Matrix-Client zu importieren, sodass dieser Client diese Nachrichten ebenfalls entschlüsseln kann.", "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.": "Mit der exportierten Datei kann jeder, der diese Datei lesen kann, jede verschlüsselte Nachricht entschlüsseln, die für dich lesbar ist. Du solltest die Datei also unbedingt sicher verwahren. Um den Vorgang sicherer zu gestalten, solltest du unten eine Passphrase eingeben, die dazu verwendet wird, die exportierten Daten zu verschlüsseln. Anschließend wird es nur möglich sein, die Daten zu importieren, wenn dieselbe Passphrase verwendet wird.", "Analytics": "Anonymisierte Analysedaten", - "Opt out of analytics": "Zustimmung zur Übermittlung von anonymisierten Analysedaten verweigern", "Riot collects anonymous analytics to allow us to improve the application.": "Riot sammelt anonymisierte Analysedaten, um die Anwendung kontinuierlich verbessern zu können.", "Add an Integration": "Eine Integration hinzufügen", "Removed or unknown message type": "Gelöschte Nachricht oder unbekannter Nachrichten-Typ", @@ -474,7 +472,6 @@ "Online": "Online", " (unsupported)": " (nicht unterstützt)", "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.": "Dieser Prozess erlaubt es dir, die zuvor von einem anderen Matrix-Client exportierten Verschlüsselungs-Schlüssel zu importieren. Danach kannst du alle Nachrichten entschlüsseln, die auch bereits auf dem anderen Client entschlüsselt werden konnten.", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dies wird dein Benutzerkonto dauerhaft unbenutzbar machen. Du wirst nicht in der Lage sein, dich mit derselben Benutzer-ID erneut zu registrieren.", "To verify that this device 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 device matches the key below:": "Um sicherzustellen, dass diesem Gerät vertraut werden kann, kontaktiere bitte den Eigentümer des Geräts über ein anderes Kommunikationsmittel (z.B. im persönlichen Gespräch oder durch einen Telefonanruf) und vergewissere dich, dass der Schlüssel, den der Eigentümer in den Benutzer-Einstellungen für dieses Gerät sieht, mit dem folgenden Schlüssel identisch ist:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Wenn er identisch ist, bitte den Bestätigen-Button unten verwenden. Falls er nicht identisch sein sollte, hat eine Fremdperson Kontrolle über dieses Gerät und es sollte gesperrt werden.", "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.": "Wenn du zuvor eine aktuellere Version von Riot verwendet hast, ist deine Sitzung eventuell inkompatibel mit dieser Version. Bitte schließe dieses Fenster und kehre zur aktuelleren Version zurück.", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 5fa4a114c5..fabd88c74a 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -513,11 +513,9 @@ "Please select the destination room for this message": "Παρακαλούμε επιλέξτε ένα δωμάτιο προορισμού για αυτό το μήνυμα", "Desktop specific": "Μόνο για επιφάνεια εργασίας", "Analytics": "Αναλυτικά δεδομένα", - "Opt out of analytics": "Αποκλεισμός αναλυτικών δεδομένων", "Riot collects anonymous analytics to allow us to improve the application.": "Το Riot συλλέγει ανώνυμα δεδομένα επιτρέποντας μας να βελτιώσουμε την εφαρμογή.", "Failed to invite": "Δεν ήταν δυνατή η πρόσκληση", "Failed to invite user": "Δεν ήταν δυνατή η πρόσκληση του χρήστη", - "This action is irreversible.": "Αυτή η ενέργεια είναι μη αναστρέψιμη.", "In future this verification process will be more sophisticated.": "Στο μέλλον η διαδικασία επαλήθευσης θα είναι πιο εξελιγμένη.", "I verify that the keys match": "Επιβεβαιώνω πως ταιριάζουν τα κλειδιά", "\"%(RoomName)s\" contains devices that you haven't seen before.": "Το \"%(RoomName)s\" περιέχει συσκευές που δεν έχετε ξαναδεί.", @@ -614,7 +612,6 @@ "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Το αρχείο εξαγωγής θα επιτρέψει σε οποιονδήποτε που μπορεί να το διαβάσει να αποκρυπτογραφήσει κρυπτογραφημένα μηνύματα που εσείς μπορείτε να δείτε, οπότε θα πρέπει να είστε προσεκτικοί για να το κρατήσετε ασφαλές. Για να βοηθήσετε με αυτό, θα πρέπει να εισαγάγετε ένα συνθηματικό, το οποία θα χρησιμοποιηθεί για την κρυπτογράφηση των εξαγόμενων δεδομένων. Η εισαγωγή δεδομένων θα είναι δυνατή χρησιμοποιώντας μόνο το ίδιο συνθηματικό.", "This process allows you to 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.": "Αυτή η διαδικασία σας επιτρέπει να εισαγάγετε κλειδιά κρυπτογράφησης που έχετε προηγουμένως εξάγει από άλλο πρόγραμμα του Matrix. Στη συνέχεια, θα μπορέσετε να αποκρυπτογραφήσετε τυχόν μηνύματα που το άλλο πρόγραμμα θα μπορούσε να αποκρυπτογραφήσει.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Το αρχείο εξαγωγής θα είναι προστατευμένο με συνθηματικό. Θα χρειαστεί να πληκτρολογήσετε το συνθηματικό εδώ για να αποκρυπτογραφήσετε το αρχείο.", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Με αυτόν τον τρόπο, ο λογαριασμός σας θα είναι μόνιμα αχρησιμοποίητος. Δεν θα μπορείτε να εγγραφείτε ξανά με το ίδιο αναγνωριστικό χρήστη.", "To verify that this device 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 device matches the key below:": "Για να βεβαιωθείτε ότι είναι αξιόπιστη αυτή η συσκευή, επικοινωνήστε με τον κάτοχο της χρησιμοποιώντας άλλα μέσα (π.χ. προσωπικά ή μέσω τηλεφώνου) και ρωτήστε εάν το κλειδί που βλέπετε στις ρυθμίσεις χρήστη για αυτήν τη συσκευή ταιριάζει με το παρακάτω κλειδί:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Εάν ταιριάζει, πατήστε το κουμπί επιβεβαίωσης παρακάτω. Εάν όχι, τότε κάποιος άλλος παρακολουθεί αυτή τη συσκευή και ίσως θέλετε να πατήσετε το κουμπί της μαύρης λίστας.", "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.": "Αν χρησιμοποιούσατε προηγουμένως μια πιο πρόσφατη έκδοση του Riot, η συνεδρία σας ίσως είναι μη συμβατή με αυτήν την έκδοση. Κλείστε αυτό το παράθυρο και επιστρέψτε στην πιο πρόσφατη έκδοση.", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index e316f72e80..43e2041020 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -474,7 +474,6 @@ "Start automatically after system login": "Start automatically after system login", "Desktop specific": "Desktop specific", "Analytics": "Analytics", - "Opt out of analytics": "Opt out of analytics", "Banned by %(displayName)s": "Banned by %(displayName)s", "Options": "Options", "Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.", @@ -499,8 +498,6 @@ "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.": "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.", "Unknown error": "Unknown error", "Incorrect password": "Incorrect password", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "This will make your account permanently unusable. You will not be able to re-register the same user ID.", - "This action is irreversible.": "This action is irreversible.", "To continue, please enter your password.": "To continue, please enter your password.", "To verify that this device 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 device matches the key below:": "To verify that this device 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 device matches the key below:", "Device name": "Device name", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index fae7d6cfa8..68645ffd9c 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -192,7 +192,6 @@ "Automatically replace plain text Emoji": "Aŭtomate anstataŭigi tekstajn mienetojn", "Mirror local video feed": "Speguli lokan videon", "Disable Peer-to-Peer for 1:1 calls": "Malŝalti samtavolajn duopajn vokojn", - "Opt out of analytics": "Malpermesi datuman analizon", "Never send encrypted messages to unverified devices from this device": "Neniam sendi neĉifritajn mesaĝojn al nekontrolitaj aparatoj de tiu ĉi aparato", "Never send encrypted messages to unverified devices in this room from this device": "Neniam sendi ĉifritajn mesaĝojn al nekontrolitaj aparatoj en tiu ĉi ĉambro de tiu ĉi aparto", "Enable inline URL previews by default": "Ŝalti entekstan antaŭrigardon al retadresoj", @@ -653,8 +652,6 @@ "Unknown error": "Nekonata eraro", "Incorrect password": "Malĝusta pasvorto", "Deactivate Account": "Malaktivigi konton", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Tio ĉi por ĉiam senuzebligos vian konton. Vi ne povos reregistriĝi kun la sama identigaĵo.", - "This action is irreversible.": "Tiu ĉi ago ne malfareblas.", "To verify that this device 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 device matches the key below:": "Por kontroli ke tiu ĉi aparato estas fidinda, bonvolu kontakti ties posedanton per alia maniero (ekz-e persone aŭ telefone) kaj demandi ĝin ĉu la ŝlosilo, kiun ĝi vidas en agordoj de uzanto ĉe si, kongruas kun la ĉi-suba ŝlosilo:", "Device name": "Aparata nomo", "Device key": "Aparata ŝlosilo", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 7ec0e821db..8e7925ba36 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -225,7 +225,6 @@ "Start chat": "Comenzar chat", "New Password": "Nueva contraseña", "Analytics": "Analíticas", - "Opt out of analytics": "No participar en las analíticas", "Options": "Opciones", "Passphrases must match": "Las contraseñas deben coincidir", "Passphrase must not be empty": "La contraseña no puede estar en blanco", @@ -241,7 +240,6 @@ "Failed to invite the following users to the %(roomName)s room:": "No se pudo invitar a los siguientes usuarios a la sala %(roomName)s:", "Unknown error": "Error desconocido", "Incorrect password": "Contraseña incorrecta", - "This action is irreversible.": "Esta acción es irreversible.", "To continue, please enter your password.": "Para continuar, introduzca su contraseña.", "Device name": "Nombre del dispositivo", "Device Name": "Nombre del dispositivo", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 4015d703ce..0c143bb597 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -548,7 +548,6 @@ "Start automatically after system login": "Hasi automatikoki sisteman saioa hasi eta gero", "Desktop specific": "Mahaigainean besterik ez", "Analytics": "Estatistikak", - "Opt out of analytics": "Ez bidali estatistikak", "Options": "Aukerak", "Riot collects anonymous analytics to allow us to improve the application.": "Riotek estatistika anonimoak jasotzen ditu aplikazioa hobetzeko.", "Passphrases must match": "Pasaesaldiak bat etorri behar dira", @@ -567,8 +566,6 @@ "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.": "Ziur gertaera hau kendu (ezabatu) nahi duzula? Jakin gelaren izenaren edo mintzagaiaren aldaketa ezabatzen baduzu, aldaketa desegin daitekeela.", "Unknown error": "Errore ezezaguna", "Incorrect password": "Pasahitz okerra", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Honek zure kontua behin betiko erabilezin bihurtuko du. Ezin izango duzu ID honekin berriro erregistratu.", - "This action is irreversible.": "Ez dago ekintza hau atzera egiterik.", "To continue, please enter your password.": "Jarraitzeko sartu zure pasahitza.", "To verify that this device 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 device matches the key below:": "Gailu hau fidagarria dela egiaztatzeko, kontaktatu bere jabea beste medio bat erabiliz (adib. aurrez aurre edo telefonoz deituz) eta galdetu beraien erabiltzaile-ezarpenetan bere gailurako ikusten duen gakoa hemen beheko bera den:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta blokeatu beharko zenuke.", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 0f05b697a6..e5787ab561 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -414,7 +414,6 @@ "Start automatically after system login": "Käynnistä automaattisesti käyttöjärjestelmään kirjautumisen jälkeen", "Desktop specific": "Työpöytäkäytön asetukset", "Analytics": "Analytiikka", - "Opt out of analytics": "Ota analytiikka pois käytöstä", "Options": "Valinnat", "Riot collects anonymous analytics to allow us to improve the application.": "Riot kerää anonyymisti tilastoja jotta voimme parantaa ohjelmistoa.", "Passphrases must match": "Salasanojen on täsmättävä", @@ -432,7 +431,6 @@ "Confirm Removal": "Varmista poistaminen", "Unknown error": "Tuntematon virhe", "Incorrect password": "Virheellinen salasana", - "This action is irreversible.": "Tätä toimintoa ei voi perua.", "Device name": "Laitenimi", "Device Name": "Laitenimi", "Device key": "Laiteavain", @@ -756,7 +754,6 @@ "Advanced options": "Lisäasetukset", "Block users on other matrix homeservers from joining this room": "Salli vain tämän palvelimen käyttäjät", "This setting cannot be changed later!": "Tätä asetusta ei voi muuttaa myöhemmin!", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Tämä tekee tilistäsi pysyvästi käyttökelvottoman. Et voi rekisteröidä samaa tunnusta uudestaan.", "Add rooms to the community summary": "Lisää huoneita yhteisön yhteenvetoon", "Which rooms would you like to add to this summary?": "Mitkä huoneet haluaisit lisätä tähän yhteenvetoon?", "Add to summary": "Lisää yhteenvetoon", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 758f2d9948..7dbcff2c9a 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -410,7 +410,6 @@ "Please select the destination room for this message": "Merci de sélectionner le salon de destination pour ce message", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s a supprimé le nom du salon.", "Analytics": "Collecte de données", - "Opt out of analytics": "Ne pas envoyer ses données", "Riot collects anonymous analytics to allow us to improve the application.": "Riot collecte des données anonymes qui nous permettent d’améliorer l’application.", "Passphrases must match": "Les phrases de passe doivent être identiques", "Passphrase must not be empty": "La phrase de passe ne peut pas être vide", @@ -433,8 +432,6 @@ "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.": "Voulez-vous vraiment supprimer cet événement ? Notez que si vous supprimez le changement du nom ou du sujet d’un salon, il est possible que ce changement soit annulé.", "Unknown error": "Erreur inconnue", "Incorrect password": "Mot de passe incorrect", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ceci rendra votre compte inutilisable de manière permanente. Vous ne pourrez pas vous réinscrire avec le même identifiant utilisateur.", - "This action is irreversible.": "Cette action est irréversible.", "To continue, please enter your password.": "Pour continuer, veuillez saisir votre mot de passe.", "To verify that this device 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 device matches the key below:": "Pour vérifier que vous pouvez faire confiance à cet appareil, merci de contacter son propriétaire par un autre moyen (par ex. en personne ou par téléphone) et demandez lui si la clé qu’il/elle voit dans ses Paramètres Utilisateur pour cet appareil correspond à la clé ci-dessous :", "Device name": "Nom de l'appareil", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index d08b689a2c..fdab066031 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -236,7 +236,6 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", "Message Replies": "Respostas a mensaxe", "Mirror local video feed": "Copiar fonte de vídeo local", - "Opt out of analytics": "Saírse de analytics", "Cannot add any more widgets": "Non pode engadir máis widgets", "The maximum permitted number of widgets have already been added to this room.": "Xa se engadeu o número máximo de widgets a esta sala.", "Add a widget": "Engadir widget", @@ -653,8 +652,6 @@ "Unknown error": "Fallo descoñecido", "Incorrect password": "Contrasinal incorrecto", "Deactivate Account": "Desactivar conta", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Esto inutilizará a súa conta de xeito permanente. Non poderá voltar a rexistrarse co mesmo ID de usuaria.", - "This action is irreversible.": "Esta acción e irreversible.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Non se pode determinar si o enderezo ao que foi enviado este convite coincide con un dos asociados a súa conta.", "To verify that this device 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 device matches the key below:": "Para verificar que se pode confiar en este dispositivo, contacte co seu dono utilizando algún outro medio (ex. en persoa ou chamada de teléfono) e pregúntelle si a chave que ven nos Axustes de Usuaria do se dispositivo coincide coa chave inferior:", "Device name": "Nome do dispositivo", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 051cd8213b..d63b6055a3 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -532,7 +532,6 @@ "Start automatically after system login": "Rendszerindításkor automatikus elindítás", "Desktop specific": "Asztali használatra jellemző", "Analytics": "Analitika", - "Opt out of analytics": "Ne gyűjtsön analitikai adatokat", "Options": "Opciók", "Riot collects anonymous analytics to allow us to improve the application.": "Riot személytelen analitikai adatokat gyűjt annak érdekében, hogy fejleszteni tudjuk az alkalmazást.", "Passphrases must match": "A jelmondatoknak meg kell egyezniük", @@ -551,8 +550,6 @@ "Confirm Removal": "Törlés megerősítése", "Unknown error": "Ismeretlen hiba", "Incorrect password": "Helytelen jelszó", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "A fiókodat véglegesen használhatatlanná teszi. Ez után ugyanazzal az azonosítóval már nem fogsz tudni vissza regisztrálni.", - "This action is irreversible.": "Ez a művelet visszafordíthatatlan.", "To continue, please enter your password.": "A folytatáshoz, kérlek add meg a jelszavadat.", "Device name": "Eszköz neve", "Device Name": "Eszköz neve", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index b660231915..50121c7059 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -247,7 +247,6 @@ "Automatically replace plain text Emoji": "Sostituisci automaticamente le emoji testuali", "Disable Community Filter Panel": "Disattiva il pannello filtro comunità", "Disable Peer-to-Peer for 1:1 calls": "Disattiva il peer-to-peer per chiamate 1:1", - "Opt out of analytics": "Rifiuta le statistiche", "Never send encrypted messages to unverified devices from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati", "Never send encrypted messages to unverified devices in this room from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati in questa stanza", "Enable inline URL previews by default": "Attiva le anteprime URL in modo predefinito", @@ -695,8 +694,6 @@ "Unknown error": "Errore sconosciuto", "Incorrect password": "Password sbagliata", "Deactivate Account": "Disattiva l'account", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ciò renderà il tuo account definitivamente inutilizzabile. Non potrai registrare di nuovo lo stesso ID utente.", - "This action is irreversible.": "Questa azione è irreversibile.", "To verify that this device 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 device matches the key below:": "Per verificare se questo dispositivo è fidato, contatta il suo proprietario usando altri metodi (es. di persona o telefonando) e chiedigli se la chiave che vede nelle sue impostazioni utente per questo dispositivo coincide con la chiave sotto:", "Device name": "Nome del dispositivo", "Device key": "Chiave del dispositivo", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 3908ede0e2..80bd4f1ff5 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -43,7 +43,6 @@ "Use compact timeline layout": "会話表示の行間を狭くする", "(warning: cannot be disabled again!)": "(警告: 再び元に戻すことは出来ません!)", "Start Chat": "対話へ招待", - "Opt out of analytics": "匿名分析情報を収集しない", "Riot collects anonymous analytics to allow us to improve the application.": "Riotはアプリケーションを改善するために匿名の分析情報を収集しています。", "Start chatting": "対話開始", "Start Chatting": "対話開始", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index f0b8cc454f..4e0a988223 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -535,7 +535,6 @@ "Start automatically after system login": "컴퓨터를 시작할 때 자동으로 실행하기", "Desktop specific": "컴퓨터 설정", "Analytics": "정보 수집", - "Opt out of analytics": "정보 수집 거부", "Options": "선택권", "Riot collects anonymous analytics to allow us to improve the application.": "라이엇은 익명의 정보를 수집해 응용 프로그램을 개선한답니다.", "Passphrases must match": "암호가 일치해야 해요", @@ -552,8 +551,6 @@ "Confirm Removal": "삭제 확인", "Unknown error": "알 수 없는 오류", "Incorrect password": "맞지 않는 비밀번호", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "계정을 영원히 쓸 수 없게 할 거에요. 같은 사용자 ID를 다시 등록하실 수 없을 거고요.", - "This action is irreversible.": "되돌릴 수 없는 일이에요.", "To continue, please enter your password.": "계속하시려면, 비밀번호를 입력해주세요.", "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.": "이 과정으로 암호화한 방에서 받은 메시지의 키를 로컬 파일로 내보낼 수 있어요. 너중에 다른 매트릭스 클라이언트로 파일을 불러올 수 있기 때문에, 그 클라이언트에서 메시지를 해독할 수도 있지요.", "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.": "내보낸 파일은 누구든지 암호화한 메시지를 해독해서 읽을 수 있게 하므로, 보안에 신경 써 주세요. 이를 위해, 내보낸 파일을 암호화하려하니, 아래에 암호를 입력해주세요. 같은 암호를 쓰셔야만 자료를 불러올 수 있어요.", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 17238aa206..01e3ae5c6d 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -548,7 +548,6 @@ "Start automatically after system login": "Startēt pie ierīces ielādes", "Desktop specific": "Darbvirsmai specifiskie", "Analytics": "Analītika", - "Opt out of analytics": "Atteikties no analītikas", "Options": "Opcijas/iestatījumi", "Riot collects anonymous analytics to allow us to improve the application.": "Riot ievāc anonīmus analītikas datus, lai varētu uzlabot aplikācijas darbību.", "Passphrases must match": "Paroles frāzēm ir jāsakrīt", @@ -569,8 +568,6 @@ "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.": "Vai tiešām vēlies dzēst šo notikumu? Ņem vērā, ka istabas nosaukuma vai tēmas nosaukuma maiņa var ietekmēt (atsaukt) izmaiņas.", "Unknown error": "Nezināma kļūda", "Incorrect password": "Nepareiza parole", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Tas uz visiem laikiem padarīs tavu kontu neizmantojamu, un Tu vairs nevarēsi atkārtoti reģistrēt šo pašu lietotāja ID.", - "This action is irreversible.": "Šī darbība ir neatgriezeniska.", "To continue, please enter your password.": "Lai turpinātu, ievadi savu paroli.", "To verify that this device 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 device matches the key below:": "Lai verificētu šīs ierīces uzticamību, lūdzu sazinies ar tās īpašnieku, izmantojot citu saziņas veidu (piemēram, sazinoties personiski vai telefoniski) un pajautā, vai atslēga, kuru īpašnieks redz savos lietotāja iestatījumos, sakrīt ar šo atslēgu:", "Device name": "Ierīces nosaukums", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1ddcda076e..0df2cf1bd7 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -535,7 +535,6 @@ "Start automatically after system login": "Start automatisch na systeem-aanmelding", "Desktop specific": "Desktop-specifiek", "Analytics": "Gegevensanalyse", - "Opt out of analytics": "Uitschrijven voor gegevensanalyse", "Options": "Opties", "Riot collects anonymous analytics to allow us to improve the application.": "Riot verzameld anonieme gegevensanalyse die het mogelijk maakt om de applicatie te verbeteren.", "Passphrases must match": "Wachtzinnen moeten overeenkomen", @@ -558,8 +557,6 @@ "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.": "Weet je zeker dat je deze gebeurtenis wilt verwijderen? Wees er wel van bewust dat als je een ruimtenaam of onderwerp verwijderd je de verandering ongedaan kunt maken.", "Unknown error": "Onbekende fout", "Incorrect password": "Incorrect wachtwoord", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dit zal je account permanent onbruikbaar maken. Je zal ook niet opnieuw kunnen registreren met hetzelfde gebruikers-ID.", - "This action is irreversible.": "Deze actie is onomkeerbaar.", "To continue, please enter your password.": "Om verder te gaan, voer je wachtwoord in.", "To verify that this device 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 device matches the key below:": "Om te verifiëren dat dit apparaat vertrouwd kan worden, contacteer de eigenaar op een andere manier (bijv. persoonlijk of via een telefoontje) en vraag of de sleutel die ze zien in de Gebruikersinstellingen voor dit apparaat overeenkomt met de onderstaande sleutel:", "Device name": "Apparaat naam", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 8d7c5d11da..d3dcb72f49 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -555,7 +555,6 @@ "Offline": "Niedostępny", "Add an Integration": "Dodaj integrację", "Token incorrect": "Niepoprawny token", - "This action is irreversible.": "Ta akcja jest nieodwracalna.", "To link to a room it must have <a>an address</a>.": "Aby móc stworzyć link do pokoju musi on mieć swój <a>adres</a>.", "unencrypted": "niezaszyfrowany", "Unknown (user, device) pair:": "Nieznana para (użytkownik, urządzenie):", @@ -600,7 +599,6 @@ "Failed to invite the following users to the %(roomName)s room:": "Wysłanie zaproszenia do następujących użytkowników do pokoju %(roomName)s nie powiodło się:", "Confirm Removal": "Potwierdź usunięcie", "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.": "Jesteś pewien że chcesz usunąć to wydarzenie? Pamiętaj, że jeśli usuniesz nazwę pokoju lub aktualizację tematu pokoju, zmiana może zostać cofnięta.", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "To sprawi, że Twoje konto będzie permamentnie nieużywalne. Nie będzie można zarejestrować się ponownie z tą samą identyfikacją użytkownika.", "To verify that this device 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 device matches the key below:": "Aby sprawdzić czy to urządzenie jest zaufane, skontaktuj się z jego właścicielem używając innych środków (np. osobiście lub telefonicznie) i zapytaj ich czy klucz, który widzą w ustawieniach użytkownika dla tego urządzenia pasuje do klucza poniżej:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Jeśli klucz pasuje, naciśnij na przycisk \"Zweryfikuj\" poniżej. Jeśli nie, to ktoś inny najprawdopodobniej przejmuje lub podszywa się pod to urządzenie i powinieneś nacisnąć przycisk dodania do czarnej listy.", "In future this verification process will be more sophisticated.": "W przyszłości proces weryfikacji będzie bardziej skomplikowany.", @@ -618,7 +616,6 @@ "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Nastąpiła próba załadowania danego punktu w historii tego pokoju, lecz nie masz uprawnień, by zobaczyć określoną wiadomość.", "Use compact timeline layout": "Użyj kompaktowego stylu linii czasu", "You have <a>enabled</a> URL previews by default.": "Masz domyślnie <a>włączone</a> podglądy linków.", - "Opt out of analytics": "Zrezygnuj z analityk", "Please check your email to continue registration.": "Sprawdź swój e-mail, aby kontynuować rejestrację.", "Please enter the code it contains:": "Wpisz kod, który jest tam zawarty:", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Jeśli nie ustawisz adresu e-mail, nie będzie możliwe zresetowanie Twojego hasła. Kontynuować?", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 229d4f32a1..d165c6c057 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -411,7 +411,6 @@ "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", - "Opt out of analytics": "Sair da ferramenta de análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", "Passphrases must match": "As senhas têm que ser iguais", @@ -433,8 +432,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Você tem certeza que quer apagar este evento? Note que se você apaga o nome de uma sala ou uma mudança de tópico, esta ação não poderá ser desfeita.", "Unknown error": "Erro desconhecido", "Incorrect password": "Senha incorreta", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Isso tornará a sua conta permanentemente inusável. Você não será capaz de registrar novamente o mesmo ID de usuário.", - "This action is irreversible.": "Esta ação é irreversível.", "To continue, please enter your password.": "Para continuar, por favor insira a sua senha.", "To verify that this device 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 device matches the key below:": "Para verificar que este dispositivo é confiável, por favor entre em contato com a(o) sua(seu) dona(o) usando outros meios, como por exemplo pessoalmente ou por uma chamada telefônica, e pergunte a esta pessoa se a chave que ela está vendo nas suas configurações de usuário para este dispositivo é igual a esta:", "Device name": "Nome do dispositivo", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index a3333de2f2..0a4d847805 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -413,7 +413,6 @@ "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", - "Opt out of analytics": "Sair da ferramenta de análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", "Passphrases must match": "As senhas têm que ser iguais", @@ -435,8 +434,6 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Você tem certeza que quer apagar este evento? Note que se você apaga o nome de uma sala ou uma mudança de tópico, esta ação não poderá ser desfeita.", "Unknown error": "Erro desconhecido", "Incorrect password": "Senha incorreta", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Isso tornará a sua conta permanentemente inusável. Você não será capaz de registrar novamente o mesmo ID de usuário.", - "This action is irreversible.": "Esta ação é irreversível.", "To continue, please enter your password.": "Para continuar, por favor insira a sua senha.", "To verify that this device 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 device matches the key below:": "Para verificar que este dispositivo é confiável, por favor entre em contato com a(o) sua(seu) dona(o) usando outros meios, como por exemplo pessoalmente ou por uma chamada telefônica, e pergunte a esta pessoa se a chave que ela está vendo nas suas configurações de usuário para este dispositivo é igual a esta:", "Device name": "Nome do dispositivo", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index ba21f51f10..0514c133be 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -384,7 +384,6 @@ "Start automatically after system login": "Автозапуск при входе в систему", "Analytics": "Аналитика", "Riot collects anonymous analytics to allow us to improve the application.": "Riot собирает анонимные данные, позволяющие нам улучшить приложение.", - "Opt out of analytics": "Не отправлять данные для аналитики", "Logged in as:": "Вы вошли как:", "Default Device": "Устройство по умолчанию", "No Webcams detected": "Веб-камера не обнаружена", @@ -482,8 +481,6 @@ "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.": "Вы действительно хотите удалить это событие? Обратите внимание, что если это смена названия комнаты или темы, то удаление отменит это изменение.", "Unknown error": "Неизвестная ошибка", "Incorrect password": "Неверный пароль", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ваша учетная запись будет заблокирована навсегда. Вы не сможете повторно зарегистрировать тот же идентификатор пользователя.", - "This action is irreversible.": "Это действие необратимо.", "To continue, please enter your password.": "Чтобы продолжить, введите ваш пароль.", "To verify that this device 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 device matches the key below:": "Чтобы удостовериться, что этому устройству можно доверять, пожалуйста, свяжитесь с владельцем другим способом (например, лично или по телефону) и спросите его, совпадает ли ключ, указанный у него в настройках для этого устройства, с ключом ниже:", "Device name": "Имя устройства", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 523cabaa68..c7f38cff35 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -591,8 +591,6 @@ "Unknown error": "Neznáma chyba", "Incorrect password": "Nesprávne heslo", "Deactivate Account": "Deaktivovať účet", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Toto spôsobí, že váš účet nebude viac použiteľný. Tak tiež si nebudete môcť znovu zaregistrovať rovnaké používateľské ID.", - "This action is irreversible.": "Túto akciu nie je možné vrátiť späť.", "To verify that this device 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 device matches the key below:": "Ak chcete overiť, či toto zariadenie je skutočne dôverihodné, kontaktujte jeho vlastníka iným spôsobom (napr. osobne alebo cez telefón) a opýtajte sa ho, či kľúč, ktorý má pre toto zariadenie zobrazený v nastaveniach sa zhoduje s kľúčom zobrazeným nižšie:", "Device name": "Názov zariadenia", "Device key": "Kľúč zariadenia", @@ -740,7 +738,6 @@ "Hide avatars in user and room mentions": "Skryť avatarov pri zmienkach miestností a používateľov", "Disable big emoji in chat": "Zakázať veľké Emoji v konverzácii", "Mirror local video feed": "Zrkadliť lokálne video", - "Opt out of analytics": "Odhlásiť sa zo zberu analytických údajov", "Disable Peer-to-Peer for 1:1 calls": "Zakázať P2P počas priamych volaní", "Never send encrypted messages to unverified devices from this device": "Z tohoto zariadenia nikdy neposielať šifrované správy neovereným zariadeniam", "Light theme": "Svetlá téma", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index dc39bb8cdd..ebacd28a5c 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -190,7 +190,6 @@ "Automatically replace plain text Emoji": "Самостално замени емоџије писане обичним текстом", "Mirror local video feed": "Копирај довод локалног видеа", "Disable Peer-to-Peer for 1:1 calls": "Онемогући парњаке за 1 на 1 позиве", - "Opt out of analytics": "Не учествуј у аналитици", "Never send encrypted messages to unverified devices from this device": "Никада не шаљи шифроване поруке са овог уређаја ка непровереним уређајима", "Never send encrypted messages to unverified devices in this room from this device": "Никада не шаљи шифроване поруке са овог уређаја ка непровереним уређајима у овој соби", "Enable inline URL previews by default": "Подразумевано омогући претпрегледе адреса унутар линије", @@ -662,8 +661,6 @@ "Unknown error": "Непозната грешка", "Incorrect password": "Нетачна лозинка", "Deactivate Account": "Угаси налог", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Ово ће учинити ваш налог трајно неупотребљивим. Нећете моћи да се поново региструјете са истим корисничким ИБ-јем.", - "This action is irreversible.": "Ова радња се не може поништити.", "To verify that this device 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 device matches the key below:": "Да бисте проверили да се овом уређају може веровати, контактирајте власника користећи друге начине (нпр.: лично или преко телефонског позива) и питајте га да ли се кључ који види у корисничким подешавањима подудара са кључем испод:", "Device name": "Назив уређаја", "Device key": "Кључ уређаја", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 451383bc02..797fed79ce 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -531,7 +531,6 @@ "Start automatically after system login": "Sisteme giriş yaptıktan sonra otomatik başlat", "Desktop specific": "Masaüstüne özgü", "Analytics": "Analitik", - "Opt out of analytics": "Analytics'ten çıkmak", "Options": "Seçenekler", "Riot collects anonymous analytics to allow us to improve the application.": "Riot , uygulamayı iyileştirmemize izin vermek için anonim analitik toplar.", "Passphrases must match": "Şifrenin eşleşmesi gerekir", @@ -554,8 +553,6 @@ "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.": "Bu etkinliği kaldırmak(silmek) istediğinizden emin misiniz ? Bir odayı ismini silmeniz veya konu değiştirmeniz , geri alınabilir bir durumdur.", "Unknown error": "Bilinmeyen Hata", "Incorrect password": "Yanlış Şifre", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Bu hesabınızı kalıcı olarak kullanılamaz yapılacak . Aynı kullanıcı ID ile yeniden Kayıt olamazsınız .", - "This action is irreversible.": "Bu eylem geri döndürülemez.", "To continue, please enter your password.": "Devam etmek için , lütfen şifrenizi girin.", "To verify that this device 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 device matches the key below:": "Bu cihazın güvenilir olabileceğini doğrulamak için , lütfen sahibiyle başka yollarla iletişim kurun (örn. şahsen veya telefon görüşmesi) ve bu cihazın Kullanıcı Ayarları'nda gördükleri anahtarın aşağıdaki anahtarla eşleşip eşleşmediğini sorun :", "Device name": "Cihaz ismi", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 45b7ea9e46..8e2dc6e0f8 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -351,7 +351,6 @@ "Failed to invite user": "邀请用户失败", "Unknown error": "未知错误", "Incorrect password": "密码错误", - "This action is irreversible.": "此操作不可逆。", "To continue, please enter your password.": "请输入你的密码继续。", "Device name": "设备名称", "Device Name": "设备名称", @@ -591,7 +590,6 @@ "You must join the room to see its files": "你必须加入聊天室以看到它的文件", "Failed to invite the following users to the %(roomName)s room:": "邀请以下用户到 %(roomName)s 聊天室失败:", "Confirm Removal": "确认移除", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "这将会导致您的账户永远无法使用。你将无法重新注册同样的用户 ID。", "Verifies a user, device, and pubkey tuple": "验证一个用户、设备和密钥元组", "Unknown devices": "未知设备", "Unknown Address": "未知地址", @@ -802,7 +800,6 @@ "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 将他们的昵称修改成了 %(displayName)s 。", "Hide avatars in user and room mentions": "隐藏头像", "Disable Community Filter Panel": "停用社区面板", - "Opt out of analytics": "退出统计分析服务", "Stickerpack": "贴图集", "You don't currently have any stickerpacks enabled": "您目前没有启用任何贴纸包", "Add a stickerpack": "添加贴图集", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index a2e8d669c9..2f571d3883 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -553,7 +553,6 @@ "Start automatically after system login": "在系統登入後自動開始", "Desktop specific": "桌面版特有", "Analytics": "分析", - "Opt out of analytics": "選擇退出分析", "Options": "選項", "Riot collects anonymous analytics to allow us to improve the application.": "Riot 會收集匿名分析以讓我們可以改進此應用程式。", "Passphrases must match": "通關密語必須符合", @@ -576,8 +575,6 @@ "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.": "您確定您想要移除(刪除)此活動嗎?注意若您刪除房間名稱或主題變更,還是可以復原變更。", "Unknown error": "未知的錯誤", "Incorrect password": "不正確的密碼", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "這將會讓您的帳號永遠無法使用。您將無法重新註冊相同的使用者 ID。", - "This action is irreversible.": "此動作是不可逆的。", "To continue, please enter your password.": "要繼續,請輸入您的密碼。", "To verify that this device 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 device matches the key below:": "要驗證此裝置是否可信,請使用其他方式(例如:面對面或是打電話)聯絡它的擁有者並詢問他們在使用者設定中看到此裝置的金鑰是否與下列的金鑰相符:", "Device name": "裝置名稱", From cd91974fe8e3c76feface031f7a043cf0cb9d54a Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Thu, 24 May 2018 11:23:00 +0000 Subject: [PATCH 064/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1185 of 1185 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 156a09f661..3154f1f3b9 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1183,5 +1183,9 @@ "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Az üzenetek láthatósága a Matrixban olyan mint az e-mail. Az üzeneted törlése azt jelenti, hogy amit elküldtél már nem lesz megosztva új- vagy vendég felhasználóval, de azok a regisztrált felhasználók akik már látták az üzenetet továbbra is hozzáférnek a saját példányukhoz.", "To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:", "password": "jelszó", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Töröld az összes üzenetet amit küldtem amikor felfüggeszted a felhasználói fiókomat. (Figyelem: ezzel a jövőbeni felhasználók csak részleges beszélgetést láthatnak majd, ami rosszul eshet)." + "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Töröld az összes üzenetet amit küldtem amikor felfüggeszted a felhasználói fiókomat. (Figyelem: ezzel a jövőbeni felhasználók csak részleges beszélgetést láthatnak majd, ami rosszul eshet).", + "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. <b>This action is irreversible.</b>": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az \"identity\" szerverről. <b>Ez a művelet visszafordíthatatlan.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "A fiókod felfüggesztése <b>nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek.</b> Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.", + "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.": "Az üzenetek láthatósága a Matrixban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)" } From 6f77b8ae26bc939822e75f9bb448d5d257c645e7 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 24 May 2018 12:46:06 +0100 Subject: [PATCH 065/480] Modify showDetailsModal to give examples if analytics is not enabled --- src/Analytics.js | 25 ++++++++++++++++++++++--- src/i18n/strings/en_EN.json | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Analytics.js b/src/Analytics.js index ec8234eb83..8ffce7077f 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -49,34 +49,42 @@ const customVariables = { 'App Platform': { id: 1, expl: _td('The platform you\'re on'), + example: 'Electron Platform', }, 'App Version': { id: 2, expl: _td('The version of Riot.im'), + example: '15.0.0', }, 'User Type': { id: 3, expl: _td('Whether or not you\'re logged in (we don\'t record your user name)'), + example: 'Logged In', }, 'Chosen Language': { id: 4, expl: _td('Your language of choice'), + example: 'en', }, 'Instance': { id: 5, expl: _td('Which officially provided instance you are using, if any'), + example: 'app', }, 'RTE: Uses Richtext Mode': { id: 6, expl: _td('Whether or not you\'re using the Richtext mode of the Rich Text Editor'), + example: 'off', }, 'Homeserver URL': { id: 7, expl: _td('Your homeserver\'s URL'), + example: 'https://matrix.org', }, 'Identity Server URL': { id: 8, expl: _td('Your identity server\'s URL'), + example: 'https://vector.im', }, }; @@ -218,8 +226,19 @@ class Analytics { } showDetailsModal() { - const Tracker = window.Piwik.getAsyncTracker(); - const rows = Object.values(customVariables).map((v) => Tracker.getCustomVariable(v.id)).filter(Boolean); + let rows = []; + if (window.Piwik) { + const Tracker = window.Piwik.getAsyncTracker(); + rows = Object.values(customVariables).map((v) => Tracker.getCustomVariable(v.id)).filter(Boolean); + } else { + // Piwik may not have been enabled, so show example values + rows = Object.keys(customVariables).map( + (k) => [ + k, + _t('e.g. %(exampleValue)s', { exampleValue: customVariables[k].example }), + ], + ); + } const resolution = `${window.screen.width}x${window.screen.height}`; const otherVariables = [ @@ -247,7 +266,7 @@ class Analytics { <table> { rows.map((row) => <tr key={row[0]}> <td>{ _t(customVariables[row[0]].expl) }</td> - <td><code>{ row[1] }</code></td> + { row[1] !== undefined && <td><code>{ row[1] }</code></td> } </tr>) } { otherVariables.map((item, index) => <tr key={index}> diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 8dc5b8e630..8bacc3557e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -10,6 +10,7 @@ "Whether or not you're using the Richtext mode of the Rich Text Editor": "Whether or not you're using the Richtext mode of the Rich Text Editor", "Your homeserver's URL": "Your homeserver's URL", "Your identity server's URL": "Your identity server's URL", + "e.g. %(exampleValue)s": "e.g. %(exampleValue)s", "Every page you use in the app": "Every page you use in the app", "e.g. <CurrentPageURL>": "e.g. <CurrentPageURL>", "Your User Agent": "Your User Agent", From aae89efa017c41a5728d09366cf19ea8712c0ef0 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 24 May 2018 12:47:27 +0100 Subject: [PATCH 066/480] Add usage data link to cookie bar this opens the analytics modal --- src/components/views/globals/CookieBar.js | 14 +++++++++++++- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/views/globals/CookieBar.js b/src/components/views/globals/CookieBar.js index 8fab64be67..ad00884dd2 100644 --- a/src/components/views/globals/CookieBar.js +++ b/src/components/views/globals/CookieBar.js @@ -19,6 +19,7 @@ import PropTypes from 'prop-types'; import dis from '../../../dispatcher'; import { _t } from '../../../languageHandler'; import sdk from '../../../index'; +import Analytics from '../../../Analytics'; export default class CookieBar extends React.Component { static propTypes = { @@ -29,6 +30,10 @@ export default class CookieBar extends React.Component { super(); } + onUsageDataClicked() { + Analytics.showDetailsModal(); + } + onAccept() { dis.dispatch({ action: 'accept_cookies', @@ -49,11 +54,18 @@ export default class CookieBar extends React.Component { <img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="Warning" /> <div className="mx_MatrixToolbar_content"> { this.props.policyUrl ? _t( - "Help improve Riot by sending usage data? " + + "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? " + "This will use a cookie. " + "(See our <PolicyLink>cookie and privacy policies</PolicyLink>).", {}, { + 'UsageDataLink': (sub) => <a + className="mx_MatrixToolbar_link" + href="javascript:;" + onClick={this.onUsageDataClicked} + > + { sub } + </a>, // XXX: We need to link to the page that explains our cookies 'PolicyLink': (sub) => <a className="mx_MatrixToolbar_link" diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 8bacc3557e..41f1780425 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -636,7 +636,7 @@ "Something went wrong when trying to get your communities.": "Something went wrong when trying to get your communities.", "Display your community flair in rooms configured to show it.": "Display your community flair in rooms configured to show it.", "You're not currently a member of any communities.": "You're not currently a member of any communities.", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).", + "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).", "Help improve Riot by sending usage data? This will use a cookie.": "Help improve Riot by sending usage data? This will use a cookie.", "Yes please": "Yes please", "You are not receiving desktop notifications": "You are not receiving desktop notifications", From 44a150aaabced1465b5e26bb3bde05727566419a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Thu, 24 May 2018 12:10:20 +0000 Subject: [PATCH 067/480] Translated using Weblate (French) Currently translated at 99.7% (1182 of 1185 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 7c56712b70..16be476a29 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1183,5 +1183,6 @@ "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Supprimer vos messages signifie que les messages que vous avez envoyés ne seront pas partagés avec de nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à vos messages continueront d'en avoir une copie.", "To continue, please enter your password:": "Pour continuer, veuillez renseigner votre mot de passe :", "password": "mot de passe", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Veuillez supprimer tous les messages que j'ai envoyé quand mon compte est désactivé. (Attention : les futurs utilisateurs verront alors des conversations incomplètes, ce qui est une mauvaise expérience)." + "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Veuillez supprimer tous les messages que j'ai envoyé quand mon compte est désactivé. (Attention : les futurs utilisateurs verront alors des conversations incomplètes, ce qui est une mauvaise expérience).", + "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. <b>This action is irreversible.</b>": "Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous reconnecter et personne ne pourra se réenregistrer avec le même identifiant d'utilisateur. Votre compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d'identité. <b>Cette action est irréversible.</b>" } From e6aa204484a582f7924fc728858499c568bc2dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Thu, 24 May 2018 12:21:51 +0000 Subject: [PATCH 068/480] Translated using Weblate (French) Currently translated at 100.0% (1186 of 1186 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 16be476a29..dc36520506 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1184,5 +1184,10 @@ "To continue, please enter your password:": "Pour continuer, veuillez renseigner votre mot de passe :", "password": "mot de passe", "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Veuillez supprimer tous les messages que j'ai envoyé quand mon compte est désactivé. (Attention : les futurs utilisateurs verront alors des conversations incomplètes, ce qui est une mauvaise expérience).", - "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. <b>This action is irreversible.</b>": "Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous reconnecter et personne ne pourra se réenregistrer avec le même identifiant d'utilisateur. Votre compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d'identité. <b>Cette action est irréversible.</b>" + "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. <b>This action is irreversible.</b>": "Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous reconnecter et personne ne pourra se réenregistrer avec le même identifiant d'utilisateur. Votre compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d'identité. <b>Cette action est irréversible.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "La désactivation du compte <b>ne nous fait pas oublier les messages que vous avez envoyés par défaut.</b> Si vous souhaitez que nous les oubliions, cochez la case ci-dessous.", + "e.g. %(exampleValue)s": "par ex. %(exampleValue)s", + "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant <UsageDataLink>des données d'utilisation</UsageDataLink> ? Cela utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", + "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.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Quand nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront partagés avec aucun nouvel utilisateur ou avec les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à ces messages en conserveront leur propre copie.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Veuillez oublier tous les messages que j'ai envoyé quand mon compte sera désactivé (<b>Avertissement :</b> les futurs utilisateurs verront des conversations incomplètes)" } From f8415548d05b9d8ba9317e8e9844a73adb42ee5d Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Thu, 24 May 2018 13:03:13 +0000 Subject: [PATCH 069/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1186 of 1186 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 3154f1f3b9..f2aaac9a81 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1187,5 +1187,7 @@ "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az \"identity\" szerverről. <b>Ez a művelet visszafordíthatatlan.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "A fiókod felfüggesztése <b>nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek.</b> Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.", "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.": "Az üzenetek láthatósága a Matrixban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.", - "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)" + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)", + "e.g. %(exampleValue)s": "pl. %(exampleValue)s", + "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Segítesz jobbá tenni a Riotot <UsageDataLink>használati adat</UsageDataLink> küldésével? Ez sütit (cookie) fog használni. (Nézd meg az <PolicyLink>Általános Szerződési Feltételeket</PolicyLink>)." } From a13d58f6c254aa8cd057edefdd54b229108b633b Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Thu, 24 May 2018 14:58:59 +0100 Subject: [PATCH 070/480] More thorough check of IM URL validity. --- src/components/views/elements/AppTile.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 0895ede636..e4d003b59b 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -122,23 +122,32 @@ export default class AppTile extends React.Component { /** * Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api - * @param {[type]} url URL to check + * @param {[type]} testUrlString URL to check * @return {Boolean} True if specified URL is a scalar URL */ - isScalarUrl(url) { - if (!url) { + isScalarUrl(testUrlString) { + if (!testUrlString) { console.error('Scalar URL check failed. No URL specified'); return false; } + const testUrl = url.parse(testUrlString); + let scalarUrls = SdkConfig.get().integrations_widgets_urls; if (!scalarUrls || scalarUrls.length == 0) { scalarUrls = [SdkConfig.get().integrations_rest_url]; } for (let i = 0; i < scalarUrls.length; i++) { - if (url.startsWith(scalarUrls[i])) { - return true; + const scalarUrl = url.parse(scalarUrls[i]); + if (testUrl && scalarUrl) { + if ( + testUrl.protocol === scalarUrl.protocol && + testUrl.host === scalarUrl.host && + testUrl.pathname.startsWith(scalarUrl.pathname) + ) { + return true; + } } } return false; From 9753ee8d825001e76e726d2173068ee5d144ac31 Mon Sep 17 00:00:00 2001 From: Richard Lewis <richard@smetco.co.uk> Date: Thu, 24 May 2018 16:14:18 +0100 Subject: [PATCH 071/480] Better check of jitsi widget message origin. --- src/components/views/elements/AppTile.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index e4d003b59b..018b6cb342 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -278,7 +278,12 @@ export default class AppTile extends React.Component { event.origin = event.originalEvent.origin; } - if (!this.state.widgetUrl.startsWith(event.origin)) { + const widgetUrlObj = url.parse(this.state.widgetUrl); + const eventOrigin = url.parse(event.origin); + if ( + eventOrigin.protocol !== widgetUrlObj.protocol || + eventOrigin.host !== widgetUrlObj.host + ) { return; } From 24aeda2e05eed18d836df8d809abb75ff994edcc Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 24 May 2018 16:52:04 +0100 Subject: [PATCH 072/480] Fix bug where usage data link not visible when no cookie policy url --- src/components/views/globals/CookieBar.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/views/globals/CookieBar.js b/src/components/views/globals/CookieBar.js index ad00884dd2..82ac598532 100644 --- a/src/components/views/globals/CookieBar.js +++ b/src/components/views/globals/CookieBar.js @@ -76,7 +76,20 @@ export default class CookieBar extends React.Component { </a> , }, - ) : _t("Help improve Riot by sending usage data? This will use a cookie.") } + ) : _t( + "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? " + + "This will use a cookie.", + {}, + { + 'UsageDataLink': (sub) => <a + className="mx_MatrixToolbar_link" + href="javascript:;" + onClick={this.onUsageDataClicked} + > + { sub } + </a>, + }, + ) } </div> <AccessibleButton element='button' className="mx_MatrixToolbar_action" onClick={this.onAccept}> { _t("Yes please") } From 9d2f223773a3c73a7eec78d200266672033b93e8 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 24 May 2018 16:54:48 +0100 Subject: [PATCH 073/480] Message for leaving server notices room --- src/components/structures/MatrixChat.js | 16 +++++++++++++--- src/i18n/strings/en_EN.json | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 96e721f7ca..a3b243f8bc 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -996,10 +996,20 @@ export default React.createClass({ }, (err) => { modal.close(); console.error("Failed to leave room " + roomId + " " + err); + let title = _t("Failed to leave room"); + let message = _t("Server may be unavailable, overloaded, or you hit a bug."); + if (err.errcode == 'M_CANNOT_LEAVE_SERVER_NOTICE_ROOM') { + title = _t("Can't leave Server Notices room"); + message = _t( + "This room is used for important messages from the Home Server, " + + "so you cannot leave it.", + ); + } else if (err && err.message) { + message = err.message; + } Modal.createTrackedDialog('Failed to leave room', '', ErrorDialog, { - title: _t("Failed to leave room"), - description: (err && err.message ? err.message : - _t("Server may be unavailable, overloaded, or you hit a bug.")), + title: title, + description: message, }); }); } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 41f1780425..f334a94d4e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -949,6 +949,8 @@ "This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.", "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", "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 Home Server, so you cannot leave it.": "This room is used for important messages from the Home Server, so you cannot leave it.", "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", From fd8d50173207696fda5e2f01726ec48f048ed91a Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 24 May 2018 16:58:14 +0100 Subject: [PATCH 074/480] Update cookie bar wording --- src/components/views/globals/CookieBar.js | 10 +++++----- src/i18n/strings/en_EN.json | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/views/globals/CookieBar.js b/src/components/views/globals/CookieBar.js index 82ac598532..a63a163dd1 100644 --- a/src/components/views/globals/CookieBar.js +++ b/src/components/views/globals/CookieBar.js @@ -54,9 +54,9 @@ export default class CookieBar extends React.Component { <img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="Warning" /> <div className="mx_MatrixToolbar_content"> { this.props.policyUrl ? _t( - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? " + - "This will use a cookie. " + - "(See our <PolicyLink>cookie and privacy policies</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. " + + "This will use a cookie " + + "(please see our <PolicyLink>Cookie Policy</PolicyLink>).", {}, { 'UsageDataLink': (sub) => <a @@ -77,7 +77,7 @@ export default class CookieBar extends React.Component { , }, ) : _t( - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? " + + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. " + "This will use a cookie.", {}, { @@ -92,7 +92,7 @@ export default class CookieBar extends React.Component { ) } </div> <AccessibleButton element='button' className="mx_MatrixToolbar_action" onClick={this.onAccept}> - { _t("Yes please") } + { _t("Yes, I want to help!") } </AccessibleButton> <AccessibleButton className="mx_MatrixToolbar_close" onClick={this.onReject}> <img src="img/cancel.svg" width="18" height="18" /> diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 41f1780425..e20b277ef2 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -636,9 +636,9 @@ "Something went wrong when trying to get your communities.": "Something went wrong when trying to get your communities.", "Display your community flair in rooms configured to show it.": "Display your community flair in rooms configured to show it.", "You're not currently a member of any communities.": "You're not currently a member of any communities.", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Help improve Riot by sending usage data? This will use a cookie.", - "Yes please": "Yes please", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.", + "Yes, I want to help!": "Yes, I want to help!", "You are not receiving desktop notifications": "You are not receiving desktop notifications", "Enable them now": "Enable them now", "What's New": "What's New", From 168b956b3c8c9895c3f8b1e09bf29350b57eba7b Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 24 May 2018 17:01:00 +0100 Subject: [PATCH 075/480] homeserver --- src/components/structures/MatrixChat.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index a3b243f8bc..46c1113a1d 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1001,7 +1001,7 @@ export default React.createClass({ if (err.errcode == 'M_CANNOT_LEAVE_SERVER_NOTICE_ROOM') { title = _t("Can't leave Server Notices room"); message = _t( - "This room is used for important messages from the Home Server, " + + "This room is used for important messages from the Homeserver, " + "so you cannot leave it.", ); } else if (err && err.message) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f334a94d4e..07f9f6b8ec 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -950,7 +950,7 @@ "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", "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 Home Server, so you cannot leave it.": "This room is used for important messages from the Home Server, so you cannot leave it.", + "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.", "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", From 24ae804a80b1e5b71e790f6c043f946a8a385256 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Thu, 24 May 2018 13:49:43 +0000 Subject: [PATCH 076/480] Translated using Weblate (Russian) Currently translated at 99.8% (1184 of 1186 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 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index ff362ab5bc..17c232b5a8 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1174,5 +1174,14 @@ "Warning: This widget might use cookies.": "Внимание: этот виджет может использовать cookie.", "Terms and Conditions": "Условия и положения", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Для продолжения использования сервера %(homeserverDomain)s вы должны ознакомиться и принять условия и положения.", - "Review terms and conditions": "Просмотр условий и положений" + "Review terms and conditions": "Просмотр условий и положений", + "e.g. %(exampleValue)s": "напр. %(exampleValue)s", + "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя <UsageDataLink>данные использования</UsageDataLink>? Будут использоваться файлы cookie. (Смотрите наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", + "Failed to indicate account erasure": "Не удается удалить учетную запись", + "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. <b>This action is irreversible.</b>": "Это навсегда сделает вашу учетную запись невозможной для использования. Вы не сможете войти в систему, и никто не сможет перерегистрировать тот же идентификатор пользователя. Это приведет к тому, что ваша учетная запись выйдет из всех комнат, в которые она входит, и будут удалены данные вашей учетной записи с сервера идентификации. <b>Это действие необратимо.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "По умолчанию деактивация вашей учетной записи <b>не приведет к удалению всех ваших сообщений.</b> Если вы хотите, чтобы мы удалили ваши сообщения, поставьте отметку в поле ниже.", + "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.": "Видимость сообщений в Matrix похожа на электронную почту. Удаление ваших сообщений означает, что отправленные вами сообщения не будут видны новым или незарегистрированным пользователям, но зарегистрированные пользователи, у которых уже есть доступ к этим сообщениям, по-прежнему будут иметь доступ к своей копии.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Пожалуйста, удалите все сообщения, которые я отправил, после деактивации учетной записи. (<b>Внимание:</b> будущие пользователи увидят неполный вид разговоров)", + "To continue, please enter your password:": "Чтобы продолжить, введите пароль:", + "password": "пароль" } From 33e5f32390e005db7d45f59a1838784b270b9b77 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Thu, 24 May 2018 16:28:20 +0000 Subject: [PATCH 077/480] Translated using Weblate (Russian) Currently translated at 99.6% (1184 of 1188 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 17c232b5a8..e2529ed1bc 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1183,5 +1183,8 @@ "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.": "Видимость сообщений в Matrix похожа на электронную почту. Удаление ваших сообщений означает, что отправленные вами сообщения не будут видны новым или незарегистрированным пользователям, но зарегистрированные пользователи, у которых уже есть доступ к этим сообщениям, по-прежнему будут иметь доступ к своей копии.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Пожалуйста, удалите все сообщения, которые я отправил, после деактивации учетной записи. (<b>Внимание:</b> будущие пользователи увидят неполный вид разговоров)", "To continue, please enter your password:": "Чтобы продолжить, введите пароль:", - "password": "пароль" + "password": "пароль", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie (ознакомьтесь с нашей<PolicyLink>Политикой cookie</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie.", + "Yes, I want to help!": "Да, я хочу помочь!" } From 3851fa80ff3fc694fdb4d43dd3c4fc8c914c2510 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 24 May 2018 18:19:11 +0100 Subject: [PATCH 078/480] js-sdk RC --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c34979c43..6595fb4216 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "linkifyjs": "^2.1.3", "lodash": "^4.13.1", "lolex": "2.3.2", - "matrix-js-sdk": "0.10.2", + "matrix-js-sdk": "0.10.3-rc.1", "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", From dacb9dea262f4b6e1a4f88699a5943bba6ea67f7 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 24 May 2018 18:22:56 +0100 Subject: [PATCH 079/480] Prepare changelog for v0.12.6-rc.1 --- CHANGELOG.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b161a9d908..b6a893bfc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,42 @@ +Changes in [0.12.6-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.6-rc.1) (2018-05-24) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.5...v0.12.6-rc.1) + + * Add a "reload widget" button. + [\#1920](https://github.com/matrix-org/matrix-react-sdk/pull/1920) + * Make devTools styling more consistent and easier to edit event data. + [\#1923](https://github.com/matrix-org/matrix-react-sdk/pull/1923) + * Update from Weblate. + [\#1930](https://github.com/matrix-org/matrix-react-sdk/pull/1930) + * Cookie bar update + [\#1929](https://github.com/matrix-org/matrix-react-sdk/pull/1929) + * Message for leaving server notices room + [\#1928](https://github.com/matrix-org/matrix-react-sdk/pull/1928) + * More thorough check of IM URL validity. + [\#1927](https://github.com/matrix-org/matrix-react-sdk/pull/1927) + * Add usage data link to cookie bar + [\#1926](https://github.com/matrix-org/matrix-react-sdk/pull/1926) + * Change wording and appearance of Deactivate Account dialog + [\#1925](https://github.com/matrix-org/matrix-react-sdk/pull/1925) + * fix membership list ordering when presence is disabled. + [\#1924](https://github.com/matrix-org/matrix-react-sdk/pull/1924) + * Implement erasure option upon deactivation + [\#1922](https://github.com/matrix-org/matrix-react-sdk/pull/1922) + * Add cookie warning to widget warning (AppPermission) + [\#1921](https://github.com/matrix-org/matrix-react-sdk/pull/1921) + * Terms and Conditions dialog + [\#1919](https://github.com/matrix-org/matrix-react-sdk/pull/1919) + * improve privileged section users in room settings + [\#1902](https://github.com/matrix-org/matrix-react-sdk/pull/1902) + * Space between sentences in 'leave room' warning + [\#1918](https://github.com/matrix-org/matrix-react-sdk/pull/1918) + * Specify valid address types to "Start a chat" dialog + [\#1908](https://github.com/matrix-org/matrix-react-sdk/pull/1908) + * Implement opt-in analytics with cookie bar + [\#1906](https://github.com/matrix-org/matrix-react-sdk/pull/1906) + * Fix vector-im/riot-web#6523 Emoji rendering destroys paragraphs + [\#1910](https://github.com/matrix-org/matrix-react-sdk/pull/1910) + Changes in [0.12.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.5) (2018-05-17) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4...v0.12.5) From 02377b57c0d7fa1acb7c3db7d1fff86c86c8c444 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 24 May 2018 18:22:56 +0100 Subject: [PATCH 080/480] v0.12.6-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6595fb4216..e39b8d0f19 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.5", + "version": "0.12.6-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From eb25b63a35fa0bb2088184ef07d38f66b452dbf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Thu, 24 May 2018 18:11:51 +0000 Subject: [PATCH 081/480] Translated using Weblate (French) Currently translated at 100.0% (1189 of 1189 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index dc36520506..274d13fa45 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1189,5 +1189,11 @@ "e.g. %(exampleValue)s": "par ex. %(exampleValue)s", "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant <UsageDataLink>des données d'utilisation</UsageDataLink> ? Cela utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", "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.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Quand nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront partagés avec aucun nouvel utilisateur ou avec les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à ces messages en conserveront leur propre copie.", - "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Veuillez oublier tous les messages que j'ai envoyé quand mon compte sera désactivé (<b>Avertissement :</b> les futurs utilisateurs verront des conversations incomplètes)" + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Veuillez oublier tous les messages que j'ai envoyé quand mon compte sera désactivé (<b>Avertissement :</b> les futurs utilisateurs verront des conversations incomplètes)", + "Reload widget": "Recharger le widget", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Veuillez aider Riot.im à s'améliorer en envoyant <UsageDataLink>des données d'utilisation anonymes</UsageDataLink>. Cela utilisear un cookie (veuillez voir notre <PolicyLink>politique de cookie</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Veuillez aider Riot.im à s'améliorer en envoyant <UsageDataLink>des données d'utilisation anonymes</UsageDataLink>. Cela utilisera un cookie.", + "Yes, I want to help!": "Oui, je veux aider !", + "Can't leave Server Notices room": "Impossible de quitter le salon des Annonces du serveur", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ce salon est utilisé pour les messages importants du serveur d'accueil, donc vous ne pouvez pas en partir." } From 065e2a980212fef0897ecc7605d882122138762c Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Thu, 24 May 2018 23:49:56 +0000 Subject: [PATCH 082/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1189 of 1189 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 | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 6ceda34507..f545df95d3 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1172,5 +1172,23 @@ "Muted Users": "已靜音的使用者", "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。(參見我們的 <PolicyLink>cookie 與隱私政策</PolicyLink>)。", "Help improve Riot by sending usage data? This will use a cookie.": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。", - "Yes please": "好的,請" + "Yes please": "好的,請", + "e.g. %(exampleValue)s": "範例:%(exampleValue)s", + "Reload widget": "重新載入小工具", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "請透過傳送<UsageDataLink>匿名使用資料</UsageDataLink>來協助改善 Riot.im。這將會使用 cookie(請參見我們的 <PolicyLink>Cookie 政策</PolicyLink>)。", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "請透過傳送<UsageDataLink>匿名使用資料</UsageDataLink>來協助改善 Riot.im。這將會使用 cookie。", + "Yes, I want to help!": "是的,我想要協助!", + "Warning: This widget might use cookies.": "警告:此小工具可能會使用 cookies。", + "Failed to indicate account erasure": "指示帳號刪除失敗", + "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. <b>This action is irreversible.</b>": "這將會讓您的帳號永久無法使用。您將無法登入,且也沒有人可以重新註冊一個相同的使用者 ID。這將會造成您的帳號離開所有已參與的聊天室,並將會從識別伺服器上移除您帳號的所有詳細資訊。<b>此動作是不可逆的。</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "停用您的帳號<b>預設不會讓我們忘記您已經傳送過的訊息。</b>若您想要我們忘記您的訊息,請在下面的方框中打勾。", + "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.": "在 Matrix 中的訊息可見度類似於電子郵件。我們忘記您的訊息代表您傳送過的訊息不會有任何新的或未註冊的使用者看到,但已註冊且已經看過這些訊息的使用者還是看得到他們的副本。", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "請在我的帳號停用時忘記我傳送過的所有訊息(<b>警告:</b>這將會造成未來的使用者無法看見完整的對話紀錄)", + "To continue, please enter your password:": "要繼續,請輸入您的密碼:", + "password": "密碼", + "Can't leave Server Notices room": "無法離開伺服器通知聊天室", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "這個聊天室是用於發佈從家伺服器而來的重要訊息,所以您不能離開它。", + "Terms and Conditions": "條款與細則", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "要繼續使用 %(homeserverDomain)s 家伺服器,您必須審閱並同意我們的條款與細則。", + "Review terms and conditions": "審閱條款與細則" } From f13672df39aa857ab0bb95fd704c52ba42a1486e Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Fri, 25 May 2018 06:49:55 +0000 Subject: [PATCH 083/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1189 of 1189 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index f2aaac9a81..f15c8893b8 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1189,5 +1189,11 @@ "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.": "Az üzenetek láthatósága a Matrixban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)", "e.g. %(exampleValue)s": "pl. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Segítesz jobbá tenni a Riotot <UsageDataLink>használati adat</UsageDataLink> küldésével? Ez sütit (cookie) fog használni. (Nézd meg az <PolicyLink>Általános Szerződési Feltételeket</PolicyLink>)." + "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Segítesz jobbá tenni a Riotot <UsageDataLink>használati adat</UsageDataLink> küldésével? Ez sütit (cookie) fog használni. (Nézd meg az <PolicyLink>Általános Szerződési Feltételeket</PolicyLink>).", + "Reload widget": "Kisalkalmazás újratöltése", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Kérlek segíts javítani a Riot.im-et azzal, hogy <UsageDataLink>anonim felhasználási adatokat</UsageDataLink> küldesz. Ez szütit (cookie) fog használni (lásd a <PolicyLink>sütire vonatkozó szabályozásunkat</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Kérlek segíts javítani a Riot.im-et azzal, hogy <UsageDataLink>anonim felhasználási adatokat</UsageDataLink> küldesz. Ez szütit (cookie) fog használni.", + "Yes, I want to help!": "Igen, segítek!", + "Can't leave Server Notices room": "Nem lehet elhagyni a Szerver Üzenetek szobát", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba fontos szerverüzenetek közlésére jött létre, nem tudsz kilépni belőle." } From 475e2d16d8c6379ef09a59dc26862d7086c13224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Fri, 25 May 2018 09:51:40 +0000 Subject: [PATCH 084/480] Translated using Weblate (Slovak) Currently translated at 100.0% (1189 of 1189 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index c7f38cff35..2cab64ca49 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1166,5 +1166,26 @@ "Refresh": "Obnoviť", "We encountered an error trying to restore your previous session.": "Počas obnovovania vašej predchádzajúcej relácie sa vyskytla chyba.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Vymazaním úložiska prehliadača možno opravíte váš problém, no zároveň sa týmto odhlásite a história vašich šifrovaných konverzácií sa pre vás môže stať nečitateľná.", - "Collapse Reply Thread": "Zbaliť vlákno odpovedí" + "Collapse Reply Thread": "Zbaliť vlákno odpovedí", + "e.g. %(exampleValue)s": "príklad %(exampleValue)s", + "Reload widget": "Obnoviť widget", + "Send analytics data": "Odosielať analytické údaje", + "Enable widget screenshots on supported widgets": "Umožniť zachytiť snímku obrazovky pre podporované widgety", + "Muted Users": "Umlčaní používatelia", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Prosím pomôžte nám vylepšovať Riot.im odosielaním <UsageDataLink>anonymných údajov o používaní</UsageDataLink>. Na tento účel použijeme cookie (prečítajte si <PolicyLink>ako používame cookies</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Prosím pomôžte nám vylepšovať Riot.im odosielaním <UsageDataLink>anonymných údajov o používaní</UsageDataLink>. Na tento účel použijeme cookie.", + "Yes, I want to help!": "Áno, chcem pomôcť", + "Warning: This widget might use cookies.": "Pozor: tento widget môže používať cookies.", + "Failed to indicate account erasure": "Nie je možné odstrániť odoslané správy", + "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. <b>This action is irreversible.</b>": "Toto spôsobí, že váš účet nebude viac použiteľný. Nebudete sa môcť opätovne prihlásiť a nikto sa nebude môcť znovu zaregistrovať s rovnakým používateľským ID. Deaktiváciou účtu opustíte všetky miestnosti, do ktorých ste kedy vstúpili a vaše kontaktné údaje budú odstránené zo servera totožností. <b>Túto akciu nie je možné vrátiť späť.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Pri deaktivácii účtu <b>predvolene neodstraňujeme vami odoslané správy.</b> Ak si želáte uplatniť právo zabudnutia, zaškrtnite prosím zodpovedajúce pole nižšie.", + "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.": "Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť správ elektronickej pošty. To, že zabudneme vaše správy v skutočnosti znamená, že správy ktoré ste už odoslali nebudú čitateľné pre nových alebo neregistrovaných používateľov, no registrovaní používatelia, ktorí už prístup k vašim správam majú, budú aj naďalej bez zmeny môcť pristupovať k ich vlastným kópiám vašich správ.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Spolu s deaktivovaním účtu si želám odstrániť všetky mnou odoslané správy (<b>Pozor:</b> Môže sa stať, že noví používatelia uvidia neúplnú históriu konverzácií)", + "To continue, please enter your password:": "Aby ste mohli pokračovať, prosím zadajte svoje heslo:", + "password": "heslo", + "Can't leave Server Notices room": "Nie je možné opustiť miestnosť Oznamy zo servera", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Táto miestnosť je určená na dôležité oznamy a správy od správcov domovského servera, preto ju nie je možné opustiť.", + "Terms and Conditions": "Zmluvné podmienky", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Ak chcete aj naďalej používať domovský server %(homeserverDomain)s, mali by ste si prečítať a odsúhlasiť naše zmluvné podmienky.", + "Review terms and conditions": "Prečítať zmluvné podmienky" } From 35aeac1b252b6bd4ef830c6a92ffeaf64380795e Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Fri, 25 May 2018 14:06:14 +0000 Subject: [PATCH 085/480] Translated using Weblate (Swedish) Currently translated at 80.4% (957 of 1189 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 0f898a3374..2afd9bc5a4 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -446,7 +446,7 @@ "Add an email address above to configure email notifications": "Lägg till en epostadress här för att konfigurera epostaviseringar", "Expand panel": "Öppna panel", "On": "På", - "%(count)s Members|other": "%(count)s 1 Medlemmar", + "%(count)s Members|other": "%(count)s medlemmar", "Filter room names": "Filtrera rumsnamn", "Changelog": "Ändringslogg", "Waiting for response from server": "Väntar på svar från servern", @@ -557,7 +557,7 @@ "Login": "Logga in", "Download this file": "Ladda ner filen", "Failed to change settings": "Det gick inte att spara inställningarna", - "%(count)s Members|one": "%(count)s 1 Medlem", + "%(count)s Members|one": "%(count)s medlem", "View Source": "Visa källa", "Thank you!": "Tack!", "Quote": "Citera", From 8a3ae1ed6349bd27cce677339eaa75537b5c201b Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 25 May 2018 15:12:48 +0100 Subject: [PATCH 086/480] released js-sdk --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e39b8d0f19..9daf550ef3 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "linkifyjs": "^2.1.3", "lodash": "^4.13.1", "lolex": "2.3.2", - "matrix-js-sdk": "0.10.3-rc.1", + "matrix-js-sdk": "0.10.3", "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", From 294f9c63b391a5274c47298ab6083bf64eb1e4f2 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 25 May 2018 15:16:00 +0100 Subject: [PATCH 087/480] Prepare changelog for v0.12.6 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a893bfc5..b1951875ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +Changes in [0.12.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.6) (2018-05-25) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.6-rc.1...v0.12.6) + + * No changes since v0.12.6-rc.1 + Changes in [0.12.6-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.6-rc.1) (2018-05-24) =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.5...v0.12.6-rc.1) From bbdc27019a9261eb74cc79656a7b70fb5468be34 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 25 May 2018 15:16:01 +0100 Subject: [PATCH 088/480] v0.12.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9daf550ef3..96c37a61c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.6-rc.1", + "version": "0.12.6", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 806458dfc2deeaa1269176696faa7c64c141b5f6 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Thu, 24 May 2018 17:21:27 +0000 Subject: [PATCH 089/480] Translated using Weblate (Russian) Currently translated at 99.6% (1185 of 1189 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index e2529ed1bc..e77cb76aff 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1186,5 +1186,6 @@ "password": "пароль", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie (ознакомьтесь с нашей<PolicyLink>Политикой cookie</PolicyLink>).", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie.", - "Yes, I want to help!": "Да, я хочу помочь!" + "Yes, I want to help!": "Да, я хочу помочь!", + "Reload widget": "Перезагрузить виджет" } From e1fc7a56ff78fdf2840f1b46db7d297e601ec9e1 Mon Sep 17 00:00:00 2001 From: stuve20 <stuve20@gmail.com> Date: Fri, 25 May 2018 14:14:08 +0000 Subject: [PATCH 090/480] Translated using Weblate (Swedish) Currently translated at 80.4% (957 of 1189 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 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 2afd9bc5a4..c4d072b723 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -375,7 +375,7 @@ "The maximum permitted number of widgets have already been added to this room.": "Den största tillåtna mängden widgetar har redan tillsats till rummet.", "The phone number entered looks invalid": "Telefonnumret ser felaktigt ut", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signeringsnyckeln du angav matchar signeringsnyckeln som mottogs från enheten %(deviceId)s som tillhör %(userId)s. Enheten är markerad som verifierad.", - "This email address is already in use": "Den här epostadressen är redan i bruk", + "This email address is already in use": "Den här epostadressen används redan", "This email address was not found": "Den här epostadressen finns inte", "The email address linked to your account must be entered.": "Epostadressen som är kopplad till ditt konto måste anges.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Filen '%(fileName)s' överskrider serverns största tillåtna filstorlek", @@ -385,7 +385,7 @@ "World readable": "Alla kan läsa", "Guests can join": "Gäster kan bli medlem i rummet", "No rooms to show": "Inga fler rum att visa", - "This phone number is already in use": "Detta telefonnummer är redan i bruk", + "This phone number is already in use": "Detta telefonnummer används redan", "The version of Riot.im": "Versionen av Riot.im", "Call Failed": "Samtal misslyckades", "Call Anyway": "Ring ändå", @@ -575,9 +575,9 @@ "This room has no local addresses": "Det här rummet har inga lokala adresser", "Updates": "Uppdateringar", "Check for update": "Leta efter uppdatering", - "Your language of choice": "Ditt valda språk", + "Your language of choice": "Ditt språkval", "The platform you're on": "Plattformen du använder", - "Whether or not you're logged in (we don't record your user name)": "Om du är inloggad eller inte (vi sparar inte ditt användarnamn)", + "Whether or not you're logged in (we don't record your user name)": "Oavsett om du är inloggad (så registreras inte ditt användarnamn)", "Your homeserver's URL": "Din hemservers URL", "Your identity server's URL": "Din identitetsservers URL", "Every page you use in the app": "Varje sida du använder i appen", From c116de441a1607c987f52fda136d7ae7d610dadd Mon Sep 17 00:00:00 2001 From: stuve20 <stuve20@gmail.com> Date: Fri, 25 May 2018 14:18:51 +0000 Subject: [PATCH 091/480] Translated using Weblate (Swedish) Currently translated at 80.4% (957 of 1189 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index c4d072b723..b0b44e5052 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -368,7 +368,7 @@ "PM": "p.m.", "NOTE: Apps are not end-to-end encrypted": "OBS: Apparna är inte end-to-end-krypterade", "Revoke widget access": "Upphäv widget-åtkomst", - "Submit": "Lämna", + "Submit": "Lämna in", "Tagged as: ": "Taggad som: ", "The default role for new room members is": "Standardrollen för nya medlemmar är", "The main address for this room is": "Huvudadressen för det här rummet är", From ab1261321166224bff64322a8bcfb4b531ae85df Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Fri, 25 May 2018 14:20:55 +0000 Subject: [PATCH 092/480] Translated using Weblate (Swedish) Currently translated at 80.6% (959 of 1189 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index b0b44e5052..d49dfe3fb6 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -958,5 +958,7 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern.", "The remote side failed to pick up": "Mottagaren kunde inte svara", - "Room name or alias": "Rumsnamn eller alias" + "Room name or alias": "Rumsnamn eller alias", + "Jump to read receipt": "Hoppa till läskvitto", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Just nu är det inte möjligt att svara med en fil så den kommer att skickas utan att vara ett svar." } From 296174998bbfeb188648ea3fd55f4df92cbb6957 Mon Sep 17 00:00:00 2001 From: stuve20 <stuve20@gmail.com> Date: Fri, 25 May 2018 14:21:58 +0000 Subject: [PATCH 093/480] Translated using Weblate (Swedish) Currently translated at 80.6% (959 of 1189 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index d49dfe3fb6..21f38169dc 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -370,7 +370,7 @@ "Revoke widget access": "Upphäv widget-åtkomst", "Submit": "Lämna in", "Tagged as: ": "Taggad som: ", - "The default role for new room members is": "Standardrollen för nya medlemmar är", + "The default role for new room members is": "Standardrollen för nya medlemmar i rummet är", "The main address for this room is": "Huvudadressen för det här rummet är", "The maximum permitted number of widgets have already been added to this room.": "Den största tillåtna mängden widgetar har redan tillsats till rummet.", "The phone number entered looks invalid": "Telefonnumret ser felaktigt ut", From 5147246c175a0b55d5b978e040248b82a3b71f7b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 26 May 2018 15:41:25 +0100 Subject: [PATCH 094/480] kill stream when using gUM for permission to device labels to kill camera Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/UserSettings.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index c8ce79905d..4ee4f1a427 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -284,7 +284,12 @@ module.exports = React.createClass({ this.setState({ electron_settings: settings }); }, - _refreshMediaDevices: function() { + _refreshMediaDevices: function(stream) { + if (stream) { + // kill stream so that we don't leave it lingering around with webcam enabled etc + stream.getTracks().forEach((track) => track.stop()); + } + Promise.resolve().then(() => { return CallMediaHandler.getDevices(); }).then((mediaDevices) => { From 6636fa32f67a592eb18208e89b2ae2ce226c00ac Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 26 May 2018 17:22:23 +0100 Subject: [PATCH 095/480] Allow selecting audio output for WebRTC Audio/Video calls Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/CallMediaHandler.js | 22 +++++++++++----- src/components/structures/UserSettings.js | 32 +++++++++++++++++++++-- src/settings/Settings.js | 4 +++ 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/CallMediaHandler.js b/src/CallMediaHandler.js index cdc5c61921..2330f86b99 100644 --- a/src/CallMediaHandler.js +++ b/src/CallMediaHandler.js @@ -22,34 +22,44 @@ export default { // Only needed for Electron atm, though should work in modern browsers // once permission has been granted to the webapp return navigator.mediaDevices.enumerateDevices().then(function(devices) { - const audioIn = []; - const videoIn = []; + const audiooutput = []; + const audioinput = []; + const videoinput = []; if (devices.some((device) => !device.label)) return false; devices.forEach((device) => { switch (device.kind) { - case 'audioinput': audioIn.push(device); break; - case 'videoinput': videoIn.push(device); break; + case 'audiooutput': audiooutput.push(device); break; + case 'audioinput': audioinput.push(device); break; + case 'videoinput': videoinput.push(device); break; } }); // console.log("Loaded WebRTC Devices", mediaDevices); return { - audioinput: audioIn, - videoinput: videoIn, + audiooutput, + audioinput, + videoinput, }; }, (error) => { console.log('Unable to refresh WebRTC Devices: ', error); }); }, loadDevices: function() { + const audioOutDeviceId = SettingsStore.getValue("webrtc_audiooutput"); const audioDeviceId = SettingsStore.getValue("webrtc_audioinput"); const videoDeviceId = SettingsStore.getValue("webrtc_videoinput"); + Matrix.setMatrixCallAudioOutput(audioOutDeviceId); Matrix.setMatrixCallAudioInput(audioDeviceId); Matrix.setMatrixCallVideoInput(videoDeviceId); }, + setAudioOutput: function(deviceId) { + SettingsStore.setValue("webrtc_audiooutput", null, SettingLevel.DEVICE, deviceId); + Matrix.setMatrixCallAudioOutput(deviceId); + }, + setAudioInput: function(deviceId) { SettingsStore.setValue("webrtc_audioinput", null, SettingLevel.DEVICE, deviceId); Matrix.setMatrixCallAudioInput(deviceId); diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index c8ce79905d..0561071fce 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -292,6 +292,7 @@ module.exports = React.createClass({ if (this._unmounted) return; this.setState({ mediaDevices, + activeAudioOutput: SettingsStore.getValueAt(SettingLevel.DEVICE, 'webrtc_audiooutput'), activeAudioInput: SettingsStore.getValueAt(SettingLevel.DEVICE, 'webrtc_audioinput'), activeVideoInput: SettingsStore.getValueAt(SettingLevel.DEVICE, 'webrtc_videoinput'), }); @@ -970,6 +971,11 @@ module.exports = React.createClass({ return devices.map((device) => <span key={device.deviceId}>{ device.label }</span>); }, + _setAudioOutput: function(deviceId) { + this.setState({activeAudioOutput: deviceId}); + CallMediaHandler.setAudioOutput(deviceId); + }, + _setAudioInput: function(deviceId) { this.setState({activeAudioInput: deviceId}); CallMediaHandler.setAudioInput(deviceId); @@ -1010,6 +1016,7 @@ module.exports = React.createClass({ const Dropdown = sdk.getComponent('elements.Dropdown'); + let speakerDropdown = <p>{ _t('No Audio Outputs detected') }</p>; let microphoneDropdown = <p>{ _t('No Microphones detected') }</p>; let webcamDropdown = <p>{ _t('No Webcams detected') }</p>; @@ -1018,6 +1025,26 @@ module.exports = React.createClass({ label: _t('Default Device'), }; + const audioOutputs = this.state.mediaDevices.audiooutput.slice(0); + if (audioOutputs.length > 0) { + let defaultOutput = ''; + if (!audioOutputs.some((input) => input.deviceId === 'default')) { + audioOutputs.unshift(defaultOption); + } else { + defaultOutput = 'default'; + } + + speakerDropdown = <div> + <h4>{ _t('Audio Output') }</h4> + <Dropdown + className="mx_UserSettings_webRtcDevices_dropdown" + value={this.state.activeAudioOutput || defaultOutput} + onOptionChange={this._setAudioOutput}> + { this._mapWebRtcDevicesToSpans(audioOutputs) } + </Dropdown> + </div>; + } + const audioInputs = this.state.mediaDevices.audioinput.slice(0); if (audioInputs.length > 0) { let defaultInput = ''; @@ -1059,8 +1086,9 @@ module.exports = React.createClass({ } return <div> - { microphoneDropdown } - { webcamDropdown } + { speakerDropdown } + { microphoneDropdown } + { webcamDropdown } </div>; }, diff --git a/src/settings/Settings.js b/src/settings/Settings.js index b1bc4161fd..a222c29dda 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -201,6 +201,10 @@ export const SETTINGS = { displayName: _td('Disable Peer-to-Peer for 1:1 calls'), default: false, }, + "webrtc_audiooutput": { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, + default: null, + }, "webrtc_audioinput": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: null, From 689b00c6188802fd31de2cff4314a3a3d2df8372 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 26 May 2018 17:24:07 +0100 Subject: [PATCH 096/480] run gen-i18n and prune-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/de_DE.json | 5 +-- src/i18n/strings/en_EN.json | 64 ++++++++++++++++++----------------- src/i18n/strings/eu.json | 9 +---- src/i18n/strings/fr.json | 8 ----- src/i18n/strings/hu.json | 10 +----- src/i18n/strings/it.json | 3 -- src/i18n/strings/ru.json | 4 --- src/i18n/strings/sv.json | 2 -- src/i18n/strings/zh_Hant.json | 5 +-- 9 files changed, 37 insertions(+), 73 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4892b91b48..c2b1e56cc6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1168,8 +1168,5 @@ "Collapse Reply Thread": "Antwort-Thread zusammenklappen", "At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.", "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren", - "Send analytics data": "Analysedaten senden", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden. (Siehe unsere <PolicyLink>Datenschutzerklärung</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden.", - "Yes please": "Ja, bitte" + "Send analytics data": "Analysedaten senden" } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index bf9e395bee..bfe1b562bc 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,6 +42,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -81,6 +85,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -104,7 +109,6 @@ "You need to be logged in.": "You need to be logged in.", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "Unable to create widget.": "Unable to create widget.", - "Reload widget": "Reload widget", "Missing roomId.": "Missing roomId.", "Failed to send request.": "Failed to send request.", "This room is not recognised.": "This room is not recognised.", @@ -180,11 +184,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -298,6 +297,29 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -394,11 +416,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -530,29 +552,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -663,6 +662,7 @@ "Delete widget": "Delete widget", "Revoke widget access": "Revoke widget access", "Minimize apps": "Minimize apps", + "Reload widget": "Reload widget", "Popout widget": "Popout widget", "Picture": "Picture", "Edit": "Edit", @@ -1076,9 +1076,11 @@ "No media permissions": "No media permissions", "You may need to manually permit Riot to access your microphone/webcam": "You may need to manually permit Riot to access your microphone/webcam", "Missing Media Permissions, click here to request.": "Missing Media Permissions, click here to request.", + "No Audio Outputs detected": "No Audio Outputs detected", "No Microphones detected": "No Microphones detected", "No Webcams detected": "No Webcams detected", "Default Device": "Default Device", + "Audio Output": "Audio Output", "Microphone": "Microphone", "Camera": "Camera", "VoIP": "VoIP", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 04d2e86664..be67127955 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1170,18 +1170,11 @@ "Enable widget screenshots on supported widgets": "Gaitu trepeten pantaila-argazkiak onartzen duten trepetetan", "Send analytics data": "Bidali datu analitikoak", "Muted Users": "Mutututako erabiltzaileak", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du. (Ikusi gure <PolicyLink>Cookie eta pribatutasun politikak</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du.", - "Yes please": "Bai mesedez", "Warning: This widget might use cookies.": "Abisua: Trepeta honek cookie-ak erabili litzake.", "Terms and Conditions": "Termino eta baldintzak", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "%(homeserverDomain)s hasiera-zerbitzaria erabiltzen jarraitzeko gure termino eta baldintzak irakurri eta onartu behar dituzu.", "Review terms and conditions": "Irakurri termino eta baldintzak", "Failed to indicate account erasure": "Ezin izan da kontuaren ezabaketa jakinarazi", - "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. <b>This action is irreversible.</b>": "Honek zure kontua betiko erabilgaitz bihurtuko du. Ezin izango duzu saioa hasi, eta beste inork ezin izango du erabiltzaile ID bera erabili. <b>Ez dago ekintza hau desegiterik.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Zure kontua desaktibatzean <b>ez dira lehenetsita zuk bidalitako mezuak ezabatuko.</b> Zuk bidalitako mezuak ezabatu nahi badituzu, markatu beheko kutxa.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Matrix-eko mezuen ikusgaitasuna, e-mail mezuen antzekoa da. Zure mezuak ezabatzeak esan nahi du bidali dituzun mezuak ez direla erabiltzaile berriekin partekatuko, baina aurretik zure mezuak jaso dituzten erabiltzaile erregistratuek bere kopia izango dute.", "To continue, please enter your password:": "Jarraitzeko, sartu zure pasahitza:", - "password": "pasahitza", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Ezabatu bidali ditudan mezu guztiak nire kontua desaktibatzean. (Abisua: Etorkizuneko erabiltzaileek elkarrizketa partzialak ikusiko dituzte, esperientzia kaskarra sortuz)." + "password": "pasahitza" } diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index dc36520506..5c14373d7e 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1169,25 +1169,17 @@ "Collapse Reply Thread": "Dévoiler le fil de réponse", "Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge", "Send analytics data": "Envoyer les données analytiques", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie.", - "Yes please": "Oui, s'il vous plaît", "Muted Users": "Utilisateurs ignorés", "Warning: This widget might use cookies.": "Avertissement : ce widget utilise peut-être des cookies.", "Terms and Conditions": "Conditions générales", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Pour continuer à utiliser le serveur d'accueil %(homeserverDomain)s, vous devez lire et accepter nos conditions générales.", "Review terms and conditions": "Voir les conditions générales", "Failed to indicate account erasure": "Échec de notification de la suppression du compte", - "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. <b>This action is irreversible.</b>": "Cela rendra votre compte inutilisable de façon permanente. Vous ne pourrez plus vous connecter et ne pourrez plus vous enregistrer avec le même identifiant d'utilisateur. <b>Cette action est irréversible.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Désactiver votre compte <b>ne supprime pas les messages que vous avez envoyés par défaut.</b> Si vous souhaitez supprimer vos messages, cochez la case ci-dessous.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Supprimer vos messages signifie que les messages que vous avez envoyés ne seront pas partagés avec de nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à vos messages continueront d'en avoir une copie.", "To continue, please enter your password:": "Pour continuer, veuillez renseigner votre mot de passe :", "password": "mot de passe", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Veuillez supprimer tous les messages que j'ai envoyé quand mon compte est désactivé. (Attention : les futurs utilisateurs verront alors des conversations incomplètes, ce qui est une mauvaise expérience).", "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. <b>This action is irreversible.</b>": "Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous reconnecter et personne ne pourra se réenregistrer avec le même identifiant d'utilisateur. Votre compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d'identité. <b>Cette action est irréversible.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "La désactivation du compte <b>ne nous fait pas oublier les messages que vous avez envoyés par défaut.</b> Si vous souhaitez que nous les oubliions, cochez la case ci-dessous.", "e.g. %(exampleValue)s": "par ex. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant <UsageDataLink>des données d'utilisation</UsageDataLink> ? Cela utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", "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.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Quand nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront partagés avec aucun nouvel utilisateur ou avec les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à ces messages en conserveront leur propre copie.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Veuillez oublier tous les messages que j'ai envoyé quand mon compte sera désactivé (<b>Avertissement :</b> les futurs utilisateurs verront des conversations incomplètes)" } diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index f2aaac9a81..b45cdd3311 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1169,25 +1169,17 @@ "Collapse Reply Thread": "Beszélgetés szál becsukása", "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése", "Send analytics data": "Analitikai adatok küldése", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ. (Nézd meg a <PolicyLink>sütikről és titoktartási irányelvekről</PolicyLink> szóló leírást).", - "Help improve Riot by sending usage data? This will use a cookie.": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ.", - "Yes please": "Igen, kérlek", "Muted Users": "Elnémított felhasználók", "Warning: This widget might use cookies.": "Figyelmeztetés: Ez a kisalkalmazás sütiket (cookies) használhat.", "Terms and Conditions": "Általános Szerződési Feltételek", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.", "Review terms and conditions": "Általános Szerződési Feltételek elolvasása", "Failed to indicate account erasure": "A fiók törlésének jelzése sikertelen", - "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. <b>This action is irreversible.</b>": "Ezzel a felhasználói fiókod végleg használhatatlanná válik. Nem tudsz bejelentkezni, és senki más sem fog tudni újra regisztrálni ugyanezzel az azonosítóval. <b>Ez a művelet visszafordíthatatlan.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "A felhasználói fiók felfüggesztése <b>alapértelmezetten nem töröli semelyik általad küldött üzenetet.</b> Ha az elküldött üzeneteidet törölni szeretnéd pipáld be a jelölőnégyzetet alul.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Az üzenetek láthatósága a Matrixban olyan mint az e-mail. Az üzeneted törlése azt jelenti, hogy amit elküldtél már nem lesz megosztva új- vagy vendég felhasználóval, de azok a regisztrált felhasználók akik már látták az üzenetet továbbra is hozzáférnek a saját példányukhoz.", "To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:", "password": "jelszó", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Töröld az összes üzenetet amit küldtem amikor felfüggeszted a felhasználói fiókomat. (Figyelem: ezzel a jövőbeni felhasználók csak részleges beszélgetést láthatnak majd, ami rosszul eshet).", "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. <b>This action is irreversible.</b>": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az \"identity\" szerverről. <b>Ez a művelet visszafordíthatatlan.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "A fiókod felfüggesztése <b>nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek.</b> Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.", "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.": "Az üzenetek láthatósága a Matrixban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)", - "e.g. %(exampleValue)s": "pl. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Segítesz jobbá tenni a Riotot <UsageDataLink>használati adat</UsageDataLink> küldésével? Ez sütit (cookie) fog használni. (Nézd meg az <PolicyLink>Általános Szerződési Feltételeket</PolicyLink>)." + "e.g. %(exampleValue)s": "pl. %(exampleValue)s" } diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 068ad01ff1..ab251bdf6f 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1159,9 +1159,6 @@ "Refresh": "Aggiorna", "We encountered an error trying to restore your previous session.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente.", "Send analytics data": "Invia dati statistici", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie. (Vedi la nostra <PolicyLink>politica sui cookie e sulla privacy</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie.", - "Yes please": "Sì grazie", "Clear Storage and Sign Out": "Elimina lo storage e disconnetti", "Send Logs": "Invia i log", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Eliminare lo storage del browser potrebbe risolvere il problema, ma verrai disconnesso e la cronologia delle chat criptate sarà illeggibile.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index e2529ed1bc..956f4fc41b 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1167,16 +1167,12 @@ "Enable widget screenshots on supported widgets": "Включить скриншоты виджета в поддерживаемых виджетах", "Collapse Reply Thread": "Ответить с цитированием", "Send analytics data": "Отправить данные аналитики", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie. (См. наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie.", - "Yes please": "Да, пожалуйста", "Muted Users": "Приглушенные пользователи", "Warning: This widget might use cookies.": "Внимание: этот виджет может использовать cookie.", "Terms and Conditions": "Условия и положения", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Для продолжения использования сервера %(homeserverDomain)s вы должны ознакомиться и принять условия и положения.", "Review terms and conditions": "Просмотр условий и положений", "e.g. %(exampleValue)s": "напр. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя <UsageDataLink>данные использования</UsageDataLink>? Будут использоваться файлы cookie. (Смотрите наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", "Failed to indicate account erasure": "Не удается удалить учетную запись", "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. <b>This action is irreversible.</b>": "Это навсегда сделает вашу учетную запись невозможной для использования. Вы не сможете войти в систему, и никто не сможет перерегистрировать тот же идентификатор пользователя. Это приведет к тому, что ваша учетная запись выйдет из всех комнат, в которые она входит, и будут удалены данные вашей учетной записи с сервера идентификации. <b>Это действие необратимо.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "По умолчанию деактивация вашей учетной записи <b>не приведет к удалению всех ваших сообщений.</b> Если вы хотите, чтобы мы удалили ваши сообщения, поставьте отметку в поле ниже.", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 0f898a3374..791c6e3165 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -901,8 +901,6 @@ "This setting cannot be changed later!": "Den här inställningen kan inte ändras senare!", "Unknown error": "Okänt fel", "Incorrect password": "Felaktigt lösenord", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Detta kommer att göra ditt konto permanent oanvändbart. Du kommer inte att kunna registrera samma användar-ID igen.", - "This action is irreversible.": "Denna åtgärd går inte att ångra.", "To verify that this device 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 device matches the key below:": "För att verifiera att denna enhet kan litas på, vänligen kontakta ägaren på annat sätt (t ex personligen eller med ett telefonsamtal) och fråga om nyckeln ägaren har i sina användarinställningar för enheten matchar nyckeln nedan:", "Device name": "Enhetsnamn", "Device key": "Enhetsnyckel", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 6ceda34507..fd72511f8c 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1169,8 +1169,5 @@ "Collapse Reply Thread": "摺疊回覆討論串", "Enable widget screenshots on supported widgets": "在支援的小工具上啟用小工具螢幕快照", "Send analytics data": "傳送分析資料", - "Muted Users": "已靜音的使用者", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。(參見我們的 <PolicyLink>cookie 與隱私政策</PolicyLink>)。", - "Help improve Riot by sending usage data? This will use a cookie.": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。", - "Yes please": "好的,請" + "Muted Users": "已靜音的使用者" } From ed9e4d82c9d476ba7146379428357db35813b9d4 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 18:16:05 -0600 Subject: [PATCH 097/480] Reduce the text size on the 'Jump to pinned message' button Fixes https://github.com/vector-im/riot-web/issues/6329 Signed-off-by: Travis Ralston <travpc@gmail.com> --- res/css/views/rooms/_PinnedEventTile.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/rooms/_PinnedEventTile.scss b/res/css/views/rooms/_PinnedEventTile.scss index ca790ef8f0..8354df0537 100644 --- a/res/css/views/rooms/_PinnedEventTile.scss +++ b/res/css/views/rooms/_PinnedEventTile.scss @@ -63,5 +63,5 @@ limitations under the License. .mx_PinnedEventTile_gotoButton { display: inline-block; - font-size: 0.8em; + font-size: 0.7em; // Smaller text to avoid conflicting with the layout } From 62f4cfe734cc7a0f63bceb601a5c9f7d68677ba2 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 18:21:24 -0600 Subject: [PATCH 098/480] Don't affect avatars in pinned message contents This uses more direct classes to avoid affecting pills. Fixes https://github.com/vector-im/riot-web/issues/5438 Signed-off-by: Travis Ralston <travpc@gmail.com> --- res/css/views/rooms/_PinnedEventTile.scss | 2 +- src/components/views/rooms/PinnedEventTile.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_PinnedEventTile.scss b/res/css/views/rooms/_PinnedEventTile.scss index 8354df0537..be6acdf524 100644 --- a/res/css/views/rooms/_PinnedEventTile.scss +++ b/res/css/views/rooms/_PinnedEventTile.scss @@ -40,7 +40,7 @@ limitations under the License. left: 0; } -.mx_PinnedEventTile .mx_BaseAvatar { +.mx_PinnedEventTile .mx_PinnedEventTile_senderAvatar .mx_BaseAvatar { float: left; margin-right: 10px; } diff --git a/src/components/views/rooms/PinnedEventTile.js b/src/components/views/rooms/PinnedEventTile.js index b63fdde0a8..91d656d60b 100644 --- a/src/components/views/rooms/PinnedEventTile.js +++ b/src/components/views/rooms/PinnedEventTile.js @@ -80,7 +80,9 @@ module.exports = React.createClass({ { unpinButton } </div> - <MemberAvatar member={sender} width={avatarSize} height={avatarSize} /> + <span className="mx_PinnedEventTile_senderAvatar"> + <MemberAvatar member={sender} width={avatarSize} height={avatarSize} /> + </span> <span className="mx_PinnedEventTile_sender"> { sender.name } </span> From 033c41a2a81cf4436309024898abd6e796aaec12 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 18:40:48 -0600 Subject: [PATCH 099/480] Align pinned message contents and reduce image size Fixes https://github.com/vector-im/riot-web/issues/5421 Signed-off-by: Travis Ralston <travpc@gmail.com> --- res/css/views/rooms/_PinnedEventTile.scss | 14 +++++++------- src/components/views/messages/MImageBody.js | 8 ++++++-- src/components/views/messages/MessageEvent.js | 6 +++++- src/components/views/rooms/PinnedEventTile.js | 6 +++++- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/res/css/views/rooms/_PinnedEventTile.scss b/res/css/views/rooms/_PinnedEventTile.scss index be6acdf524..fa76f4c679 100644 --- a/res/css/views/rooms/_PinnedEventTile.scss +++ b/res/css/views/rooms/_PinnedEventTile.scss @@ -33,13 +33,6 @@ limitations under the License. padding-bottom: 3px; } -.mx_PinnedEventTile .mx_EventTile_content { - margin-left: 50px; - position: relative; - top: 0; - left: 0; -} - .mx_PinnedEventTile .mx_PinnedEventTile_senderAvatar .mx_BaseAvatar { float: left; margin-right: 10px; @@ -65,3 +58,10 @@ limitations under the License. display: inline-block; font-size: 0.7em; // Smaller text to avoid conflicting with the layout } + +.mx_PinnedEventTile_message { + margin-left: 50px; + position: relative; + top: 0; + left: 0; +} \ No newline at end of file diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 8045d43104..4dfd89ec0a 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -40,6 +40,9 @@ export default class extends React.Component { /* called when the image has loaded */ onWidgetLoad: PropTypes.func.isRequired, + + /* the maximum image height to use */ + maxImageHeight: PropTypes.number, } static contextTypes = { @@ -249,8 +252,9 @@ export default class extends React.Component { const content = this.props.mxEvent.getContent(); const timelineWidth = this.refs.body.offsetWidth; - const maxHeight = 600; // let images take up as much width as they can so long as the height doesn't exceed 600px. - // the alternative here would be 600*timelineWidth/800; to scale them down to fit inside a 4:3 bounding box + const maxHeight = this.props.maxImageHeight || 600; // let images take up as much width as they can so long + // as the height doesn't exceed 600px. The alternative here would be 600*timelineWidth/800; to scale them down + // to fit inside a 4:3 bounding box // FIXME: this will break on clientside generated thumbnails (as per e2e rooms) // which may well be much smaller than the 800x600 bounding box. diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index 7358e297c7..38f55c9d70 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -39,8 +39,11 @@ module.exports = React.createClass({ /* callback called when dynamic content in events are loaded */ onWidgetLoad: PropTypes.func, - /* the shsape of the tile, used */ + /* the shape of the tile, used */ tileShape: PropTypes.string, + + /* the maximum image height to use, if the event is an image */ + maxImageHeight: PropTypes.number, }, getEventTileOps: function() { @@ -78,6 +81,7 @@ module.exports = React.createClass({ highlightLink={this.props.highlightLink} showUrlPreview={this.props.showUrlPreview} tileShape={this.props.tileShape} + maxImageHeight={this.props.maxImageHeight} onWidgetLoad={this.props.onWidgetLoad} />; }, }); diff --git a/src/components/views/rooms/PinnedEventTile.js b/src/components/views/rooms/PinnedEventTile.js index 91d656d60b..478454a3d8 100644 --- a/src/components/views/rooms/PinnedEventTile.js +++ b/src/components/views/rooms/PinnedEventTile.js @@ -86,7 +86,11 @@ module.exports = React.createClass({ <span className="mx_PinnedEventTile_sender"> { sender.name } </span> - <MessageEvent mxEvent={this.props.mxEvent} className="mx_PinnedEventTile_body" /> + <div className="mx_PinnedEventTile_message"> + <MessageEvent mxEvent={this.props.mxEvent} className="mx_PinnedEventTile_body" maxImageHeight={150} + onWidgetLoad={() => {}} // we need to give this, apparently + /> + </div> </div> ); }, From 085271a86427ecfe0c0104d6c2ed1410881ece44 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 19:17:59 -0600 Subject: [PATCH 100/480] Update pinned messages in real time Fixes https://github.com/vector-im/riot-web/issues/5358 Signed-off-by: Travis Ralston <travpc@gmail.com> --- src/components/views/rooms/PinnedEventsPanel.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/components/views/rooms/PinnedEventsPanel.js b/src/components/views/rooms/PinnedEventsPanel.js index 4624b3c051..e75cbea817 100644 --- a/src/components/views/rooms/PinnedEventsPanel.js +++ b/src/components/views/rooms/PinnedEventsPanel.js @@ -39,6 +39,19 @@ module.exports = React.createClass({ componentDidMount: function() { this._updatePinnedMessages(); + MatrixClientPeg.get().on("RoomState.events", this._onEvent); + }, + + componentWillUnmount: function() { + if (MatrixClientPeg.get()) { + MatrixClientPeg.get().removeListener("RoomState.events", this._onEvent); + } + }, + + _onEvent: function(ev) { + if (ev.getRoomId() === this.props.room.roomId && ev.getType() === "m.room.pinned_events") { + this._updatePinnedMessages(); + } }, _updatePinnedMessages: function() { From 53396ff38dcac527605d327f5b4123c4a8884727 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 19:42:09 -0600 Subject: [PATCH 101/480] Show timestamp of pinned messages on hover Addresses part of https://github.com/vector-im/riot-web/issues/5405 Signed-off-by: Travis Ralston <travpc@gmail.com> --- res/css/views/rooms/_PinnedEventTile.scss | 14 ++++++++++++-- src/components/views/rooms/PinnedEventTile.js | 4 ++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_PinnedEventTile.scss b/res/css/views/rooms/_PinnedEventTile.scss index fa76f4c679..f7417272b6 100644 --- a/res/css/views/rooms/_PinnedEventTile.scss +++ b/res/css/views/rooms/_PinnedEventTile.scss @@ -25,19 +25,29 @@ limitations under the License. background-color: $event-selected-color; } -.mx_PinnedEventTile .mx_PinnedEventTile_sender { +.mx_PinnedEventTile .mx_PinnedEventTile_sender, +.mx_PinnedEventTile .mx_PinnedEventTile_timestamp { color: #868686; font-size: 0.8em; vertical-align: top; - display: block; + display: inline-block; padding-bottom: 3px; } +.mx_PinnedEventTile .mx_PinnedEventTile_timestamp { + padding-left: 15px; + display: none; +} + .mx_PinnedEventTile .mx_PinnedEventTile_senderAvatar .mx_BaseAvatar { float: left; margin-right: 10px; } +.mx_PinnedEventTile:hover .mx_PinnedEventTile_timestamp { + display: inline-block; +} + .mx_PinnedEventTile:hover .mx_PinnedEventTile_actions { display: block; } diff --git a/src/components/views/rooms/PinnedEventTile.js b/src/components/views/rooms/PinnedEventTile.js index 478454a3d8..d0572e489a 100644 --- a/src/components/views/rooms/PinnedEventTile.js +++ b/src/components/views/rooms/PinnedEventTile.js @@ -22,6 +22,7 @@ import AccessibleButton from "../elements/AccessibleButton"; import MessageEvent from "../messages/MessageEvent"; import MemberAvatar from "../avatars/MemberAvatar"; import { _t } from '../../../languageHandler'; +import {formatFullDate} from '../../../DateUtils'; module.exports = React.createClass({ displayName: 'PinnedEventTile', @@ -86,6 +87,9 @@ module.exports = React.createClass({ <span className="mx_PinnedEventTile_sender"> { sender.name } </span> + <span className="mx_PinnedEventTile_timestamp"> + { formatFullDate(new Date(this.props.mxEvent.getTs())) } + </span> <div className="mx_PinnedEventTile_message"> <MessageEvent mxEvent={this.props.mxEvent} className="mx_PinnedEventTile_body" maxImageHeight={150} onWidgetLoad={() => {}} // we need to give this, apparently From 752605429cd8072aa59ec145d31e3d33a2f4c596 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 19:32:23 -0600 Subject: [PATCH 102/480] Persist pinned message open-ness between room switches Addresses part of https://github.com/vector-im/riot-web/issues/5405 Signed-off-by: Travis Ralston <travpc@gmail.com> --- src/components/structures/RoomView.js | 9 +++++++-- src/settings/Settings.js | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index c5f6a75cc5..eae621b722 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -44,7 +44,7 @@ import { KeyCode, isOnlyCtrlOrCmdKeyEvent } from '../../Keyboard'; import RoomViewStore from '../../stores/RoomViewStore'; import RoomScrollStateStore from '../../stores/RoomScrollStateStore'; -import SettingsStore from "../../settings/SettingsStore"; +import SettingsStore, {SettingLevel} from "../../settings/SettingsStore"; const DEBUG = false; let debuglog = function() {}; @@ -115,6 +115,7 @@ module.exports = React.createClass({ showApps: false, isAlone: false, isPeeking: false, + showingPinned: false, // error object, as from the matrix client/server API // If we failed to load information about the room, @@ -182,6 +183,7 @@ module.exports = React.createClass({ isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(), forwardingEvent: RoomViewStore.getForwardingEvent(), shouldPeek: RoomViewStore.shouldPeek(), + showingPinned: SettingsStore.getValue("PinnedEvents.isOpen", RoomViewStore.getRoomId()), }; // Temporary logging to diagnose https://github.com/vector-im/riot-web/issues/4307 @@ -1135,7 +1137,10 @@ module.exports = React.createClass({ }, onPinnedClick: function() { - this.setState({showingPinned: !this.state.showingPinned, searching: false}); + const nowShowingPinned = !this.state.showingPinned; + const roomId = this.state.room.roomId; + this.setState({showingPinned: nowShowingPinned, searching: false}); + SettingsStore.setValue("PinnedEvents.isOpen", roomId, SettingLevel.ROOM_DEVICE, nowShowingPinned); }, onSettingsClick: function() { diff --git a/src/settings/Settings.js b/src/settings/Settings.js index b1bc4161fd..456665aeb8 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -274,4 +274,8 @@ export const SETTINGS = { displayName: _td('Enable widget screenshots on supported widgets'), default: false, }, + "PinnedEvents.isOpen": { + supportedLevels: ['room-device'], + default: false, + }, }; From e690bcb6efd58ecb85f2373949d840794bc1ab48 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 20:54:19 -0600 Subject: [PATCH 103/480] Replace "Login as guest" with "Try the app first" on login page Fixes vector-im/riot-web#5875 Signed-off-by: Travis Ralston <travpc@gmail.com> --- src/components/structures/login/Login.js | 2 +- src/i18n/strings/bg.json | 1 - src/i18n/strings/ca.json | 1 - src/i18n/strings/cs.json | 1 - src/i18n/strings/da.json | 1 - src/i18n/strings/de_DE.json | 1 - src/i18n/strings/el.json | 1 - src/i18n/strings/en_EN.json | 2 +- src/i18n/strings/en_US.json | 1 - src/i18n/strings/eo.json | 1 - src/i18n/strings/es.json | 1 - src/i18n/strings/eu.json | 1 - src/i18n/strings/fi.json | 1 - src/i18n/strings/fr.json | 1 - src/i18n/strings/gl.json | 1 - src/i18n/strings/hu.json | 1 - src/i18n/strings/id.json | 1 - src/i18n/strings/it.json | 1 - src/i18n/strings/ko.json | 1 - src/i18n/strings/lv.json | 1 - src/i18n/strings/nl.json | 1 - src/i18n/strings/pl.json | 1 - src/i18n/strings/pt.json | 1 - src/i18n/strings/pt_BR.json | 1 - src/i18n/strings/ru.json | 1 - src/i18n/strings/sk.json | 1 - src/i18n/strings/sr.json | 1 - src/i18n/strings/sv.json | 1 - src/i18n/strings/th.json | 1 - src/i18n/strings/tr.json | 1 - src/i18n/strings/zh_Hans.json | 1 - src/i18n/strings/zh_Hant.json | 1 - 32 files changed, 2 insertions(+), 32 deletions(-) diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index 7f4aa0325a..1332f52f97 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -399,7 +399,7 @@ module.exports = React.createClass({ if (this.props.enableGuest) { loginAsGuestJsx = <a className="mx_Login_create" onClick={this._onLoginAsGuestClick} href="#"> - { _t('Login as guest') } + { _t('Try the app first') } </a>; } diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 4911ad970e..2a7696f872 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -888,7 +888,6 @@ "This homeserver doesn't offer any login flows which are supported by this client.": "Този Home сървър не предлага методи за влизане, които се поддържат от този клиент.", "Error: Problem communicating with the given homeserver.": "Грешка: Проблем при комуникацията с дадения Home сървър.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Не е възможно свързване към Home сървъра чрез HTTP, когато има HTTPS адрес в лентата на браузъра Ви. Или използвайте HTTPS или <a>включете функция небезопасни скриптове</a>.", - "Login as guest": "Влез като гост", "Sign in to get started": "Влезте в профила си, за да започнете", "Set a display name:": "Задаване на име:", "Upload an avatar:": "Качване на профилна снимка:", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 407b9f61d4..ab4e803342 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -579,7 +579,6 @@ "%(nameList)s %(transitionList)s": "%(transitionList)s%(nameList)s", "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s han entrat", "Guest access is disabled on this Home Server.": "L'accés a usuaris d'altres xarxes no està permès en aquest servidor.", - "Login as guest": "Inicia sessió com a convidat", "Unblacklist": "Treure de la llista negre", "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s s'ha unit", "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s han sortit", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 33c7a3d5f1..441e16e2c3 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -239,7 +239,6 @@ "Level:": "Úroveň:", "Local addresses for this room:": "Místní adresy této místnosti:", "Logged in as:": "Přihlášen/a jako:", - "Login as guest": "Přihlášen/a jako host", "matrix-react-sdk version:": "Verze matrix-react-sdk:", "Mobile phone number": "Číslo mobilního telefonu", "Mobile phone number (optional)": "Číslo mobilního telefonu (nepovinné)", diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 2a59530d5a..e10534d7f1 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -39,7 +39,6 @@ "Searches DuckDuckGo for results": "Søger DuckDuckGo for resultater", "Commands": "kommandoer", "Emoji": "Emoji", - "Login as guest": "Log ind som gæst", "Sign in": "Log ind", "Warning!": "Advarsel!", "Account": "Konto", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4892b91b48..16ca9462b3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -40,7 +40,6 @@ "Searches DuckDuckGo for results": "Verwendet DuckDuckGo für Suchergebnisse", "Commands": "Kommandos", "Emoji": "Emoji", - "Login as guest": "Als Gast anmelden", "Sign in": "Anmelden", "Warning!": "Warnung!", "Error": "Fehler", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index fabd88c74a..929ca5e7df 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -142,7 +142,6 @@ "%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.", "Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:", "Logged in as:": "Συνδεθήκατε ως:", - "Login as guest": "Σύνδεση ως επισκέπτης", "Logout": "Αποσύνδεση", "Low priority": "Χαμηλής προτεραιότητας", "matrix-react-sdk version:": "Έκδοση matrix-react-sdk:", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index bf9e395bee..8e068d5651 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1120,7 +1120,7 @@ "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 <a>enable unsafe scripts</a>.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.", - "Login as guest": "Login as guest", + "Try the app first": "Try the app first", "Sign in to get started": "Sign in to get started", "Failed to fetch avatar URL": "Failed to fetch avatar URL", "Set a display name:": "Set a display name:", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index 43e2041020..2a1b97b536 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -209,7 +209,6 @@ "Publish this room to the public in %(domain)s's room directory?": "Publish this room to the public in %(domain)s's room directory?", "Local addresses for this room:": "Local addresses for this room:", "Logged in as:": "Logged in as:", - "Login as guest": "Login as guest", "Logout": "Logout", "Low priority": "Low priority", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s made future room history visible to all room members, from the point they are invited.", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 68645ffd9c..f48d10fa9f 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -862,7 +862,6 @@ "Error: Problem communicating with the given homeserver.": "Eraro: Estas problemo en komunikado kun la hejmservilo.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Hejmservilo ne alkonekteblas per HTTP kun HTTPS URL en via adresbreto. Aŭ uzu HTTPS aŭ <a>ŝaltu malsekurajn skriptojn</a>.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Ne eblas konekti al hejmservilo – bonvolu kontroli vian konekton, certigi ke <a>la SSL-atestilo de via hejmservilo</a> estas fidata, kaj ke neniu foliumila kromprogramo baras petojn.", - "Login as guest": "Saluti kiel gasto", "Sign in to get started": "Komencu per saluto", "Failed to fetch avatar URL": "Malsukcesis venigi adreson de profilbildo", "Set a display name:": "Agordi vidigan nomon:", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 8e7925ba36..5180461828 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -166,7 +166,6 @@ "%(targetName)s left the room.": "%(targetName)s ha dejado la sala.", "Local addresses for this room:": "Direcciones locales para esta sala:", "Logged in as:": "Sesión iniciada como:", - "Login as guest": "Iniciar sesión como invitado", "Logout": "Cerrar Sesión", "Low priority": "Baja prioridad", "Accept": "Aceptar", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 04d2e86664..9c9e5a7589 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -298,7 +298,6 @@ "Level:": "Maila:", "Local addresses for this room:": "Gela honen tokiko helbideak:", "Logged in as:": "Saioa hasteko erabiltzailea:", - "Login as guest": "Hasi saioa bisitari gisa", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, gonbidapena egiten zaienetik.", "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, elkartzen direnetik.", "%(senderName)s made future room history visible to all room members.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat.", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index e5787ab561..b96dbafa14 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -198,7 +198,6 @@ "Level:": "Taso:", "Local addresses for this room:": "Tämän huoneen paikalliset osoitteet:", "Logged in as:": "Kirjautunut käyttäjänä:", - "Login as guest": "Kirjaudu vieraana", "Logout": "Kirjaudu ulos", "Low priority": "Alhainen prioriteetti", "Manage Integrations": "Hallinoi integraatioita", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index dc36520506..5194dc21e7 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -166,7 +166,6 @@ "%(targetName)s left the room.": "%(targetName)s a quitté le salon.", "Local addresses for this room:": "Adresses locales pour ce salon :", "Logged in as:": "Identifié en tant que :", - "Login as guest": "Se connecter en tant que visiteur", "Logout": "Se déconnecter", "Low priority": "Priorité basse", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont été invités.", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index fdab066031..fc1adfc478 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -879,7 +879,6 @@ "Error: Problem communicating with the given homeserver.": "Fallo: problema ao comunicarse con servidor proporcionado.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Non se pode conectar ao servidor vía HTTP cando na barra de enderezos do navegador está HTTPS. Utilice HTTPS ou <a>active scripts non seguros</a>.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Non se conectou ao servidor - por favor comprobe a conexión, asegúrese de o <a>certificado SSL do servidor</a> é de confianza, e que ningún engadido do navegador está bloqueando as peticións.", - "Login as guest": "Conexión como convidado", "Sign in to get started": "Conéctese para iniciar", "Failed to fetch avatar URL": "Fallo ao obter o URL do avatar", "Set a display name:": "Establecer nome público:", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index f2aaac9a81..6012e857f5 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -238,7 +238,6 @@ "Level:": "Szint:", "Local addresses for this room:": "A szoba helyi címe:", "Logged in as:": "Bejelentkezve mint:", - "Login as guest": "Belépés vendégként", "Logout": "Kilép", "Low priority": "Alacsony prioritás", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta meg van hívva.", diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index 9db1a4a99c..00d56e6074 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -62,7 +62,6 @@ "Sign in with": "Masuk dengan", "Leave room": "Meninggalkan ruang", "Level:": "Tingkat:", - "Login as guest": "Masuk sebagai tamu", "Logout": "Keluar", "Low priority": "Prioritas rendah", "Markdown is disabled": "Markdown dinonaktifkan", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 068ad01ff1..5ba19d1622 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -909,7 +909,6 @@ "Error: Problem communicating with the given homeserver.": "Errore: problema di comunicazione con l'homeserver dato.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Impossibile connettersi all'homeserver via HTTP quando c'è un URL HTTPS nella barra del tuo browser. Usa HTTPS o <a>attiva gli script non sicuri</a>.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Impossibile connettersi all'homeserver - controlla la tua connessione, assicurati che il <a>certificato SSL dell'homeserver</a> sia fidato e che un'estensione del browser non stia bloccando le richieste.", - "Login as guest": "Accedi come ospite", "Sign in to get started": "Accedi per iniziare", "Failed to fetch avatar URL": "Ricezione URL dell'avatar fallita", "Set a display name:": "Imposta un nome visualizzato:", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 4e0a988223..58333f23ad 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -240,7 +240,6 @@ "Level:": "등급:", "Local addresses for this room:": "이 방의 로컬 주소:", "Logged in as:": "로그인:", - "Login as guest": "손님으로 로그인", "Logout": "로그아웃", "Low priority": "낮은 우선순위", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 초대받은 시점부터.", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 01e3ae5c6d..37cb6ec324 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -224,7 +224,6 @@ "Level:": "Līmenis:", "Local addresses for this room:": "Šīs istabas lokālās adreses:", "Logged in as:": "Pierakstījās kā:", - "Login as guest": "Pierakstīties kā viesim", "Logout": "Izrakstīties", "Low priority": "Zemas prioritātes", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem no brīža, kad tie tika uzaicināti.", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 0df2cf1bd7..3e48fb9c3a 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -305,7 +305,6 @@ "Level:": "Niveau:", "Local addresses for this room:": "Lokale adressen voor deze ruimte:", "Logged in as:": "Ingelogd als:", - "Login as guest": "Als gast inloggen", "Logout": "Uitloggen", "Low priority": "Lage prioriteit", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor alle kamerleden, vanaf het moment dat ze uitgenodigt zijn.", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index d3dcb72f49..2ef30f7732 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -303,7 +303,6 @@ "Publish this room to the public in %(domain)s's room directory?": "Czy opublikować ten pokój dla ogółu w spisie pokojów domeny %(domain)s?", "Local addresses for this room:": "Lokalne adresy dla tego pokoju:", "Logged in as:": "Zalogowany jako:", - "Login as guest": "Zaloguj jako gość", "Logout": "Wyloguj", "Low priority": "Niski priorytet", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich zaproszenia.", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index d165c6c057..9b1c599501 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -83,7 +83,6 @@ "Kicks user with given id": "Remove usuário com o identificador informado", "Labs": "Laboratório", "Leave room": "Sair da sala", - "Login as guest": "Entrar como visitante", "Logout": "Sair", "Low priority": "Baixa prioridade", "Manage Integrations": "Gerenciar integrações", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 0a4d847805..55a503dbe7 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -83,7 +83,6 @@ "Kicks user with given id": "Remove usuário com o identificador informado", "Labs": "Laboratório", "Leave room": "Sair da sala", - "Login as guest": "Entrar como visitante", "Logout": "Sair", "Low priority": "Baixa prioridade", "Manage Integrations": "Gerenciar integrações", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index e2529ed1bc..c93b9a2e3b 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -75,7 +75,6 @@ "Kicks user with given id": "Выкидывает пользователя с заданным ID", "Labs": "Лаборатория", "Leave room": "Покинуть комнату", - "Login as guest": "Войти как гость", "Logout": "Выйти", "Low priority": "Неважные", "Manage Integrations": "Управление интеграциями", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index c7f38cff35..b40ba8f750 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -822,7 +822,6 @@ "Error: Problem communicating with the given homeserver.": "Chyba: Nie je možné komunikovať so zadaným domovským serverom.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "K domovskému serveru nie je možné pripojiť sa použitím protokolu HTTP keďže v adresnom riadku prehliadača máte HTTPS adresu. Použite protokol HTTPS alebo <a>povolte nezabezpečené skripty</a>.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nie je možné pripojiť sa k domovskému serveru - skontrolujte prosím funkčnosť vašeho pripojenia na internet, uistite sa že <a>certifikát domovského servera</a> je dôverihodný, a že žiaden doplnok nainštalovaný v prehliadači nemôže blokovať požiadavky.", - "Login as guest": "Prihlásiť sa ako hosť", "Failed to fetch avatar URL": "Nepodarilo sa získať URL adresu obrázka", "Set a display name:": "Nastaviť zobrazované meno:", "Upload an avatar:": "Nahrať obrázok:", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index ebacd28a5c..e73107376b 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -903,7 +903,6 @@ "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 <a>enable unsafe scripts</a>.": "Не могу да се повежем на кућни сервер преко HTTP-а када се користи HTTPS адреса у траци вашег прегледача. Или користите HTTPS или <a>омогућите небезбедне скрипте</a>.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Не могу да се повежем на кућни сервер. Проверите вашу интернет везу, постарајте се да верујете <a>SSL сертификату кућног сервера</a> и да проширење прегледача не блокира захтеве.", - "Login as guest": "Пријави се као гост", "Sign in to get started": "Пријави се да почнеш", "Failed to fetch avatar URL": "Нисам успео да добавим адресу аватара", "Set a display name:": "Постави приказно име:", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 0f898a3374..36c858247e 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -224,7 +224,6 @@ "Level:": "Nivå:", "Local addresses for this room:": "Lokala adresser för rummet:", "Logged in as:": "Inloggad som:", - "Login as guest": "Logga in som gäst", "Logout": "Logga ut", "Low priority": "Lågprioritet", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar från att de bjöds in.", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 6fa7febabd..f59ae4b53b 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -178,7 +178,6 @@ "Leave room": "ออกจากห้อง", "%(targetName)s left the room.": "%(targetName)s ออกจากห้องแล้ว", "Logged in as:": "เข้าสู่ระบบในชื่อ:", - "Login as guest": "เข้าสู่ระบบในฐานะแขก", "Logout": "ออกจากระบบ", "Markdown is disabled": "ปิดใช้งาน Markdown แล้ว", "Markdown is enabled": "เปิดใช้งาน Markdown แล้ว", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 797fed79ce..3fb790c0d6 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -224,7 +224,6 @@ "Level:": "Seviye :", "Local addresses for this room:": "Bu oda için yerel adresler :", "Logged in as:": "Olarak giriş yaptı :", - "Login as guest": "Misafir olarak giriş yaptı", "Logout": "Çıkış Yap", "Low priority": "Düşük öncelikli", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , davet edildiği noktadan.", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 8e2dc6e0f8..cb39c1751b 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -153,7 +153,6 @@ "Jump to first unread message.": "跳到第一条未读消息。", "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", "Leave room": "退出聊天室", - "Login as guest": "以游客的身份登录", "New password": "新密码", "Add a topic": "添加一个主题", "Admin": "管理员", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 6ceda34507..bc5464d315 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -123,7 +123,6 @@ "Jump to first unread message.": "跳到第一則未讀訊息。", "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", "Leave room": "離開聊天室", - "Login as guest": "以游客的身份登錄", "New password": "新密碼", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "重設密碼目前會把所有裝置上的端到端加密金鑰重設,讓已加密的聊天歷史不可讀,除非您先匯出您的聊天室金鑰並在稍後重新匯入。這會在未來改進。", "Return to login screen": "返回到登入畫面", From ec53b5f5ab3d00593fca3da788ec1bf0c333cac2 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sat, 26 May 2018 21:21:06 -0600 Subject: [PATCH 104/480] Expose at-room power level setting Fixes https://github.com/vector-im/riot-web/issues/5835 Signed-off-by: Travis Ralston <travpc@gmail.com> --- src/components/views/rooms/RoomSettings.js | 27 ++++++++++++++++++++-- src/i18n/strings/en_EN.json | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index 059e07ffdb..0ccfa23bf3 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -395,7 +395,17 @@ module.exports = React.createClass({ powerLevels["events"] = Object.assign({}, this.state.powerLevels["events"] || {}); powerLevels["events"][powerLevelKey.slice(eventsLevelPrefix.length)] = value; } else { - powerLevels[powerLevelKey] = value; + const keyPath = powerLevelKey.split('.'); + let parentObj; + let currentObj = powerLevels; + for (const key of keyPath) { + if (!currentObj[key]) { + currentObj[key] = {}; + } + parentObj = currentObj; + currentObj = currentObj[key]; + } + parentObj[keyPath[keyPath.length - 1]] = value; } this.setState({ powerLevels, @@ -664,6 +674,10 @@ module.exports = React.createClass({ desc: _t('To remove other users\' messages, you must be a'), defaultValue: 50, }, + "notifications.room": { + desc: _t('To notify everyone in the room, you must be a'), + defaultValue: 50, + }, }; const banLevel = parseIntWithDefault(powerLevels.ban, powerLevelDescriptors.ban.defaultValue); @@ -865,7 +879,16 @@ module.exports = React.createClass({ const powerSelectors = Object.keys(powerLevelDescriptors).map((key, index) => { const descriptor = powerLevelDescriptors[key]; - const value = parseIntWithDefault(powerLevels[key], descriptor.defaultValue); + const keyPath = key.split('.'); + let currentObj = powerLevels; + for (const prop of keyPath) { + if (currentObj === undefined) { + break; + } + currentObj = currentObj[prop]; + } + + const value = parseIntWithDefault(currentObj, descriptor.defaultValue); return <div key={index} className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey"> { descriptor.desc } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index bf9e395bee..8698e6108f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -491,6 +491,7 @@ "To kick users, you must be a": "To kick users, you must be a", "To ban users, you must be a": "To ban users, you must be a", "To remove other users' messages, you must be a": "To remove other users' messages, you must be a", + "To notify everyone in the room, you must be a": "To notify everyone in the room, you must be a", "No users have specific privileges in this room": "No users have specific privileges in this room", "%(user)s is a %(userRole)s": "%(user)s is a %(userRole)s", "Privileged Users": "Privileged Users", From 929da30df8016926d1780ef0e04e42d366938eb6 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sun, 27 May 2018 10:28:47 -0600 Subject: [PATCH 105/480] onEvent -> onStateEvent Signed-off-by: Travis Ralston <travpc@gmail.com> --- src/components/views/rooms/PinnedEventsPanel.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/PinnedEventsPanel.js b/src/components/views/rooms/PinnedEventsPanel.js index e75cbea817..50c40142da 100644 --- a/src/components/views/rooms/PinnedEventsPanel.js +++ b/src/components/views/rooms/PinnedEventsPanel.js @@ -39,16 +39,16 @@ module.exports = React.createClass({ componentDidMount: function() { this._updatePinnedMessages(); - MatrixClientPeg.get().on("RoomState.events", this._onEvent); + MatrixClientPeg.get().on("RoomState.events", this._onStateEvent); }, componentWillUnmount: function() { if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener("RoomState.events", this._onEvent); + MatrixClientPeg.get().removeListener("RoomState.events", this._onStateEvent); } }, - _onEvent: function(ev) { + _onStateEvent: function(ev) { if (ev.getRoomId() === this.props.room.roomId && ev.getType() === "m.room.pinned_events") { this._updatePinnedMessages(); } From 65a30572f3976621d0cf577461e50c60873e609d Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Fri, 25 May 2018 21:40:11 +0000 Subject: [PATCH 106/480] Translated using Weblate (Swedish) Currently translated at 81.4% (968 of 1189 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 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 21f38169dc..4ab1413e4f 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -589,7 +589,7 @@ "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Din epostadress verkar inte vara kopplad till något Matrix-ID på den här hemservern.", "Restricted": "Begränsad", "Who would you like to communicate with?": "Vem vill du kommunicera med?", - "Failed to invite the following users to the %(roomName)s room:": "Misslyckades med att bjuda in följande användare till %(roomName)s-rummet:", + "Failed to invite the following users to the %(roomName)s room:": "Det gick inte att bjuda in följande användare till %(roomName)s-rummet:", "Unable to create widget.": "Det går inte att skapa widget.", "Ignored user": "Ignorerad användare", "You are now ignoring %(userId)s": "Du ignorerar nu %(userId)s", @@ -960,5 +960,14 @@ "The remote side failed to pick up": "Mottagaren kunde inte svara", "Room name or alias": "Rumsnamn eller alias", "Jump to read receipt": "Hoppa till läskvitto", - "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Just nu är det inte möjligt att svara med en fil så den kommer att skickas utan att vara ett svar." + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Just nu är det inte möjligt att svara med en fil så den kommer att skickas utan att vara ett svar.", + "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.": "Denna process låter dig exportera nycklarna för meddelanden som du har fått i krypterade rum till en lokal fil. Du kommer sedan att kunna importera filen i en annan Matrix-klient i framtiden, så att den klienten också kan dekryptera meddelandena.", + "Unknown for %(duration)s": "Okänt i %(duration)s", + "Unknown": "Okänt", + "Reload widget": "Ladda om widget", + "e.g. %(exampleValue)s": "t.ex. %(exampleValue)s", + "Can't leave Server Notices room": "Kan inte lämna serveraviseringsrummet", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Detta rum används för viktiga meddelanden från hemservern, så du kan inte lämna det.", + "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ån en äldre version av Riot has upptäckts. Detta ska ha orsakat att krypteringen inte fungerat i den äldre versionen. Krypterade meddelanden som nyligen har skickats medans den äldre versionen användes kanske inte kan dekrypteras i denna version. Detta kan även orsaka att meddelanden skickade med denna version inte fungerar. Om du upplever problem, logga ut och in igen. För att behålla meddelandehistoriken, exportera dina nycklar och importera dem igen.", + "Confirm Removal": "Bekräfta borttagning" } From 23162c86253cc5aca18f2a9a954ab56736055991 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Mon, 9 Oct 2017 18:50:08 -0600 Subject: [PATCH 107/480] Support third party integration managers in AppPermission Alternative integration managers may wish to also wrap widgets to supply a better user experience. With the previous code, it was not possible to use the integrations_widgets_urls configuration option (described in AppTile). AppPermission should use the same logic to determine if a widget is being wrapped, so it can display a helpful URL for the user (instead of the wrapper URL). Signed-off-by: Travis Ralston <travpc@gmail.com> --- .../views/elements/AppPermission.js | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/components/views/elements/AppPermission.js b/src/components/views/elements/AppPermission.js index c45006be3a..0ce7c2a45e 100644 --- a/src/components/views/elements/AppPermission.js +++ b/src/components/views/elements/AppPermission.js @@ -2,6 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import url from 'url'; import { _t } from '../../../languageHandler'; +import SdkConfig from '../../../SdkConfig'; export default class AppPermission extends React.Component { constructor(props) { @@ -34,14 +35,21 @@ export default class AppPermission extends React.Component { } isScalarWurl(wurl) { - if (wurl && wurl.hostname && ( - wurl.hostname === 'scalar.vector.im' || - wurl.hostname === 'scalar-staging.riot.im' || - wurl.hostname === 'scalar-develop.riot.im' || - wurl.hostname === 'demo.riot.im' || - wurl.hostname === 'localhost' - )) { - return true; + // Exit early if we've been given bad data + if (!wurl) { + return false; + } + + let scalarUrls = SdkConfig.get().integrations_widgets_urls; + if (!scalarUrls || scalarUrls.length == 0) { + scalarUrls = [SdkConfig.get().integrations_rest_url]; + } + + const url = wurl.format(); + for (const scalarUrl of scalarUrls) { + if (url.startsWith(scalarUrl)) { + return true; + } } return false; } From 47ae19672fa76539854cab31d4dfff8da9267b3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Thu, 24 May 2018 18:12:29 +0000 Subject: [PATCH 108/480] Translated using Weblate (French) Currently translated at 100.0% (1190 of 1190 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 274d13fa45..64093ebb0d 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1195,5 +1195,6 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Veuillez aider Riot.im à s'améliorer en envoyant <UsageDataLink>des données d'utilisation anonymes</UsageDataLink>. Cela utilisera un cookie.", "Yes, I want to help!": "Oui, je veux aider !", "Can't leave Server Notices room": "Impossible de quitter le salon des Annonces du serveur", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ce salon est utilisé pour les messages importants du serveur d'accueil, donc vous ne pouvez pas en partir." + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ce salon est utilisé pour les messages importants du serveur d'accueil, donc vous ne pouvez pas en partir.", + "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être" } From 98613748b63a338d21b800d41004f070562a0ffb Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sun, 27 May 2018 11:12:55 -0600 Subject: [PATCH 109/480] Move Scalar Widget URL check to WidgetUtils Signed-off-by: Travis Ralston <travpc@gmail.com> --- src/WidgetUtils.js | 35 +++++++++++++++++++ .../views/elements/AppPermission.js | 23 ++---------- src/components/views/elements/AppTile.js | 35 +------------------ 3 files changed, 38 insertions(+), 55 deletions(-) diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 5f45a8c58c..10cd473904 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -15,6 +15,8 @@ limitations under the License. */ import MatrixClientPeg from './MatrixClientPeg'; +import SdkConfig from "./SdkConfig"; +import * as url from "url"; export default class WidgetUtils { /* Returns true if user is able to send state events to modify widgets in this room @@ -55,4 +57,37 @@ export default class WidgetUtils { return room.currentState.maySendStateEvent('im.vector.modular.widgets', me); } + + /** + * Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api + * @param {[type]} testUrlString URL to check + * @return {Boolean} True if specified URL is a scalar URL + */ + static isScalarUrl(testUrlString) { + if (!testUrlString) { + console.error('Scalar URL check failed. No URL specified'); + return false; + } + + const testUrl = url.parse(testUrlString); + + let scalarUrls = SdkConfig.get().integrations_widgets_urls; + if (!scalarUrls || scalarUrls.length === 0) { + scalarUrls = [SdkConfig.get().integrations_rest_url]; + } + + for (let i = 0; i < scalarUrls.length; i++) { + const scalarUrl = url.parse(scalarUrls[i]); + if (testUrl && scalarUrl) { + if ( + testUrl.protocol === scalarUrl.protocol && + testUrl.host === scalarUrl.host && + testUrl.pathname.startsWith(scalarUrl.pathname) + ) { + return true; + } + } + } + return false; + } } diff --git a/src/components/views/elements/AppPermission.js b/src/components/views/elements/AppPermission.js index 0ce7c2a45e..6af3148e21 100644 --- a/src/components/views/elements/AppPermission.js +++ b/src/components/views/elements/AppPermission.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import url from 'url'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; +import WidgetUtils from "../../../WidgetUtils"; export default class AppPermission extends React.Component { constructor(props) { @@ -20,7 +21,7 @@ export default class AppPermission extends React.Component { const searchParams = new URLSearchParams(wurl.search); - if (this.isScalarWurl(wurl) && searchParams && searchParams.get('url')) { + if (WidgetUtils.isScalarUrl(wurl) && searchParams && searchParams.get('url')) { curl = url.parse(searchParams.get('url')); if (curl) { curl.search = curl.query = ""; @@ -34,26 +35,6 @@ export default class AppPermission extends React.Component { return curlString; } - isScalarWurl(wurl) { - // Exit early if we've been given bad data - if (!wurl) { - return false; - } - - let scalarUrls = SdkConfig.get().integrations_widgets_urls; - if (!scalarUrls || scalarUrls.length == 0) { - scalarUrls = [SdkConfig.get().integrations_rest_url]; - } - - const url = wurl.format(); - for (const scalarUrl of scalarUrls) { - if (url.startsWith(scalarUrl)) { - return true; - } - } - return false; - } - render() { let e2eWarningText; if (this.props.isRoomEncrypted) { diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 5f3ed6eba1..0ec754e0c0 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -121,39 +121,6 @@ export default class AppTile extends React.Component { return u.format(); } - /** - * Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api - * @param {[type]} testUrlString URL to check - * @return {Boolean} True if specified URL is a scalar URL - */ - isScalarUrl(testUrlString) { - if (!testUrlString) { - console.error('Scalar URL check failed. No URL specified'); - return false; - } - - const testUrl = url.parse(testUrlString); - - let scalarUrls = SdkConfig.get().integrations_widgets_urls; - if (!scalarUrls || scalarUrls.length == 0) { - scalarUrls = [SdkConfig.get().integrations_rest_url]; - } - - for (let i = 0; i < scalarUrls.length; i++) { - const scalarUrl = url.parse(scalarUrls[i]); - if (testUrl && scalarUrl) { - if ( - testUrl.protocol === scalarUrl.protocol && - testUrl.host === scalarUrl.host && - testUrl.pathname.startsWith(scalarUrl.pathname) - ) { - return true; - } - } - } - return false; - } - isMixedContent() { const parentContentProtocol = window.location.protocol; const u = url.parse(this.props.url); @@ -209,7 +176,7 @@ export default class AppTile extends React.Component { setScalarToken() { this.setState({initialising: true}); - if (!this.isScalarUrl(this.props.url)) { + if (!WidgetUtils.isScalarUrl(this.props.url)) { console.warn('Non-scalar widget, not setting scalar token!', url); this.setState({ error: null, From 77bfce5f9af813ed0359568f5a011c5256b9e9ee Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Sun, 27 May 2018 23:46:28 +0000 Subject: [PATCH 110/480] Translated using Weblate (Basque) Currently translated at 100.0% (1190 of 1190 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 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 04d2e86664..c293ec135d 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1183,5 +1183,17 @@ "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Matrix-eko mezuen ikusgaitasuna, e-mail mezuen antzekoa da. Zure mezuak ezabatzeak esan nahi du bidali dituzun mezuak ez direla erabiltzaile berriekin partekatuko, baina aurretik zure mezuak jaso dituzten erabiltzaile erregistratuek bere kopia izango dute.", "To continue, please enter your password:": "Jarraitzeko, sartu zure pasahitza:", "password": "pasahitza", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Ezabatu bidali ditudan mezu guztiak nire kontua desaktibatzean. (Abisua: Etorkizuneko erabiltzaileek elkarrizketa partzialak ikusiko dituzte, esperientzia kaskarra sortuz)." + "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Ezabatu bidali ditudan mezu guztiak nire kontua desaktibatzean. (Abisua: Etorkizuneko erabiltzaileek elkarrizketa partzialak ikusiko dituzte, esperientzia kaskarra sortuz).", + "e.g. %(exampleValue)s": "adib. %(exampleValue)s", + "Reload widget": "Birkargatu trepeta", + "To notify everyone in the room, you must be a": "Gelan dauden guztiei jakinarazteko", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Hobetu Riot.im <UsageDataLink>erabilera-datu anonimoak</UsageDataLink> bidaliz. Honek coockie bat erabiliko du (Ikusi gure <PolicyLink>Cookie politika</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Hobetu Riot.im <UsageDataLink>erabilera-datu anonimoak</UsageDataLink> bidaliz. Honek cookie bat erabiliko du.", + "Yes, I want to help!": "Bai, lagundu nahi dut!", + "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. <b>This action is irreversible.</b>": "Honek kontua behin betirako erabilgaitza bihurtuko du. Ezin izango duzu saioa hasi, eta ezin izango du beste inork ID hori erabili. Kontua dagoen gela guztietatik aterako da, eta kontuaren xehetasunak identitate-zerbitzaritik ezabatuko dira. <b>Ekintza hau ezin da desegin.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Kontua desaktibatzean <b>ez dira zuk bidalitako mezuak ahaztuko.</b> Mezuak ahaztea nahi baduzu markatu beheko kutxa.", + "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.": "Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ahaztean ez dizkiogu erabiltzaile berriei edo izena eman ez dutenei erakutsiko, baina jada zure mezuak jaso diztuzten erregistratutako erabiltzaileen bere kopia izaten jarraituko dute.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Ahaztu bidali ditudan mezu guztiak kontua desaktibatzean (Abisua: Honekin etorkizuneko erabiltzaileek elkarrizketaren bertsio ez oso bat ikusiko dute)", + "Can't leave Server Notices room": "Ezin zara Server Notices gelatik atera", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Gela hau mezu hasiera zerbitzariaren garrantzitsuak bidaltzeko erabiltzen da, eta ezin zara atera." } From 5a9c32a5a72e33092fa75838400ca16e33b61afe Mon Sep 17 00:00:00 2001 From: Brendan Abolivier <contact@brendanabolivier.com> Date: Sun, 27 May 2018 18:17:29 +0000 Subject: [PATCH 111/480] Translated using Weblate (French) Currently translated at 100.0% (1190 of 1190 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 64093ebb0d..0d8cf10f8d 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1196,5 +1196,5 @@ "Yes, I want to help!": "Oui, je veux aider !", "Can't leave Server Notices room": "Impossible de quitter le salon des Annonces du serveur", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ce salon est utilisé pour les messages importants du serveur d'accueil, donc vous ne pouvez pas en partir.", - "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être" + "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être un" } From 9b86040856591c12a8b50ea99442360e220668af Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Thu, 24 May 2018 23:50:05 +0000 Subject: [PATCH 112/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1190 of 1190 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 f545df95d3..80dce1cc2d 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1190,5 +1190,6 @@ "This room is used for important messages from the Homeserver, so you cannot leave it.": "這個聊天室是用於發佈從家伺服器而來的重要訊息,所以您不能離開它。", "Terms and Conditions": "條款與細則", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "要繼續使用 %(homeserverDomain)s 家伺服器,您必須審閱並同意我們的條款與細則。", - "Review terms and conditions": "審閱條款與細則" + "Review terms and conditions": "審閱條款與細則", + "To notify everyone in the room, you must be a": "為了通知每個在聊天室裡的人,您必須為" } From 779579dea4a4578d696e338e000d8ce5105c25f6 Mon Sep 17 00:00:00 2001 From: Nathan van Beelen <nathan@vanbeelen.org> Date: Mon, 28 May 2018 07:40:11 +0000 Subject: [PATCH 113/480] Translated using Weblate (Dutch) Currently translated at 100.0% (1190 of 1190 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 | 44 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 0df2cf1bd7..e71463564a 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1146,5 +1146,47 @@ "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.": "Debug logs bevatten applicatie-gebruik data inclusief je gebruikersnaam, de ID's of namen van de ruimtes en groepen die je hebt bezocht en de gebruikersnamen van andere gebruikers. Ze bevatten geen berichten.", "Failed to send logs: ": "Het is niet gelukt om de logs te versturen: ", "Notes:": "Constateringen:", - "Preparing to send logs": "Voorbereiden om logs te versturen" + "Preparing to send logs": "Voorbereiden om logs te versturen", + "e.g. %(exampleValue)s": "bijv. %(exampleValue)s", + "Every page you use in the app": "Elke pagina die je in de applicatie gebruikt", + "e.g. <CurrentPageURL>": "bijv. <CurrentPageURL>", + "Your User Agent": "Je gebruikersagent", + "Your device resolution": "De resolutie van je apparaat", + "Reload widget": "Widget herladen", + "Missing roomId.": "roomId mist.", + "Always show encryption icons": "Altijd versleutelingsiconen weergeven", + "Send analytics data": "Statistische gegevens (analytics) versturen", + "Enable widget screenshots on supported widgets": "Widget schermafbeeldingen op ondersteunde widgets aanzetten", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Op dit moment is het niet mogelijk om te reageren met een bestand het zal dus als een normaal bericht worden verstuurd.", + "Unable to reply": "Niet mogelijk om te reageren", + "At this time it is not possible to reply with an emote.": "Op dit moment is het niet mogelijk om met een emote te reageren.", + "To notify everyone in the room, you must be a": "Om iedereen in de ruimte te notificeren moet je het volgende zijn:", + "Muted Users": "Gedempte Gebruikers", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Help Riot.im te verbeteren door het versturen van <UsageDataLink>anonieme gebruiksgegevens</UsageDataLink>. Dit zal een cookie gebruiken (zie ons <PolicyLink>Cookiebeleid</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Help Riot.im te verbeteren door het versturen van <UsageDataLink>anonieme gebruiksgegevens</UsageDataLink>. Dit zal een cookie gebruiken.", + "Yes, I want to help!": "Ja, ik wil helpen!", + "Warning: This widget might use cookies.": "Waarschuwing: deze widget gebruikt misschien cookies.", + "Popout widget": "Opspringende widget", + "Picture": "Afbeelding", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Niet mogelijk om de gebeurtenis te laden waar op gereageerd was. Het kan zijn dat het niet bestaat of dat je niet toestemming hebt om het te bekijken.", + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot fouten worden bijgehouden op GitHub: <a>maak een GitHub melding</a>.", + "Failed to indicate account erasure": "Niet gelukt om de accountverwijdering aan te geven", + "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. <b>This action is irreversible.</b>": "Dit zal je account voorgoed onbruikbaar maken. Je zal niet meer in kunnen loggen en niemand anders zal met dezelfde gebruikers ID kunnen registreren. Dit zal er voor zorgen dat je account alle ruimtes verlaat waar het momenteel onderdeel van is en het verwijderd de accountgegevens van de identiteitsserver. <b>Deze actie is onomkeerbaar.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Het deactiveren van je account <b>zal er niet standaard voor zorgen dat de berichten die je verzonden hebt vergeten worden.</b> Als je wilt dat wij de berichten vergeten, klikt alsjeblieft op het vakje hieronder.", + "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.": "De zichtbaarheid van berichten in Matrix is hetzelfde als in e-mail. Het vergeten van je berichten betekent dat berichten die je hebt verstuurd niet meer gedeeld worden met nieuwe of ongeregistreerde gebruikers, maar geregistreerde gebruikers die al toegang hebben tot deze berichten zullen alsnog toegang hebben tot hun eigen kopie van het bericht.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Vergeet alle berichten die ik heb verstuurd wanneer mijn account gedeactiveerd is (<b>Waarschuwing:</b> dit zal er voor zorgen dat toekomstige gebruikers een incompleet beeld krijgen van gesprekken)", + "To continue, please enter your password:": "Om verder te gaan, vul alsjeblieft je wachtwoord in:", + "password": "wachtwoord", + "Log out and remove encryption keys?": "Uitloggen en versleutelingssleutels verwijderen?", + "Clear Storage and Sign Out": "Leeg Opslag en Log Uit", + "Send Logs": "Logboek Versturen", + "Refresh": "Herladen", + "We encountered an error trying to restore your previous session.": "Er is een fout opgetreden tijdens het herstellen van je vorige sessie.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Het opschonen van je browser's opslag zal het probleem misschien oplossen, maar zal je uitloggen en ervoor zorgen dat alle versleutelde chat geschiedenis onleesbaar wordt.", + "Collapse Reply Thread": "Reactieketting Inklappen", + "Can't leave Server Notices room": "Kan de Server Meldingen ruimte niet verlaten", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Deze ruimte wordt gebruikt voor belangrijke berichten van de thuisserver, dus je kan het niet verlaten.", + "Terms and Conditions": "Voorwaarden", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Om de %(homeserverDomain)s thuisserver te blijven gebruiken zal je de voorwaarden moeten lezen en ermee akkoord moeten gaan.", + "Review terms and conditions": "Voorwaarden lezen" } From cc241edb4b2fa4da8ab247c75534bd54eac418ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= <sv1@fellsnet.is> Date: Mon, 28 May 2018 10:57:38 +0000 Subject: [PATCH 114/480] Added translation using Weblate (Icelandic) --- src/i18n/strings/is.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/i18n/strings/is.json diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src/i18n/strings/is.json @@ -0,0 +1 @@ +{} From 181e5ee7d36c5c8c48179422fe9a4899cbd7b2be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= <sv1@fellsnet.is> Date: Mon, 28 May 2018 11:27:58 +0000 Subject: [PATCH 115/480] Translated using Weblate (Icelandic) Currently translated at 42.5% (506 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/is/ --- src/i18n/strings/is.json | 509 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 508 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 0967ef424b..aa56456458 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -1 +1,508 @@ -{} +{ + "This email address is already in use": "Þetta tölvupóstfang er nú þegar í notkun", + "This phone number is already in use": "Þetta símanúmer er nú þegar í notkun", + "Failed to verify email address: make sure you clicked the link in the email": "Gat ekki sannprófað tölvupóstfang: gakktu úr skugga um að þú hafir smellt á tengilinn í tölvupóstinum", + "e.g. %(exampleValue)s": "t.d. %(exampleValue)s", + "e.g. <CurrentPageURL>": "t.d. <CurrentPageURL>", + "Your User Agent": "Kennisstrengur þinn", + "Your device resolution": "Skjáupplausn tækisins þíns", + "Analytics": "Greiningar", + "Call Anyway": "hringja samt", + "Answer Anyway": "Svara samt", + "Call": "Símtal", + "Answer": "Svara", + "The remote side failed to pick up": "Ekki var svarað á fjartengda endanum", + "VoIP is unsupported": "Enginn stuðningur við VoIP", + "Conference calls are not supported in encrypted rooms": "Símafundir eru ekki studdir í dulrituðum spjallrásum", + "Warning!": "Aðvörun!", + "Conference calling is in development and may not be reliable.": "Símafundir eru í þróun og gætu verið óáreiðanlegir.", + "Upload Failed": "Upphleðsla mistókst", + "Sun": "sun", + "Mon": "mán", + "Tue": "þri", + "Wed": "mið", + "Thu": "fim", + "Fri": "fös", + "Sat": "lau", + "Jan": "jan", + "Feb": "feb", + "Mar": "mar", + "Apr": "apr", + "May": "maí", + "Jun": "jún", + "Jul": "júl", + "Aug": "ágú", + "Sep": "sep", + "Oct": "okt", + "Nov": "nóv", + "Dec": "des", + "PM": "e.h.", + "AM": "f.h.", + "%(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", + "Room name or alias": "Nafn eða samnefni spjallrásar", + "Default": "Sjálfgefið", + "Restricted": "Takmarkað", + "Moderator": "Umsjónarmaður", + "Admin": "Stjórnandi", + "Start a chat": "Hefja spjall", + "Email, name or matrix ID": "Tölvupóstfang, nafn eða Matrix-auðkenni", + "Start Chat": "Hefja spjall", + "Operation failed": "Aðgerð tókst ekki", + "You need to be logged in.": "Þú þarft að vera skráð/ur inn.", + "Unable to create widget.": "Gat ekki búið til viðmótshluta.", + "Failed to send request.": "Mistókst að senda beiðni.", + "This room is not recognised.": "Spjallrás er ekki þekkt.", + "Power level must be positive integer.": "Völd verða að vera jákvæð heiltala.", + "You are not in this room.": "Þú ert ekki á þessari spjallrás.", + "You do not have permission to do that in this room.": "Þú hefur ekki réttindi til þess að gera þetta á þessari spjallrás.", + "Missing room_id in request": "Vantar spjallrásarauðkenni í beiðni", + "Missing user_id in request": "Vantar notandaauðkenni í beiðni", + "Usage": "Notkun", + "Reason": "Ástæða", + "VoIP conference started.": "VoIP-símafundur hafinn.", + "VoIP conference finished.": "VoIP-símafundi lokið.", + "Someone": "Einhver", + "(not supported by this browser)": "(Ekki stutt af þessum vafra)", + "(no answer)": "(ekkert svar)", + "Send anyway": "Senda samt", + "Send": "Senda", + "Unnamed Room": "Nafnlaus spjallrás", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Fela taka-þátt/hætta skilaboð (hefur ekki áhrif á boð/spörk/bönn)", + "Hide read receipts": "Fela leskvittanir", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Birta tímamerki á 12 stunda sniði (t.d. 2:30 fh)", + "Always show message timestamps": "Alltaf birta tímamerki skilaboða", + "Send analytics data": "Senda greiningargögn", + "Never send encrypted messages to unverified devices from this device": "Aldrei senda dulrituð skilaboð af þessu tæki til ósannvottaðra tækja", + "Never send encrypted messages to unverified devices in this room from this device": "Aldrei senda dulrituð skilaboð af þessu tæki til ósannvottaðra tækja á þessari spjallrás", + "Enable inline URL previews by default": "Sjálfgefið virkja forskoðun innfelldra vefslóða", + "Room Colour": "Litur spjallrásar", + "Collecting app version information": "Safna upplýsingum um útgáfu forrits", + "Collecting logs": "Safna atvikaskrám", + "Uploading report": "Sendi inn skýrslu", + "Waiting for response from server": "Bíð eftir svari frá vefþjóni", + "Messages containing my display name": "Skilaboð sem innihalda birtingarnafn mitt", + "Messages containing my user name": "Skilaboð sem innihalda notandanafn mitt", + "Messages in one-to-one chats": "Skilaboð í maður-á-mann spjalli", + "Messages in group chats": "Skilaboð í hópaspjalli", + "When I'm invited to a room": "Þegar mér er boðið á spjallrás", + "Call invitation": "Boð um þátttöku", + "Messages sent by bot": "Skilaboð send af vélmennum", + "unknown caller": "Óþekktur símnotandi", + "Incoming voice call from %(name)s": "Innhringing raddsamtals frá %(name)s", + "Incoming video call from %(name)s": "Innhringing myndsamtals frá %(name)s", + "Decline": "Hafna", + "Accept": "Samþykkja", + "Error": "Villa", + "Enter Code": "Settu inn kóða", + "Submit": "Senda inn", + "Phone": "Sími", + "Add phone number": "Bæta við símanúmeri", + "Add": "Bæta við", + "Continue": "Halda áfram", + "Export E2E room keys": "Flytja út E2E dulritunarlykla spjallrásar", + "Current password": "Núverandi lykilorð", + "Password": "Lykilorð", + "New Password": "Nýtt lykilorð", + "Confirm password": "Staðfestu lykilorðið", + "Change Password": "Breyta lykilorði", + "Authentication": "Auðkenning", + "Delete %(count)s devices|other": "Eyða %(count)s tækjum", + "Delete %(count)s devices|one": "Eyða tæki", + "Device ID": "Auðkenni tækis", + "Device Name": "Heiti tækis", + "Last seen": "Sást síðast", + "Enable Notifications": "Virkja tilkynningar", + "Error saving email notification preferences": "Villa við að vista valkosti pósttilkynninga", + "An error occurred whilst saving your email notification preferences.": "Villa kom upp við að vista valkosti tilkynninga í tölvupósti.", + "Keywords": "Stikkorð", + "Enter keywords separated by a comma:": "Settu inn stikkorð aðskilin með kommu:", + "OK": "Í lagi", + "Failed to change settings": "Mistókst að breyta stillingum", + "Can't update user notification settings": "Gat ekki uppfært stillingar á tilkynningum notandans", + "Failed to update keywords": "Mistókst að uppfæra stikkorð", + "Messages containing <span>keywords</span>": "Skilaboð sem innihalda <span>kstikkorð</span>", + "Notify for all other messages/rooms": "Senda tilkynningar fyrir öll önnur skilaboð/spjallrásir", + "Notify me for anything else": "Senda mér tilkynningar fyrir allt annað", + "Enable notifications for this account": "Virkja tilkynningar fyrir þennan notandaaðgang", + "Add an email address above to configure email notifications": "Settu inn tölvupóstfang hér fyrir ofan til að stilla tilkynningar með tölvupósti", + "Enable email notifications": "Virkja tilkynningar í tölvupósti", + "Notification targets": "Markmið tilkynninga", + "Advanced notification settings": "Ítarlegar stillingar á tilkynningum", + "Enable desktop notifications": "Virkja tilkynningar á skjáborði", + "Show message in desktop notification": "Birta tilkynningu í innbyggðu kerfistilkynningakerfi", + "Enable audible notifications in web client": "Virkja hljóðtilkynningar í vefviðmóti", + "Off": "Slökkt", + "On": "Kveikt", + "Noisy": "Hávært", + "Add a widget": "Bæta við viðmótshluta", + "Drop File Here": "Slepptu skrá hérna", + "Drop file here to upload": "Slepptu hér skrá til að senda inn", + " (unsupported)": "[óstutt]", + "%(senderName)s sent an image": "%(senderName)s sendi mynd", + "%(senderName)s sent a video": "%(senderName)s sendi myndskeið", + "%(senderName)s uploaded a file": "%(senderName)s sendi inn skrá", + "Options": "Valkostir", + "Unencrypted message": "Ódulrituð skilaboð", + "Blacklisted": "Á bannlista", + "Verified": "Sannreynt", + "Unverified": "Óstaðfest", + "device id: ": "Auðkenni tækis: ", + "Kick": "Sparka", + "Unban": "Afbanna", + "Ban": "Banna", + "Unban this user?": "Taka þennan notanda úr banni?", + "Ban this user?": "Banna þennan notanda?", + "Are you sure?": "Ertu viss?", + "Devices": "Tæki", + "Unignore": "Byrja að fylgjast með á ný", + "Ignore": "Hunsa", + "Mention": "Minnst á", + "Invite": "Bjóða", + "User Options": "User Options", + "Direct chats": "Beint spjall", + "Unmute": "Kveikja á hljóði", + "Mute": "Þagga hljóð", + "Make Moderator": "Gera að umsjónarmanni", + "Admin Tools": "Kerfisstjóratól", + "Level:": "Stig:", + "Invited": "Boðið", + "Filter room members": "Sía meðlimi spjallrásar", + "Attachment": "Viðhengi", + "Upload Files": "Senda inn skrár", + "Hangup": "Leggja á", + "Voice call": "Raddsamtal", + "Video call": "_Myndsímtal", + "Upload file": "Hlaða inn skrá", + "Send an encrypted message…": "Senda dulrituð skilaboð…", + "Send a message (unencrypted)…": "Senda skilaboð (ódulrituð)…", + "You do not have permission to post to this room": "Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás", + "Server error": "Villa á þjóni", + "Command error": "Skipanavilla", + "bold": "feitletrað", + "italic": "skáletrað", + "strike": "yfirstrikað", + "underline": "undirstrikað", + "code": "kóði", + "quote": "tilvitnun", + "bullet": "áherslumerki", + "Loading...": "Hleð inn...", + "Online": "Nettengt", + "Idle": "Iðjulaust", + "Offline": "Ótengt", + "Unknown": "Óþekkt", + "No rooms to show": "Engar spjallrásir sem hægt er að birta", + "Unnamed room": "Nafnlaus spjallrás", + "World readable": "Lesanlegt öllum", + "Guests can join": "Gestir geta tekið þátt", + "Save": "Vista", + "Join Room": "Taka þátt í spjallrás", + "Settings": "Stillingar", + "Forget room": "Gleyma spjallrás", + "Search": "Leita", + "Invites": "Boðsgestir", + "Favourites": "Eftirlæti", + "People": "Fólk", + "Rooms": "Spjallrásir", + "Low priority": "Lítill forgangur", + "Historical": "Ferilskráning", + "Rejoin": "Taka þátt aftur", + "This room": "Þessi spjallrás", + "This is a preview of this room. Room interactions have been disabled": "Þetta er forskoðun á spjallrásinni. Samskipti spjallrásarinnar hafa verið gerð óvirk", + "Privacy warning": "Aðvörun vegna gagnaleyndar", + "unknown error code": "óþekktur villukóði", + "Failed to forget room %(errCode)s": "Mistókst að gleyma spjallrásinni %(errCode)s", + "Encryption is enabled in this room": "Dulritun er virk í þessari spjallrás", + "Encryption is not enabled in this room": "Dulritun er ekki virk í þessari spjallrás", + "Banned users": "Bannaðir notendur", + "Leave room": "Fara af spjallrás", + "Favourite": "Eftirlæti", + "Tagged as: ": "Merkt sem:", + "To link to a room it must have <a>an address</a>.": "Til að tengja við spjallrás verður hún að vera með <a>vistfang</a>.", + "Who can access this room?": "Hver hefur aðgang að þessari spjallrás?", + "Only people who have been invited": "Aðeins fólk sem hefur verið boðið", + "Anyone who knows the room's link, apart from guests": "Hver sá sem þekkir slóðina á spjallrásina, fyrir utan gesti", + "Anyone who knows the room's link, including guests": "Hver sá sem þekkir slóðina á spjallrásina, að gestum meðtöldum", + "Who can read history?": "Hver getur lesið ferilskráningu?", + "Anyone": "Hver sem er", + "Members only (since the point in time of selecting this option)": "Einungis meðlimir (síðan þessi kostur var valinn)", + "Members only (since they were invited)": "Einungis meðlimir (síðan þeim var boðið)", + "Members only (since they joined)": "Einungis meðlimir (síðan þeir skráðu sig)", + "Permissions": "Heimildir", + "Advanced": "Nánar", + "Search…": "Leita…", + "This Room": "Þessi spjallrás", + "All Rooms": "Allar spjallrásir", + "Cancel": "Hætta við", + "Jump to first unread message.": "Fara í fyrstu ólesin skilaboð.", + "Close": "Loka", + "Invalid alias format": "Ógilt snið samnefnis", + "not specified": "ekki tilgreint", + "not set": "ekki stillt", + "Addresses": "Vistföng", + "Invalid community ID": "Ógilt auðkenni samfélags", + "Flair": "Hlutverksmerki", + "This room is not showing flair for any communities": " Þessi spjallrás sýnir ekki hlutverksmerki fyrir nein samfélög", + "Sunday": "Sunnudagur", + "Monday": "Mánudagur", + "Tuesday": "Þriðjudagur", + "Wednesday": "Miðvikudagur", + "Thursday": "Fimmtudagur", + "Friday": "Föstudagur", + "Saturday": "Laugardagur", + "Today": "Í dag", + "Yesterday": "Í gær", + "Error decrypting attachment": "Villa við afkóðun viðhengis", + "Copied!": "Afritað", + "This Home Server would like to make sure you are not a robot": "Þessi heimavefþjónn vill ganga úr skugga um að þú sért ekki vélmenni", + "Custom Server Options": "Sérsniðnir valkostir vefþjóns", + "Dismiss": "Hunsa", + "To continue, please enter your password.": "Til að halda áfram, settu inn lykilorðið þitt.", + "Password:": "Lykilorð:", + "Please check your email to continue registration.": "Skoðaðu tölvupóstinn þinn til að geta haldið áfram með skráningu.", + "Code": "Kóði", + "powered by Matrix": "keyrt með Matrix", + "User name": "Notandanafn", + "Forgot your password?": "Gleymdirðu lykilorðinu?", + "Email address": "Tölvupóstfang", + "Sign in": "Skrá inn", + "Email address (optional)": "Tölvupóstfang (valfrjálst)", + "Register": "Nýskrá", + "Home server URL": "Slóð á heimaþjón", + "Identity server URL": "Slóð á auðkennisþjón", + "What does this mean?": "Hvað þýðir þetta?", + "Filter community members": "Sía meðlimi samfélags", + "Remove": "Fjarlægja", + "Something went wrong!": "Eitthvað fór úrskeiðis!", + "Filter community rooms": "Sía spjallrásir samfélags", + "Yes, I want to help!": "Já, ég vil hjálpa til", + "You are not receiving desktop notifications": "Þú færð ekki tilkynningar á skjáborði", + "Enable them now": "Virkja þetta núna", + "What's New": "Nýtt á döfinni", + "Update": "Uppfæra", + "What's new?": "Hvað er nýtt á döfinni?", + "A new version of Riot is available.": "Ný útgáfa af Riot er tiltæk.", + "Set Password": "Setja lykilorð", + "Error encountered (%(errorDetail)s).": "Villa fannst (%(errorDetail)s).", + "Checking for an update...": "Athuga með uppfærslu...", + "No update available.": "Engin uppfærsla tiltæk.", + "Downloading update...": "Sæki uppfærslu...", + "Warning": "Aðvörun", + "Allow": "Leyfa", + "Picture": "Mynd", + "Edit": "Breyta", + "Unblacklist": "Taka af bannlista", + "Blacklist": "Bannlisti", + "Unverify": "Afturkalla sannvottun", + "Verify...": "Sannreyna...", + "No results": "Engar niðurstöður", + "Delete": "Eyða", + "Communities": "Samfélög", + "Home": "Heim", + "You cannot delete this image. (%(code)s)": "Þú getur ekki eytt þessari mynd. (%(code)s)", + "Uploaded on %(date)s by %(user)s": "Sent inn %(date)s af %(user)s", + "Download this file": "Sækja þessa skrá", + "collapse": "fella saman", + "expand": "fletta út", + "<a>In reply to</a> <pill>": "<a>Sem svar til</a> <pill>", + "Room directory": "Skrá yfir spjallrásir", + "Start chat": "Hefja spjall", + "Add User": "Bæta við notanda", + "email address": "tölvupóstfang", + "Preparing to send logs": "Undirbý sendingu atvikaskráa", + "Logs sent": "Sendi atvikaskrár", + "Thank you!": "Takk fyrir!", + "Failed to send logs: ": "Mistókst að senda atvikaskrár: ", + "Submit debug logs": "Senda inn aflúsunarannála", + "GitHub issue link:": "Slóð villutilkynningar á GitHub:", + "Notes:": "Athugasemdir:", + "Send logs": "Senda atvikaskrá", + "Unavailable": "Ekki tiltækt", + "Changelog": "Breytingaskrá", + "Start new chat": "Hefja nýtt spjall", + "Start Chatting": "Hefja spjall", + "Confirm Removal": "Staðfesta fjarlægingu", + "Create Community": "Búa til samfélag", + "Community Name": "Heiti samfélags", + "Example": "Dæmi", + "Community ID": "Auðkenni samfélags", + "example": "dæmi", + "Create": "Búa til", + "Create Room": "Búa til spjallrás", + "Room name (optional)": "Heiti spjallrásar (valkvætt)", + "Advanced options": "Ítarlegir valkostir", + "Unknown error": "Óþekkt villa", + "Incorrect password": "Rangt lykilorð", + "Deactivate Account": "Gera notandaaðgang óvirkann", + "To continue, please enter your password:": "Til að halda áfram, settu inn lykilorðið þitt:", + "password": "lykilorð", + "Device name": "Heiti tækis", + "Device key": "Dulritunarlykill tækis", + "Verify device": "Sannreyna tæki", + "I verify that the keys match": "Ég staðfesti hvort dulritunarlyklarnir samsvari", + "Back": "Til baka", + "Send Account Data": "Senda upplýsingar um notandaaðgang", + "Filter results": "Sía niðurstöður", + "Toolbox": "Verkfærakassi", + "Developer Tools": "Forritunartól", + "An error has occurred.": "Villa kom upp.", + "Start verification": "Hefja sannvottun", + "Share without verifying": "Deila án sannvottunar", + "Ignore request": "Hunsa beiðni", + "Encryption key request": "Beiðni um dulritunarlykil", + "Sign out": "Skrá út", + "Send Logs": "Senda atvikaskrár", + "Refresh": "Endurlesa", + "Invalid Email Address": "Ógilt tölvupóstfang", + "Verification Pending": "Sannvottun í bið", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Skoðaðu tölvupóstinn þinn og smelltu á tengilinn sem hann inniheldur. Þegar því er lokið skaltu smella á að halda áfram.", + "Skip": "Sleppa", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "Notendanöfn mega einungis innihalda bókstafi, tölustafi, punkta, bandstrik eða undirstrik.", + "Username not available": "Notandanafnið er ekki tiltækt", + "Username available": "Notandanafnið er tiltækt", + "You have successfully set a password!": "Þér tókst að setja lykilorð!", + "You have successfully set a password and an email address!": "Þér tókst að setja lykilorð og tölvupóstfang!", + "Failed to change password. Is your password correct?": "Mistókst að breyta lykilorðinu. Er lykilorðið rétt?", + "(HTTP status %(httpStatus)s)": "(HTTP staða %(httpStatus)s)", + "Please set a password!": "Stilltu lykilorð!", + "Room contains unknown devices": "Spjallrás inniheldur óþekkt tæki", + "Unknown devices": "Óþekkt tæki", + "Custom": "Sérsniðið", + "Alias (optional)": "Samnefni (valfrjálst)", + "You cannot delete this message. (%(code)s)": "Þú getur ekki eytt þessum skilaboðum. (%(code)s)", + "Resend": "Endursenda", + "Cancel Sending": "Hætta við sendingu", + "Forward Message": "Áframsenda skeyti", + "Reply": "Svara", + "Pin Message": "Festa skeyti", + "View Source": "Skoða frumkóða", + "View Decrypted Source": "Skoða afkóðaða upprunaskrá", + "Unhide Preview": "Birta forskoðun", + "Permalink": "Varanlegur tengill", + "Quote": "Tilvitnun", + "Source URL": "Upprunaslóð", + "All messages (noisy)": "Öll skilaboð (hávært)", + "All messages": "Öll skilaboð", + "Mentions only": "Aðeins minnst á", + "Leave": "Fara út", + "Forget": "Gleyma", + "Reject": "Hafna", + "Low Priority": "Lítill forgangur", + "Direct Chat": "Beint spjall", + "View Community": "Skoða samfélag", + "Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Endilega settu upp <chromeLink>Chrome</chromeLink> eða <firefoxLink>Firefox</firefoxLink> til að þetta gangi sem best.", + "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> og <operaLink>Opera</operaLink> virka líka ágætlega.", + "I understand the risks and wish to continue": "Ég skil áhættuna og vil halda áfram", + "Name": "Nafn", + "Topic": "Umfjöllunarefni", + "Failed to upload image": "Gat ekki sent inn mynd", + "Add rooms to this community": "Bæta spjallrásum í þetta samfélag", + "Featured Users:": "Notendur í sviðsljósinu:", + "Everyone": "Allir", + "Description": "Lýsing", + "Login": "Innskráning", + "Signed Out": "Skráð/ur út", + "Terms and Conditions": "Skilmálar og kvaðir", + "Logout": "Útskráning", + "Members": "Meðlimir", + "%(count)s Members|other": "%(count)s þátttakendur", + "%(count)s Members|one": "%(count)s þátttakandi", + "Invite to this room": "Bjóða inn á þessa spjallrás", + "Files": "Skrár", + "Notifications": "Tilkynningar", + "Hide panel": "Fela spjald", + "Invite to this community": "Bjóða í þetta samfélag", + "The server may be unavailable or overloaded": "Netþjónninn gæti verið undir miklu álagi eða ekki til taks", + "Room not found": "Spjallrás fannst ekki", + "Directory": "Efnisskrá", + "Search for a room": "Leita að spjallrás", + "#example": "#dæmi", + "Connectivity to the server has been lost.": "Tenging við vefþjón hefur rofnað.", + "Active call": "Virkt samtal", + "more": "meira", + "Failed to upload file": "Gat ekki sent inn skrá", + "Search failed": "Leit mistókst", + "Room": "Spjallrás", + "Fill screen": "Fylla skjáinn", + "Expand panel": "Fletta út spjaldi", + "Collapse panel": "Fella saman spjald", + "Filter room names": "Sía heiti spjallrása", + "Clear filter": "Hreinsa síu", + "Light theme": "Ljóst þema", + "Dark theme": "Dökkt þema", + "Success": "Tókst", + "Interface Language": "Tungumál notandaviðmóts", + "User Interface": "Notandaviðmót", + "Import E2E room keys": "Flytja inn E2E dulritunarlykla spjallrásar", + "Cryptography": "Dulritun", + "Device ID:": "Auðkenni tækis:", + "Device key:": "Dulritunarlykill tækis:", + "Ignored Users": "Hunsaðir notendur", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot safnar nafnlausum greiningargögnum til að gera okkur kleift að bæta forritið.", + "Labs": "Tilraunir", + "Deactivate my account": "Gera notandaaðganginn minn óvirkann", + "Clear Cache": "Hreinsa skyndiminni", + "Updates": "Uppfærslur", + "Check for update": "Athuga með uppfærslu", + "Default Device": "Sjálfgefið tæki", + "Microphone": "Hljóðnemi", + "Camera": "Myndavél", + "VoIP": "VoIP", + "Email": "Tölvupóstur", + "Add email address": "Bæta við tölvupóstfangi", + "Profile": "Notandasnið", + "Display name": "Birtingarnafn", + "Account": "Notandaaðgangur", + "Logged in as:": "Skráð inn sem:", + "Access Token:": "Aðgangsteikn:", + "click to reveal": "smelltu til að birta", + "Identity Server is": "Auðkennisþjónn er", + "matrix-react-sdk version:": "Útgáfa matrix-react-sdk:", + "riot-web version:": "Útgáfa riot-web:", + "olm version:": "Útgáfa olm:", + "Failed to send email": "Mistókst að senda tölvupóst", + "The email address linked to your account must be entered.": "Það þarf að setja inn tölvupóstfangið sem tengt er notandaaðgangnum þínum.", + "A new password must be entered.": "Það verður að setja inn nýtt lykilorð.", + "New passwords must match each other.": "Nýju lykilorðin verða að vera þau sömu.", + "I have verified my email address": "Ég hef staðfest tölvupóstfangið mitt", + "Return to login screen": "Fara aftur í innskráningargluggann", + "To reset your password, enter the email address linked to your account": "Til að endursetja lykilorðið þitt, settu þá inn tölvupóstfangið sem tengt er notandaaðgangnum þínum", + "New password": "Nýtt lykilorð", + "Confirm your new password": "Staðfestu nýtt lykilorð", + "Send Reset Email": "Senda endurstillingarpóst", + "Create an account": "Stofna notandaaðgang", + "Incorrect username and/or password.": "Rangt notandanafn og/eða lykilorð.", + "Upload an avatar:": "Hlaða inn auðkennismynd:", + "Missing password.": "Lykilorð vantar.", + "Passwords don't match.": "Lykilorðin samsvara ekki.", + "This doesn't look like a valid email address.": "Þetta lítur ekki út eins og gilt tölvupóstfang.", + "This doesn't look like a valid phone number.": "Þetta lítur ekki út eins og gilt símanúmer.", + "An unknown error occurred.": "Óþekkt villa kom upp.", + "Commands": "Skipanir", + "Users": "Notendur", + "unknown device": "óþekkt tæki", + "NOT verified": "EKKI sannreynt", + "verified": "sannreynt", + "Verification": "Sannvottun", + "Ed25519 fingerprint": "Ed25519 fingrafar", + "User ID": "Notandaauðkenni", + "Curve25519 identity key": "Curve25519 auðkennislykill", + "none": "ekkert", + "Claimed Ed25519 fingerprint key": "Tilkynnti Ed25519 fingrafarslykil", + "Algorithm": "Reiknirit", + "unencrypted": "ódulritað", + "Decryption error": "Afkóðunarvilla", + "Session ID": "Auðkenni setu", + "End-to-end encryption information": "Enda-í-enda dulritunarupplýsingar", + "Event information": "Upplýsingar um viðburð", + "Sender device information": "Upplýsingar um tæki sendanda", + "Export room keys": "Flytja út dulritunarlykla spjallrásar", + "Enter passphrase": "Settu inn lykilsetningu (passphrase)", + "Confirm passphrase": "Staðfestu lykilsetningu", + "Export": "Flytja út", + "Import room keys": "Flytja inn dulritunarlykla spjallrásar", + "File to import": "Skrá til að flytja inn", + "Import": "Flytja inn" +} From b6e2815f228ea47048f0f6074b900fbe40328431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= <sv1@fellsnet.is> Date: Mon, 28 May 2018 11:43:18 +0000 Subject: [PATCH 116/480] Translated using Weblate (Icelandic) Currently translated at 43.6% (520 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/is/ --- src/i18n/strings/is.json | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index aa56456458..3a8c98669d 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -9,7 +9,7 @@ "Analytics": "Greiningar", "Call Anyway": "hringja samt", "Answer Anyway": "Svara samt", - "Call": "Símtal", + "Call": "Samtal", "Answer": "Svara", "The remote side failed to pick up": "Ekki var svarað á fjartengda endanum", "VoIP is unsupported": "Enginn stuðningur við VoIP", @@ -140,7 +140,7 @@ "Add a widget": "Bæta við viðmótshluta", "Drop File Here": "Slepptu skrá hérna", "Drop file here to upload": "Slepptu hér skrá til að senda inn", - " (unsupported)": "[óstutt]", + " (unsupported)": " (óstutt)", "%(senderName)s sent an image": "%(senderName)s sendi mynd", "%(senderName)s sent a video": "%(senderName)s sendi myndskeið", "%(senderName)s uploaded a file": "%(senderName)s sendi inn skrá", @@ -191,7 +191,7 @@ "Loading...": "Hleð inn...", "Online": "Nettengt", "Idle": "Iðjulaust", - "Offline": "Ótengt", + "Offline": "Ónettengt", "Unknown": "Óþekkt", "No rooms to show": "Engar spjallrásir sem hægt er að birta", "Unnamed room": "Nafnlaus spjallrás", @@ -244,7 +244,7 @@ "Addresses": "Vistföng", "Invalid community ID": "Ógilt auðkenni samfélags", "Flair": "Hlutverksmerki", - "This room is not showing flair for any communities": " Þessi spjallrás sýnir ekki hlutverksmerki fyrir nein samfélög", + "This room is not showing flair for any communities": "Þessi spjallrás sýnir ekki hlutverksmerki fyrir nein samfélög", "Sunday": "Sunnudagur", "Monday": "Mánudagur", "Tuesday": "Þriðjudagur", @@ -450,7 +450,7 @@ "Microphone": "Hljóðnemi", "Camera": "Myndavél", "VoIP": "VoIP", - "Email": "Tölvupóstur", + "Email": "Tölvupóstfang", "Add email address": "Bæta við tölvupóstfangi", "Profile": "Notandasnið", "Display name": "Birtingarnafn", @@ -496,7 +496,7 @@ "Decryption error": "Afkóðunarvilla", "Session ID": "Auðkenni setu", "End-to-end encryption information": "Enda-í-enda dulritunarupplýsingar", - "Event information": "Upplýsingar um viðburð", + "Event information": "Upplýsingar um atburð", "Sender device information": "Upplýsingar um tæki sendanda", "Export room keys": "Flytja út dulritunarlykla spjallrásar", "Enter passphrase": "Settu inn lykilsetningu (passphrase)", @@ -504,5 +504,19 @@ "Export": "Flytja út", "Import room keys": "Flytja inn dulritunarlykla spjallrásar", "File to import": "Skrá til að flytja inn", - "Import": "Flytja inn" + "Import": "Flytja inn", + "The platform you're on": "Stýrikerfið sem þú ert á", + "The version of Riot.im": "Útgáfan af Riot.im", + "Your language of choice": "Tungumálið þitt", + "Your homeserver's URL": "Vefslóð á heimaþjóninn þinn", + "Your identity server's URL": "Vefslóð á auðkenningarþjóninn þinn", + "Review Devices": "Yfirfara tæki", + "Call Timeout": "Tímamörk hringingar", + "Unable to capture screen": "Get ekki tekið skjámynd", + "Name or matrix ID": "Nafn eða Matrix-auðkenni", + "Invite to Community": "Bjóða í samfélag", + "Add rooms to the community": "Bæta spjallrásum í þetta samfélag", + "Add to community": "Bæta í samfélag", + "Unable to enable Notifications": "Tekst ekki að virkja tilkynningar", + "This email address was not found": "Tölvupóstfangið fannst ekki" } From 4a3c7bc6e44dbff14935935e7270a53ec7a8504e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= <sv1@fellsnet.is> Date: Mon, 28 May 2018 15:42:49 +0000 Subject: [PATCH 117/480] Translated using Weblate (Icelandic) Currently translated at 54.2% (645 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/is/ --- src/i18n/strings/is.json | 131 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 3a8c98669d..4d48e32cf3 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -219,7 +219,7 @@ "Banned users": "Bannaðir notendur", "Leave room": "Fara af spjallrás", "Favourite": "Eftirlæti", - "Tagged as: ": "Merkt sem:", + "Tagged as: ": "Merkt sem: ", "To link to a room it must have <a>an address</a>.": "Til að tengja við spjallrás verður hún að vera með <a>vistfang</a>.", "Who can access this room?": "Hver hefur aðgang að þessari spjallrás?", "Only people who have been invited": "Aðeins fólk sem hefur verið boðið", @@ -341,7 +341,7 @@ "Device name": "Heiti tækis", "Device key": "Dulritunarlykill tækis", "Verify device": "Sannreyna tæki", - "I verify that the keys match": "Ég staðfesti hvort dulritunarlyklarnir samsvari", + "I verify that the keys match": "Ég staðfesti að dulritunarlyklarnir samsvari", "Back": "Til baka", "Send Account Data": "Senda upplýsingar um notandaaðgang", "Filter results": "Sía niðurstöður", @@ -518,5 +518,130 @@ "Add rooms to the community": "Bæta spjallrásum í þetta samfélag", "Add to community": "Bæta í samfélag", "Unable to enable Notifications": "Tekst ekki að virkja tilkynningar", - "This email address was not found": "Tölvupóstfangið fannst ekki" + "This email address was not found": "Tölvupóstfangið fannst ekki", + "Existing Call": "Fyrirliggjandi samtal", + "You are already in a call.": "Þú ert nú þegar í samtali.", + "Failed to set up conference call": "Mistókst að setja upp símafund", + "Invite new community members": "Bjóða nýjum meðlimum í samfélag", + "Which rooms would you like to add to this community?": "Hvaða spjallrásum myndir þú vilja bæta í þetta samfélag?", + "Invite new room members": "Bjóða nýjum meðlimum á spjallrás", + "Who would you like to add to this room?": "Hverjum myndir þú vilja bæta á þessa spjallrás?", + "Send Invites": "Senda boðskort", + "Failed to invite user": "Mistókst að bjóða notanda", + "Failed to invite": "Mistókst að bjóða", + "Reload widget": "Endurlesa viðmótshluta", + "Missing roomId.": "Vantar spjallrásarauðkenni.", + "/ddg is not a command": "/ddg er ekki skipun", + "Ignored user": "Hunsaður notandi", + "Device already verified!": "Tæki er þegar sannreynt!", + "Verified key": "Staðfestur dulritunarlykill", + "Unrecognised command:": "Óþekkt skipun:", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s breytti umræðuefninu í \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s fjarlægði heiti spjallrásarinnar.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s breytti heiti spjallrásarinnar í %(roomName)s.", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendi mynd.", + "%(senderName)s answered the call.": "%(senderName)s svaraði símtalinu.", + "Disinvite": "Taka boð til baka", + "Unknown Address": "Óþekkt vistfang", + "Delete Widget": "Eyða viðmótshluta", + "Delete widget": "Eyða viðmótshluta", + "Create new room": "Búa til nýja spjallrás", + "were invited %(count)s times|one": "var boðið", + "was invited %(count)s times|one": "var boðið", + "And %(count)s more...|other": "Og %(count)s til viðbótar...", + "ex. @bob:example.com": "t.d. @jon:netfang.is", + "Matrix ID": "Matrix-auðkenni", + "Matrix Room ID": "Matrix-auðkenni spjallrásar", + "Start chatting": "Hefja spjall", + "This setting cannot be changed later!": "Ekki er hægt að breyta þessari stillingu síðar!", + "Send Custom Event": "Senda sérsniðið atvik", + "Event sent!": "Atvik sent!", + "State Key": "Stöðulykill", + "Explore Room State": "Skoða stöðu spjallrásar", + "Explore Account Data": "Skoða aðgangsgögn", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Þú bættir við nýju tæki '%(displayName)s', sem er að krefjast dulritunarlykla.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "ósannvottaða tækið þitt '%(displayName)s' er að krefjast dulritunarlykla.", + "Loading device info...": "Hleð inn upplýsingum um tæki...", + "Log out and remove encryption keys?": "Skrá út og fjarlægja dulritunarlykla?", + "Clear Storage and Sign Out": "Hreinsa gagnageymslu og skrá út", + "Unable to restore session": "Tókst ekki að endurheimta setu", + "This doesn't appear to be a valid email address": "Þetta lítur ekki út eins og gilt tölvupóstfang", + "Unable to add email address": "Get ekki bætt við tölvupóstfangi", + "Unable to verify email address.": "Get ekki sannreynt tölvupóstfang.", + "Username invalid: %(errMessage)s": "Notandanafn er ógilt: %(errMessage)s", + "An error occurred: %(error_string)s": "Villa kom upp: %(error_string)s", + "To get started, please pick a username!": "Til að komast í gang, veldu fyrst notandanafn!", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" inniheldur tæki sem þú hefur ekki séð áður.", + "Private Chat": "Einkaspjall", + "Public Chat": "Opinbert spjall", + "Collapse Reply Thread": "Fella saman svarþráð", + "Sorry, your browser is <b>not</b> able to run Riot.": "Því miður, vafrinn þinn getur <b>ekki</b> keyrt Riot.", + "Make this room private": "Gera þessa spjallrás einka", + "Encrypt room": "Dulrita spjallrás", + "Add a Room": "Bæta við spjallrás", + "Add a User": "Bæta við notanda", + "Unable to accept invite": "Mistókst að þiggja boð", + "Unable to reject invite": "Mistókst að hafna boði", + "Unable to join community": "Tókst ekki að ganga í samfélag", + "Leave Community": "Hætta í samfélagi", + "Leave %(groupName)s?": "Hætta í %(groupName)s?", + "Unable to leave community": "Tókst ekki að hætta í samfélagi", + "Community Settings": "Samfélagsstillingar", + "Featured Rooms:": "Spjallrásir í sviðsljósinu:", + "%(inviter)s has invited you to join this community": "%(inviter)s hefur boðið þér að taka þátt í þessu samfélagi", + "Join this community": "Taka þátt í þessu samfélagi", + "Leave this community": "Hætta í þessu samfélagi", + "You are an administrator of this community": "Þú ert kerfisstjóri í þessu samfélagi", + "You are a member of this community": "Þú ert meðlimur í þessum hópi", + "Who can join this community?": "Hverjir geta tekið þátt í þessu samfélagi?", + "Long Description (HTML)": "Tæmandi lýsing (HTML)", + "Failed to load %(groupId)s": "Mistókst að hlaða inn %(groupId)s", + "Couldn't load home page": "Gat ekki hlaðið inn heimasíðu", + "Reject invitation": "Hafna boði", + "Are you sure you want to reject the invitation?": "Ertu viss um að þú viljir hafna þessu boði?", + "Failed to reject invitation": "Mistókst að hafna boði", + "Scroll to bottom of page": "Skruna neðst á síðu", + "No more results": "Ekki fleiri niðurstöður", + "Unknown room %(roomId)s": "Óþekkt spjallrás %(roomId)s", + "Failed to save settings": "Mistókst að vista stillingar", + "Failed to reject invite": "Mistókst að hafna boði", + "Click to unmute video": "Smelltu til að virkja hljóð í myndskeiði", + "Click to mute video": "Smelltu til að þagga niður í myndskeiði", + "Click to unmute audio": "Smelltu til að virkja hljóð", + "Click to mute audio": "Smelltu til að þagga niður hljóð", + "Failed to load timeline position": "Mistókst að hlaða inn staðsetningu á tímalínu", + "Uploading %(filename)s and %(count)s others|other": "Sendi inn %(filename)s og %(count)s til viðbótar", + "Uploading %(filename)s and %(count)s others|zero": "Sendi inn %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Sendi inn %(filename)s og %(count)s til viðbótar", + "Status.im theme": "Status.im þema", + "Can't load user settings": "Gat ekki hlaði inn notandastillingum", + "Server may be unavailable or overloaded": "Netþjónninn gæti verið undir miklu álagi eða ekki til taks", + "Remove Contact Information?": "Fjarlægja upplýsingar um tengilið?", + "Remove %(threePid)s?": "Fjarlægja %(threePid)s?", + "Unable to remove contact information": "Ekki tókst að fjarlægja upplýsingar um tengilið", + "Refer a friend to Riot:": "Mæla með Riot við vin:", + "Autocomplete Delay (ms):": "Töf við sjálfvirka klárun (msek):", + "<not supported>": "<ekki stutt>", + "These are experimental features that may break in unexpected ways": "Þetta eru eiginleikar á tilraunastigi sem gætu bilað á óvæntan hátt", + "Use with caution": "Notist með varúð", + "Clear Cache and Reload": "Hreinsa skyndiminni og endurhlaða", + "No Microphones detected": "Engir hljóðnemar fundust", + "No Webcams detected": "Engar vefmyndavélar fundust", + "Homeserver is": "Heimanetþjónn er", + "Login as guest": "Skrá inn sem gestur", + "Sign in to get started": "Skráðu þig inn til að komast í gang", + "Failed to fetch avatar URL": "Ekki tókst að sækja slóð á auðkennismynd", + "Set a display name:": "Stilltu birtingarnafn", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Lykilorð er of stutt (lágmark %(MIN_PASSWORD_LENGTH)s).", + "You need to enter a user name.": "Þú þarft að setja inn notandanafn.", + "I already have an account": "Ég er nú þegar með notandaaðgang", + "Displays action": "Birtir aðgerð", + "Changes your display nickname": "Breytir birtu gælunafni þínu", + "Searches DuckDuckGo for results": "Leitar í DuckDuckGo að niðurstöðum", + "Results from DuckDuckGo": "Leitarniðurstöður frá DuckDuckGo", + "Emoji": "Tjáningartáknmynd", + "Notify the whole room": "Tilkynna öllum á spjallrásinni", + "Room Notification": "Tilkynning á spjallrás", + "Passphrases must match": "Lykilfrasar verða að stemma", + "Passphrase must not be empty": "Lykilfrasi má ekki vera auður" } From 254e8c358aaf5cd7c20d7c005dccd805c1697ee8 Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Mon, 28 May 2018 11:38:09 -0600 Subject: [PATCH 118/480] Remove unused imports Signed-off-by: Travis Ralston <travpc@gmail.com> --- src/components/views/elements/AppPermission.js | 1 - src/components/views/elements/AppTile.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/components/views/elements/AppPermission.js b/src/components/views/elements/AppPermission.js index 6af3148e21..231ed52364 100644 --- a/src/components/views/elements/AppPermission.js +++ b/src/components/views/elements/AppPermission.js @@ -2,7 +2,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import url from 'url'; import { _t } from '../../../languageHandler'; -import SdkConfig from '../../../SdkConfig'; import WidgetUtils from "../../../WidgetUtils"; export default class AppPermission extends React.Component { diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 0ec754e0c0..429b5941b9 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -25,7 +25,6 @@ import PlatformPeg from '../../../PlatformPeg'; import ScalarAuthClient from '../../../ScalarAuthClient'; import WidgetMessaging from '../../../WidgetMessaging'; import TintableSvgButton from './TintableSvgButton'; -import SdkConfig from '../../../SdkConfig'; import Modal from '../../../Modal'; import { _t, _td } from '../../../languageHandler'; import sdk from '../../../index'; From f23f5614c104844f28771eb473288bfd7003dfc0 Mon Sep 17 00:00:00 2001 From: Nathan van Beelen <nathan@vanbeelen.org> Date: Mon, 28 May 2018 17:35:26 +0000 Subject: [PATCH 119/480] Translated using Weblate (Dutch) Currently translated at 100.0% (1190 of 1190 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 e71463564a..a6df7d69b2 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1172,7 +1172,7 @@ "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot fouten worden bijgehouden op GitHub: <a>maak een GitHub melding</a>.", "Failed to indicate account erasure": "Niet gelukt om de accountverwijdering aan te geven", "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. <b>This action is irreversible.</b>": "Dit zal je account voorgoed onbruikbaar maken. Je zal niet meer in kunnen loggen en niemand anders zal met dezelfde gebruikers ID kunnen registreren. Dit zal er voor zorgen dat je account alle ruimtes verlaat waar het momenteel onderdeel van is en het verwijderd de accountgegevens van de identiteitsserver. <b>Deze actie is onomkeerbaar.</b>", - "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Het deactiveren van je account <b>zal er niet standaard voor zorgen dat de berichten die je verzonden hebt vergeten worden.</b> Als je wilt dat wij de berichten vergeten, klikt alsjeblieft op het vakje hieronder.", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Het deactiveren van je account <b>zal er niet standaard voor zorgen dat de berichten die je verzonden hebt vergeten worden.</b> Als je wilt dat wij de berichten vergeten, klik alsjeblieft op het vakje hieronder.", "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.": "De zichtbaarheid van berichten in Matrix is hetzelfde als in e-mail. Het vergeten van je berichten betekent dat berichten die je hebt verstuurd niet meer gedeeld worden met nieuwe of ongeregistreerde gebruikers, maar geregistreerde gebruikers die al toegang hebben tot deze berichten zullen alsnog toegang hebben tot hun eigen kopie van het bericht.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Vergeet alle berichten die ik heb verstuurd wanneer mijn account gedeactiveerd is (<b>Waarschuwing:</b> dit zal er voor zorgen dat toekomstige gebruikers een incompleet beeld krijgen van gesprekken)", "To continue, please enter your password:": "Om verder te gaan, vul alsjeblieft je wachtwoord in:", From f885def74819a19061bf9c77336625ec83d232cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Mon, 28 May 2018 06:49:16 +0000 Subject: [PATCH 120/480] Translated using Weblate (French) Currently translated at 100.0% (1190 of 1190 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, 7 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 0d8cf10f8d..8dd45192e6 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -714,17 +714,17 @@ "To change the topic, you must be a": "Pour changer le sujet, vous devez être un", "To modify widgets in the room, you must be a": "Pour modifier les widgets, vous devez être un", "Banned by %(displayName)s": "Banni par %(displayName)s", - "To send messages, you must be a": "Pour envoyer des messages, vous devez être un", + "To send messages, you must be a": "Pour envoyer des messages, vous devez être un(e)", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s a changé les messages épinglés du salon.", "%(names)s and %(count)s others are typing|other": "%(names)s et %(count)s autres écrivent", "Jump to read receipt": "Aller à l'accusé de lecture", "World readable": "Lisible publiquement", "Guests can join": "Les invités peuvent rejoindre le salon", - "To invite users into the room, you must be a": "Pour inviter des utilisateurs dans le salon, vous devez être un", - "To configure the room, you must be a": "Pour configurer le salon, vous devez être un", - "To kick users, you must be a": "Pour exclure des utilisateurs, vous devez être un", - "To ban users, you must be a": "Pour bannir des utilisateurs, vous devez être un", - "To remove other users' messages, you must be a": "Pour supprimer les messages d'autres utilisateurs, vous devez être un", + "To invite users into the room, you must be a": "Pour inviter des utilisateurs dans le salon, vous devez être un(e)", + "To configure the room, you must be a": "Pour configurer le salon, vous devez être un(e)", + "To kick users, you must be a": "Pour exclure des utilisateurs, vous devez être un(e)", + "To ban users, you must be a": "Pour bannir des utilisateurs, vous devez être un(e)", + "To remove other users' messages, you must be a": "Pour supprimer les messages d'autres utilisateurs, vous devez être un(e)", "To send events of type <eventType/>, you must be a": "Pour envoyer des évènements du type <eventType/>, vous devez être un", "Invalid community ID": "Identifiant de communauté non valide", "'%(groupId)s' is not a valid community ID": "\"%(groupId)s\" n'est pas un identifiant de communauté valide", @@ -1196,5 +1196,5 @@ "Yes, I want to help!": "Oui, je veux aider !", "Can't leave Server Notices room": "Impossible de quitter le salon des Annonces du serveur", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ce salon est utilisé pour les messages importants du serveur d'accueil, donc vous ne pouvez pas en partir.", - "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être un" + "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être un(e)" } From 1bd8182b1a4fe4a3e33edd47b2b9956c76c5f23c Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Sun, 27 May 2018 19:14:49 +0000 Subject: [PATCH 121/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1190 of 1190 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 f15c8893b8..6b52958ea6 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1195,5 +1195,6 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Kérlek segíts javítani a Riot.im-et azzal, hogy <UsageDataLink>anonim felhasználási adatokat</UsageDataLink> küldesz. Ez szütit (cookie) fog használni.", "Yes, I want to help!": "Igen, segítek!", "Can't leave Server Notices room": "Nem lehet elhagyni a Szerver Üzenetek szobát", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba fontos szerverüzenetek közlésére jött létre, nem tudsz kilépni belőle." + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba fontos szerverüzenetek közlésére jött létre, nem tudsz kilépni belőle.", + "To notify everyone in the room, you must be a": "Hogy mindenkinek tudj üzenni ahhoz ilyen szinten kell lenned:" } From 6f6d28d4eecf32e2281cbed9cb60f8cf7938e68a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= <sv1@fellsnet.is> Date: Mon, 28 May 2018 15:45:16 +0000 Subject: [PATCH 122/480] Translated using Weblate (Icelandic) Currently translated at 54.2% (645 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/is/ --- src/i18n/strings/is.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 4d48e32cf3..d901c52f60 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -631,7 +631,7 @@ "Login as guest": "Skrá inn sem gestur", "Sign in to get started": "Skráðu þig inn til að komast í gang", "Failed to fetch avatar URL": "Ekki tókst að sækja slóð á auðkennismynd", - "Set a display name:": "Stilltu birtingarnafn", + "Set a display name:": "Stilltu birtingarnafn:", "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Lykilorð er of stutt (lágmark %(MIN_PASSWORD_LENGTH)s).", "You need to enter a user name.": "Þú þarft að setja inn notandanafn.", "I already have an account": "Ég er nú þegar með notandaaðgang", From e968ccb24ce999c02a1210b2bfb0ed1dbb052cba Mon Sep 17 00:00:00 2001 From: random <dictionary@tutamail.com> Date: Mon, 28 May 2018 09:45:04 +0000 Subject: [PATCH 123/480] Translated using Weblate (Italian) Currently translated at 99.4% (1183 of 1190 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 | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 068ad01ff1..fa22725f78 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1165,5 +1165,24 @@ "Clear Storage and Sign Out": "Elimina lo storage e disconnetti", "Send Logs": "Invia i log", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Eliminare lo storage del browser potrebbe risolvere il problema, ma verrai disconnesso e la cronologia delle chat criptate sarà illeggibile.", - "Collapse Reply Thread": "Riduci finestra di risposta" + "Collapse Reply Thread": "Riduci finestra di risposta", + "e.g. %(exampleValue)s": "es. %(exampleValue)s", + "Reload widget": "Ricarica widget", + "To notify everyone in the room, you must be a": "Per notificare chiunque nella stanza, devi essere un", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Per favore aiuta a migliorare Riot.im inviando <UsageDataLink>dati di utilizzo anonimi</UsageDataLink>. Verrà usato un cookie (vedi la nostra <PolicyLink>politica sui cookie</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Per favore aiutaci a migliorare Riot.im inviando <UsageDataLink>dati di utilizzo anonimi</UsageDataLink>. Verrà usato un cookie.", + "Yes, I want to help!": "Sì, voglio aiutare!", + "Warning: This widget might use cookies.": "Attenzione: questo widget potrebbe usare cookie.", + "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. <b>This action is irreversible.</b>": "Il tuo account sarà permanentemente inutilizzabile. Non potrai accedere e nessuno potrà ri-registrare lo stesso ID utente. Il tuo account abbandonerà tutte le stanze a cui partecipa e i dettagli del tuo account saranno rimossi dal server di identità. <b>Questa azione è irreversibile.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Disattivare il tuo account <b>non eliminerà in modo predefinito i messaggi che hai inviato</b>. Se vuoi che noi dimentichiamo i tuoi messaggi, seleziona la casella sotto.", + "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.": "La visibilità dei messaggi in Matrix è simile alle email. Se dimentichiamo i messaggi significa che quelli che hai inviato non verranno condivisi con alcun utente nuovo o non registrato, ma gli utenti registrati che avevano già accesso ai messaggi avranno ancora accesso alla loro copia.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Per favore dimenticate tutti i messaggi che ho inviato quando il mio account viene disattivato (Attenzione: gli utenti futuri vedranno un elenco incompleto di conversazioni)", + "To continue, please enter your password:": "Per continuare, inserisci la tua password:", + "password": "password", + "Can't leave Server Notices room": "Impossibile abbandonare la stanza Notifiche Server", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Questa stanza viene usata per messaggi importanti dall'homeserver, quindi non puoi lasciarla.", + "Terms and Conditions": "Termini e condizioni", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Per continuare a usare l'homeserver %(homeserverDomain)s devi leggere e accettare i nostri termini e condizioni.", + "Review terms and conditions": "Leggi i termini e condizioni", + "Muted Users": "Utenti silenziati" } From 6467349921e98d8c5602156043c123c90e22e469 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Sun, 27 May 2018 17:14:29 +0000 Subject: [PATCH 124/480] Translated using Weblate (Russian) Currently translated at 99.6% (1186 of 1190 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index e77cb76aff..0a254736b8 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1187,5 +1187,6 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie (ознакомьтесь с нашей<PolicyLink>Политикой cookie</PolicyLink>).", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie.", "Yes, I want to help!": "Да, я хочу помочь!", - "Reload widget": "Перезагрузить виджет" + "Reload widget": "Перезагрузить виджет", + "To notify everyone in the room, you must be a": "Для уведомления всех в комнате, вы должны быть" } From 16ebef81f2fa234bc74fcc5c0ed20cfd25f6d9c5 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Mon, 28 May 2018 15:21:34 +0000 Subject: [PATCH 125/480] Translated using Weblate (Swedish) Currently translated at 84.4% (1005 of 1190 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 | 69 ++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 4ab1413e4f..a9c9bfade2 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -35,7 +35,7 @@ "Are you sure you want to leave the room '%(roomName)s'?": "Vill du lämna rummet '%(roomName)s'?", "Are you sure you want to upload the following files?": "Vill du ladda upp följande filer?", "Autoplay GIFs and videos": "Spela automatiskt upp GIFar och videor", - "Are you sure you want to reject the invitation?": "Vill du avvisa inbjudan?", + "Are you sure you want to reject the invitation?": "Är du säker på att du vill avböja inbjudan?", "Bulk Options": "Volymhandlingar", "Blacklisted": "Svartlistad", "%(senderName)s banned %(targetName)s.": "%(senderName)s bannade %(targetName)s.", @@ -150,7 +150,7 @@ "Admin Tools": "Admin-verktyg", "Alias (optional)": "Alias (valfri)", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till servern - kontrollera anslutningen, försäkra att din <a>hemservers TLS-certifikat</a> är betrott, och att inget webbläsartillägg blockerar förfrågningar.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade maktnivån av %(powerLevelDiffText)s.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade behörighetsnivå för %(powerLevelDiffText)s.", "<a>Click here</a> to join the discussion!": "<a>Klicka här</a> för att gå med i diskussionen!", "Close": "Stäng", "%(count)s new messages|one": "%(count)s nytt meddelande", @@ -185,8 +185,8 @@ "Hide Text Formatting Toolbar": "Göm textformatteringsverktygsfältet", "Historical": "Historiska", "Home": "Hem", - "Homeserver is": "Hemservern är", - "Identity Server is": "Identitetsservern är", + "Homeserver is": "Hemserver är", + "Identity Server is": "Identitetsserver är", "I have verified my email address": "Jag har verifierat min epostadress", "Import": "Importera", "Import E2E room keys": "Importera rumskrypteringsnycklar", @@ -226,7 +226,7 @@ "Logged in as:": "Inloggad som:", "Login as guest": "Logga in som gäst", "Logout": "Logga ut", - "Low priority": "Lågprioritet", + "Low priority": "Låg prioritet", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar från att de bjöds in.", "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar fr.o.m. att de gick med som medlem.", "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar.", @@ -289,7 +289,7 @@ "Refer a friend to Riot:": "Hänvisa en vän till Riot:", "Register": "Registrera", "%(targetName)s rejected the invitation.": "%(targetName)s avvisade inbjudan.", - "Reject invitation": "Avvisa inbjudan", + "Reject invitation": "Avböj inbjudan", "Rejoin": "Gå med tillbaka", "Remote addresses for this room:": "Fjärradresser för det här rummet:", "Remove Contact Information?": "Ta bort kontaktuppgifter?", @@ -504,7 +504,7 @@ "I understand the risks and wish to continue": "Jag förstår riskerna och vill fortsätta", "Direct Chat": "Direkt-chatt", "The server may be unavailable or overloaded": "Servern kan vara överbelastad eller inte tillgänglig", - "Reject": "Avvisa", + "Reject": "Avböj", "Failed to set Direct Message status of room": "Det gick inte att ställa in direktmeddelandestatus för rummet", "Monday": "måndag", "Remove from Directory": "Ta bort från katalogen", @@ -653,18 +653,18 @@ "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nivå %(powerLevelNumber)s)", "Unknown Address": "Okänd adress", "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", - "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s har gått med %(count)s gånger", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sgick med %(count)s gånger", "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sgick med", - "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s har gått med %(count)s gånger", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)sgick med %(count)s gånger", "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sgick med", - "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)shar lämnat %(count)s gånger", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)slämnade %(count)s gånger", "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)slämnade", - "%(oneUser)sleft %(count)s times|other": "%(oneUser)shar lämnat %(count)s gånger", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)slämnade %(count)s gånger", "%(oneUser)sleft %(count)s times|one": "%(oneUser)slämnade", - "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)shar gått med och lämnat %(count)s gånger", - "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)shar gått med och lämnat", - "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)shar gått med och lämnat %(count)s gånger", - "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)shar gått med och lämnat", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sgick med och lämnade %(count)s gånger", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sgick med och lämnade", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sgick med och lämnade %(count)s gånger", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sgick med och lämnade", "And %(count)s more...|other": "Och %(count)s till...", "ex. @bob:example.com": "t.ex. @kalle:exempel.com", "Add User": "Lägg till användare", @@ -969,5 +969,42 @@ "Can't leave Server Notices room": "Kan inte lämna serveraviseringsrummet", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Detta rum används för viktiga meddelanden från hemservern, så du kan inte lämna det.", "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ån en äldre version av Riot has upptäckts. Detta ska ha orsakat att krypteringen inte fungerat i den äldre versionen. Krypterade meddelanden som nyligen har skickats medans den äldre versionen användes kanske inte kan dekrypteras i denna version. Detta kan även orsaka att meddelanden skickade med denna version inte fungerar. Om du upplever problem, logga ut och in igen. För att behålla meddelandehistoriken, exportera dina nycklar och importera dem igen.", - "Confirm Removal": "Bekräfta borttagning" + "Confirm Removal": "Bekräfta borttagning", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Det gick inte att kontrollera att adressen den här inbjudan skickades till matchar en som är kopplad till ditt konto.", + "You may wish to login with a different account, or add this email to this account.": "Du kanske vill logga in med ett annat konto, eller lägga till e-postadressen till detta konto.", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Vänligen hjälp till att förbättra Riot.im genom att skicka <UsageDataLink>anonyma användardata</UsageDataLink>. Detta kommer att använda en cookie (se vår <PolicyLink>Cookiepolicy</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Vänligen hjälp till att förbättra Riot.im genom att skicka <UsageDataLink>anonyma användardata</UsageDataLink>. Detta kommer att använda en cookie.", + "Yes, I want to help!": "Ja, jag vill hjälpa till!", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s aktiverade kryptering (algoritm %(algorithm)s).", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)slämnade och gick med igen %(count)s gånger", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)slämnade och gick med igen", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)slämnade och gick med igen %(count)s gånger", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)slämnade och gick med igen", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)savböjde sina inbjudningar %(count)s gånger", + "Unable to reject invite": "Det gick inte att avböja inbjudan", + "Reject all %(invitedRooms)s invites": "Avböj alla %(invitedRooms)s inbjudningar", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)savböjde sina inbjudningar", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)savböjde sin inbjudan %(count)s gånger", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)savböjde sin inbjudan", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)sfick sina inbjudningar tillbakadragna %(count)s gånger", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)sfick sina inbjudningar tillbakadragna", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)sfick sin inbjudan tillbakadragen %(count)s gånger", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sfick sin inbjudan tillbakadragen", + "were invited %(count)s times|other": "blev inbjudna %(count)s gånger", + "were invited %(count)s times|one": "blev inbjudna", + "was invited %(count)s times|other": "blev inbjuden %(count)s gånger", + "was invited %(count)s times|one": "blev inbjuden", + "were banned %(count)s times|other": "blev bannade %(count)s gånger", + "were banned %(count)s times|one": "blev bannade", + "was banned %(count)s times|other": "blev bannad %(count)s gånger", + "was banned %(count)s times|one": "blev bannad", + "Ban this user?": "Banna användaren?", + "were kicked %(count)s times|other": "blev kickade %(count)s gånger", + "were kicked %(count)s times|one": "blev kickade", + "was kicked %(count)s times|other": "blev kickad %(count)s gånger", + "was kicked %(count)s times|one": "blev kickad", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sbytte namn %(count)s gånger", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sbytte namn", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sbytte namn %(count)s gånger", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sbytte namn" } From 05357b9f8cef27502ff7ad09f6f9461c7b7685f1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@googlemail.com> Date: Tue, 29 May 2018 12:07:56 +0100 Subject: [PATCH 126/480] improve comment --- src/components/structures/UserSettings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 4ee4f1a427..d88a477932 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -287,6 +287,7 @@ module.exports = React.createClass({ _refreshMediaDevices: function(stream) { if (stream) { // kill stream so that we don't leave it lingering around with webcam enabled etc + // as here we called gUM to ask user for permission to their device names only stream.getTracks().forEach((track) => track.stop()); } From da9fe9917bfeff2f670296648c6a5b76fb71224b Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 29 May 2018 13:16:39 +0100 Subject: [PATCH 127/480] Fix click on faded left/right/middle panel -> close settings - implement generic dispatch to close user/room/group settings - use dispatch to allow clicks on disabled left/right/middle panel to close settings A much more maintainable approach would be to use dedicate routing instead of doing different things depending on what page of the app is currently being viewed. At the very least we could make the concept of a settings page generic. --- src/components/structures/GroupView.js | 23 ++++++-- src/components/structures/LoggedInView.js | 20 ++++++- src/components/structures/MatrixChat.js | 69 ++++++++++++++--------- src/components/structures/RoomView.js | 20 ++----- src/stores/RoomViewStore.js | 16 ++++++ 5 files changed, 100 insertions(+), 48 deletions(-) diff --git a/src/components/structures/GroupView.js b/src/components/structures/GroupView.js index ce79ccadfa..c7610219f7 100644 --- a/src/components/structures/GroupView.js +++ b/src/components/structures/GroupView.js @@ -432,11 +432,14 @@ export default React.createClass({ this._changeAvatarComponent = null; this._initGroupStore(this.props.groupId, true); + + this._dispatcherRef = dis.register(this._onAction); }, componentWillUnmount: function() { this._unmounted = true; this._matrixClient.removeListener("Group.myMembership", this._onGroupMyMembership); + dis.unregister(this._dispatcherRef); }, componentWillReceiveProps: function(newProps) { @@ -563,12 +566,22 @@ export default React.createClass({ this._closeSettings(); }, + _onAction(payload) { + switch (payload.action) { + // NOTE: close_settings is an app-wide dispatch; as it is dispatched from MatrixChat + case 'close_settings': + this.setState({ + editing: false, + profileForm: null, + }); + break; + default: + break; + } + }, + _closeSettings() { - this.setState({ - editing: false, - profileForm: null, - }); - dis.dispatch({action: 'panel_disable'}); + dis.dispatch({action: 'close_settings'}); }, _onNameChange: function(value) { diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 2dd5a75c47..5dca359f32 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -255,6 +255,22 @@ const LoggedInView = React.createClass({ ), true); }, + _onClick: function(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). + if (this.props.leftDisabled && + this.props.rightDisabled && + ( + ev.target.className === 'mx_MatrixChat' || + ev.target.className === 'mx_MatrixChat_middlePanel' || + ev.target.className === 'mx_RoomView' + ) + ) { + dis.dispatch({ action: 'close_settings' }); + } + }, + render: function() { const LeftPanel = sdk.getComponent('structures.LeftPanel'); const RightPanel = sdk.getComponent('structures.RightPanel'); @@ -295,7 +311,7 @@ const LoggedInView = React.createClass({ case PageTypes.UserSettings: page_element = <UserSettings - onClose={this.props.onUserSettingsClose} + onClose={this.props.onCloseAllSettings} brand={this.props.config.brand} referralBaseUrl={this.props.config.referralBaseUrl} teamToken={this.props.teamToken} @@ -380,7 +396,7 @@ const LoggedInView = React.createClass({ } return ( - <div className='mx_MatrixChat_wrapper' aria-hidden={this.props.hideToSRUsers}> + <div className='mx_MatrixChat_wrapper' aria-hidden={this.props.hideToSRUsers} onClick={this._onClick}> { topBar } <DragDropContext onDragEnd={this._onDragEnd}> <div className={bodyClasses}> diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 46c1113a1d..c1c757a65a 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -560,6 +560,27 @@ export default React.createClass({ this._setPage(PageTypes.UserSettings); this.notifyNewScreen('settings'); break; + case 'close_settings': + this.setState({ + leftDisabled: false, + rightDisabled: false, + middleDisabled: false, + }); + if (this.state.page_type === PageTypes.UserSettings) { + // We do this to get setPage and notifyNewScreen + if (this.state.currentRoomId) { + this._viewRoom({ + room_id: this.state.currentRoomId, + }); + } else if (this.state.currentGroupId) { + this._viewGroup({ + group_id: this.state.currentGroupId, + }); + } else { + this._viewHome(); + } + } + break; case 'view_create_room': this._createRoom(); break; @@ -577,19 +598,10 @@ export default React.createClass({ this.notifyNewScreen('groups'); break; case 'view_group': - { - const groupId = payload.group_id; - this.setState({ - currentGroupId: groupId, - currentGroupIsNew: payload.group_is_new, - }); - this._setPage(PageTypes.GroupView); - this.notifyNewScreen('group/' + groupId); - } + this._viewGroup(payload); break; case 'view_home_page': - this._setPage(PageTypes.HomePage); - this.notifyNewScreen('home'); + this._viewHome(); break; case 'view_set_mxid': this._setMxId(payload); @@ -632,7 +644,8 @@ export default React.createClass({ middleDisabled: payload.middleDisabled || false, rightDisabled: payload.rightDisabled || payload.sideDisabled || false, }); - break; } + break; + } case 'set_theme': this._onSetTheme(payload.value); break; @@ -848,6 +861,21 @@ export default React.createClass({ }); }, + _viewGroup: function(payload) { + const groupId = payload.group_id; + this.setState({ + currentGroupId: groupId, + currentGroupIsNew: payload.group_is_new, + }); + this._setPage(PageTypes.GroupView); + this.notifyNewScreen('group/' + groupId); + }, + + _viewHome: function() { + this._setPage(PageTypes.HomePage); + this.notifyNewScreen('home'); + }, + _setMxId: function(payload) { const SetMxIdDialog = sdk.getComponent('views.dialogs.SetMxIdDialog'); const close = Modal.createTrackedDialog('Set MXID', '', SetMxIdDialog, { @@ -1606,19 +1634,8 @@ export default React.createClass({ this._setPageSubtitle(subtitle); }, - onUserSettingsClose: function() { - // XXX: use browser history instead to find the previous room? - // or maintain a this.state.pageHistory in _setPage()? - if (this.state.currentRoomId) { - dis.dispatch({ - action: 'view_room', - room_id: this.state.currentRoomId, - }); - } else { - dis.dispatch({ - action: 'view_home_page', - }); - } + onCloseAllSettings() { + dis.dispatch({ action: 'close_settings' }); }, onServerConfigChange(config) { @@ -1677,7 +1694,7 @@ export default React.createClass({ return ( <LoggedInView ref={this._collectLoggedInView} matrixClient={MatrixClientPeg.get()} onRoomCreated={this.onRoomCreated} - onUserSettingsClose={this.onUserSettingsClose} + onCloseAllSettings={this.onCloseAllSettings} onRegistered={this.onRegistered} currentRoomId={this.state.currentRoomId} teamToken={this._teamToken} diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index c5f6a75cc5..990f9bf8bc 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -182,6 +182,7 @@ module.exports = React.createClass({ isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(), forwardingEvent: RoomViewStore.getForwardingEvent(), shouldPeek: RoomViewStore.shouldPeek(), + editingRoomSettings: RoomViewStore.isEditingSettings(), }; // Temporary logging to diagnose https://github.com/vector-im/riot-web/issues/4307 @@ -1139,7 +1140,7 @@ module.exports = React.createClass({ }, onSettingsClick: function() { - this.showSettings(true); + dis.dispatch({ action: 'open_room_settings' }); }, onSettingsSaveClick: function() { @@ -1172,24 +1173,20 @@ module.exports = React.createClass({ }); // still editing room settings } else { - this.setState({ - editingRoomSettings: false, - }); + dis.dispatch({ action: 'close_settings' }); } }).finally(() => { this.setState({ uploadingRoomSettings: false, - editingRoomSettings: false, }); + dis.dispatch({ action: 'close_settings' }); }).done(); }, onCancelClick: function() { console.log("updateTint from onCancelClick"); this.updateTint(); - this.setState({ - editingRoomSettings: false, - }); + dis.dispatch({ action: 'close_settings' }); if (this.state.forwardingEvent) { dis.dispatch({ action: 'forward_event', @@ -1406,13 +1403,6 @@ module.exports = React.createClass({ });*/ }, - showSettings: function(show) { - // XXX: this is a bit naughty; we should be doing this via props - if (show) { - this.setState({editingRoomSettings: true}); - } - }, - /** * called by the parent component when PageUp/Down/etc is pressed. * diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index 1e7e50eae0..923c073065 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -44,6 +44,8 @@ const INITIAL_STATE = { forwardingEvent: null, quotingEvent: null, + + isEditingSettings: false, }; /** @@ -116,6 +118,16 @@ class RoomViewStore extends Store { replyingToEvent: payload.event, }); break; + case 'open_room_settings': + this._setState({ + isEditingSettings: true, + }); + break; + case 'close_settings': + this._setState({ + isEditingSettings: false, + }); + break; } } @@ -301,6 +313,10 @@ class RoomViewStore extends Store { return this._state.replyingToEvent; } + isEditingSettings() { + return this._state.isEditingSettings; + } + shouldPeek() { return this._state.shouldPeek; } From 404c071f2aa94796098608d74df8dd7a787ff581 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 29 May 2018 13:19:56 +0100 Subject: [PATCH 128/480] Remove lie from docs --- src/components/structures/MatrixChat.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index c1c757a65a..0b2396ddff 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -794,7 +794,6 @@ export default React.createClass({ // @param {string=} roomInfo.room_id ID of the room to join. One of room_id or room_alias must be given. // @param {string=} roomInfo.room_alias Alias of the room to join. One of room_id or room_alias must be given. // @param {boolean=} roomInfo.auto_join If true, automatically attempt to join the room if not already a member. - // @param {boolean=} roomInfo.show_settings Makes RoomView show the room settings dialog. // @param {string=} roomInfo.event_id ID of the event in this room to show: this will cause a switch to the // context of that particular event. // @param {boolean=} roomInfo.highlighted If true, add event_id to the hash of the URL From 577b2564c0e36110d1516721e2b46665abb5a9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Fri, 25 May 2018 09:52:21 +0000 Subject: [PATCH 129/480] Translated using Weblate (Slovak) Currently translated at 100.0% (1190 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 2cab64ca49..daa9cfc9b6 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1187,5 +1187,6 @@ "This room is used for important messages from the Homeserver, so you cannot leave it.": "Táto miestnosť je určená na dôležité oznamy a správy od správcov domovského servera, preto ju nie je možné opustiť.", "Terms and Conditions": "Zmluvné podmienky", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Ak chcete aj naďalej používať domovský server %(homeserverDomain)s, mali by ste si prečítať a odsúhlasiť naše zmluvné podmienky.", - "Review terms and conditions": "Prečítať zmluvné podmienky" + "Review terms and conditions": "Prečítať zmluvné podmienky", + "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť" } From 56541c7ea7c068244e18b021a1524d19658a4ede Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Tue, 29 May 2018 16:59:37 +0000 Subject: [PATCH 130/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1190 of 1190 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 | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 4911ad970e..6295c7e934 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1167,5 +1167,26 @@ "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Изчистване на запазените данни в браузъра може да поправи проблема, но ще Ви изкара от профила и ще направи шифрованите съобщения нечетими.", "Collapse Reply Thread": "Свий отговорите", "Enable widget screenshots on supported widgets": "Включи скрийншоти за поддържащи ги приспособления", - "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Бъговете по Riot се следят в GitHub: <a>създайте проблем в GitHub</a>." + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Бъговете по Riot се следят в GitHub: <a>създайте проблем в GitHub</a>.", + "e.g. %(exampleValue)s": "напр. %(exampleValue)s", + "Reload widget": "Презареди приспособлението", + "Send analytics data": "Изпращане на статистически данни", + "To notify everyone in the room, you must be a": "За да уведомите всички в стаята, трябва да бъдете", + "Muted Users": "Заглушени потребители", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Моля, помогнете за подобряването на Riot.im като изпращате <UsageDataLink>анонимни данни за ползване</UsageDataLink>. Това ще използва бисквитка (моля, вижте нашата <PolicyLink>политика за бисквитки</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Моля, помогнете за подобряването на Riot.im като изпращате <UsageDataLink>анонимни данни за ползване</UsageDataLink>. Това ще използва бисквитка.", + "Yes, I want to help!": "Да, искам да помогна!", + "Warning: This widget might use cookies.": "Внимание: това приспособление може да използва бисквитки.", + "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. <b>This action is irreversible.</b>": "Това ще направи акаунта Ви неизползваем завинаги. Няма да можете да влезете пак, а регистрирането повторно на същия потребителски идентификатор няма да е възможно. Акаунтът Ви да напусне всички стаи, в които участва. Ще бъдат премахнати и данните за акаунта Ви от сървъра за самоличност. <b>Действието е необратимо.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Деактивирането на акаунта Ви <b>по подразбиране не прави така, че изпратените съобщения да бъдат забравени.</b> Ако искате да забравим съобщенията Ви, моля отбележете с отметка по-долу.", + "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.": "Видимостта на съобщенията в Matrix е подобно на имейл системата. Нашето забравяне означава, че: изпратените от Вас съобщения няма да бъдат споделяни с нови или нерегистрирани потребители, но регистрираните потребители имащи достъп до тях ще продължат да имат достъп до своето копие.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Моля, забравете всички изпратени съобщения от мен съобщения, когато акаунта ми се деактивира (<b>Внимание:</b> това ще направи бъдещите потребители да имат само частичен поглед върху кореспонденцията)", + "To continue, please enter your password:": "За да продължите, моля въведете паролата си:", + "password": "парола", + "Can't leave Server Notices room": "Не може да напуснете стая \"Server Notices\"", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Тази стая се използва за важни съобщения от сървъра, така че не можете да я напуснете.", + "Terms and Conditions": "Правила и условия", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "За да продължите да ползвате %(homeserverDomain)s е необходимо да прегледате и да се съгласите с правилата и условията за ползване.", + "Review terms and conditions": "Прегледай правилата и условията", + "Failed to indicate account erasure": "Неуспешно указване на желанието за изтриване на акаунта" } From 7053302f7799b66f93b512c991cd90224e67bcc9 Mon Sep 17 00:00:00 2001 From: Krombel <krombel@krombel.de> Date: Thu, 31 May 2018 16:01:23 +0000 Subject: [PATCH 131/480] Translated using Weblate (German) Currently translated at 100.0% (1190 of 1190 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 | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4892b91b48..d3787a15a3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1171,5 +1171,25 @@ "Send analytics data": "Analysedaten senden", "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden. (Siehe unsere <PolicyLink>Datenschutzerklärung</PolicyLink>).", "Help improve Riot by sending usage data? This will use a cookie.": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden.", - "Yes please": "Ja, bitte" + "Yes please": "Ja, bitte", + "e.g. %(exampleValue)s": "z.B. %(exampleValue)s", + "Reload widget": "Widget neu laden", + "To notify everyone in the room, you must be a": "Notwendiges Berechtigungslevel, um jeden im Raum zu benachrichten:", + "Muted Users": "Stummgeschaltete Benutzer", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Bitte helfe uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen (bitte beachte auch unsere <PolicyLink>Cookie-Richtlinie</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Bitte helfe uns Riot.im zu verbessern, in dem du <UsageDataLink>anonyme Nutzungsdaten</UsageDataLink> schickst. Dies wird ein Cookie benutzen.", + "Yes, I want to help!": "Ja, ich möchte helfen!", + "Warning: This widget might use cookies.": "Warnung: Diese Widget mag Cookies verwenden.", + "Failed to indicate account erasure": "Fehler beim Signalisieren der Account-Löschung", + "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. <b>This action is irreversible.</b>": "Dies wird deinen Account permanent unbenutzbar machen. Du wirst nicht in der Lage sein, dich anzumelden und keiner wird dieselbe Benutzer-ID erneut registrieren können. Alle Räume, in denen der Account ist, werden verlassen und deine Account-Daten werden vom Identitätsserver gelöscht. <b>Diese Aktion ist irreversibel!</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Standardmäßig werden <b>die von dir gesendeten Nachrichten beim Deaktiveren nicht gelöscht</b>. Wenn du dies von uns möchtest, aktivere das Auswalfeld unten.", + "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.": "Sie Sichtbarkeit der Nachrichten in Matrix ist vergleichbar mit E-Mails: Wenn wir deine Nachrichten vergessen heißt das, dass diese nicht mit neuen oder nicht registrierten Nutzern teilen werden, aber registrierte Nutzer, die bereits zugriff haben, werden Zugriff auf ihre Kopie behalten.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Bitte vergesst alle Nachrichten, die ich gesendet habe, wenn mein Account deaktiviert wird. (<b>Warnung:</b> Zukünftige Nutzer werden eine unvollständige Konversation sehen)", + "To continue, please enter your password:": "Um fortzufahren, bitte Password eingeben:", + "password": "Passwort", + "Can't leave Server Notices room": "Du kannst den Raum für Server-Notizen nicht verlassen", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Du kannst diesen Raum nicht verlassen, da dieser Raum für wichtige Nachrichten vom Heimserver verwendet wird.", + "Terms and Conditions": "Geschäftsbedingungen", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Um den %(homeserverDomain)s -Heimserver weiter zu verwenden, musst du die Geschäftsbedingungen sichten und ihnen zustimmen.", + "Review terms and conditions": "Geschäftsbedingungen anzeigen" } From f5892b8c6174c018ee2e616e15c2437cbaf39987 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Sun, 3 Jun 2018 22:33:00 +0000 Subject: [PATCH 132/480] Translated using Weblate (Swedish) Currently translated at 100.0% (1190 of 1190 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 | 220 +++++++++++++++++++++++++++++++++++---- 1 file changed, 202 insertions(+), 18 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index a9c9bfade2..8e5d8e2f21 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -40,7 +40,7 @@ "Blacklisted": "Svartlistad", "%(senderName)s banned %(targetName)s.": "%(senderName)s bannade %(targetName)s.", "Banned users": "Bannade användare", - "Bans user with given id": "Bannar användaren med givet id", + "Bans user with given id": "Bannar användare med givet id", "Ban": "Banna", "Attachment": "Bilaga", "Call Timeout": "Samtalstimeout", @@ -78,14 +78,14 @@ "Cryptography": "Kryptografi", "Current password": "Nuvarande lösenord", "Curve25519 identity key": "Curve25519 -identitetsnyckel", - "Custom level": "Egen nivå", + "Custom level": "Anpassad nivå", "/ddg is not a command": "/ddg är inte ett kommando", - "Deactivate Account": "Deaktivera konto", + "Deactivate Account": "Inaktivera konto", "Deactivate my account": "Deaktivera mitt konto", "Decrypt %(text)s": "Dekryptera %(text)s", "Decryption error": "Dekrypteringsfel", "Delete": "Radera", - "Deops user with given id": "Degraderar användaren med givet id", + "Deops user with given id": "Degraderar användare med givet id", "Default": "Standard", "Device already verified!": "Enheten är redan verifierad!", "Device ID": "Enhets-ID", @@ -94,11 +94,11 @@ "Device key:": "Enhetsnyckel:", "Devices": "Enheter", "Devices will not yet be able to decrypt history from before they joined the room": "Enheter kan inte ännu dekryptera meddelandehistorik från före de gick med i rummet", - "Direct chats": "Direkta chattar", + "Direct chats": "Direkt-chattar", "Disinvite": "Häv inbjudan", "Display name": "Namn", "Displays action": "Visar åtgärd", - "Don't send typing notifications": "Sänd inte \"skriver\"-status", + "Don't send typing notifications": "Skicka inte \"skriver\"-status", "Download %(text)s": "Ladda ner %(text)s", "Drop here to tag %(section)s": "Dra hit för att tagga %(section)s", "Ed25519 fingerprint": "Ed25519-fingeravtryck", @@ -122,7 +122,7 @@ "Export E2E room keys": "Exportera krypteringsrumsnycklar", "Failed to ban user": "Det gick inte att banna användaren", "Failed to change password. Is your password correct?": "Det gick inte att byta lösenord. Är lösenordet rätt?", - "Failed to change power level": "Det gick inte att ändra maktnivå", + "Failed to change power level": "Det gick inte att ändra behörighetsnivå", "Failed to forget room %(errCode)s": "Det gick inte att glömma bort rummet %(errCode)s", "Failed to join room": "Det gick inte att gå med i rummet", "Failed to kick": "Det gick inte att kicka", @@ -165,7 +165,7 @@ "Encrypted by an unverified device": "Krypterat av en overifierad enhet", "Encryption is enabled in this room": "Kryptering är aktiverat i det här rummet", "Encryption is not enabled in this room": "Kryptering är inte aktiverat i det här rummet", - "Enter passphrase": "Ge lösenfras", + "Enter passphrase": "Ange lösenfras", "Error: Problem communicating with the given homeserver.": "Fel: Det gick inte att kommunicera med den angivna hemservern.", "Failed to fetch avatar URL": "Det gick inte att hämta avatar-URL", "Failed to upload profile picture!": "Det gick inte att ladda upp profilbild!", @@ -204,7 +204,7 @@ "Invite new room members": "Bjud in nya rumsmedlemmar", "Invited": "Inbjuden", "Invites": "Inbjudningar", - "Invites user with given id to current room": "Bjuder in användaren med det givna ID:t till det nuvarande rummet", + "Invites user with given id to current room": "Bjuder in användare med givet id till nuvarande rum", "'%(alias)s' is not a valid format for an address": "'%(alias)s' är inte ett giltigt format för en adress", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' är inte ett giltigt format för ett alias", "%(displayName)s is typing": "%(displayName)s skriver", @@ -216,7 +216,7 @@ "Jump to first unread message.": "Hoppa till första olästa meddelande.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s kickade %(targetName)s.", "Kick": "Kicka", - "Kicks user with given id": "Kickar användaren med givet ID", + "Kicks user with given id": "Kickar användaren med givet id", "Labs": "Labb", "Last seen": "Senast sedd", "Leave room": "Lämna rummet", @@ -276,7 +276,7 @@ "Phone": "Telefon", "%(senderName)s placed a %(callType)s call.": "%(senderName)s startade ett %(callType)ssamtal.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Öppna meddelandet i din epost och klicka på länken i meddelandet. När du har gjort detta, klicka vidare.", - "Power level must be positive integer.": "Maktnivån måste vara ett positivt heltal.", + "Power level must be positive integer.": "Behörighetsnivå måste vara ett positivt heltal.", "Press <StartChatButton> to start a chat with someone": "Tryck på <StartChatButton> för att starta en chatt med någon", "Privacy warning": "Integritetsvarning", "Private Chat": "Privatchatt", @@ -358,7 +358,7 @@ "Cannot add any more widgets": "Det går inte att lägga till fler widgets", "Changes colour scheme of current room": "Ändrar färgschema för nuvarande rum", "Delete widget": "Ta bort widget", - "Define the power level of a user": "Definiera anseende för en användare", + "Define the power level of a user": "Definiera behörighetsnivå för en användare", "Do you want to load widget from URL:": "Vill du ladda widgeten från URL:", "Edit": "Ändra", "Enable automatic language detection for syntax highlighting": "Aktivera automatisk språkdetektering för syntaxmarkering", @@ -415,7 +415,7 @@ "Nov": "nov", "Dec": "dec", "Name or matrix ID": "Namn eller matrix ID", - "Invite to Community": "", + "Invite to Community": "Bjud in till community", "Unable to enable Notifications": "Det går inte att aktivera aviseringar", "Failed to invite user": "Det gick inte att bjuda in användaren", "The information being sent to us to help make Riot.im better includes:": "Informationen som skickas till oss för att hjälpa Riot.im att bli bättre inkluderar:", @@ -436,7 +436,7 @@ "Sunday": "söndag", "Messages sent by bot": "Meddelanden från bottar", "Notification targets": "Aviseringsmål", - "Failed to set direct chat tag": "Det gick inte att markera rummet som direkt chatt", + "Failed to set direct chat tag": "Det gick inte att markera rummet som direkt-chatt", "Today": "idag", "Failed to get protocol list from Home Server": "Det gick inte att hämta protokollistan från hemservern", "You are not receiving desktop notifications": "Du får inte skrivbordsaviseringar", @@ -481,7 +481,7 @@ "Filter results": "Filtrera resultaten", "Members": "Medlemmar", "No update available.": "Ingen uppdatering tillgänglig.", - "Resend": "Sänd igen", + "Resend": "Skicka igen", "Files": "Filer", "Collecting app version information": "Samlar in appversionsinformation", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Radera rumsadressen %(alias)s och ta bort %(name)s från katalogen?", @@ -516,8 +516,8 @@ "All Rooms": "Alla rum", "Wednesday": "onsdag", "You cannot delete this message. (%(code)s)": "Du kan inte radera det här meddelandet. (%(code)s)", - "Send": "Sänd", - "Send logs": "Sänd loggar", + "Send": "Skicka", + "Send logs": "Skicka loggar", "All messages": "Alla meddelanden", "Call invitation": "Inbjudan till samtal", "Downloading update...": "Laddar ned uppdatering...", @@ -1006,5 +1006,189 @@ "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sbytte namn %(count)s gånger", "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sbytte namn", "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sbytte namn %(count)s gånger", - "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sbytte namn" + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sbytte namn", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sändrade sin avatar %(count)s gånger", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sändrade sin avatar", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)ssändrade sin avatar %(count)s gånger", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)ssändrade sin avatar", + "%(items)s and %(count)s others|other": "%(items)s och %(count)s andra", + "%(items)s and %(count)s others|one": "%(items)s och en annan", + "collapse": "fäll ihop", + "expand": "fäll ut", + "Custom of %(powerLevel)s": "Anpassad på %(powerLevel)s", + "<a>In reply to</a> <pill>": "<a>Som svar på</a> <pill>", + "Who would you like to add to this community?": "Vem vill du lägga till i denna community?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Varning: En person du lägger till i en community kommer att vara synlig för alla som känner till community-ID:t", + "Invite new community members": "Bjud in nya community-medlemmar", + "Which rooms would you like to add to this community?": "Vilka rum vill du lägga till i denna community?", + "Show these rooms to non-members on the community page and room list?": "Vissa dessa rum och icke-medlemmar på community-sidan och -rumslistan?", + "Add rooms to the community": "Lägg till rum i communityn", + "Add to community": "Lägg till i community", + "Failed to invite users to community": "Det gick inte att bjuda in användare till communityn", + "Message Replies": "Meddelandesvar", + "Mirror local video feed": "Spegelvänd lokal video", + "Disable Community Filter Panel": "Inaktivera community-filterpanel", + "Community Invites": "Community-inbjudningar", + "Invalid community ID": "Ogiltigt community-ID", + "'%(groupId)s' is not a valid community ID": "%(groupId)s är inte ett giltigt community-ID", + "New community ID (e.g. +foo:%(localDomain)s)": "Nytt community-ID (t.ex. +foo:%(localDomain)s)", + "Remove from community": "Ta bort från community", + "Disinvite this user from community?": "Ta bort användarens inbjudan till community?", + "Remove this user from community?": "Ta bort användaren från community?", + "Failed to remove user from community": "Det gick inte att ta bort användaren från community", + "Filter community members": "Filtrera community-medlemmar", + "Removing a room from the community will also remove it from the community page.": "Om du tar bort ett rum från communityn tas det även bort från communityns sida.", + "Failed to remove room from community": "Det gick inte att ta bort rum från community", + "Only visible to community members": "Endast synlig för community-medlemmar", + "Filter community rooms": "Filtrera community-rum", + "Community IDs cannot not be empty.": "Community-ID kan inte vara tomt.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community-ID får endast innehålla tecknen a-z, 0-9 och '=_-./'", + "Something went wrong whilst creating your community": "Något gick fel när din community skapades", + "Create Community": "Skapa community", + "Community Name": "Community-namn", + "Community ID": "Community-ID", + "View Community": "Visa community", + "<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML för din community-sida</h1>\n<p>\n Använd den långa beskrivningen för att introducera nya medlemmar till communityn, eller dela\n några viktiga <a href=\"foo\">länkar</a>\n</p>\n<p>\n Du kan även använda 'img'-taggar\n</p>\n", + "Add rooms to the community summary": "Lägg till rum i community-översikten", + "Add users to the community summary": "Lägg till användare i community-översikten", + "Failed to update community": "Det gick inte att uppdatera community", + "Unable to join community": "Det gick inte att gå med i communityn", + "Leave Community": "Lämna community", + "Unable to leave community": "Det gick inte att lämna community", + "Community Settings": "Community-inställningar", + "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Ändringar på <bold1>namn</bold1> och <bold2>avatar</bold2> som gjorts i din community kommer eventuellt inte synas för andra användare i upp till 30 minuter.", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Dessa rum visas för community-medlemmar på community-sidan. Community-medlemmar kan gå med i rummen genom att klicka på dem.", + "Add rooms to this community": "Lägg till rum i denna community", + "%(inviter)s has invited you to join this community": "%(inviter)s har bjudit in dig till denna community", + "Join this community": "Gå med i denna community", + "Leave this community": "Lämna denna community", + "You are an administrator of this community": "Du är administratör för denna community", + "You are a member of this community": "Du är medlem i denna community", + "Who can join this community?": "Vem kan gå med i denna community?", + "Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Din community har ingen lång beskrivning eller HTML-sida att visa för medlemmar.<br />Klicka här för att öppna inställningar och lägga till det!", + "Community %(groupId)s not found": "Community %(groupId)s hittades inte", + "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.": "För att skapa ett filter, dra en community-avatar till filterpanelen längst till vänster på skärmen. Du kan när som helst klicka på en avatar i filterpanelen för att bara se rum och personer som är associerade med den communityn.", + "Create a new community": "Skapa en ny community", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Skapa en community för att gruppera användare och rum! Bygg en anpassad hemsida för att markera er plats i Matrix-universumet.", + "Join an existing community": "Gå med i en befintlig community", + "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "För att gå med i en befintlig gemenskap behöver du ha community-ID; det ser ut som något i stil med <i>+exempel:matrix.org</i>.", + "Invite to this community": "Bjud in till denna community", + "Something went wrong when trying to get your communities.": "Något gick fel vid hämtning av dina communityn.", + "You're not currently a member of any communities.": "Du är för närvarande inte medlem i någon community.", + "Communities": "Communityn", + "This Home server does not support communities": "Denna hemserver stöder inte communityn", + "Your Communities": "Dina communityn", + "Did you know: you can use communities to filter your Riot.im experience!": "Visste du att: du kan använda communityn för att filtrera din Riot.im-upplevelse!", + "Error whilst fetching joined communities": "Fel vid hämtning av anslutna communityn", + "Featured Rooms:": "Utvalda rum:", + "Featured Users:": "Utvalda användare:", + "Everyone": "Alla", + "To notify everyone in the room, you must be a": "För att meddela alla i rummet, måste du vara", + "Long Description (HTML)": "Lång beskrivning (HTML)", + "Description": "Beskrivning", + "Failed to load %(groupId)s": "Det gick inte att ladda %(groupId)s", + "Failed to withdraw invitation": "Det gick inte att ta bort inbjudan", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Är du säker på att du vill ta bort %(roomName)s från %(groupId)s?", + "Failed to remove '%(roomName)s' from %(groupId)s": "Det gick inte att ta bort %(roomName)s från %(groupId)s", + "Something went wrong!": "Något gick fel!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Synligheten för '%(roomName)s' i %(groupId)s kunde inte uppdateras.", + "Visibility in Room List": "Synlighet i rumslistan", + "Visible to everyone": "Synlig för alla", + "Please select the destination room for this message": "Välj vilket rum meddelandet ska skickas till", + "Disinvite this user?": "Ta bort användarens inbjudan?", + "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 kommer inte att kunna ångra den här ändringen eftersom du sänker din egen behörighetsnivå, om du är den sista privilegierade användaren i rummet blir det omöjligt att ändra behörigheter.", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du kommer inte att kunna ångra den här ändringen eftersom du höjer användaren till samma behörighetsnivå som dig själv.", + "User Options": "Användaralternativ", + "unknown caller": "okänd uppringare", + "At this time it is not possible to reply with an emote.": "Det är för närvarande inte möjligt att svara med en emoji.", + "To use it, just wait for autocomplete results to load and tab through them.": "För att använda detta, vänta på att autokompletteringen laddas och tabba igenom resultatet.", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VARNING: NYCKELVERIFIERINGEN MISSLYCKADES! Signeringsnyckeln för %(userId)s och enhet %(deviceId)s är \"%(fprint)s\" som inte matchar den angivna nyckeln \"%(fingerprint)s\". Detta kan betyda att dina kommunikationer avlyssnas!", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Dölj \"gå med\"/lämna-meddelanden (inbjudningar/kickningar/banningar opåverkat)", + "Disable Peer-to-Peer for 1:1 calls": "Inaktivera enhet-till-enhet-kommunikation för direktsamtal (mellan två personer)", + "Enable inline URL previews by default": "Aktivera URL-förhandsvisning som standard", + "Enable URL previews for this room (only affects you)": "Aktivera URL-förhandsvisning för detta rum (påverkar bara dig)", + "Enable URL previews by default for participants in this room": "Aktivera URL-förhandsvisning som standard för deltagare i detta rum", + "You have <a>enabled</a> URL previews by default.": "Du har <a>aktiverat</a> URL-förhandsvisning som standard.", + "You have <a>disabled</a> URL previews by default.": "Du har <a>inaktiverat</a> URL-förhandsvisning som standard.", + "URL previews are enabled by default for participants in this room.": "URL-förhandsvisning är aktiverat som standard för deltagare i detta rum.", + "URL previews are disabled by default for participants in this room.": "URL-förhandsvisning är inaktiverat som standard för deltagare i detta rum.", + "URL Previews": "URL-förhandsvisning", + "Which rooms would you like to add to this summary?": "Vilka rum vill du lägga till i översikten?", + "Add to summary": "Lägg till i översikt", + "Failed to add the following rooms to the summary of %(groupId)s:": "Det gick inte att lägga till följande rum i översikten för %(groupId)s:", + "Add a Room": "Lägg till ett rum", + "Failed to remove the room from the summary of %(groupId)s": "Det gick inte att ta bort rummet från översikten i %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "Rummet '%(roomName)s' kunde inte tas bort från översikten.", + "Who would you like to add to this summary?": "Vem vill du lägga till i översikten?", + "Failed to add the following users to the summary of %(groupId)s:": "Det gick inte att lägga till följande användare i översikten för %(groupId)s:", + "Add a User": "Lägg till en användare", + "Failed to remove a user from the summary of %(groupId)s": "Det gick inte att ta bort en användare från översikten i %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "Användaren '%(displayName)s' kunde inte tas bort från översikten.", + "Unable to accept invite": "Det gick inte att acceptera inbjudan", + "Leave %(groupName)s?": "Lämna %(groupName)s?", + "Enable widget screenshots on supported widgets": "Aktivera widget-skärmdumpar för widgets som stöder det", + "Your key share request has been sent - please check your other devices for key share requests.": "Din nyckeldelningsbegäran har skickats - kolla efter nyckeldelningsbegäran på dina andra enheter.", + "Undecryptable": "Odekrypterbar", + "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Nyckeldelningsbegäran skickas automatiskt till dina andra enheter. Om du avvisat nyckelbegäran på dina andra enheter, klicka här för att begära nycklarna till den här sessionen igen.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Om dina andra enheter inte har nyckeln till detta meddelande kommer du du att kunna dekryptera det.", + "Key request sent.": "Nyckelbegäran skickad.", + "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Begär krypteringsnycklar igen</requestLink> från dina andra enheter.", + "Unban": "Avbanna", + "Unban this user?": "Avbanna användaren?", + "Unmute": "Ta bort dämpning", + "You don't currently have any stickerpacks enabled": "Du har för närvarande inga dekalpaket aktiverade", + "Add a stickerpack": "Lägg till dekalpaket", + "Stickerpack": "Dekalpaket", + "Hide Stickers": "Dölj dekaler", + "Show Stickers": "Visa dekaler", + "Error decrypting audio": "Det gick inte att dekryptera ljud", + "Error decrypting image": "Det gick inte att dekryptera bild", + "Error decrypting video": "Det gick inte att dekryptera video", + "Add an Integration": "Lägg till integration", + "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 skickas till en tredjepartswebbplats så att du kan autentisera ditt konto för användning med %(integrationsUrl)s. Vill du fortsätta?", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Du kan använda de anpassade serverinställningar för att logga in på andra Matrix-servrar genom att ange en annan hemserver-URL.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Det gör det möjligt att använda denna app med ett befintligt Matrix-konto på en annan hemserver.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Du kan även ange en anpassad identitetsserver men det förhindrar vanligtvis interaktion med användare baserat på e-postadress.", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Om du inte anger en epostadress, kan du inte återställa ditt lösenord. Är du säker?", + "You are registering with %(SelectedTeamName)s": "Du registrerar dig med %(SelectedTeamName)s", + "Warning: This widget might use cookies.": "Varning: Denna widget kan använda cookies.", + "Popout widget": "Poppa ut widget", + "were unbanned %(count)s times|other": "blev avbannade %(count)s gånger", + "were unbanned %(count)s times|one": "blev avbannade", + "was unbanned %(count)s times|other": "blev avbannad %(count)s gånger", + "was unbanned %(count)s times|one": "blev avbannad", + "Failed to indicate account erasure": "Det gick inte att ange kontoradering", + "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. <b>This action is irreversible.</b>": "Detta kommer att göra ditt konto permanent oanvändbart. Du kommer inte att kunna logga in, och ingen kommer att kunna registrera samma användar-ID. Ditt konto kommer att lämna alla rum som det deltar i, och dina kontouppgifter kommer att raderas från identitetsservern. <b>Denna åtgärd går inte att ångra.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Att du inaktiverar ditt konto <b>gör inte att meddelanden som du skickat glöms automatiskt.</b> Om du vill att vi ska glömma dina meddelanden, kryssa i rutan nedan.", + "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.": "Meddelandesynlighet i Matrix liknar email. Att vi glömmer dina meddelanden innebär att meddelanden som du skickat inte delas med några nya eller oregistrerade användare, men registrerade användare som redan har tillgång till meddelandena kommer fortfarande ha tillgång till sin kopia.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Glöm alla meddelanden som jag har skickat när mitt konto inaktiveras (<b>Varning:</b> detta kommer att göra så att framtida användare får se ofullständiga konversationer)", + "To continue, please enter your password:": "För att fortsätta, ange ditt lösenord:", + "password": "lösenord", + "Debug Logs Submission": "Inlämning av felsökningsloggar", + "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.": "Om du har anmält en bugg via GitHub, kan felsökningsloggar hjälpa oss spåra problemet. Felsökningsloggarna innehåller användningsdata för applikationen inklusive ditt användarnamn, ID eller alias för rum och grupper du besökt och användarnamn för andra användare. De innehåller inte meddelanden.", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot samlar in anonym analysdata för att vi ska kunna förbättra applikationen.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Integritet är viktig för oss, så vi samlar inte in några personliga eller identifierbara uppgifter för våra analyser.", + "Learn more about how we use analytics.": "Läs mer om hur vi använder analysdata.", + "Analytics": "Analysdata", + "Send analytics data": "Skicka analysdata", + "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Du har loggats ut från alla enheter och kommer inte längre att få push-meddelanden. För att återaktivera det, logga in på varje enhet igen", + "Passphrases must match": "Passfraser måste matcha", + "Passphrase must not be empty": "Lösenfras får inte vara tom", + "Confirm passphrase": "Bekräfta lösenfrasen", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ändrade fastnålade meddelanden för rummet.", + "Message Pinning": "Nåla fast meddelanden", + "Unpin Message": "Ta bort fastnålning", + "No pinned messages.": "Inga fastnålade meddelanden.", + "Pinned Messages": "Fastnålade meddelanden", + "Pin Message": "Nåla fast meddelande", + "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.": "Den exporterade filen kommer att låta någon som kan läsa den att dekryptera alla krypterade meddelanden som du kan se, så du bör vara noga med att hålla den säker. För att hjälpa till med detta, bör du ange en lösenfras nedan, som kommer att användas för att kryptera exporterad data. Det kommer bara vara möjligt att importera data genom att använda samma lösenfras.", + "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.": "Denna process möjliggör import av krypteringsnycklar som tidigare exporterats från en annan Matrix-klient. Du kommer då kunna dekryptera alla meddelanden som den andra klienten kunde dekryptera.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Den exporterade filen kommer vara skyddad med en lösenfras. Du måste ange lösenfrasen här, för att dekryptera filen.", + "Tag Panel": "Tagg-panel", + "Flair": "Emblem", + "Showing flair for these communities:": "Visar emblem för dessa communityn:", + "This room is not showing flair for any communities": "Detta rum visar inte emblem för några communityn", + "Flair will appear if enabled in room settings": "Emblem kommer visas om det är aktiverat i rumsinställningarna", + "Flair will not appear": "Emblem kommer inte att visas", + "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det." } From 6a317569d798a5d79e0cc2ef511864a15cb73c0c Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Mon, 4 Jun 2018 09:38:21 +0100 Subject: [PATCH 133/480] Add null-guard to support browsers that don't support performance Like Tor. Fixes https://github.com/vector-im/riot-web/issues/6781 --- src/components/structures/MatrixChat.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 46c1113a1d..e1c9e33055 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -398,6 +398,9 @@ export default React.createClass({ }, startPageChangeTimer() { + // Tor doesn't support performance + if (!performance || !performance.mark) return null; + // This shouldn't happen because componentWillUpdate and componentDidUpdate // are used. if (this._pageChanging) { @@ -409,6 +412,9 @@ export default React.createClass({ }, stopPageChangeTimer() { + // Tor doesn't support performance + if (!performance || !performance.mark) return null; + if (!this._pageChanging) { console.warn('MatrixChat.stopPageChangeTimer: timer not started'); return; From 8f135c650e9894da580a9d3debc26fa8e73bbc63 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Sat, 2 Jun 2018 12:31:10 +0000 Subject: [PATCH 134/480] Translated using Weblate (Basque) Currently translated at 100.0% (1190 of 1190 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 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index c293ec135d..909b466da3 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -893,7 +893,7 @@ "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Trepeta ezabatzean gelako kide guztientzat kentzen da. Ziur trepeta ezabatu nahi duzula?", "%(nameList)s %(transitionList)s": "%(nameList)s%(transitionList)s", "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s %(count)s aldiz elkartu dira", - "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s elkartu da", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s elkartu dira", "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s%(count)s aldiz elkartu da", "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s elkartu da", "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s%(count)s aldiz atera dira", @@ -904,7 +904,7 @@ "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s elkartu eta atera da", "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s elkartu eta atera da %(count)s aldiz", "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s elkartu eta atera da", - "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s atera eta berriz elkartu da %(count)s aldiz", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s atera eta berriz elkartu dira %(count)s aldiz", "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s atera eta berriz elkartu da", "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s atera eta berriz elkartu da %(count)s aldiz", "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s atera eta berriz elkartu da", @@ -1192,7 +1192,7 @@ "Yes, I want to help!": "Bai, lagundu nahi dut!", "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. <b>This action is irreversible.</b>": "Honek kontua behin betirako erabilgaitza bihurtuko du. Ezin izango duzu saioa hasi, eta ezin izango du beste inork ID hori erabili. Kontua dagoen gela guztietatik aterako da, eta kontuaren xehetasunak identitate-zerbitzaritik ezabatuko dira. <b>Ekintza hau ezin da desegin.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Kontua desaktibatzean <b>ez dira zuk bidalitako mezuak ahaztuko.</b> Mezuak ahaztea nahi baduzu markatu beheko kutxa.", - "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.": "Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ahaztean ez dizkiogu erabiltzaile berriei edo izena eman ez dutenei erakutsiko, baina jada zure mezuak jaso diztuzten erregistratutako erabiltzaileen bere kopia izaten jarraituko dute.", + "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.": "Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ahaztean ez dizkiogu erabiltzaile berriei edo izena eman ez dutenei erakutsiko, baina jada zure mezuak jaso dituzten erregistratutako erabiltzaileen bere kopia izaten jarraituko dute.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Ahaztu bidali ditudan mezu guztiak kontua desaktibatzean (Abisua: Honekin etorkizuneko erabiltzaileek elkarrizketaren bertsio ez oso bat ikusiko dute)", "Can't leave Server Notices room": "Ezin zara Server Notices gelatik atera", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Gela hau mezu hasiera zerbitzariaren garrantzitsuak bidaltzeko erabiltzen da, eta ezin zara atera." From 195d596c896fc6da1730300e4a594db00f74ba43 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Wed, 30 May 2018 12:53:39 +0000 Subject: [PATCH 135/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1190 of 1190 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 6295c7e934..d157f4dff8 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -269,7 +269,7 @@ "Enable Notifications": "Включване на известия", "Cannot add any more widgets": "Не могат да се добавят повече приспособления", "The maximum permitted number of widgets have already been added to this room.": "Максимално разрешеният брой приспособления е вече добавен към тази стая.", - "Add a widget": "Добавяне на приспособление", + "Add a widget": "Добави приспособление", "Drop File Here": "Пусни файла тук", "Drop file here to upload": "Пуснете файла тук, за да се качи", " (unsupported)": " (не се поддържа)", @@ -1180,7 +1180,7 @@ "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Това ще направи акаунта Ви неизползваем завинаги. Няма да можете да влезете пак, а регистрирането повторно на същия потребителски идентификатор няма да е възможно. Акаунтът Ви да напусне всички стаи, в които участва. Ще бъдат премахнати и данните за акаунта Ви от сървъра за самоличност. <b>Действието е необратимо.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Деактивирането на акаунта Ви <b>по подразбиране не прави така, че изпратените съобщения да бъдат забравени.</b> Ако искате да забравим съобщенията Ви, моля отбележете с отметка по-долу.", "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.": "Видимостта на съобщенията в Matrix е подобно на имейл системата. Нашето забравяне означава, че: изпратените от Вас съобщения няма да бъдат споделяни с нови или нерегистрирани потребители, но регистрираните потребители имащи достъп до тях ще продължат да имат достъп до своето копие.", - "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Моля, забравете всички изпратени съобщения от мен съобщения, когато акаунта ми се деактивира (<b>Внимание:</b> това ще направи бъдещите потребители да имат само частичен поглед върху кореспонденцията)", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Моля, забравете всички изпратени от мен съобщения, когато акаунта ми се деактивира (<b>Внимание:</b> това ще направи бъдещите потребители да имат само частичен поглед върху кореспонденцията)", "To continue, please enter your password:": "За да продължите, моля въведете паролата си:", "password": "парола", "Can't leave Server Notices room": "Не може да напуснете стая \"Server Notices\"", From 3c204f1eb8a827d62c932c9300f1d60139585778 Mon Sep 17 00:00:00 2001 From: Nathan van Beelen <nathan@vanbeelen.org> Date: Sat, 2 Jun 2018 18:54:14 +0000 Subject: [PATCH 136/480] Translated using Weblate (Dutch) Currently translated at 100.0% (1190 of 1190 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 | 74 ++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index a6df7d69b2..f09c63118e 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -4,7 +4,7 @@ "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s heeft de uitnodiging voor %(displayName)s geaccepteerd.", "Account": "Account", "Access Token:": "Toegangstoken:", - "Add email address": "Voeg een email address toe", + "Add email address": "Voeg een e-mailadres toe", "Add phone number": "Voeg een telefoonnummer toe", "Admin": "Beheerder", "Advanced": "Geavanceerd", @@ -18,8 +18,8 @@ "A new password must be entered.": "Er moet een nieuw wachtwoord worden ingevoerd.", "%(senderName)s answered the call.": "%(senderName)s heeft deelgenomen aan het audiogesprek.", "An error has occurred.": "Er is een fout opgetreden.", - "Anyone who knows the room's link, apart from guests": "Iedereen die de kamerlink weet, behalve gasten", - "Anyone who knows the room's link, including guests": "Iedereen die de kamerlink weet, inclusief gasten", + "Anyone who knows the room's link, apart from guests": "Iedereen die de link van de ruimte weet, behalve gasten", + "Anyone who knows the room's link, including guests": "Iedereen die link van de ruimte weet, inclusief gasten", "Are you sure?": "Weet je het zeker?", "Are you sure you want to reject the invitation?": "Weet je zeker dat je de uitnodiging wilt weigeren?", "Attachment": "Bijlage", @@ -36,13 +36,13 @@ "Change Password": "Wachtwoord veranderen", "%(senderName)s changed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto veranderd.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de kamernaam van %(roomName)s gewijzigd.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de ruimtenaam van %(roomName)s gewijzigd.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s heeft het onderwerp gewijzigd naar \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Veranderingen aan wie de geschiedenis kan lezen worden alleen maar toegepast op toekomstige berichten in deze ruimte", "Changes your display nickname": "Verandert jouw weergavenaam", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde gespreksgeschiedenis onleesbaar zou maken, behalve als je eerst je ruimtesleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.", - "Clear Cache and Reload": "Legen cache en herlaad", - "Clear Cache": "Legen cache", + "Clear Cache and Reload": "Cache Legen en Herladen", + "Clear Cache": "Cache Legen", "Click here to fix": "Klik hier om op te lossen", "Click to mute audio": "Klik om audio te dempen", "Click to mute video": "Klik om de video te dempen", @@ -53,7 +53,7 @@ "Commands": "Opdrachten", "Conference call failed.": "Conferentiegesprek mislukt.", "Conference calling is in development and may not be reliable.": "Conferentiegesprekken zijn nog in ontwikkelingen en kunnen onbetrouwbaar zijn.", - "Conference calls are not supported in encrypted rooms": "Conferentiegesprekken worden niet ondersteunt in versleutelde kamers", + "Conference calls are not supported in encrypted rooms": "Conferentiegesprekken worden niet ondersteunt in versleutelde ruimtes", "Conference calls are not supported in this client": "Conferentiegesprekken worden niet ondersteunt in deze client", "Confirm password": "Bevestigen wachtwoord", "Confirm your new password": "Bevestig je nieuwe wachtwoord", @@ -93,7 +93,7 @@ "Operation failed": "Actie mislukt", "powered by Matrix": "mogelijk gemaakt door Matrix", "Remove": "Verwijderen", - "Room directory": "Kamerlijst", + "Room directory": "Ruimtelijst", "Settings": "Instellingen", "Start chat": "Gesprek starten", "unknown error code": "onbekende foutcode", @@ -267,7 +267,7 @@ "Hangup": "Ophangen", "Hide read receipts": "Leesbewijzen verbergen", "Hide Text Formatting Toolbar": "Tekstopmaakgereedschapsbalk verbergen", - "Historical": "Historische", + "Historical": "Historisch", "Home": "Home", "Homeserver is": "Thuisserver is", "Identity Server is": "Identiteitsserver is", @@ -295,7 +295,7 @@ "Sign in with": "Inloggen met", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Toetreden als <voiceText>spraak</voiceText> of <videoText>video</videoText>.", "Join Room": "Ruimte toetreden", - "%(targetName)s joined the room.": "%(targetName)s is aan de ruimte toegevoegd.", + "%(targetName)s joined the room.": "%(targetName)s is tot de ruimte toegetreden.", "Joins room with given alias": "Treed de ruimte toe met een gegeven naam", "Jump to first unread message.": "Spring naar het eerste ongelezen bericht.", "Labs": "Labs", @@ -308,9 +308,9 @@ "Login as guest": "Als gast inloggen", "Logout": "Uitloggen", "Low priority": "Lage prioriteit", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor alle kamerleden, vanaf het moment dat ze uitgenodigt zijn.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle kamerleden, vanaf het moment dat ze toegetreden zijn.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle kamerleden.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze uitgenodigd zijn.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze toegetreden zijn.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor iedereen.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor onbekend (%(visibility)s).", "Manage Integrations": "Integraties beheren", @@ -349,7 +349,7 @@ "Room name (optional)": "Ruimtenaam (optioneel)", "%(roomName)s does not exist.": "%(roomName)s bestaat niet.", "%(roomName)s is not accessible at this time.": "%(roomName)s is niet toegankelijk op dit moment.", - "Rooms": "Kamers", + "Rooms": "Ruimtes", "Save": "Opslaan", "Scroll to bottom of page": "Scroll naar de onderkant van de pagina", "Scroll to unread messages": "Scroll naar ongelezen berichten", @@ -562,8 +562,8 @@ "Device name": "Apparaat naam", "Device Name": "Apparaat Naam", "Device key": "Apparaat sleutel", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Als het overeenkomt, druk op de verifiëren knop hieronder. Als het niet overeenkomt, dan is er iemand anders die dit apparaat onderschept en dan zal je waarschijnlijk in plaats daarvan op de 'buitensluiten' knop willen drukken.", - "Blacklist": "Buitensluiten", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Als het overeenkomt, druk op de verifiëren knop hieronder. Als het niet overeenkomt, dan is er iemand anders die dit apparaat onderschept en dan zal je waarschijnlijk in plaats daarvan op de 'blokkeren' knop willen drukken.", + "Blacklist": "Blokkeren", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Je bent momenteel geverifieerde apparaten aan het buitensluiten; om berichten naar deze apparaten te versturen moet je ze verifiëren.", "Unblacklist": "Niet buitensluiten", "In future this verification process will be more sophisticated.": "In de toekomst zal dit verificatie proces meer geraffineerd zijn.", @@ -674,17 +674,17 @@ "Copied!": "Gekopieerd!", "Failed to copy": "Kopiëren mislukt", "Unpin Message": "Maak pin los", - "Add rooms to this community": "Voeg kamers toe aan deze community", + "Add rooms to this community": "Voeg ruimtes toe aan deze gemeenschap", "Call Failed": "Oproep mislukt", "Call": "Bel", "Answer": "Antwoord", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Opgepast: elke persoon die je toevoegt aan een community zal publiek zichtbaar zijn voor iedereen die het community ID kent", "Invite new community members": "Nodig nieuwe community leden uit", "Name or matrix ID": "Naam of Matrix ID", - "Which rooms would you like to add to this community?": "Welke kamers wil je toevoegen aan deze community?", + "Which rooms would you like to add to this community?": "Welke ruimtes wil je toevoegen aan deze community?", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Een widget verwijderen doet dat voor alle gebruikers in deze ruimte. Ben je zeker dat je het widget wil verwijderen?", "Delete Widget": "Widget verwijderen", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Er zijn onbekende toestellen in deze kamer: als je verder gaat zonder ze te verifieren zal het mogelijk zijn dat iemand je oproep afluistert.", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Er zijn onbekende toestellen in deze ruimte: als je verder gaat zonder ze te verifiëren zal het mogelijk zijn dat iemand je oproep afluistert.", "Review Devices": "Toestellen nakijken", "Call Anyway": "Bel toch", "Answer Anyway": "Antwoord toch", @@ -1014,7 +1014,7 @@ "Expand panel": "Paneel uitklappen", "On": "Aan", "%(count)s Members|other": "%(count)s Deelnemers", - "Filter room names": "Filter kamernamen", + "Filter room names": "Filter ruimtenamen", "Changelog": "Logboek van wijzigingen", "Waiting for response from server": "Wachten op antwoord van de server", "Send Custom Event": "Verzend aangepast evenement", @@ -1026,7 +1026,7 @@ "Hide panel": "Paneel verbergen", "You cannot delete this image. (%(code)s)": "Je kunt deze afbeelding niet verwijderen. (%(code)s)", "Cancel Sending": "Versturen annuleren", - "This Room": "Deze kamer", + "This Room": "Deze Ruimte", "The Home Server may be too old to support third party networks": "De thuisserver is misschien te oud om netwerken van derde partijen te ondersteunen", "Resend": "Opnieuw verzenden", "Error saving email notification preferences": "Fout bij het opslaan van de meldingsvoorkeuren voor e-mail", @@ -1035,7 +1035,7 @@ "Unavailable": "Niet beschikbaar", "View Decrypted Source": "Bekijk ontsleutelde bron", "Failed to update keywords": "Trefwoorden bijwerken mislukt", - "remove %(name)s from the directory.": "verwijder %(name)s uit de kamerlijst.", + "remove %(name)s from the directory.": "verwijder %(name)s uit de ruimtelijst.", "Notifications on the following keywords follow rules which can’t be displayed here:": "Meldingen op de volgende trefwoorden volgen regels die hier niet kunnen worden getoond:", "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> en <operaLink>Opera</operaLink> werken ook.", "Please set a password!": "Stel een wachtwoord in!", @@ -1050,31 +1050,31 @@ "Noisy": "Luidruchtig", "Failed to get protocol list from Home Server": "Protocollijst ophalen van de homeserver mislukt", "Collecting app version information": "App-versieinformatie verzamelen", - "Delete the room alias %(alias)s and remove %(name)s from the directory?": "De alias %(alias)s verwijderen en %(name)s uit de kamerlijst verwijderen?", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "De alias %(alias)s verwijderen en %(name)s uit de ruimtelijst verwijderen?", "This will allow you to return to your account after signing out, and sign in on other devices.": "Hiermee kunt u naar uw account terugkeren nadat u zich heeft afgemeld, en u aanmelden op andere apparaten.", "Keywords": "Trefwoorden", "Enable notifications for this account": "Meldingen voor dit account aanzetten", - "Directory": "Kamerlijst", + "Directory": "Ruimtelijst", "Invite to this community": "Nodig uit in deze community", - "Search for a room": "Een kamer opzoeken", + "Search for a room": "Een ruimte opzoeken", "Messages containing <span>keywords</span>": "Berichten die <span>trefwoorden</span> bevatten", - "Room not found": "De kamer is niet gevonden", + "Room not found": "De ruimte is niet gevonden", "Tuesday": "Dinsdag", "Enter keywords separated by a comma:": "Voeg trefwoorden toe, gescheiden door een komma:", "Search…": "Zoeken…", "You have successfully set a password and an email address!": "Het instellen van een wachtwoord en e-mailadres is geslaagd!", - "Remove %(name)s from the directory?": "%(name)s uit de kamerlijst verwijderen?", + "Remove %(name)s from the directory?": "%(name)s uit de ruimtelijst verwijderen?", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot gebrukt veel geavanceerde browserfuncties, waarvan enkele niet (of experimenteel) in uw webbrowser beschikbaar zijn.", "Developer Tools": "Ontwikkelaarsgereedschap", "Enable desktop notifications": "Desktopmeldingen aanzetten", "Explore Account Data": "Bekijk account informatie", - "Remove from Directory": "Uit de kamerlijst verwijderen", + "Remove from Directory": "Uit de ruimtelijst verwijderen", "Saturday": "Zaterdag", "Remember, you can always set an email address in user settings if you change your mind.": "Onthoud dat u altijd een e-mailadres in kan stellen in de gebruikersinstellingen als u zich bedenkt.", "Direct Chat": "Privégesprek", "The server may be unavailable or overloaded": "De server is misschien niet beschikbaar of overbelast", "Reject": "Afwijzen", - "Failed to set Direct Message status of room": "Het is mislukt om de directe-berichtenstatus van de kamer in te stellen", + "Failed to set Direct Message status of room": "Het is niet gelukt om de privéchat status van de ruimte in te stellen", "Monday": "Maandag", "All messages (noisy)": "Alle berichten (luid)", "Enable them now": "Deze nu aanzetten", @@ -1084,9 +1084,9 @@ "more": "meer", "You must specify an event type!": "Je moet een event-type specificeren!", "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)", - "Invite to this room": "Uitnodigen voor deze kamer", + "Invite to this room": "Uitnodigen voor deze ruimte", "Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Installeer alstublieft <chromeLink>Chrome</chromeLink> of <firefoxLink>Firefox</firefoxLink> voor de beste gebruikerservaring.", - "Failed to get public room list": "Lijst met publieke kamers ophalen mislukt", + "Failed to get public room list": "Lijst met publieke ruimtes ophalen mislukt", "Send logs": "Logboeken versturen", "All messages": "Alle berichten", "Call invitation": "Oproep-uitnodiging", @@ -1095,12 +1095,12 @@ "Failed to send custom event.": "Aangepast Event verzenden mislukt.", "What's new?": "Wat is er nieuw?", "Notify me for anything else": "Stuur een melding voor al het andere", - "When I'm invited to a room": "Wanneer ik uitgenodigd word voor een kamer", + "When I'm invited to a room": "Wanneer ik uitgenodigd word voor een ruimte", "Can't update user notification settings": "Het is niet gelukt om de meldingsinstellingen van de gebruiker bij te werken", - "Notify for all other messages/rooms": "Stuur een melding voor alle andere berichten/kamers", - "Unable to look up room ID from server": "Het is mislukt om de kamer-ID op te halen van de server", - "Couldn't find a matching Matrix room": "Het is niet gelukt om een bijbehorende Matrix-kamer te vinden", - "All Rooms": "Alle kamers", + "Notify for all other messages/rooms": "Stuur een melding voor alle andere berichten/ruimtes", + "Unable to look up room ID from server": "Het is mislukt om het ruimte-ID op te halen van de server", + "Couldn't find a matching Matrix room": "Het is niet gelukt om een bijbehorende Matrix-ruimte te vinden", + "All Rooms": "Alle Ruimtes", "You cannot delete this message. (%(code)s)": "Je kunt dit bericht niet verwijderen. (%(code)s)", "Thursday": "Donderdag", "Forward Message": "Bericht doorsturen", @@ -1122,7 +1122,7 @@ "Enable audible notifications in web client": "Geluidsmeldingen in de webclient aanzetten", "Permalink": "Permanente link", "Off": "Uit", - "Riot does not know how to join a room on this network": "Riot weet niet hoe het moet deelnemen in een kamer op dit netwerk", + "Riot does not know how to join a room on this network": "Riot weet niet hoe het moet deelnemen in een ruimte op dit netwerk", "Mentions only": "Alleen vermeldingen", "Wednesday": "Woensdag", "You can now return to your account after signing out, and sign in on other devices.": "U kunt nu terugkeren naar uw account nadat u bent afgemeld, en u aanmelden op andere apparaten.", From c792ae1c6fba7bf93ee079ba06d630da8d2f74c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Tue, 29 May 2018 15:48:56 +0000 Subject: [PATCH 137/480] Translated using Weblate (Slovak) Currently translated at 100.0% (1190 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index daa9cfc9b6..ed07ff5c09 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -735,7 +735,7 @@ "Enable automatic language detection for syntax highlighting": "Povoliť automatickú detegciu jazyka pre zvýrazňovanie syntaxe", "Automatically replace plain text Emoji": "Automaticky nahrádzať textové Emoji", "Disable Emoji suggestions while typing": "Zakázať návrhy Emoji počas písania", - "Hide avatars in user and room mentions": "Skryť avatarov pri zmienkach miestností a používateľov", + "Hide avatars in user and room mentions": "Skryť profilové obrázky pri zmienkach miestností a používateľov", "Disable big emoji in chat": "Zakázať veľké Emoji v konverzácii", "Mirror local video feed": "Zrkadliť lokálne video", "Disable Peer-to-Peer for 1:1 calls": "Zakázať P2P počas priamych volaní", From bf0d03bce364521e760e37ec8ccdf2b0b16a114e Mon Sep 17 00:00:00 2001 From: Akihiko Odaki <nekomanma@pixiv.co.jp> Date: Wed, 6 Jun 2018 16:30:24 +0900 Subject: [PATCH 138/480] Import react as React in src/components/views/elements/DNDTagTile.js Signed-off-by: Akihiko Odaki <nekomanma@pixiv.co.jp> --- src/components/views/elements/DNDTagTile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/elements/DNDTagTile.js b/src/components/views/elements/DNDTagTile.js index 9d8ecc1da6..7aa642986b 100644 --- a/src/components/views/elements/DNDTagTile.js +++ b/src/components/views/elements/DNDTagTile.js @@ -17,6 +17,7 @@ limitations under the License. import TagTile from './TagTile'; +import React from 'react'; import { Draggable } from 'react-beautiful-dnd'; export default function DNDTagTile(props) { From 03d67988e86a9100a1463e3464fa5a35408bb1f0 Mon Sep 17 00:00:00 2001 From: Walter <studinsky@gmail.com> Date: Wed, 6 Jun 2018 13:40:48 +0000 Subject: [PATCH 139/480] Translated using Weblate (Russian) Currently translated at 99.8% (1188 of 1190 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, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 0a254736b8..9d7f8901ab 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1188,5 +1188,7 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Пожалуйста, помогите улучшить Riot.im, отправляя <UsageDataLink>анонимные данные использования</UsageDataLink>. При этом будут использоваться cookie.", "Yes, I want to help!": "Да, я хочу помочь!", "Reload widget": "Перезагрузить виджет", - "To notify everyone in the room, you must be a": "Для уведомления всех в комнате, вы должны быть" + "To notify everyone in the room, you must be a": "Для уведомления всех в комнате, вы должны быть", + "Can't leave Server Notices room": "Невозможно покинуть комнату для сервера по заметкам", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Эта комната для важных сообщений от сервера, потому ее не возможно покинуть." } From 881e9a8070ea368482a59895619cb0bc23f7b8d4 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 6 Jun 2018 16:00:16 +0100 Subject: [PATCH 140/480] js-sdk rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 96c37a61c8..6722cfc3c3 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "linkifyjs": "^2.1.3", "lodash": "^4.13.1", "lolex": "2.3.2", - "matrix-js-sdk": "0.10.3", + "matrix-js-sdk": "0.10.4-rc.1", "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", From c8bf74350677f1b21e94dc1310437baa960b4eec Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 6 Jun 2018 16:06:44 +0100 Subject: [PATCH 141/480] Prepare changelog for v0.12.7-rc.1 --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1951875ee..ae8f535cb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +Changes in [0.12.7-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.7-rc.1) (2018-06-06) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.6...v0.12.7-rc.1) + + * Update from Weblate. + [\#1944](https://github.com/matrix-org/matrix-react-sdk/pull/1944) + * Import react as React in src/components/views/elements/DNDTagTile.js + [\#1943](https://github.com/matrix-org/matrix-react-sdk/pull/1943) + * Fix click on faded left/right/middle panel -> close settings + [\#1940](https://github.com/matrix-org/matrix-react-sdk/pull/1940) + * Add null-guard to support browsers that don't support performance + [\#1942](https://github.com/matrix-org/matrix-react-sdk/pull/1942) + * Support third party integration managers in AppPermission + [\#1455](https://github.com/matrix-org/matrix-react-sdk/pull/1455) + * Update pinned messages in real time + [\#1934](https://github.com/matrix-org/matrix-react-sdk/pull/1934) + * Expose at-room power level setting + [\#1938](https://github.com/matrix-org/matrix-react-sdk/pull/1938) + Changes in [0.12.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.6) (2018-05-25) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.6-rc.1...v0.12.6) From 4834816a0625e0215e5f6a2bf8ba660e5f261cf1 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 6 Jun 2018 16:06:45 +0100 Subject: [PATCH 142/480] v0.12.7-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6722cfc3c3..6add75f972 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.6", + "version": "0.12.7-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From c91e6cb530b3e1050b2248b831da23a0dc548060 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 7 Jun 2018 01:02:34 +0100 Subject: [PATCH 143/480] make click to insert nick work on join/parts, /me's etc Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/_components.scss | 1 + res/css/views/elements/_TextForEvent.scss | 19 +++ src/TextForEvent.js | 158 +++++++++++++--------- 3 files changed, 113 insertions(+), 65 deletions(-) create mode 100644 res/css/views/elements/_TextForEvent.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 2734939ae3..3f36b6bbdf 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -59,6 +59,7 @@ @import "./views/elements/_RoleButton.scss"; @import "./views/elements/_Spinner.scss"; @import "./views/elements/_SyntaxHighlight.scss"; +@import "./views/elements/_TextForEvent.scss"; @import "./views/elements/_ToolTipButton.scss"; @import "./views/globals/_MatrixToolbar.scss"; @import "./views/groups/_GroupPublicityToggle.scss"; diff --git a/res/css/views/elements/_TextForEvent.scss b/res/css/views/elements/_TextForEvent.scss new file mode 100644 index 0000000000..8d46cbf84c --- /dev/null +++ b/res/css/views/elements/_TextForEvent.scss @@ -0,0 +1,19 @@ +/* +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> + +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_TextForEvent_username { + cursor: pointer; +} diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 712150af4d..0cdaaac4ab 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -17,11 +17,28 @@ import MatrixClientPeg from './MatrixClientPeg'; import CallHandler from './CallHandler'; import { _t } from './languageHandler'; import * as Roles from './Roles'; +import dis from "./dispatcher"; +import React from 'react'; + +function onUsernameClick(e) { + dis.dispatch({ + action: 'insert_mention', + user_id: e.target.id, + }); +} + +function makeUsernameSpan(mxid, text) { + return <span className="mx_TextForEvent_username" dir="auto" onClick={onUsernameClick} id={mxid}>{ text }</span>; +} function textForMemberEvent(ev) { // XXX: SYJS-16 "sender is sometimes null for join messages" const senderName = ev.sender ? ev.sender.name : ev.getSender(); const targetName = ev.target ? ev.target.name : ev.getStateKey(); + + const sender = makeUsernameSpan(ev.getSender(), senderName); + const target = makeUsernameSpan(ev.getStateKey(), targetName); + const prevContent = ev.getPrevContent(); const content = ev.getContent(); @@ -32,47 +49,48 @@ function textForMemberEvent(ev) { const threePidContent = content.third_party_invite; if (threePidContent) { if (threePidContent.display_name) { - return _t('%(targetName)s accepted the invitation for %(displayName)s.', { - targetName, + return _t('<target> accepted the invitation for %(displayName)s.', { displayName: threePidContent.display_name, + }, { + target, }); } else { - return _t('%(targetName)s accepted an invitation.', {targetName}); + return _t('<target> accepted an invitation.', {}, {target}); } } else { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { - return _t('%(senderName)s requested a VoIP conference.', {senderName}); + return _t('<sender> requested a VoIP conference.', {}, {sender}); } else { - return _t('%(senderName)s invited %(targetName)s.', {senderName, targetName}); + return _t('<sender> invited <target>.', {}, {sender, target}); } } } case 'ban': - return _t('%(senderName)s banned %(targetName)s.', {senderName, targetName}) + ' ' + reason; + return _t('<sender> banned <target>.', {}, {sender, target}) + ' ' + reason; case 'join': if (prevContent && prevContent.membership === 'join') { if (prevContent.displayname && content.displayname && prevContent.displayname !== content.displayname) { - return _t('%(oldDisplayName)s changed their display name to %(displayName)s.', { - oldDisplayName: prevContent.displayname, - displayName: content.displayname, + return _t('<oldDisplayName> changed their display name to <displayName>.', {}, { + oldDisplayName: makeUsernameSpan(ev.getStateKey(), prevContent.displayname), + displayName: makeUsernameSpan(ev.getStateKey(), content.displayname), }); } else if (!prevContent.displayname && content.displayname) { - return _t('%(senderName)s set their display name to %(displayName)s.', { - senderName: ev.getSender(), - displayName: content.displayname, + return _t('<sender> set their display name to <displayName>.', {}, { + sender, + displayName: makeUsernameSpan(ev.getSender(), content.displayname), }); } else if (prevContent.displayname && !content.displayname) { - return _t('%(senderName)s removed their display name (%(oldDisplayName)s).', { - senderName, - oldDisplayName: prevContent.displayname, + return _t('<sender> removed their display name (<oldDisplayName>).', { + sender, + oldDisplayName: makeUsernameSpan(ev.getSender(), prevContent.displayname), }); } else if (prevContent.avatar_url && !content.avatar_url) { - return _t('%(senderName)s removed their profile picture.', {senderName}); + return _t('<sender> removed their profile picture.', {}, {sender}); } else if (prevContent.avatar_url && content.avatar_url && prevContent.avatar_url !== content.avatar_url) { - return _t('%(senderName)s changed their profile picture.', {senderName}); + return _t('<sender> changed their profile picture.', {}, {sender}); } else if (!prevContent.avatar_url && content.avatar_url) { - return _t('%(senderName)s set a profile picture.', {senderName}); + return _t('<sender> set a profile picture.', {}, {sender}); } else { // suppress null rejoins return ''; @@ -82,7 +100,7 @@ function textForMemberEvent(ev) { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { return _t('VoIP conference started.'); } else { - return _t('%(targetName)s joined the room.', {targetName}); + return _t('<target> joined the room.', {}, {target}); } } case 'leave': @@ -90,42 +108,42 @@ function textForMemberEvent(ev) { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { return _t('VoIP conference finished.'); } else if (prevContent.membership === "invite") { - return _t('%(targetName)s rejected the invitation.', {targetName}); + return _t('<target> rejected the invitation.', {}, {target}); } else { - return _t('%(targetName)s left the room.', {targetName}); + return _t('<target> left the room.', {}, {target}); } } else if (prevContent.membership === "ban") { - return _t('%(senderName)s unbanned %(targetName)s.', {senderName, targetName}); + return _t('<sender> unbanned <target>.', {}, {sender, target}); } else if (prevContent.membership === "join") { - return _t('%(senderName)s kicked %(targetName)s.', {senderName, targetName}) + ' ' + reason; + return _t('<sender> kicked <target>.', {}, {sender, target}) + ' ' + reason; } else if (prevContent.membership === "invite") { - return _t('%(senderName)s withdrew %(targetName)s\'s invitation.', { - senderName, - targetName, - }) + ' ' + reason; + return _t('<sender> withdrew <target>\'s invitation.', {}, {sender, target}) + ' ' + reason; } else { - return _t('%(targetName)s left the room.', {targetName}); + return _t('<target> left the room.', {}, {target}); } } } function textForTopicEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - return _t('%(senderDisplayName)s changed the topic to "%(topic)s".', { - senderDisplayName, + return _t('<sender> changed the topic to "%(topic)s".', { topic: ev.getContent().topic, + }, { + sender: makeUsernameSpan(ev.getSender(), senderDisplayName), }); } function textForRoomNameEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); + const sender = makeUsernameSpan(ev.getSender(), senderDisplayName); if (!ev.getContent().name || ev.getContent().name.trim().length === 0) { - return _t('%(senderDisplayName)s removed the room name.', {senderDisplayName}); + return _t('<sender> removed the room name.', {}, {sender}); } - return _t('%(senderDisplayName)s changed the room name to %(roomName)s.', { - senderDisplayName, + return _t('<sender> changed the room name to %(roomName)s.', { roomName: ev.getContent().name, + }, { + sender, }); } @@ -135,7 +153,9 @@ function textForMessageEvent(ev) { if (ev.getContent().msgtype === "m.emote") { message = "* " + senderDisplayName + " " + message; } else if (ev.getContent().msgtype === "m.image") { - message = _t('%(senderDisplayName)s sent an image.', {senderDisplayName}); + message = _t('<sender> sent an image.', {}, { + sender: makeUsernameSpan(ev.getSender(), senderDisplayName), + }); } return message; } @@ -143,7 +163,9 @@ function textForMessageEvent(ev) { function textForCallAnswerEvent(event) { const senderName = event.sender ? event.sender.name : _t('Someone'); const supported = MatrixClientPeg.get().supportsVoip() ? '' : _t('(not supported by this browser)'); - return _t('%(senderName)s answered the call.', {senderName}) + ' ' + supported; + return _t('<sender> answered the call.', {}, { + sender: makeUsernameSpan(event.getSender(), senderName), + }) + ' ' + supported; } function textForCallHangupEvent(event) { @@ -161,11 +183,14 @@ function textForCallHangupEvent(event) { reason = _t('(unknown failure: %(reason)s)', {reason: eventContent.reason}); } } - return _t('%(senderName)s ended the call.', {senderName}) + ' ' + reason; + return _t('<sender> ended the call.', {}, { + sender: makeUsernameSpan(event.getSender(), senderName), + }) + ' ' + reason; } function textForCallInviteEvent(event) { const senderName = event.sender ? event.sender.name : _t('Someone'); + const sender = makeUsernameSpan(event.getSender(), senderName); // FIXME: Find a better way to determine this from the event? let callType = "voice"; if (event.getContent().offer && event.getContent().offer.sdp && @@ -173,43 +198,47 @@ function textForCallInviteEvent(event) { callType = "video"; } const supported = MatrixClientPeg.get().supportsVoip() ? "" : _t('(not supported by this browser)'); - return _t('%(senderName)s placed a %(callType)s call.', {senderName, callType}) + ' ' + supported; + return _t('<sender> placed a %(callType)s call.', {callType}, {sender}) + ' ' + supported; } function textForThreePidInviteEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - return _t('%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.', { - senderName, + return _t('<sender> sent an invitation to %(targetDisplayName)s to join the room.', { targetDisplayName: event.getContent().display_name, + }, { + sender: makeUsernameSpan(event.getSender(), senderName), }); } function textForHistoryVisibilityEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); + const sender = makeUsernameSpan(event.getSender(), senderName); switch (event.getContent().history_visibility) { case 'invited': - return _t('%(senderName)s made future room history visible to all room members, ' - + 'from the point they are invited.', {senderName}); + return _t('<sender> made future room history visible to all room members, ' + + 'from the point they are invited.', {}, {sender}); case 'joined': - return _t('%(senderName)s made future room history visible to all room members, ' - + 'from the point they joined.', {senderName}); + return _t('<sender> made future room history visible to all room members, ' + + 'from the point they joined.', {}, {sender}); case 'shared': - return _t('%(senderName)s made future room history visible to all room members.', {senderName}); + return _t('<sender> made future room history visible to all room members.', {}, {sender}); case 'world_readable': - return _t('%(senderName)s made future room history visible to anyone.', {senderName}); + return _t('<sender> made future room history visible to anyone.', {}, {sender}); default: - return _t('%(senderName)s made future room history visible to unknown (%(visibility)s).', { - senderName, + return _t('<sender> made future room history visible to unknown (%(visibility)s).', { visibility: event.getContent().history_visibility, + }, { + sender, }); } } function textForEncryptionEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - return _t('%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).', { - senderName, + return _t('<sender> turned on end-to-end encryption (algorithm %(algorithm)s).', { algorithm: event.getContent().algorithm, + }, { + sender: makeUsernameSpan(event.getSender(), senderName), }); } @@ -241,10 +270,11 @@ function textForPowerEvent(event) { const to = event.getContent().users[userId]; if (to !== from) { diff.push( - _t('%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s', { - userId, + _t('<user> from %(fromPowerLevel)s to %(toPowerLevel)s', { fromPowerLevel: Roles.textualPowerLevel(from, userDefault), toPowerLevel: Roles.textualPowerLevel(to, userDefault), + }, { + user: makeUsernameSpan(userId, userId), }), ); } @@ -252,19 +282,23 @@ function textForPowerEvent(event) { if (!diff.length) { return ''; } - return _t('%(senderName)s changed the power level of %(powerLevelDiffText)s.', { - senderName, + return _t('<sender> changed the power level of %(powerLevelDiffText)s.', { powerLevelDiffText: diff.join(", "), + }, { + sender: makeUsernameSpan(event.getSender(), senderName), }); } function textForPinnedEvent(event) { - const senderName = event.getSender(); - return _t("%(senderName)s changed the pinned messages for the room.", {senderName}); + const senderName = event.sender ? event.sender.name : event.getSender(); + const sender = makeUsernameSpan(event.getSender(), senderName); + return _t("<sender> changed the pinned messages for the room.", {}, {sender}); } function textForWidgetEvent(event) { - const senderName = event.getSender(); + const senderName = event.sender ? event.sender.name : event.getSender(); + const sender = makeUsernameSpan(event.getSender(), senderName); + const {name: prevName, type: prevType, url: prevUrl} = event.getPrevContent(); const {name, type, url} = event.getContent() || {}; @@ -278,18 +312,12 @@ function textForWidgetEvent(event) { // equivalent to that condition. if (url) { if (prevUrl) { - return _t('%(widgetName)s widget modified by %(senderName)s', { - widgetName, senderName, - }); + return _t('%(widgetName)s widget modified by <sender>', {widgetName}, {sender}); } else { - return _t('%(widgetName)s widget added by %(senderName)s', { - widgetName, senderName, - }); + return _t('%(widgetName)s widget added by <sender>', {widgetName}, {sender}); } } else { - return _t('%(widgetName)s widget removed by %(senderName)s', { - widgetName, senderName, - }); + return _t('%(widgetName)s widget removed by <sender>', {widgetName}, {sender}); } } From 89b927e2784e592dcc022e0454a3a7cf22021143 Mon Sep 17 00:00:00 2001 From: Silvano <silvano87@yahoo.it> Date: Thu, 7 Jun 2018 15:27:19 +0000 Subject: [PATCH 144/480] Translated using Weblate (Italian) Currently translated at 100.0% (1190 of 1190 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index fa22725f78..bb931e17ea 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1184,5 +1184,12 @@ "Terms and Conditions": "Termini e condizioni", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Per continuare a usare l'homeserver %(homeserverDomain)s devi leggere e accettare i nostri termini e condizioni.", "Review terms and conditions": "Leggi i termini e condizioni", - "Muted Users": "Utenti silenziati" + "Muted Users": "Utenti silenziati", + "Message Replies": "Risposte", + "Message Pinning": "Messaggi appuntati", + "Mirror local video feed": "Feed video dai ripetitori locali", + "Replying": "Rispondere", + "Popout widget": "Oggetto a comparsa", + "Failed to indicate account erasure": "Impossibile indicare la cancellazione dell'account", + "Bulk Options": "Opzioni applicate in massa" } From 0b9b03c9ee4a357b4756dfe55d9343e131641e4a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 7 Jun 2018 22:01:27 +0100 Subject: [PATCH 145/480] re-run checkIfAlone if a member change occurred in the active room Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomView.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index c5f6a75cc5..0c62f5a874 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -672,6 +672,7 @@ module.exports = React.createClass({ } this._updateRoomMembers(); + this._checkIfAlone(this.state.room); }, onRoomMemberMembership: function(ev, member, oldMembership) { From 92c146bcacb578b2ee73c9e633d5d819c4208d25 Mon Sep 17 00:00:00 2001 From: Yao Wei <mwei@lxde.org> Date: Thu, 7 Jun 2018 08:29:20 +0000 Subject: [PATCH 146/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1190 of 1190 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, 7 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 80dce1cc2d..3677b78ec9 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -152,7 +152,7 @@ "Server unavailable, overloaded, or something else went wrong.": "伺服器可能不可用、超載,或者其他東西出錯了.", "Session ID": "會話 ID", "%(senderName)s set a profile picture.": "%(senderName)s 設置了頭像。.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 將暱稱改為了 %(displayName)s。.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 將他的暱稱改成 %(displayName)s。.", "Settings": "設定", "Show panel": "顯示側邊欄", "Show timestamps in 12 hour format (e.g. 2:30pm)": "用12小時制顯示時間戳 (如:下午 2:30)", @@ -193,11 +193,11 @@ "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s 更改了聊天室 %(roomName)s 圖像", "Cancel": "取消", "Custom Server Options": "自訂伺服器選項", - "Dismiss": "無視", + "Dismiss": "關閉", "Mute": "靜音", "Notifications": "通知", "Operation failed": "操作失敗", - "powered by Matrix": "由 Matrix 架設", + "powered by Matrix": "由 Matrix 提供", "Remove": "移除", "unknown error code": "未知的錯誤代碼", "OK": "確定", @@ -250,7 +250,7 @@ "Are you sure you want to leave the room '%(roomName)s'?": "您確定您要想要離開房間 '%(roomName)s' 嗎?", "Bans user with given id": "禁止有指定 ID 的使用者", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "無法連線到家伺服器 - 請檢查您的連線,確保您的<a>家伺服器的 SSL 憑證</a>可被信任,而瀏覽器擴充套件也沒有阻擋請求。", - "%(senderName)s changed their profile picture.": "%(senderName)s 已經變更了他們的基本資料圖片。", + "%(senderName)s changed their profile picture.": "%(senderName)s 已經變更了他的基本資料圖片。", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 變更了 %(powerLevelDiffText)s 權限等級。", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 將房間名稱變更為 %(roomName)s。", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 已經移除了房間名稱。", @@ -381,8 +381,8 @@ "Rejoin": "重新加入", "Remote addresses for this room:": "此房間的遠端地址:", "Remove Contact Information?": "移除聯絡人資訊?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 移除了他們的顯示名稱 (%(oldDisplayName)s)。", - "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他們的基本資寮圖片。", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 移除了他的顯示名稱 (%(oldDisplayName)s)。", + "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他的基本資料圖片。", "Remove %(threePid)s?": "移除 %(threePid)s?", "%(senderName)s requested a VoIP conference.": "%(senderName)s 請求了一次 VoIP 會議。", "Results from DuckDuckGo": "DuckDuckGo 的結果", @@ -962,7 +962,7 @@ "Community IDs cannot not be empty.": "社群 ID 不能為空。", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>顯示裝置</showDevicesText>、<sendAnywayText>無論如何都要傳送</sendAnywayText>或<cancelText>取消</cancelText>。", "<a>In reply to</a> <pill>": "<a>回覆給</a> <pill>", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 變更了他們的顯示名稱為 %(displayName)s 。", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 變更了他的顯示名稱為 %(displayName)s 。", "Failed to set direct chat tag": "設定直接聊天標籤失敗", "Failed to remove tag %(tagName)s from room": "從聊天室移除標籤 %(tagName)s 失敗", "Failed to add tag %(tagName)s to room": "新增標籤 %(tagName)s 到聊天室失敗", From b8cc438cb363c74e646efbeb1df2037de66e03ce Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Wed, 6 Jun 2018 15:35:30 +0000 Subject: [PATCH 147/480] Translated using Weblate (Russian) Currently translated at 99.8% (1188 of 1190 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 9d7f8901ab..dcde72d23a 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1189,6 +1189,6 @@ "Yes, I want to help!": "Да, я хочу помочь!", "Reload widget": "Перезагрузить виджет", "To notify everyone in the room, you must be a": "Для уведомления всех в комнате, вы должны быть", - "Can't leave Server Notices room": "Невозможно покинуть комнату для сервера по заметкам", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "Эта комната для важных сообщений от сервера, потому ее не возможно покинуть." + "Can't leave Server Notices room": "Невозможно покинуть комнату сервера уведомлений", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Эта комната используется для важных сообщений от сервера, поэтому вы не можете ее покинуть." } From 62978b7a2b49747999927d52e5123d8dee5a432a Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Thu, 7 Jun 2018 13:57:55 +0000 Subject: [PATCH 148/480] Translated using Weblate (Swedish) Currently translated at 100.0% (1190 of 1190 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 | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 8e5d8e2f21..14940ed1c3 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -149,7 +149,7 @@ "Add": "Lägg till", "Admin Tools": "Admin-verktyg", "Alias (optional)": "Alias (valfri)", - "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till servern - kontrollera anslutningen, försäkra att din <a>hemservers TLS-certifikat</a> är betrott, och att inget webbläsartillägg blockerar förfrågningar.", + "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till hemservern - kontrollera anslutningen, se till att <a>hemserverns SSL-certifikat</a> är betrott, och att inget webbläsartillägg blockerar förfrågningar.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade behörighetsnivå för %(powerLevelDiffText)s.", "<a>Click here</a> to join the discussion!": "<a>Klicka här</a> för att gå med i diskussionen!", "Close": "Stäng", @@ -290,7 +290,7 @@ "Register": "Registrera", "%(targetName)s rejected the invitation.": "%(targetName)s avvisade inbjudan.", "Reject invitation": "Avböj inbjudan", - "Rejoin": "Gå med tillbaka", + "Rejoin": "Gå med igen", "Remote addresses for this room:": "Fjärradresser för det här rummet:", "Remove Contact Information?": "Ta bort kontaktuppgifter?", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s tog bort sitt visningsnamn (%(oldDisplayName)s).", @@ -326,7 +326,7 @@ "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s bjöd in %(targetDisplayName)s med i rummet.", "Server error": "Serverfel", "Server may be unavailable or overloaded": "Servern kan vara otillgänglig eller överbelastad", - "Server may be unavailable, overloaded, or search timed out :(": "Servern kan vara otillgänglig, överbelastad, eller så timade sökningen ut :(", + "Server may be unavailable, overloaded, or search timed out :(": "Servern kan vara otillgänglig, överbelastad, eller så tog sökningen för lång tid :(", "Server may be unavailable, overloaded, or the file too big": "Servern kan vara otillgänglig, överbelastad, eller så är filen för stor", "Server may be unavailable, overloaded, or you hit a bug.": "Servern kan vara otillgänglig, överbelastad, eller så stötte du på en bugg.", "Server unavailable, overloaded, or something else went wrong.": "Servern är otillgänglig, överbelastad, eller så gick något annat fel.", @@ -347,7 +347,7 @@ "Start Chat": "Starta en chatt", "Cancel": "Avbryt", "Create new room": "Skapa nytt rum", - "Custom Server Options": "Egna serverinställningar", + "Custom Server Options": "Anpassade serverinställningar", "Dismiss": "Avvisa", "powered by Matrix": "drivs av Matrix", "Room directory": "Rumskatalog", @@ -380,7 +380,7 @@ "The email address linked to your account must be entered.": "Epostadressen som är kopplad till ditt konto måste anges.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Filen '%(fileName)s' överskrider serverns största tillåtna filstorlek", "The file '%(fileName)s' failed to upload": "Filen '%(fileName)s' kunde inte laddas upp", - "Online": "Aktiv", + "Online": "Online", "Unnamed room": "Namnlöst rum", "World readable": "Alla kan läsa", "Guests can join": "Gäster kan bli medlem i rummet", @@ -467,7 +467,7 @@ "Room not found": "Rummet hittades inte", "Messages containing my display name": "Meddelanden som innehåller mitt namn", "Messages in one-to-one chats": "Meddelanden i privata chattar", - "Unavailable": "Inte tillgänglig", + "Unavailable": "Otillgänglig", "View Decrypted Source": "Visa dekrypterad källa", "Failed to update keywords": "Det gick inte att uppdatera nyckelorden", "remove %(name)s from the directory.": "ta bort %(name)s från katalogen.", @@ -503,7 +503,7 @@ "Saturday": "lördag", "I understand the risks and wish to continue": "Jag förstår riskerna och vill fortsätta", "Direct Chat": "Direkt-chatt", - "The server may be unavailable or overloaded": "Servern kan vara överbelastad eller inte tillgänglig", + "The server may be unavailable or overloaded": "Servern kan vara otillgänglig eller överbelastad", "Reject": "Avböj", "Failed to set Direct Message status of room": "Det gick inte att ställa in direktmeddelandestatus för rummet", "Monday": "måndag", @@ -561,7 +561,7 @@ "View Source": "Visa källa", "Thank you!": "Tack!", "Quote": "Citera", - "Collapse panel": "Kollapsa panel", + "Collapse panel": "Dölj panel", "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 din nuvarande webbläsare kan appens utseende vara helt fel, och vissa eller alla egenskaper kommer nödvändigtvis inte att fungera. Om du ändå vill försöka så kan du fortsätta, men gör det på egen risk!", "Checking for an update...": "Letar efter uppdateringar...", "There are advanced notifications which are not shown here": "Det finns avancerade aviseringar som inte visas här", @@ -638,7 +638,7 @@ "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", "%(duration)sd": "%(duration)sd", - "Online for %(duration)s": "Aktiv i %(duration)s", + "Online for %(duration)s": "Online i %(duration)s", "Idle for %(duration)s": "Inaktiv i %(duration)s", "Offline for %(duration)s": "Offline i %(duration)s", "Idle": "Inaktiv", @@ -854,7 +854,7 @@ "Drop here to demote": "Släpp här för att göra till låg prioritet", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Du är inte i något rum ännu! Tryck <CreateRoomButton> för att skapa ett rum eller <RoomDirectoryButton> för att bläddra i katalogen", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Vill du <acceptText>acceptera</acceptText> eller <declineText>avböja</declineText> denna inbjudan?", - "You have been invited to join this room by %(inviterName)s": "Du har blivit inbjuden att gå med i rummet av %(inviterName)s", + "You have been invited to join this room by %(inviterName)s": "Du har blivit inbjuden till rummet av %(inviterName)s", "Kick this user?": "Kicka användaren?", "To send messages, you must be a": "För att skicka meddelanden, måste du vara", "To invite users into the room, you must be a": "För att bjuda in användare i rummet, måste du vara", @@ -1056,7 +1056,7 @@ "Leave Community": "Lämna community", "Unable to leave community": "Det gick inte att lämna community", "Community Settings": "Community-inställningar", - "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Ändringar på <bold1>namn</bold1> och <bold2>avatar</bold2> som gjorts i din community kommer eventuellt inte synas för andra användare i upp till 30 minuter.", + "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Det kan dröja upp till 30 minuter innan ändringar på communityns <bold1>namn</bold1> och <bold2>avatar</bold2> blir synliga för andra användare.", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Dessa rum visas för community-medlemmar på community-sidan. Community-medlemmar kan gå med i rummen genom att klicka på dem.", "Add rooms to this community": "Lägg till rum i denna community", "%(inviter)s has invited you to join this community": "%(inviter)s har bjudit in dig till denna community", From 074051297aece72b773f6945f45dafb62997b430 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:11:43 +0100 Subject: [PATCH 149/480] add a ShareDialog for sharing users,groups and rooms Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 1 + res/img/icons-share.svg | 6 + res/img/matrix-m.svg | 15 ++ res/img/social/email-1.png | Bin 0 -> 2510 bytes res/img/social/facebook.png | Bin 0 -> 1201 bytes res/img/social/linkedin.png | Bin 0 -> 1366 bytes res/img/social/reddit.png | Bin 0 -> 2279 bytes res/img/social/twitter-2.png | Bin 0 -> 1519 bytes src/components/views/dialogs/ShareDialog.js | 211 ++++++++++++++++++++ 9 files changed, 233 insertions(+) create mode 100644 res/img/icons-share.svg create mode 100644 res/img/matrix-m.svg create mode 100644 res/img/social/email-1.png create mode 100644 res/img/social/facebook.png create mode 100644 res/img/social/linkedin.png create mode 100644 res/img/social/reddit.png create mode 100644 res/img/social/twitter-2.png create mode 100644 src/components/views/dialogs/ShareDialog.js diff --git a/package.json b/package.json index 96c37a61c8..15080456fe 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", + "qrcode-react": "^0.1.16", "querystring": "^0.2.0", "react": "^15.6.0", "react-addons-css-transition-group": "15.3.2", diff --git a/res/img/icons-share.svg b/res/img/icons-share.svg new file mode 100644 index 0000000000..b27616d5d5 --- /dev/null +++ b/res/img/icons-share.svg @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 481.6 481.6" style="enable-background:new 0 0 481.6 481.6;" xml:space="preserve" width="16px" height="16px"> +<g> + <path stroke="#76CFA6" stroke-width="5" d="M381.6,309.4c-27.7,0-52.4,13.2-68.2,33.6l-132.3-73.9c3.1-8.9,4.8-18.5,4.8-28.4c0-10-1.7-19.5-4.9-28.5l132.2-73.8 c15.7,20.5,40.5,33.8,68.3,33.8c47.4,0,86.1-38.6,86.1-86.1S429,0,381.5,0s-86.1,38.6-86.1,86.1c0,10,1.7,19.6,4.9,28.5 l-132.1,73.8c-15.7-20.6-40.5-33.8-68.3-33.8c-47.4,0-86.1,38.6-86.1,86.1s38.7,86.1,86.2,86.1c27.8,0,52.6-13.3,68.4-33.9 l132.2,73.9c-3.2,9-5,18.7-5,28.7c0,47.4,38.6,86.1,86.1,86.1s86.1-38.6,86.1-86.1S429.1,309.4,381.6,309.4z M381.6,27.1 c32.6,0,59.1,26.5,59.1,59.1s-26.5,59.1-59.1,59.1s-59.1-26.5-59.1-59.1S349.1,27.1,381.6,27.1z M100,299.8 c-32.6,0-59.1-26.5-59.1-59.1s26.5-59.1,59.1-59.1s59.1,26.5,59.1,59.1S132.5,299.8,100,299.8z M381.6,454.5 c-32.6,0-59.1-26.5-59.1-59.1c0-32.6,26.5-59.1,59.1-59.1s59.1,26.5,59.1,59.1C440.7,428,414.2,454.5,381.6,454.5z" fill="#76cfa6"/> +</g> +</svg> diff --git a/res/img/matrix-m.svg b/res/img/matrix-m.svg new file mode 100644 index 0000000000..ccb1df0fc5 --- /dev/null +++ b/res/img/matrix-m.svg @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 520 520" style="enable-background:new 0 0 520 520;" xml:space="preserve"> +<rect width="100%" height="100%" fill="#FFFFFF"/> +<path d="M13.7,11.9v496.2h35.7V520H0V0h49.4v11.9H13.7z"/> +<path d="M166.3,169.2v25.1h0.7c6.7-9.6,14.8-17,24.2-22.2c9.4-5.3,20.3-7.9,32.5-7.9c11.7,0,22.4,2.3,32.1,6.8 + c9.7,4.5,17,12.6,22.1,24c5.5-8.1,13-15.3,22.4-21.5c9.4-6.2,20.6-9.3,33.5-9.3c9.8,0,18.9,1.2,27.3,3.6c8.4,2.4,15.5,6.2,21.5,11.5 + c6,5.3,10.6,12.1,14,20.6c3.3,8.5,5,18.7,5,30.7v124.1h-50.9V249.6c0-6.2-0.2-12.1-0.7-17.6c-0.5-5.5-1.8-10.3-3.9-14.3 + c-2.2-4.1-5.3-7.3-9.5-9.7c-4.2-2.4-9.9-3.6-17-3.6c-7.2,0-13,1.4-17.4,4.1c-4.4,2.8-7.9,6.3-10.4,10.8c-2.5,4.4-4.2,9.4-5,15.1 + c-0.8,5.6-1.3,11.3-1.3,17v103.3h-50.9v-104c0-5.5-0.1-10.9-0.4-16.3c-0.2-5.4-1.3-10.3-3.1-14.9c-1.8-4.5-4.8-8.2-9-10.9 + c-4.2-2.7-10.3-4.1-18.5-4.1c-2.4,0-5.6,0.5-9.5,1.6c-3.9,1.1-7.8,3.1-11.5,6.1c-3.7,3-6.9,7.3-9.5,12.9c-2.6,5.6-3.9,13-3.9,22.1 + v107.6h-50.9V169.2H166.3z"/> +<path d="M506.3,508.1V11.9h-35.7V0H520v520h-49.4v-11.9H506.3z"/> +</svg> diff --git a/res/img/social/email-1.png b/res/img/social/email-1.png new file mode 100644 index 0000000000000000000000000000000000000000..193cb659da5d4adff51376f3fc75cc8609c803fd GIT binary patch literal 2510 zcmV;<2{HDGP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU*U`a$lRCwCd zTWM@m*A+gV&BJ)W!NlND9E-Bp0g+}a5lPclX`@t01Vvq9MO8@zLRpGP@~akfQ;VXs z1%=X(3SptBDoU4>HtMRhk?0buDKu#&buo5IY}eF4AYO)9Jd1n2=li0!+-J|d^Tv3N zbTszZ@4j=+J<E5_eXr)jT^Fgs)X4lX=2qsF%<IJW_>733CzuoBXMFZC_b?x4zEDZw zLKRx~X6DZ_-)m8LI*N#E$nr@RgZ!HLXUr%47PQ7k4~R2wXWq)Zrb348X6|G@#GLeF z!GI5I)HCm5?q}XxLFGxTy;t08m$>&8HNb<+z0BWYZlKwt264|`A;YX2U^(-v%tu6$ zyHeCBWO!91*jX_ElG~fi8))tjWO-f4R#5{W{(dSF-dv-&knNdD7yxDJN6b&s+^3yF z)`(v?Ajtf4QPZo19uO5`6LX<l57=8}%A0hrkiD!B*eYDAT4|@yK`R74!hFzAX;#+- z>DKx%wM2u)&yA4)EecQV!F#z$IyX_ET#>PFGEaXW&C%=Qc}f)~%f0PE(O3LM1qxrw ze8P_!-!d;q8yjosp2o=g%9ct+*8Oj6h{Ho^O0Y4?AT(6BFb|Y!fIkZl(53~U8hWHT zMw=JcQlO@M@A=1Ao(>G8=wC@~L%;*>D8&GXnZvqw3A3`FYl_mgW%DQ=lxu!ATcq<7 zMLLtVC+OwuEzQw@r>DRpzQ;y5`oD~>c-urX<!OKhfv>f2eT)@;dUf20b0?j?T%bQ* znxI#h`_qLPbHxT;<MV7t<OwHXov-#LDW{$uE-|kXpVB0_Q&)Kiy1#8ct&9b2-w$RA zbZ{VT2wf_{Sl}0iv$Tmr=;3C&H+`ZZLirVO`bwX2N8BKE{F=-I;-bw|Hb66H^=Ge} zPffM<-Fj{?P0ycA8?IXpVf}rraU-Ex>F|Hkbck8Q3tG&1f>q+}I?5y2J<}GqDW7GH zJ5DF*$WZypn_jf#tua>uM4q{6K}g37w#$IfRvqEKu`+J#kX89d|2?kc@}&^)z>_`W zbP+(oLLJNNbgIl&XAZboXOe>wcl%ZLgtx2ra!EBCLSG*b8JR!KzpUWgG0fFrgcTgj z6zT1B-T+5d!teXuNztBFaU0IKYf*%L|E`k3*9e_Yng+OE$Mqk(HfH<ohi5bNr}w58 z<c9eny8oJ}Q7OF2q)C0L0{!;gEFC+SrKCWF@T_fIMV4Fg!REzLRRfp}(@8S~KBZhx zIsRY-li-@2L+NP|;kUU&9$LG=$l^084?;!R!A4#h4cM>%3~eRk0cQd(f$lOx07+q; z%9Riv@YYJt4`n=YJ9ZoRAQn^)Rw#TXWycNhvfN~y0lG~35PQ~eR>=#Xa|6tFr>amJ zIrgo}Twql9;yF1wLwxRIe4wK|Xee870iLn^B;y2oo>>>yI^wt!SG6kp&LaD;<(KEP zQdG8%cjfC`CBilG(sqQsrfVc;gwI0$r+uySX{|$%Gajh%G<${hf31~Bfm)RffLL=1 z`HH0ELFsRLD31<r7eiU>q&34Yl=J}o>7u;7n<%=HvIeaQsg^&)nzJ<ZrQEx;c}bL( z*2-}_ly?Fogh-PF_rINzdqCE)K&@WO*@`<hDP<1F?kAEt>F#e?8g+dSSAXh1m!;@% z8E1N#4*eOq0YWuC^w`|O1W56C$%)5hF1ntxzO0M;2{$)Zx3{h95yM_Nz*$B|@<km3 z!~>)_<9E8XGZu|m+Cuq6`VSYq%hWQ70kF1LX<h6v@c9XS11OO*QKcmQyf*Gu2DxG| z<2?tst}ZA=f?m|-`2X%?K`RCVq<G96a|CKuVt^$Pw=x)bdJz)XddU#Q%V4NP&a(H$ zcuq(EBn&XBaz#NRyp!q`OHzANtrRE?WaMsrH{%fNZIN83^Ol(mFsyP#+7Xj7Wed{W z5tL?mB+G|BFi(1~QAuKhp)e}5(u>?IY0e!kzyLieS2+7|DCVT$Y(d&R-g9-W%awny z#v3MwC8cg>OUzbbfI!hLYEmDHdbjFy#@dRuNs<>5k_?*e{$QOk@I-Tia(W*(R3?H$ zE^&qvTIXL~$i6>6c)Vq5%<deEIX6Xt5+PL&z_8<^mNK`xE@bSWwOqZ-<?imQBhn#A zds9@p?swiv(PPaqqbIO7T`&q}0UNFgyGrnhv79k;EQ5Nm;&GKL{^^+ZK;AnRhF$II z8ww{mh~byGq3RlS;{+J;GfQfv%0F=`S?<j7I9A26QKHl<-c06=(UpBP=H6A{{psqy z+3P<$kfNv0TsD3`(4TgV!MqFx<+J5!pD>f4(a@<3C@`jSPGoLyG)X{lTM}b*jCa<F z=Ah$mc#Q|&8e<pE*b?l+-DAe?%77FU|3YHaFj%(yakHVbc`mRXU23UU;^^uZH`d#d z7BKr4Sz(!A2$L1DDFfvvCrhf?NRDQO8RK$zHd`d0=~m{~tOp~fRAvJhh&nqyw7NJC zr~*RbZ!@8=Nu4Sy92!iy&iF9wM5(F*>a_L(COxMDixI~iz3xQxz%^0&Zfjh71~>~e zDs*)j0KU6l2}W@&fBCfglomMQ==Jpm(9wN10Qp5@)Ljbgw>E&j9FGH}VE!kY%OQCk zJC`xQ(M*X9Lynskgz0w16&So?cIb0XaUGA#9*}s1G@cE@ZauXs?i!dnOBveYAvT0{ zGK5(mps^F|AiO?#V#JS<XVRlq_xCaYNb3<9l)HA$0b7>N)1A_~=!sL~^w*J`A4`?| zhzyBxc!D$^iA4hZG~;;Sew{eRh67FmM0NS2JmTmUS>H3=3llgneWBbtqbvM)L)eJz zMeHJVY#irtIzSZQHBN=Q8EPZ;lZ8n?W51pG$Fe`n^v1{m<}Xoo)AyNoOg9spjvi+| zTE)sA6*`cv0RZ(LV*XtfD*v*Oz3hjj(WGzkilI45ko7(xJC$ny(+KS%o~j|{+e=Yi z#Q-Ml5R1>nmM<w}+o5t%K-0Z$WbT?n%6AEwl*3fF+rX=>x6#zIx0kM<;+KRBw+WeO zwhUnHtI=HSA;l9WA6nWy;@+L*EEMo*7k1Os<EI^@IA+(F<aCI8?e@d_YAW>hIA)A^ zhi@ZkJcA@r`X!ordHOZK1+AHd*XNr=XNkwsRtkee$o*(uLX@r^5zh(H!3|eZxc>_< Y02w!UWX_nGYybcN07*qoM6N<$f{u#A1poj5 literal 0 HcmV?d00001 diff --git a/res/img/social/facebook.png b/res/img/social/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..6a29e3820aa997e5bc06d42995891ce570defd25 GIT binary patch literal 1201 zcmV;i1Wx;jP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$LrFwIRCwCt zTW?5HQ4~ME&6#DHLqjW+Kr=Ky$ihg3Kne;YKNJ+!hhk!VP!xkm@?-xH6a_H~q)!TB z^dX1@OBjfPP(cG}sF8vp8OzzoG=<J_XYktQ+V<Xkd-MI^#~b?Iz32Siz31L@?|n&i z4_<>{WFb!?3z7NA68<|~E&O{8>Ez#ZokqHl4&<Up<IIA}wIMGet7Hy`gN2^~*%f4h zyh1)lzSFY+X~;UH9a*Gexh2dy$Vp@`@+s1*M&XhQWuznTB4?59Dmx#DBCcbW>r9Wg z0N0RH$a_dDXa_6TImI?;F2Et=81fkhxp*OqZ5ZPKtBC*<+&&^tfPO%>d|=yz3PAmD zkOQ9HkjA!kiV%Q?sXk;g=pT)2t3|D0(1d)!V|t>XhDV5M<c87~(4Jt<`%%TVE9wGv zZc>SgM)o15E>MB&5i<WaNpSq=ey|<M2J4<3kdwJ}Oug}NNNIIFoL7uSBS0?qdyCr6 zAIRDbH!qaJzKoq(wE_$Katt{aX&2}dF~OlXed|h@md?v3Ons5Y06RB-)p7M~G3-iB zj#oUW2o(>c5OeG{5w+(Z%-Cd{(H5AqNFk!8kff%pI7bhof;DhdlLDra^`dG%oNEQ0 zpk6+emkUrQGNsMjo2nN9tn6#hFlZN5qm+~c$!1g7d;Y9%z~EaKIH$jXd-=C$5y;mL zc?+<Cz?Ga7i|N1j3=Dq)$NM=goCo&RCKupRyxXO7W>M=ZYvcl)iMIf&YwKE9dD<@k z1%(nY9>`}a2~Y{fMJ0^_g(6DsY(534Ddwo|55&sqIy7~>5h*~SBuW4^@a3yV_-G)3 z*o_QDn3?|}x{A#fkS(I*WV7;3r@4h?;b}5inJ%JaTJ=$i&+|*71xS-XpKJW^eQ5=L z{#p|*fT->9ptZawE#c={6zwVMYYl1vUNA1aB!I{00xTF<fJG9(WnclONq|WM3*a<* z3viJD4g(9|AOUD8#%aXn?+=265d#V^;-3f+`VA;Rzg&O`g9Squ`~1(wNUwne=#}RJ zempkFwAjPG1_?k(QI`P(=#nRZQiy-Lx3Tl?z?UqAxS@3$3(y+)f<vuaQU4g-hR%=5 z`+hh92(_@i7D~MA6GSS2YpVwm6t!E;bHc3&4uJ1qkt(M~R5<S!E4tYih^7Vj(UjoR z<bL)6VikZ68ec~aC7|=eY`fya(zG~V9j+Pa5M=8)wjGoT;1}UC_b0uhn{AC~S0&p0 zs|GGyk3*!FZEJ|;At}b@Rf-(fk@MqhQ`Frw)*Vdxw6&ba*Lda*ZnmMEZ33+XkmuC} z$om?n(jKm}K<PS$q|#fUBqI;m0%BK|TwF(9sKh1~m{oo&kC<iP`-bm4C_jQjPQL`- z$I}yPD=KPxe1dr!d?!$7N=?Vo@>viI1Ru?F^3dht{_NxoPUzm{UjYUHqC(z?^D_)0 P00000NkvXXu0mjf5Z)l0 literal 0 HcmV?d00001 diff --git a/res/img/social/linkedin.png b/res/img/social/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..2b868a585ba59ca2f716f0a21254ccbdb3c95438 GIT binary patch literal 1366 zcmV-c1*!UpP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$=t)FDRCwCt zTU}@rR}?-wu9GHivvKX#h&3^(5=>b&2Be0RqO@45R0W~Mz9=g~i=y;FTI@p~6pB_* z2nv=^U$UiG`cT>;6hc$dSOQVWmXsx_t+iFtXzH3pV-nMzGdUyU?##OLx4E<P!N*Q! za_^k;&AIoUd*@DIYoZHWMilunvH`ga8RPTxEA#OLGRepEJA_Oj$+!_WjSIR|Z!>Z` za+Aj4e2}>eXnsK>$hXKZk$oZy5JK)j#*vK<)*EBKj~qa@BhMf+PE;;AP)8Vf2zeEG z++pXl(a86>%J&S<wg5YkgUG|k2ow(yzULs@P;>$6kUhxHxRaYLMA?QO?qG`|0CjHt z$aNqN$d*fNo2vp)`#Z-So@fZMZ719ifQG3K<a;1K_Oq?BQ^VjK<X1eVdj&gqgxG?7 zXg30md(3$io7i?+O(4!8<yGuwA1n#biaZ70$0_#3lmIo{?&T5?KxSWR%yfbsg(Nr& z%FAHqntE6ftyKR0b>uFby?6y~-+v&Q2vPRwr9vVgo-brnEUqkv6R$TzYfV%Uf=I`7 zZb`U8#7Jn>>klNI9Q$ZN<IKuB2+6qtMCW#_Tq<gFIGR0Yk#u^^f+jVqtE=){n=h&W zk?c`T%1R~oLg{0#HkH>3u*b}lwtx7J;kC;*{}ow)2>Y5NK-^3%iT*zzGclEOp3c!V z!4c0EpczcA<XlVNg9G37LC>{YaA$l%Asy2>x+XXp+2==jz?)WTq4EA$_kdUX0-7-O zsS)rR_z$nDO@KOum=6UYpCcr|2JkO7P#@4>rDVtU7O0qOyq>b{^B+zBzZ3{4>2z#i z71YfSK~M@nZPh$wWEswk<L@N=@=qFm`f~(sjNNxafCkF~IE|{OWcX-(OmSE*y$(fY za+g(@WxkE6cITC0__S{b#-|?I8Vw|H_eDnGN&3bnUFQvBw|*gfvT+Smmd&*l0VF`R z5cAcFGSg*fMtZQ-*7J*!0AcVjUU)VPFFyB-)#9Nb2(-q3e(<`IO;RQ~H9ZZBo-T*A zix<Gw6-$&3(Fm_RUkyM1b<45<LZJQPZ}3g(@5jy!-X2pphNHl)rh3D&>WY*VP!q_A zAixj54_mrMpy5@XW9c<#hDxPH5McU0<7;;xOg^!EP_iz-O)qqI_a>*@sCI+|NclJw z9wGq-d@MlH?-7t90lIuFKo<!>`|y%}41cu~By{>vfKD|LA|!k$Ktd}(ug^Ne6#M+x zdx3Tz3DB;c3#d3PN?PnP((G%F05mB&=>q{yYA1k_&c)FZc78PbAqRB67kCFsV{eci z-qnV`UIeIpL3ar{-<|EekpP6<Ajm?AL&&gCP^bVYqXHhqZlgRW-!jS<$hH!2zKwkW zvjPwfcsxx`un%BW0DAAV3whpy&VSFg+ukfqpR{es7e)etY~9SZgIxhs5#I7hpU}p( zP89ObX4jJUapfWokr}papP53E#qerEUJ%In3v83=W@`1TG5WN%g~!*~oI8xN4J~XF z6iWc@ym~qENRg+~X};%jyXzQ|Lr>vDWG(UoaCc=X#rLS?d)kh^pu<n)W9C|z`G)Te zu)hU|oc<bSKA!G%T2Z%NkM}YU!psg7+N)37(w4CxGURT}OY+c_;`W^68Jw%{F8>!` Y0BLR|kwK3)O8@`>07*qoM6N<$f)AK>P5=M^ literal 0 HcmV?d00001 diff --git a/res/img/social/reddit.png b/res/img/social/reddit.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6131186f990ad2902c6d76165f5bf7e6457244 GIT binary patch literal 2279 zcmV<D2pIQ?P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU)c}YY;RCwCl zTX}30WfXtiVg&*S#d641j?!|<WjTc)DpU|qE28lawGGBdgGWROjYfliAR$_<m>AGR zp+O)Z${7Muj+U!jg-U75B}dC?p+c=td_Ued?6jTT&au1Q?Mq%}I-U8x_uluu-#cbD z>~7kt<Y$Uv9>pBX+>N=9x{hOnI<H{PRp&SsGUqdAGGFqia1H!4?m*^5=J7g(y-|dE zhIB{L8DuT<3g#SN3mWD_4`{+XjX8<Ar=JX)$GnL7d*(7<4CwN~7!NVeW<Je4-;c_Z z8hgH)YqpxZP7UxHa{==l=12-0MXEUqlnenkKxgJG<{uTv)fGi48L||>2E+gWx5Las zDR>C798j|P)d1Lk%N5`S8#Pg~edP}WAWSV`evg8mW++)Be3b`;Gp|%JJyhrw6(J@u z-*M^z^FvH|jm9h49c_Um<x-(aGn5Xt3^0Ou0fjy-P`X$$Ku5LjBkF+xB9ty2t$^T? zI!<tEQm4LLCh@jz&)M+JQlbl-1a8kDx^Ajij8Zy1ZpHvf-dx6S^hkH2IG(l{%X;fN z7r|#(Nv?=5aAn+!tLZVxa$ngsUegDOx(?zs?M<|L9?|*ZW@Z?nbX(-D8jMu=b!0%5 zAI<4}pE1V&`@4jwX-lHY+guc<5uG_A*W;ff8uGmS|L2)RcPq`zbd@<q9SuETM!=Pa z;@~^1;GvB~Mf>D>>#ju6{bZFvIlsG=2kluU+oCO(0ByR6r<g0EpyMY-Ac$0QdO($L z!1y%e1v%gN9np@Zq6qjP8{^lxas-tc?DZR$<=D8nm073jQ+d4srUiWU0ceeyvO}ID zD%|72Y0t?qCcf(RhO9&T9`0>ot(2Z-WPqeP0Y1>FgP!jx+)GqmCfi}cy8?ba7|at> zdF46VEh!?p@|V?_ld5CDKtFeKJk)Q>;Vyeo0LpLpmgt!jqAml3HM({|wvN5d5_Hbd z4DeFm)04&$^6n}5kN0~4ev3aM>Nl3CRcE4#a-w2|6Spgz6ihi<7(|1kk6#oGa|v1l zsUiHsop|M2)VvSzy|hGD_2Nl6o;&8xB|x{iFAM-bykZN%u^-#T$=}Gx^0rBq25Q-X zhv)DXGgtttI^q8EGWS@K?F>+!#X7W!=uaN^)(yD^uj$-R#s{6}WT_~J=)ZD1Mra8G zB&tq|c|z=cl7X~E+p5>$j{DYd;@MG*qtT_)L?`$2%AR7^Epi*lXj`<37Eg)pD^UW3 z9HC%08|@-d{{*538diM{<E>A(<1sJ70BA4IF&{*DrKWx+s|NJVSu58&^b&N|2twy> zCOVpF2c;EA@>c0Fl9e7;)r&AD3<_`PJz8X{xJi_eYPL4eC>0<WYe^`ipHTj6p5)<B zG@OU&ri;_ZcM<JeDlY7VfD3z9%QlFgD60=lLGEz+u*?l09QQU+_aQ_h8PC>yX(<}G zEQdb;8ffP-xAKV32v7KX^Fj$*PL<aaRu@^~s=0y%m@6Sg<_7IvskUZ})sbUifHszZ zPuqVQ=nPF1qhS9db%lHSi{N$3KXn^n_*6IcfZ!R{D5?QjdA)>*u%Cgz$jo4n0jgcN z<p*OBLX;Sx1jQ=W22{1(kF<B)*F=*)l)Ru|mlRGQa|KZqlyQ;O9zReXG<*ut*tg^y zar@X#<NFh)i-6z+6SbC^`(YGqK13tU6ArAmWdLiGpGCB5rGSwZ1~sD?QDvp^xzqbm z9)lnQumIlTsi3N*DQf*SGiq_TJP3^lZ^aBi5pf!f^V-Pl{n!dxrMPV|(f+lz;tVjL zl<d6f(trnm<SidZxLRnT&0ytzL>lA(_Oifx27m_?J3?kxc-=Kh!ySL%atQ{=xAkag ziMug@o?Ts#Ru7cg{*0&)2FSB#yEBrYfRL^Rnve$|?qmBE7up>q*S-f};{0qmfAlFS zWQ+)18>G+LYMCJ*`>-kA6Pw2-s;HFhq$iLM1K3a9kf*~7An4O?N@%Q6ImSo}8wC`U zY8K_)rE$;8T$>Gg)^lnLgCb7=_(2Byl<B-7f{bwD`*Mz=1tCe_qlZzTO#I}kpoI|j z?=8N@Alj%|O&mcbx%H=-{eDz`PrM=L>%OrS`}GYGO`<Kf4S*aVYniMZwnFpP(x=m! z9Z&$PbaX419>ZksqF-Rt06`ZB`F`GZX?9jed{led3lxlLUwKXE`)`I&%kFjrO6Ub( zWgsY&&tAcbWJ-nTsrdn8X}tq)Jp*_d>H`=J28EZw+nmv0q;&dMW5+D_2C5U<+%ST+ zx=2*e&O+X9t#>cD0*{FsE*&Cm+hALq&2y?efIm*}0iX|<zwk*D6#Eo!eDo*|;n5O9 z;RIt;Z;M4V5|4ngT3bvb&7+R|VfGzhZ8Vd4UUdT?9X?Aw`1<m`A<(?+IZBRUE_?U_ zJV5))(^j&P!ZEkkY9M_si3@4WANyn)tkjA9!oY>rU5MJms8x=38_DHzD~IF?KnMUV zIpHL}d!sac0T>*w#{)+-UXQyBZb+s2OR0M0jSK+7%eEc$Q28B7H>%A5pk(sV_xM3V zWlAS9Yk+)D4}>Tsdn)?8#in1F)9Zoq=}H%}Y5>qX%o!o9e1_72>>2<c8o$oGAq17* zq-1yeu{5%gN#5Kj2nn)IP_mO#187E=8X}mGu4FZpMp{kKQ`F$W7$VD*Y$;YAa@lmR z{><4yq<prL$?`U}`>QduVTY;sdbN&o`(!1Ht=6#9-wiHO#l`2U%nTHjsySn*+Q-j< zHh{i>>cl*Y?6%p>cXDQ_xl(=MePMq3^*DNr`1lIV`&b_+{Ts=Tr}y|;(69jfd>&t* z;9Grkox3T6L{QBxbgl|r`D#DsstT^ypThkwzyNr(v=B#;25kTU002ovPDHLkV1ko1 BJN^Iw literal 0 HcmV?d00001 diff --git a/res/img/social/twitter-2.png b/res/img/social/twitter-2.png new file mode 100644 index 0000000000000000000000000000000000000000..84f8033a30c5cef33bb14ee59b5b8d5398b9162f GIT binary patch literal 1519 zcmV<L1rYj)P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%fk{L`RCwCt zTYqRAMHGIwxo&=VP11|0u}Wgn)JRDD(W+nx3KdaoZJ|_J1krL55LzM%Vrc%;f>eqY zO9dhH4@opc3o1&nPzZ!p18Iw=v9U2GwXM;_%UyaVX?jU~@A5XDm+fVDXLfJbe(-U} z-QMhb-@ci7Z)VQ7qiYasMk(?!WDT+!S<j!-tIF?ZkYRpLuLH<_WEXPOPUHMGwYvei z1GzcH;Y?8ZH<0oQDS~{3{1n;iW&r}oMq~(CE3w^r<{QX9WGnJRWL!q$ii9?bko%Cs z$b*udPe(1^W0>z*lx+cCL|#C?g$#mo2=YBIunmq2P>DQ+Jj#PywouA8oZ<o25dmm$ z`yTlSxCdm*S+>nq0jU3V@_^?y1lYFs>=1yasW#-R;C?i*t*WePFb8>z=X9^&Ii4Z5 zA!kJ+;GoBx*RYvw7wQ5b4k@pqiG8rt1sae?jNYkwWiC8hQJj1w3|zei9}kVgP<$ra zA{^nmqT7rB<=pQL4J1$BQ3x+om4M>=_p|lE0=RcoJ{<ie0^eMj$ff`)`|=?2qR}qU zW;DT}C!X&7qPjjGgw~coRUkLpQBcZ085#pZ9R7wtVXx=>;tlY-$ID!iHZ<ss2Z~OP zeZWks_Y~$We@#&yxC95%YZgUk)HGGp6!;Y>*Em>2HQh)6iqk#t|Hq!xR6bRJMu$t< zY(_z&o&X`Zc@Rn$U<25@lH)eivd@c&&`vw=c5AL5Iv=eRZf7zv2j?fIp>sHz%rqqw zOubqJJmrPQMzaZJnEUTv16%GCUJiUh>jE?=)O#s@DY<&SG6;7U3T2q&bC3ks<i$=* zBJ8YKCECm;5}?MbBbiot3ZTZ*0{Al(AqHmy#mm#*p!iIXjDRw)3ebVmp=g;*0u*`C z`C}KO@I!P;w3&b(+_}cDi#R4i6!s^6zY5=u{Vk)(fZqwj$F3#d<?nuT=X45^wwXPO zI0+ED*##I8X<=q=e)$|eM{%nFqhwjXNDI@mbB2nT!WB7g6kvb^=o4vSWGZ3ky7j?) zHwq9Ij({su*9~3w43@9rnX7d4lK@>JE&OOO87aR-l~KLPMi&V{=kUT-TR1m91qQ~! zB(|3q!|t^uZi$4jHV6_<T5TmdGixd(rG3OV?^}~x*~zjHNuRY$upI=p!9T;ioHjy@ zf>v^x>u$3&<^DV|4WD0%!MTWV9nh|2f`lHC!LTnjEu%157Al5JU2#6_t1C-(C6U38 zeg4nBK&wcLZNH8~Vt(GS_@%DYu-bAR*P2=jX!t-REv9Aaj|L--cH$>*UuorMG4^$d z08|tm5;5rO%M-H7R70q;wkCKewE$Ffz7%?l@1GxaOoYUo=`I&Zf5?i?1ude*(YrtW z3CA5c7Bd((y(ZX_{($w$H0mGSB8Jg}X&v|r-s$@TYlZ8!3Gn45QzCb#_Weu(5MGk8 zP|`Ct39t2DP7aQ=DkKXeFwHt=B9n&ee)eezd>Q^SLmQ@_$b4e7k?~MT0o)Z(p;*m< z)p;u*VB+)$tqD>h)G-t_8~(eH9eQ76S`(xn(7_^Ur$%V1l(4I77Kd--e5Nj-;T0`q z^eEcd2e2vt9W>sJJnli~Pq6L6ho$MP>$Xf`<U)|GTiA9G6+jbV7xyQ(<1pK5=#aA6 z<=Va6xEuEp;%wVqGe1%+hSvkg(=KxUG}~mln_6A4r@yvt<m4ifMaLs-!$!6VoDv|l zu3m@S56<o|#rU4<MAtDCNl$@_j0$8k2rjc5SjlPTd$q`jKELFr@;38fSoja$RuDge zLr#AI3xA&Ok*%m*+v7dV*J0rV3Z>L^EUlUaQDN!Pyf9B){oJ3!T)~al*_ZwiU;t$x VVe!_=*FFFM002ovPDHLkV1goAzuW)- literal 0 HcmV?d00001 diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js new file mode 100644 index 0000000000..8bfa0ad931 --- /dev/null +++ b/src/components/views/dialogs/ShareDialog.js @@ -0,0 +1,211 @@ +/* +Copyright 2018 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. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import {Room, User, Group, RoomMember} from 'matrix-js-sdk'; +import sdk from '../../../index'; +import { _t } from '../../../languageHandler'; +import QRCode from 'qrcode-react'; +import {makeEventPermalink, makeGroupPermalink, makeRoomPermalink, makeUserPermalink} from "../../../matrix-to"; +import * as ContextualMenu from "../../structures/ContextualMenu"; + +const socials = [ + { + name: 'Facebook', + img: 'img/social/facebook.png', + url: (url) => `https://www.facebook.com/sharer/sharer.php?u=${url}`, + }, { + name: 'Twitter', + img: 'img/social/twitter-2.png', + url: (url) => `https://twitter.com/home?status=${url}`, + }, /* // icon missing + name: 'Google Plus', + img: 'img/social/', + url: (url) => `https://plus.google.com/share?url=${url}`, + },*/ { + name: 'Linked In', + img: 'img/social/linkedin.png', + url: (url) => `https://www.linkedin.com/shareArticle?mini=true&url=${url}`, + }, { + name: 'Reddit', + img: 'img/social/reddit.png', + url: (url) => `http://www.reddit.com/submit?url=${url}`, + }, { + name: 'email', + img: 'img/social/email-1.png', + url: (url) => `mailto:?body=${url}`, + }, +]; + +export default class ShareDialog extends React.Component { + static propTypes = { + onFinished: PropTypes.func.isRequired, + target: PropTypes.oneOfType([ + PropTypes.instanceOf(Room), + PropTypes.instanceOf(User), + PropTypes.instanceOf(Group), + PropTypes.instanceOf(RoomMember), + // PropTypes.instanceOf(MatrixEvent), + ]).isRequired, + }; + + constructor(props) { + super(props); + + this.onCopyClick = this.onCopyClick.bind(this); + this.onCheckboxClick = this.onCheckboxClick.bind(this); + + this.state = { + ticked: false, + }; + } + + 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); + } + + onCopyClick(e) { + e.preventDefault(); + + ShareDialog._selectText(this.refs.link); + + let successful; + try { + successful = document.execCommand('copy'); + } catch (err) { + console.error('Failed to copy: ', err); + } + + const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu'); + const buttonRect = e.target.getBoundingClientRect(); + + // The window X and Y offsets are to adjust position when zoomed in to page + const x = buttonRect.right + window.pageXOffset; + const y = (buttonRect.top + (buttonRect.height / 2) + window.pageYOffset) - 19; + const {close} = ContextualMenu.createMenu(GenericTextContextMenu, { + chevronOffset: 10, + left: x, + top: y, + message: successful ? _t('Copied!') : _t('Failed to copy'), + }, false); + e.target.onmouseleave = close; + } + + onCheckboxClick() { + this.setState({ + ticked: !this.state.ticked, + }); + } + + render() { + let title; + let matrixToUrl; + + let checkbox; + + if (this.props.target instanceof Room) { + title = _t('Share Room'); + + const events = this.props.target.getLiveTimeline().getEvents(); + if (events.length > 0) { + checkbox = <div> + <input type="checkbox" + value={this.state.ticked} + id="mx_ShareDialog_checkbox" + onClick={this.onCheckboxClick} /> + <label htmlFor="mx_ShareDialog_checkbox"> + { _t('Link to most recent message') } + </label> + </div>; + } + + if (this.state.ticked) { + matrixToUrl = makeEventPermalink(this.props.target.roomId, events[events.length - 1].getId()); + } else { + matrixToUrl = makeRoomPermalink(this.props.target.roomId); + } + } 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); + } + + const encodedUrl = encodeURIComponent(matrixToUrl); + + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + return <BaseDialog title={title} + className='mx_ShareDialog' + contentId='mx_Dialog_content' + onFinished={this.props.onFinished} + > + <div className="mx_ShareDialog_content"> + <div className="mx_ShareDialog_matrixto"> + <a ref="link" + href={matrixToUrl} + onClick={ShareDialog.onLinkClick} + className="mx_ShareDialog_matrixto_link" + > + { matrixToUrl } + </a> + <a href={matrixToUrl} className="mx_ShareDialog_matrixto_copy" onClick={this.onCopyClick}> + { _t('COPY') } + <div> </div> + </a> + </div> + { checkbox } + <hr /> + + <div className="mx_ShareDialog_split"> + <div className="mx_ShareDialog_left"> + <h3>QR Code</h3> + <div className="mx_ShareDialog_qrcode_container"> + <QRCode value={matrixToUrl} size={256} logo="img/matrix-m.svg" /> + </div> + </div> + <div className="mx_ShareDialog_right"> + <h3>Social</h3> + <div className="mx_ShareDialog_social_container"> + { + socials.map((social) => <a target="_blank" + key={social.name} + name={social.name} + href={social.url(encodedUrl)} + className="mx_ShareDialog_social_icon" + > + <img src={social.img} height={64} width={64} /> + </a>) + } + </div> + </div> + </div> + </div> + </BaseDialog>; + } +} From e7a4a0b2e0f78138f0bc91e98420a720783b3aef Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:12:12 +0100 Subject: [PATCH 150/480] allow context-menus/tooltips to work over modals Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/_ContextualMenu.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/res/css/structures/_ContextualMenu.scss b/res/css/structures/_ContextualMenu.scss index a0191b92cf..7474c3d107 100644 --- a/res/css/structures/_ContextualMenu.scss +++ b/res/css/structures/_ContextualMenu.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_ContextualMenu_wrapper { position: fixed; - z-index: 2000; + z-index: 5000; } .mx_ContextualMenu_background { @@ -26,7 +26,7 @@ limitations under the License. width: 100%; height: 100%; opacity: 1.0; - z-index: 2000; + z-index: 5000; } .mx_ContextualMenu { @@ -37,7 +37,7 @@ limitations under the License. position: absolute; padding: 6px; font-size: 14px; - z-index: 2001; + z-index: 5001; } .mx_ContextualMenu.mx_ContextualMenu_right { From e3c455e5997fe5874d98b833ad4317735e876d1f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:12:26 +0100 Subject: [PATCH 151/480] Style the ShareDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/_components.scss | 1 + res/css/views/dialogs/_ShareDialog.scss | 89 +++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 res/css/views/dialogs/_ShareDialog.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 2734939ae3..173939e143 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -42,6 +42,7 @@ @import "./views/dialogs/_SetEmailDialog.scss"; @import "./views/dialogs/_SetMxIdDialog.scss"; @import "./views/dialogs/_SetPasswordDialog.scss"; +@import "./views/dialogs/_ShareDialog.scss"; @import "./views/dialogs/_UnknownDeviceDialog.scss"; @import "./views/directory/_NetworkDropdown.scss"; @import "./views/elements/_AccessibleButton.scss"; diff --git a/res/css/views/dialogs/_ShareDialog.scss b/res/css/views/dialogs/_ShareDialog.scss new file mode 100644 index 0000000000..ab340ad758 --- /dev/null +++ b/res/css/views/dialogs/_ShareDialog.scss @@ -0,0 +1,89 @@ +/* +Copyright 2018 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. +*/ + +.mx_ShareDialog { + // this is to center the content + padding-right: 58px; +} + +.mx_ShareDialog hr { + margin-top: 25px; + margin-bottom: 10px; + border-color: $light-fg-color; +} + +.mx_ShareDialog_content { + margin: 10px 0; +} + +.mx_ShareDialog_matrixto { + display: flex; + justify-content: space-between; + border-radius: 5px; + border: solid 1px $light-fg-color; + margin-bottom: 10px; + margin-top: 30px; + padding: 10px; +} + +.mx_ShareDialog_matrixto a { + text-decoration: none; +} + +.mx_ShareDialog_matrixto_link { + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; +} + +.mx_ShareDialog_matrixto_copy { + flex-shrink: 0; + cursor: pointer; + margin-left: 20px; + display: inherit; +} +.mx_ShareDialog_matrixto_copy > div { + background-image: url($copy-button-url); + margin-left: 5px; + width: 20px; + height: 20px; +} + +.mx_ShareDialog_split { + display: flex; + flex-wrap: wrap; +} + +.mx_ShareDialog_qrcode_container { + float: left; + background-color: #ffffff; + padding: 5px; // makes qr code more readable in dark theme + border-radius: 5px; + height: 256px; + width: 256px; + margin-right: 64px; +} + +.mx_ShareDialog_social_container { + display: flex; + flex-wrap: wrap; + width: 299px; +} + +.mx_ShareDialog_social_icon { + margin-right: 10px; + margin-bottom: 10px; +} From 64bcf6fd7e20f562a6553742a8e9c0489fabea91 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:13:04 +0100 Subject: [PATCH 152/480] allow ContextualMenu to run without background, for tooltips & fix copy Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/ContextualMenu.js | 24 ++++++++++++-------- src/components/views/messages/TextualBody.js | 4 ++-- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index daac294d12..d6a11ca974 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2018 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. @@ -15,12 +16,10 @@ limitations under the License. */ -'use strict'; - -const classNames = require('classnames'); -const React = require('react'); -const ReactDOM = require('react-dom'); +import React from 'react'; +import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; // Shamelessly ripped off Modal.js. There's probably a better way // of doing reusable widgets like dialog boxes & menus where we go and @@ -61,7 +60,12 @@ export default class ContextualMenu extends React.Component { // If true, insert an invisible screen-sized element behind the // menu that when clicked will close it. hasBackground: PropTypes.bool, - } + + // The component to render as the context menu + elementClass: PropTypes.element.isRequired, + // on resize callback + windowResize: PropTypes.func + }; render() { const position = {}; @@ -112,7 +116,7 @@ export default class ContextualMenu extends React.Component { `; } - const chevron = <div style={chevronOffset} className={"mx_ContextualMenu_chevron_" + chevronFace}></div>; + const chevron = <div style={chevronOffset} className={"mx_ContextualMenu_chevron_" + chevronFace} />; const className = 'mx_ContextualMenu_wrapper'; const menuClasses = classNames({ @@ -158,13 +162,13 @@ export default class ContextualMenu extends React.Component { { chevron } <ElementClass {...props} onFinished={props.closeMenu} onResize={props.windowResize} /> </div> - { props.hasBackground && <div className="mx_ContextualMenu_background" onClick={props.closeMenu}></div> } + { props.hasBackground && <div className="mx_ContextualMenu_background" onClick={props.closeMenu} /> } <style>{ chevronCSS }</style> </div>; } } -export function createMenu(ElementClass, props) { +export function createMenu(ElementClass, props, hasBackground=true) { const closeMenu = function(...args) { ReactDOM.unmountComponentAtNode(getOrCreateContainer()); @@ -175,8 +179,8 @@ export function createMenu(ElementClass, props) { // We only reference closeMenu once per call to createMenu const menu = <ContextualMenu + hasBackground={hasBackground} {...props} - hasBackground={true} elementClass={ElementClass} closeMenu={closeMenu} // eslint-disable-line react/jsx-no-bind windowResize={closeMenu} // eslint-disable-line react/jsx-no-bind diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index bc2a715d31..018754411c 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -336,8 +336,8 @@ module.exports = React.createClass({ left: x, top: y, message: successful ? _t('Copied!') : _t('Failed to copy'), - }); - e.target.onmouseout = close; + }, false); + e.target.onmouseleave = close; }; p.appendChild(button); }); From 7f1ce52dd3e49669261b2fb2eb5b43183a04cbc9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:15:00 +0100 Subject: [PATCH 153/480] link to ShareDialog from GroupView, RoomView, UserSettings & MemberInfo Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/GroupView.js | 13 +++++++++++++ src/components/structures/UserSettings.js | 15 +++++++++++++-- src/components/views/rooms/MemberInfo.js | 14 +++++++++++++- src/components/views/rooms/RoomHeader.js | 16 ++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/components/structures/GroupView.js b/src/components/structures/GroupView.js index c7610219f7..a343d1c971 100644 --- a/src/components/structures/GroupView.js +++ b/src/components/structures/GroupView.js @@ -562,6 +562,13 @@ export default React.createClass({ }); }, + _onShareClick: function() { + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share community dialog', '', ShareDialog, { + target: this._matrixClient.getGroup(this.props.groupId), + }); + }, + _onCancelClick: function() { this._closeSettings(); }, @@ -1207,6 +1214,7 @@ export default React.createClass({ shortDescNode = <span onClick={onGroupHeaderItemClick}>{ summary.profile.short_description }</span>; } } + if (this.state.editing) { rightButtons.push( <AccessibleButton className="mx_GroupView_textButton mx_RoomHeader_textButton" @@ -1231,6 +1239,11 @@ export default React.createClass({ </AccessibleButton>, ); } + rightButtons.push( + <AccessibleButton className="mx_GroupHeader_button" onClick={this._onShareClick} title={_t('Share Community')} key="_shareButton"> + <TintableSvg src="img/icons-share.svg" width="16" height="16" /> + </AccessibleButton>, + ); if (this.props.collapsedRhs) { rightButtons.push( <AccessibleButton className="mx_GroupHeader_button" diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index c8ce79905d..8511010ed6 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -1074,6 +1074,14 @@ module.exports = React.createClass({ </div>; }, + onSelfShareClick: function() { + const cli = MatrixClientPeg.get(); + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share self dialog', '', ShareDialog, { + target: cli.getUser(this._me), + }); + }, + _showSpoiler: function(event) { const target = event.target; target.innerHTML = target.getAttribute('data-spoiler'); @@ -1295,10 +1303,13 @@ module.exports = React.createClass({ <div className="mx_UserSettings_section"> <div className="mx_UserSettings_advanced"> - { _t("Logged in as:") } { this._me } + { _t("Logged in as:") + ' ' } + <span onClick={this.onSelfShareClick} className="mx_UserSettings_link"> + { this._me } + </span> </div> <div className="mx_UserSettings_advanced"> - { _t('Access Token:') } + { _t('Access Token:') + ' ' } <span className="mx_UserSettings_advanced_spoiler" onClick={this._showSpoiler} data-spoiler={MatrixClientPeg.get().getAccessToken()}> diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 2789c0e4cd..20c0fb8414 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -632,6 +632,13 @@ module.exports = withMatrixClient(React.createClass({ ); }, + onShareUserClick: function() { + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room member dialog', '', ShareDialog, { + target: this.props.member, + }); + }, + _renderUserOptions: function() { const cli = this.props.matrixClient; const member = this.props.member; @@ -705,13 +712,18 @@ module.exports = withMatrixClient(React.createClass({ } } - if (!ignoreButton && !readReceiptButton && !insertPillButton && !inviteUserButton) return null; + const shareUserButton = ( + <AccessibleButton onClick={this.onShareUserClick} className="mx_MemberInfo_field"> + { _t('Share Link to User') } + </AccessibleButton> + ); return ( <div> <h3>{ _t("User Options") }</h3> <div className="mx_MemberInfo_buttons"> { readReceiptButton } + { shareUserButton } { insertPillButton } { ignoreButton } { inviteUserButton } diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 1851e03383..e40c715052 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -149,6 +149,13 @@ module.exports = React.createClass({ dis.dispatch({ action: 'show_right_panel' }); }, + onShareRoomClick: function(ev) { + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room dialog', '', ShareDialog, { + target: this.props.room, + }); + }, + _hasUnreadPins: function() { const currentPinEvent = this.props.room.currentState.getStateEvents("m.room.pinned_events", ''); if (!currentPinEvent) return false; @@ -379,6 +386,14 @@ module.exports = React.createClass({ </AccessibleButton>; } + let shareRoomButton; + if (this.props.inRoom) { + shareRoomButton = + <AccessibleButton className="mx_RoomHeader_button" onClick={this.onShareRoomClick} title={_t('Share room')}> + <TintableSvg src="img/icons-share.svg" width="16" height="16" /> + </AccessibleButton>; + } + let rightPanelButtons; if (this.props.collapsedRhs) { rightPanelButtons = @@ -400,6 +415,7 @@ module.exports = React.createClass({ <div className="mx_RoomHeader_rightRow"> { settingsButton } { pinnedEventsButton } + { shareRoomButton } { manageIntegsButton } { forgetButton } { searchButton } From d8a1feb501ad10102da8d4fee0e7a553de8dfde5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:15:30 +0100 Subject: [PATCH 154/480] fix Modal typo and refactor BaseDialog to fix " undefined" className Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/BaseDialog.js | 23 ++++++++++++------- .../views/dialogs/ChatCreateOrReuseDialog.js | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/components/views/dialogs/BaseDialog.js b/src/components/views/dialogs/BaseDialog.js index 71a5da224c..8ec417a59b 100644 --- a/src/components/views/dialogs/BaseDialog.js +++ b/src/components/views/dialogs/BaseDialog.js @@ -18,6 +18,7 @@ limitations under the License. import React from 'react'; import FocusTrap from 'focus-trap-react'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; import { MatrixClient } from 'matrix-js-sdk'; @@ -64,7 +65,10 @@ export default React.createClass({ // Id of content element // If provided, this is used to add a aria-describedby attribute - contentId: React.PropTypes.string, + contentId: PropTypes.string, + + // optional additional class for the title element + titleClass: PropTypes.string, }, getDefaultProps: function() { @@ -105,25 +109,28 @@ export default React.createClass({ render: function() { const TintableSvg = sdk.getComponent("elements.TintableSvg"); + let cancelButton; + if (this.props.hasCancel) { + cancelButton = <AccessibleButton onClick={this._onCancelClick} className="mx_Dialog_cancelButton"> + <TintableSvg src="img/icons-close-button.svg" width="35" height="35" /> + </AccessibleButton>; + } + return ( <FocusTrap onKeyDown={this._onKeyDown} className={this.props.className} role="dialog" aria-labelledby='mx_BaseDialog_title' // This should point to a node describing the dialog. - // If we were about to completelly follow this recommendation we'd need to + // If we were about to completely follow this recommendation we'd need to // make all the components relying on BaseDialog to be aware of it. // So instead we will use the whole content as the description. // Description comes first and if the content contains more text, // AT users can skip its presentation. aria-describedby={this.props.contentId} > - { this.props.hasCancel ? <AccessibleButton onClick={this._onCancelClick} - className="mx_Dialog_cancelButton" - > - <TintableSvg src="img/icons-close-button.svg" width="35" height="35" /> - </AccessibleButton> : null } - <div className={'mx_Dialog_title ' + this.props.titleClass} id='mx_BaseDialog_title'> + { cancelButton } + <div className={classNames('mx_Dialog_title', this.props.titleClass)} id='mx_BaseDialog_title'> { this.props.title } </div> { this.props.children } diff --git a/src/components/views/dialogs/ChatCreateOrReuseDialog.js b/src/components/views/dialogs/ChatCreateOrReuseDialog.js index e2387064cf..95fd8848ba 100644 --- a/src/components/views/dialogs/ChatCreateOrReuseDialog.js +++ b/src/components/views/dialogs/ChatCreateOrReuseDialog.js @@ -187,7 +187,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { } } -ChatCreateOrReuseDialog.propTyps = { +ChatCreateOrReuseDialog.propTypes = { userId: PropTypes.string.isRequired, // Called when clicking outside of the dialog onFinished: PropTypes.func.isRequired, From f9b3f0f9d1ff039fc608181138c6a771e94a7709 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:15:52 +0100 Subject: [PATCH 155/480] run gen-i18n and prune-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/de_DE.json | 3 -- src/i18n/strings/en_EN.json | 69 +++++++++++++++++++---------------- src/i18n/strings/eu.json | 7 ---- src/i18n/strings/fr.json | 8 ---- src/i18n/strings/hu.json | 8 ---- src/i18n/strings/it.json | 3 -- src/i18n/strings/ru.json | 4 -- src/i18n/strings/sv.json | 2 - src/i18n/strings/zh_Hant.json | 3 -- 9 files changed, 38 insertions(+), 69 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index d3787a15a3..8f75b71689 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1169,9 +1169,6 @@ "At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.", "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren", "Send analytics data": "Analysedaten senden", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden. (Siehe unsere <PolicyLink>Datenschutzerklärung</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden.", - "Yes please": "Ja, bitte", "e.g. %(exampleValue)s": "z.B. %(exampleValue)s", "Reload widget": "Widget neu laden", "To notify everyone in the room, you must be a": "Notwendiges Berechtigungslevel, um jeden im Raum zu benachrichten:", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 8698e6108f..76d0cb6f33 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,6 +42,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -81,6 +85,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -104,7 +109,6 @@ "You need to be logged in.": "You need to be logged in.", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "Unable to create widget.": "Unable to create widget.", - "Reload widget": "Reload widget", "Missing roomId.": "Missing roomId.", "Failed to send request.": "Failed to send request.", "This room is not recognised.": "This room is not recognised.", @@ -180,11 +184,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -298,6 +297,29 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -347,6 +369,7 @@ "Jump to read receipt": "Jump to read receipt", "Mention": "Mention", "Invite": "Invite", + "Share Link to User": "Share Link to User", "User Options": "User Options", "Direct chats": "Direct chats", "Unmute": "Unmute", @@ -394,11 +417,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -428,6 +451,7 @@ "Settings": "Settings", "Forget room": "Forget room", "Search": "Search", + "Share room": "Share room", "Show panel": "Show panel", "Drop here to favourite": "Drop here to favourite", "Drop here to tag direct chat": "Drop here to tag direct chat", @@ -531,29 +555,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -664,6 +665,7 @@ "Delete widget": "Delete widget", "Revoke widget access": "Revoke widget access", "Minimize apps": "Minimize apps", + "Reload widget": "Reload widget", "Popout widget": "Popout widget", "Picture": "Picture", "Edit": "Edit", @@ -856,6 +858,11 @@ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", "Please set a password!": "Please set a password!", "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", + "Share Room": "Share Room", + "Link to most recent message": "Link to most recent message", + "Share User": "Share User", + "Share Community": "Share Community", + "COPY": "COPY", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", "Room contains unknown devices": "Room contains unknown devices", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 909b466da3..fe9d3db424 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1170,20 +1170,13 @@ "Enable widget screenshots on supported widgets": "Gaitu trepeten pantaila-argazkiak onartzen duten trepetetan", "Send analytics data": "Bidali datu analitikoak", "Muted Users": "Mutututako erabiltzaileak", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du. (Ikusi gure <PolicyLink>Cookie eta pribatutasun politikak</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du.", - "Yes please": "Bai mesedez", "Warning: This widget might use cookies.": "Abisua: Trepeta honek cookie-ak erabili litzake.", "Terms and Conditions": "Termino eta baldintzak", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "%(homeserverDomain)s hasiera-zerbitzaria erabiltzen jarraitzeko gure termino eta baldintzak irakurri eta onartu behar dituzu.", "Review terms and conditions": "Irakurri termino eta baldintzak", "Failed to indicate account erasure": "Ezin izan da kontuaren ezabaketa jakinarazi", - "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. <b>This action is irreversible.</b>": "Honek zure kontua betiko erabilgaitz bihurtuko du. Ezin izango duzu saioa hasi, eta beste inork ezin izango du erabiltzaile ID bera erabili. <b>Ez dago ekintza hau desegiterik.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Zure kontua desaktibatzean <b>ez dira lehenetsita zuk bidalitako mezuak ezabatuko.</b> Zuk bidalitako mezuak ezabatu nahi badituzu, markatu beheko kutxa.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Matrix-eko mezuen ikusgaitasuna, e-mail mezuen antzekoa da. Zure mezuak ezabatzeak esan nahi du bidali dituzun mezuak ez direla erabiltzaile berriekin partekatuko, baina aurretik zure mezuak jaso dituzten erabiltzaile erregistratuek bere kopia izango dute.", "To continue, please enter your password:": "Jarraitzeko, sartu zure pasahitza:", "password": "pasahitza", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Ezabatu bidali ditudan mezu guztiak nire kontua desaktibatzean. (Abisua: Etorkizuneko erabiltzaileek elkarrizketa partzialak ikusiko dituzte, esperientzia kaskarra sortuz).", "e.g. %(exampleValue)s": "adib. %(exampleValue)s", "Reload widget": "Birkargatu trepeta", "To notify everyone in the room, you must be a": "Gelan dauden guztiei jakinarazteko", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 8dd45192e6..367e89d2b6 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1169,25 +1169,17 @@ "Collapse Reply Thread": "Dévoiler le fil de réponse", "Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge", "Send analytics data": "Envoyer les données analytiques", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie.", - "Yes please": "Oui, s'il vous plaît", "Muted Users": "Utilisateurs ignorés", "Warning: This widget might use cookies.": "Avertissement : ce widget utilise peut-être des cookies.", "Terms and Conditions": "Conditions générales", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Pour continuer à utiliser le serveur d'accueil %(homeserverDomain)s, vous devez lire et accepter nos conditions générales.", "Review terms and conditions": "Voir les conditions générales", "Failed to indicate account erasure": "Échec de notification de la suppression du compte", - "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. <b>This action is irreversible.</b>": "Cela rendra votre compte inutilisable de façon permanente. Vous ne pourrez plus vous connecter et ne pourrez plus vous enregistrer avec le même identifiant d'utilisateur. <b>Cette action est irréversible.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Désactiver votre compte <b>ne supprime pas les messages que vous avez envoyés par défaut.</b> Si vous souhaitez supprimer vos messages, cochez la case ci-dessous.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Supprimer vos messages signifie que les messages que vous avez envoyés ne seront pas partagés avec de nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à vos messages continueront d'en avoir une copie.", "To continue, please enter your password:": "Pour continuer, veuillez renseigner votre mot de passe :", "password": "mot de passe", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Veuillez supprimer tous les messages que j'ai envoyé quand mon compte est désactivé. (Attention : les futurs utilisateurs verront alors des conversations incomplètes, ce qui est une mauvaise expérience).", "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. <b>This action is irreversible.</b>": "Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous reconnecter et personne ne pourra se réenregistrer avec le même identifiant d'utilisateur. Votre compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d'identité. <b>Cette action est irréversible.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "La désactivation du compte <b>ne nous fait pas oublier les messages que vous avez envoyés par défaut.</b> Si vous souhaitez que nous les oubliions, cochez la case ci-dessous.", "e.g. %(exampleValue)s": "par ex. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant <UsageDataLink>des données d'utilisation</UsageDataLink> ? Cela utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", "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.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Quand nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront partagés avec aucun nouvel utilisateur ou avec les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à ces messages en conserveront leur propre copie.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Veuillez oublier tous les messages que j'ai envoyé quand mon compte sera désactivé (<b>Avertissement :</b> les futurs utilisateurs verront des conversations incomplètes)", "Reload widget": "Recharger le widget", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 6b52958ea6..3d8100d8f1 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1169,27 +1169,19 @@ "Collapse Reply Thread": "Beszélgetés szál becsukása", "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése", "Send analytics data": "Analitikai adatok küldése", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ. (Nézd meg a <PolicyLink>sütikről és titoktartási irányelvekről</PolicyLink> szóló leírást).", - "Help improve Riot by sending usage data? This will use a cookie.": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ.", - "Yes please": "Igen, kérlek", "Muted Users": "Elnémított felhasználók", "Warning: This widget might use cookies.": "Figyelmeztetés: Ez a kisalkalmazás sütiket (cookies) használhat.", "Terms and Conditions": "Általános Szerződési Feltételek", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.", "Review terms and conditions": "Általános Szerződési Feltételek elolvasása", "Failed to indicate account erasure": "A fiók törlésének jelzése sikertelen", - "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. <b>This action is irreversible.</b>": "Ezzel a felhasználói fiókod végleg használhatatlanná válik. Nem tudsz bejelentkezni, és senki más sem fog tudni újra regisztrálni ugyanezzel az azonosítóval. <b>Ez a művelet visszafordíthatatlan.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "A felhasználói fiók felfüggesztése <b>alapértelmezetten nem töröli semelyik általad küldött üzenetet.</b> Ha az elküldött üzeneteidet törölni szeretnéd pipáld be a jelölőnégyzetet alul.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Az üzenetek láthatósága a Matrixban olyan mint az e-mail. Az üzeneted törlése azt jelenti, hogy amit elküldtél már nem lesz megosztva új- vagy vendég felhasználóval, de azok a regisztrált felhasználók akik már látták az üzenetet továbbra is hozzáférnek a saját példányukhoz.", "To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:", "password": "jelszó", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Töröld az összes üzenetet amit küldtem amikor felfüggeszted a felhasználói fiókomat. (Figyelem: ezzel a jövőbeni felhasználók csak részleges beszélgetést láthatnak majd, ami rosszul eshet).", "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. <b>This action is irreversible.</b>": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az \"identity\" szerverről. <b>Ez a művelet visszafordíthatatlan.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "A fiókod felfüggesztése <b>nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek.</b> Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.", "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.": "Az üzenetek láthatósága a Matrixban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)", "e.g. %(exampleValue)s": "pl. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Segítesz jobbá tenni a Riotot <UsageDataLink>használati adat</UsageDataLink> küldésével? Ez sütit (cookie) fog használni. (Nézd meg az <PolicyLink>Általános Szerződési Feltételeket</PolicyLink>).", "Reload widget": "Kisalkalmazás újratöltése", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Kérlek segíts javítani a Riot.im-et azzal, hogy <UsageDataLink>anonim felhasználási adatokat</UsageDataLink> küldesz. Ez szütit (cookie) fog használni (lásd a <PolicyLink>sütire vonatkozó szabályozásunkat</PolicyLink>).", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Kérlek segíts javítani a Riot.im-et azzal, hogy <UsageDataLink>anonim felhasználási adatokat</UsageDataLink> küldesz. Ez szütit (cookie) fog használni.", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index fa22725f78..c73dc8b60d 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1159,9 +1159,6 @@ "Refresh": "Aggiorna", "We encountered an error trying to restore your previous session.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente.", "Send analytics data": "Invia dati statistici", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie. (Vedi la nostra <PolicyLink>politica sui cookie e sulla privacy</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie.", - "Yes please": "Sì grazie", "Clear Storage and Sign Out": "Elimina lo storage e disconnetti", "Send Logs": "Invia i log", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Eliminare lo storage del browser potrebbe risolvere il problema, ma verrai disconnesso e la cronologia delle chat criptate sarà illeggibile.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 9d7f8901ab..2bdce2fe4f 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1167,16 +1167,12 @@ "Enable widget screenshots on supported widgets": "Включить скриншоты виджета в поддерживаемых виджетах", "Collapse Reply Thread": "Ответить с цитированием", "Send analytics data": "Отправить данные аналитики", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie. (См. наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie.", - "Yes please": "Да, пожалуйста", "Muted Users": "Приглушенные пользователи", "Warning: This widget might use cookies.": "Внимание: этот виджет может использовать cookie.", "Terms and Conditions": "Условия и положения", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Для продолжения использования сервера %(homeserverDomain)s вы должны ознакомиться и принять условия и положения.", "Review terms and conditions": "Просмотр условий и положений", "e.g. %(exampleValue)s": "напр. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя <UsageDataLink>данные использования</UsageDataLink>? Будут использоваться файлы cookie. (Смотрите наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", "Failed to indicate account erasure": "Не удается удалить учетную запись", "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. <b>This action is irreversible.</b>": "Это навсегда сделает вашу учетную запись невозможной для использования. Вы не сможете войти в систему, и никто не сможет перерегистрировать тот же идентификатор пользователя. Это приведет к тому, что ваша учетная запись выйдет из всех комнат, в которые она входит, и будут удалены данные вашей учетной записи с сервера идентификации. <b>Это действие необратимо.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "По умолчанию деактивация вашей учетной записи <b>не приведет к удалению всех ваших сообщений.</b> Если вы хотите, чтобы мы удалили ваши сообщения, поставьте отметку в поле ниже.", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 8e5d8e2f21..ff64f1a8e6 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -901,8 +901,6 @@ "This setting cannot be changed later!": "Den här inställningen kan inte ändras senare!", "Unknown error": "Okänt fel", "Incorrect password": "Felaktigt lösenord", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Detta kommer att göra ditt konto permanent oanvändbart. Du kommer inte att kunna registrera samma användar-ID igen.", - "This action is irreversible.": "Denna åtgärd går inte att ångra.", "To verify that this device 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 device matches the key below:": "För att verifiera att denna enhet kan litas på, vänligen kontakta ägaren på annat sätt (t ex personligen eller med ett telefonsamtal) och fråga om nyckeln ägaren har i sina användarinställningar för enheten matchar nyckeln nedan:", "Device name": "Enhetsnamn", "Device key": "Enhetsnyckel", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 80dce1cc2d..95424eaefb 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1170,9 +1170,6 @@ "Enable widget screenshots on supported widgets": "在支援的小工具上啟用小工具螢幕快照", "Send analytics data": "傳送分析資料", "Muted Users": "已靜音的使用者", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。(參見我們的 <PolicyLink>cookie 與隱私政策</PolicyLink>)。", - "Help improve Riot by sending usage data? This will use a cookie.": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。", - "Yes please": "好的,請", "e.g. %(exampleValue)s": "範例:%(exampleValue)s", "Reload widget": "重新載入小工具", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "請透過傳送<UsageDataLink>匿名使用資料</UsageDataLink>來協助改善 Riot.im。這將會使用 cookie(請參見我們的 <PolicyLink>Cookie 政策</PolicyLink>)。", From 18546dbe06b86955b89a27dca5b29a3d3621bf11 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 11:33:38 +0100 Subject: [PATCH 156/480] QR Code align [m] logo Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/ShareDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index 8bfa0ad931..a88052ee6d 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -186,7 +186,7 @@ export default class ShareDialog extends React.Component { <div className="mx_ShareDialog_left"> <h3>QR Code</h3> <div className="mx_ShareDialog_qrcode_container"> - <QRCode value={matrixToUrl} size={256} logo="img/matrix-m.svg" /> + <QRCode value={matrixToUrl} size={256} logoWidth={48} logo="img/matrix-m.svg" /> </div> </div> <div className="mx_ShareDialog_right"> From 093400681700c7c441cde55f3a22900a5ebb5635 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 12 Jun 2018 14:13:09 +0100 Subject: [PATCH 157/480] Track decryption success/failure rate with piwik Emit a piwik event when a decryption occurs in the category "E2E" with the action "Decryption result" and the name either "failure" or "success". NB: This will cause Riot to a lot of networking when decrypting many events. One HTTP request per decrypted event should be expected. --- src/components/structures/MatrixChat.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index bd8f66163f..d4969a8bf9 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1308,6 +1308,15 @@ export default React.createClass({ } }); + // XXX: This will do a HTTP request for each Event.decrypted event + cli.on("Event.decrypted", (e) => { + if (e.isDecryptionFailure()) { + Analytics.trackEvent('E2E', 'Decryption result', 'failure'); + } else { + Analytics.trackEvent('E2E', 'Decryption result', 'success'); + } + }); + const krh = new KeyRequestHandler(cli); cli.on("crypto.roomKeyRequest", (req) => { krh.handleKeyRequest(req); From 334dccbdc78597aa071762267a55447a61686dcd Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 12 Jun 2018 14:14:14 +0100 Subject: [PATCH 158/480] Released js-sdk --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f183f1635d..bb77fcb92b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.2", + "version": "0.12.7-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6add75f972..581d25688a 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "linkifyjs": "^2.1.3", "lodash": "^4.13.1", "lolex": "2.3.2", - "matrix-js-sdk": "0.10.4-rc.1", + "matrix-js-sdk": "0.10.4", "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", From 0ad738d51044d9c92e73777d0dd79ded32118a23 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 12 Jun 2018 14:21:30 +0100 Subject: [PATCH 159/480] Prepare changelog for v0.12.7 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae8f535cb6..3b97251604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +Changes in [0.12.7](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.7) (2018-06-12) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.7-rc.1...v0.12.7) + + * No changes since rc.1 + Changes in [0.12.7-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.7-rc.1) (2018-06-06) =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.6...v0.12.7-rc.1) From ef1f580abbdb96446cf112f8206d776bdeb3e9c6 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 12 Jun 2018 14:21:30 +0100 Subject: [PATCH 160/480] v0.12.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 581d25688a..2984679bed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.7-rc.1", + "version": "0.12.7", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 9b6c3f44ec03974665e4af77085f1a6b287237a1 Mon Sep 17 00:00:00 2001 From: Silke <silke@slxh.nl> Date: Mon, 11 Jun 2018 20:27:41 +0000 Subject: [PATCH 161/480] Translated using Weblate (Dutch) Currently translated at 100.0% (1190 of 1190 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 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index f09c63118e..130be0d344 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -64,7 +64,7 @@ "Active call (%(roomName)s)": "Actief gesprek (%(roomName)s)", "Add": "Toevoegen", "Add a topic": "Een onderwerp toevoegen", - "Admin Tools": "Beheerhulpmiddelen", + "Admin Tools": "Beheerdershulpmiddelen", "VoIP": "VoiP", "Missing Media Permissions, click here to request.": "Ontbrekende mediatoestemmingen, klik hier om aan te vragen.", "No Microphones detected": "Geen microfoons gevonden", @@ -410,7 +410,7 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Het is niet gelukt om een specifiek punt in de tijdlijn van deze ruimte te laden.", "Turn Markdown off": "Zet Markdown uit", "Turn Markdown on": "Zet Markdown aan", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s heeft eind-tot-eind versleuteling aangezet (algoritme %(algorithm)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s heeft end-to-endbeveiliging aangezet (algoritme %(algorithm)s).", "Unable to add email address": "Niet mogelijk om e-mailadres toe te voegen", "Unable to remove contact information": "Niet mogelijk om contactinformatie te verwijderen", "Unable to verify email address.": "Niet mogelijk om het e-mailadres te verifiëren.", @@ -581,7 +581,7 @@ "Add User": "Gebruiker Toevoegen", "This Home Server would like to make sure you are not a robot": "Deze thuisserver wil er zeker van zijn dat je geen robot bent", "Sign in with CAS": "Inloggen met CAS", - "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Je kan de aangepaste server opties gebruiken om bij andere Matrix-servers in te loggen door een andere thuisserver-URL te specificeren.", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Je kan de alternatieve-serverinstellingen gebruiken om bij andere Matrix-servers in te loggen door een andere thuisserver-URL te specificeren.", "This allows you to use this app with an existing Matrix account on a different home server.": "Dit maakt het mogelijk om deze applicatie te gebruiken met een bestaand Matrix-account op een andere thuisserver.", "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Je kan ook een aangepaste identiteitsserver instellen maar dit zal waarschijnlijk interactie met gebruikers gebaseerd op een e-mailadres voorkomen.", "Please check your email to continue registration.": "Bekijk je e-mail om door te gaan met de registratie.", @@ -590,7 +590,7 @@ "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Als je geen e-mailadres specificeert zal je niet je wachtwoord kunnen resetten. Weet je het zeker?", "You are registering with %(SelectedTeamName)s": "Je registreert je met %(SelectedTeamName)s", "Default server": "Standaardserver", - "Custom server": "Aangepaste server", + "Custom server": "Alternatieve server", "Home server URL": "Thuisserver-URL", "Identity server URL": "Identiteitsserver-URL", "What does this mean?": "Wat betekent dit?", @@ -603,7 +603,7 @@ "URL Previews": "URL-Voorvertoningen", "Drop file here to upload": "Bestand hier laten vallen om te uploaden", " (unsupported)": " (niet ondersteund)", - "Ongoing conference call%(supportedText)s.": "Lopend vergaderingsgesprek %(supportedText)s.", + "Ongoing conference call%(supportedText)s.": "Lopend groepsgesprek%(supportedText)s.", "Online": "Online", "Idle": "Afwezig", "Offline": "Offline", @@ -759,7 +759,7 @@ "World readable": "Leesbaar voor iedereen", "Guests can join": "Gasten kunnen toetreden", "Remove avatar": "Avatar verwijderen", - "To change the room's avatar, you must be a": "Om de avatar van de ruimte te verwijderen, moet het volgende zijn:", + "To change the room's avatar, you must be a": "Om de avatar van de ruimte te verwijderen, moet je het volgende zijn:", "Drop here to favourite": "Hier laten vallen om aan favorieten toe te voegen", "Drop here to tag direct chat": "Hier laten vallen om als privégesprek te markeren", "Drop here to restore": "Hier laten vallen om te herstellen", @@ -923,7 +923,7 @@ "This Home server does not support communities": "Deze Thuisserver ondersteunt geen gemeenschappen", "Failed to load %(groupId)s": "Het is niet gelukt om %(groupId)s te laden", "Old cryptography data detected": "Oude cryptografie gegevens gedetecteerd", - "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.": "Er zijn gegevens van een oudere versie van Riot gedetecteerd. Dit zal eind-tot-eind versleuteling laten storen in de oudere versie. Eind-tot-eind berichten dat recent zijn uitgewisseld zal misschien niet ontsleutelbaar zijn in deze versie. Dit zou er misschien ook voor kunnen zorgen dat berichten die zijn uitgewisseld in deze versie falen. Indien je problemen ervaart, log opnieuw in. Om de berichtgeschiedenis te behouden, exporteer de sleutels en importeer ze achteraf weer.", + "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.": "Er zijn gegevens van een oudere versie van Riot gedetecteerd. Dit verstoorde end-to-endbeveiliging in de oude versie. End-to-endbeveiligde berichten die recent uitgewisseld zijn met de oude versie zijn wellicht niet te ontsleutelen in deze versie. Dit zou er ook voor kunnen zorgen dat berichten die zijn uitgewisseld in deze versie falen. Log opnieuw in als je problemen ervaart. Exporteer de sleutels en importeer ze achteraf weer om de berichtgeschiedenis te behouden.", "Your Communities": "Jouw Gemeenschappen", "Error whilst fetching joined communities": "Er is een fout opgetreden tijdens het ophalen van de gemeenschappen waar je lid van bent", "Create a new community": "Maak een nieuwe gemeenschap aan", @@ -1166,7 +1166,7 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Help Riot.im te verbeteren door het versturen van <UsageDataLink>anonieme gebruiksgegevens</UsageDataLink>. Dit zal een cookie gebruiken.", "Yes, I want to help!": "Ja, ik wil helpen!", "Warning: This widget might use cookies.": "Waarschuwing: deze widget gebruikt misschien cookies.", - "Popout widget": "Opspringende widget", + "Popout widget": "Widget in nieuw venster openen", "Picture": "Afbeelding", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Niet mogelijk om de gebeurtenis te laden waar op gereageerd was. Het kan zijn dat het niet bestaat of dat je niet toestemming hebt om het te bekijken.", "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot fouten worden bijgehouden op GitHub: <a>maak een GitHub melding</a>.", From 848052bb808d82885ec7993e5b351f39c6af4de8 Mon Sep 17 00:00:00 2001 From: strix aluco <strixaluco@rocketmail.com> Date: Sun, 10 Jun 2018 02:40:40 +0000 Subject: [PATCH 162/480] Translated using Weblate (Ukrainian) Currently translated at 23.6% (281 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 74bf855d22..b454c02884 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -94,7 +94,7 @@ "Register": "Зарегіструватись", "Rooms": "Кімнати", "Add rooms to this community": "Добавити кімнати в це суспільство", - "This email address is already in use": "Ця адреса елект. почти вже використовується", + "This email address is already in use": "Ця е-пошта вже використовується", "This phone number is already in use": "Цей телефонний номер вже використовується", "Fetching third party location failed": "Не вдалось отримати стороннє місцеперебування", "Messages in one-to-one chats": "Повідомлення у чатах \"сам на сам\"", @@ -270,5 +270,15 @@ "Your language of choice": "Обрана мова", "Which officially provided instance you are using, if any": "Яким офіційно наданим примірником ви користуєтесь (якщо користуєтесь)", "Whether or not you're using the Richtext mode of the Rich Text Editor": "Чи використовуєте ви режим Richtext у редакторі Rich Text Editor", - "Your homeserver's URL": "URL адреса вашого домашнього серверу" + "Your homeserver's URL": "URL адреса вашого домашнього серверу", + "Failed to verify email address: make sure you clicked the link in the email": "Не вдалось перевірити адресу е-пошти: переконайтесь, що ви перейшли за посиланням у листі", + "The platform you're on": "Використовувана платформа", + "Your identity server's URL": "URL адреса серверу ідентифікації", + "e.g. %(exampleValue)s": "напр. %(exampleValue)s", + "Every page you use in the app": "Кожна використовувана у застосунку сторінка", + "e.g. <CurrentPageURL>": "напр. <CurrentPageURL>", + "Your User Agent": "Ваш користувацький агент", + "Your device resolution": "Роздільність вашого пристрою", + "Analytics": "Аналітика", + "The information being sent to us to help make Riot.im better includes:": "Надсилана інформація, що допомагає нам покращити Riot.im, вміщує:" } From c820836bcc1c95d0fb292f47ecb377e602f5b9ee Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 15:22:45 +0100 Subject: [PATCH 163/480] make RoomTooltip generic and add ContextMenu&Tooltip to GroupInviteTile Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../GroupInviteTileContextMenu.js | 87 ++++++++++++++++ .../views/groups/GroupInviteTile.js | 98 +++++++++++++++++-- src/components/views/rooms/RoomList.js | 3 +- src/components/views/rooms/RoomTile.js | 4 +- src/components/views/rooms/RoomTooltip.js | 25 ++--- 5 files changed, 189 insertions(+), 28 deletions(-) create mode 100644 src/components/views/context_menus/GroupInviteTileContextMenu.js diff --git a/src/components/views/context_menus/GroupInviteTileContextMenu.js b/src/components/views/context_menus/GroupInviteTileContextMenu.js new file mode 100644 index 0000000000..844845ea82 --- /dev/null +++ b/src/components/views/context_menus/GroupInviteTileContextMenu.js @@ -0,0 +1,87 @@ +/* +Copyright 2018 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. +*/ + +import React from 'react'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; +import sdk from '../../../index'; +import { _t, _td } from '../../../languageHandler'; +import Modal from '../../../Modal'; +import {Group} from 'matrix-js-sdk'; +import GroupStore from "../../../stores/GroupStore"; + +export default class GroupInviteTileContextMenu extends React.Component { + static propTypes = { + group: PropTypes.instanceOf(Group).isRequired, + /* callback called when the menu is dismissed */ + onFinished: PropTypes.func, + }; + + constructor(props, context) { + super(props, context); + + this._onClickReject = this._onClickReject.bind(this); + } + + componentWillMount() { + this._unmounted = false; + } + + componentWillUnmount() { + this._unmounted = true; + } + + _onClickReject() { + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + Modal.createTrackedDialog('Reject community invite', '', QuestionDialog, { + title: _t('Reject invitation'), + description: _t('Are you sure you want to reject the invitation?'), + onFinished: async (shouldLeave) => { + if (!shouldLeave) return; + + // FIXME: controller shouldn't be loading a view :( + const Loader = sdk.getComponent("elements.Spinner"); + const modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); + + try { + await GroupStore.leaveGroup(this.props.group.groupId); + } catch (e) { + console.error(e); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Error rejecting invite', '', ErrorDialog, { + title: _t("Error"), + description: _t("Unable to reject invite"), + }); + } + modal.close(); + }, + }); + + // Close the context menu + if (this.props.onFinished) { + this.props.onFinished(); + } + } + + render() { + return <div> + <div className="mx_RoomTileContextMenu_leave" onClick={this._onClickReject} > + <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_delete.svg" width="15" height="15" /> + { _t('Reject') } + </div> + </div>; + } +} diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index d97464e8ca..65e8a07d5a 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -1,5 +1,5 @@ /* -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -20,6 +20,8 @@ import { MatrixClient } from 'matrix-js-sdk'; import sdk from '../../../index'; import dis from '../../../dispatcher'; import AccessibleButton from '../elements/AccessibleButton'; +import * as ContextualMenu from "../../structures/ContextualMenu"; +import classNames from 'classnames'; export default React.createClass({ displayName: 'GroupInviteTile', @@ -32,6 +34,15 @@ export default React.createClass({ matrixClient: PropTypes.instanceOf(MatrixClient), }, + getInitialState: function() { + return ({ + hover: false, + badgeHover: false, + menuDisplayed: false, + selected: this.props.group.groupId === null, // XXX: this needs linking to LoggedInView/GroupView state + }); + }, + onClick: function(e) { dis.dispatch({ action: 'view_group', @@ -39,6 +50,56 @@ export default React.createClass({ }); }, + onMouseEnter: function() { + const state = {hover: true}; + // Only allow non-guests to access the context menu + if (!this.context.matrixClient.isGuest()) { + state.badgeHover = true; + } + this.setState(state); + }, + + onMouseLeave: function() { + this.setState({ + badgeHover: false, + hover: false, + }); + }, + + onBadgeClicked: function(e) { + // Prevent the RoomTile onClick event firing as well + e.stopPropagation(); + + // Only allow none guests to access the context menu + if (this.context.matrixClient.isGuest()) return; + + // If the badge is clicked, then no longer show tooltip + if (this.props.collapsed) { + this.setState({ hover: false }); + } + + const RoomTileContextMenu = sdk.getComponent('context_menus.GroupInviteTileContextMenu'); + const elementRect = e.target.getBoundingClientRect(); + + // The window X and Y offsets are to adjust position when zoomed in to page + const x = elementRect.right + window.pageXOffset + 3; + const chevronOffset = 12; + let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset); + y = y - (chevronOffset + 8); // where 8 is half the height of the chevron + + ContextualMenu.createMenu(RoomTileContextMenu, { + chevronOffset: chevronOffset, + left: x, + top: y, + group: this.props.group, + onFinished: () => { + this.setState({ menuDisplayed: false }); + // this.props.refreshSubList(); + }, + }); + this.setState({ menuDisplayed: true }); + }, + render: function() { const BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); const EmojiText = sdk.getComponent('elements.EmojiText'); @@ -49,19 +110,37 @@ export default React.createClass({ const av = <BaseAvatar name={groupName} width={24} height={24} url={httpAvatarUrl} />; - const label = <EmojiText - element="div" - title={this.props.group.groupId} - className="mx_RoomTile_name mx_RoomTile_badgeShown" - dir="auto" - > + const nameClasses = classNames({ + 'mx_RoomTile_name': true, + 'mx_RoomTile_invite': this.props.isInvite, + 'mx_RoomTile_badgeShown': this.state.badgeHover || this.state.menuDisplayed, + }); + + const label = <EmojiText element="div" title={this.props.group.groupId} className={nameClasses} dir="auto"> { groupName } </EmojiText>; - const badge = <div className="mx_RoomSubList_badge mx_RoomSubList_badgeHighlight">!</div>; + const badgeEllipsis = this.state.badgeHover || this.state.menuDisplayed; + const badgeClasses = classNames('mx_RoomSubList_badge mx_RoomSubList_badgeHighlight', { + 'mx_RoomTile_badgeButton': badgeEllipsis, + }); + + const badgeContent = badgeEllipsis ? '\u00B7\u00B7\u00B7' : '!'; + const badge = <div className={badgeClasses} onClick={this.onBadgeClicked}>{ badgeContent }</div>; + + let tooltip; + if (this.props.collapsed && this.state.hover) { + const RoomTooltip = sdk.getComponent("rooms.RoomTooltip"); + tooltip = <RoomTooltip className="mx_RoomTile_tooltip" label={groupName} dir="auto" />; + } + + const classes = classNames('mx_RoomTile mx_RoomTile_highlight', { + 'mx_RoomTile_menuDisplayed': this.state.menuDisplayed, + 'mx_RoomTile_selected': this.state.selected, + }); return ( - <AccessibleButton className="mx_RoomTile mx_RoomTile_highlight" onClick={this.onClick}> + <AccessibleButton className={classes} onClick={this.onClick} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}> <div className="mx_RoomTile_avatar"> { av } </div> @@ -69,6 +148,7 @@ export default React.createClass({ { label } { badge } </div> + { tooltip } </AccessibleButton> ); }, diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index fc1872249f..2722bad88b 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -589,8 +589,7 @@ module.exports = React.createClass({ const GroupInviteTile = sdk.getComponent('groups.GroupInviteTile'); for (const group of MatrixClientPeg.get().getGroups()) { if (group.myMembership !== 'invite') continue; - - ret.push(<GroupInviteTile key={group.groupId} group={group} />); + ret.push(<GroupInviteTile key={group.groupId} group={group} collapsed={this.props.collapsed} />); } return ret; diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 05aaf79e0b..11eb2090f2 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -301,7 +301,7 @@ module.exports = React.createClass({ } } else if (this.state.hover) { const RoomTooltip = sdk.getComponent("rooms.RoomTooltip"); - tooltip = <RoomTooltip className="mx_RoomTile_tooltip" room={this.props.room} dir="auto" />; + tooltip = <RoomTooltip className="mx_RoomTile_tooltip" label={this.props.room.name} dir="auto" />; } //var incomingCallBox; @@ -314,7 +314,7 @@ module.exports = React.createClass({ let directMessageIndicator; if (this._isDirectMessageRoom(this.props.room.roomId)) { - directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm" />; + directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm" />; } return <AccessibleButton className={classes} tabIndex="0" onClick={this.onClick} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}> diff --git a/src/components/views/rooms/RoomTooltip.js b/src/components/views/rooms/RoomTooltip.js index b17f54ef3c..bce0922637 100644 --- a/src/components/views/rooms/RoomTooltip.js +++ b/src/components/views/rooms/RoomTooltip.js @@ -14,11 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; -var React = require('react'); -var ReactDOM = require('react-dom'); -var dis = require('../../../dispatcher'); +import React from 'react'; +import ReactDOM from 'react-dom'; +import dis from '../../../dispatcher'; import classNames from 'classnames'; const MIN_TOOLTIP_HEIGHT = 25; @@ -77,25 +76,21 @@ module.exports = React.createClass({ }, _renderTooltip: function() { - var label = this.props.room ? this.props.room.name : this.props.label; - // Add the parent's position to the tooltips, so it's correctly // positioned, also taking into account any window zoom // NOTE: The additional 6 pixels for the left position, is to take account of the // tooltips chevron - var parent = ReactDOM.findDOMNode(this).parentNode; - var style = {}; + const parent = ReactDOM.findDOMNode(this).parentNode; + let style = {}; style = this._updatePosition(style); style.display = "block"; - const tooltipClasses = classNames( - "mx_RoomTooltip", this.props.tooltipClassName, - ); + const tooltipClasses = classNames("mx_RoomTooltip", this.props.tooltipClassName); - var tooltip = ( - <div className={tooltipClasses} style={style} > - <div className="mx_RoomTooltip_chevron"></div> - { label } + const tooltip = ( + <div className={tooltipClasses} style={style}> + <div className="mx_RoomTooltip_chevron" /> + { this.props.label } </div> ); From 9dd2184b33720b44c34b29f8039652df02eb66ce Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 15:29:05 +0100 Subject: [PATCH 164/480] remove unused imports Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/context_menus/GroupInviteTileContextMenu.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/context_menus/GroupInviteTileContextMenu.js b/src/components/views/context_menus/GroupInviteTileContextMenu.js index 844845ea82..bbdc3a4244 100644 --- a/src/components/views/context_menus/GroupInviteTileContextMenu.js +++ b/src/components/views/context_menus/GroupInviteTileContextMenu.js @@ -15,10 +15,9 @@ limitations under the License. */ import React from 'react'; -import classNames from 'classnames'; import PropTypes from 'prop-types'; import sdk from '../../../index'; -import { _t, _td } from '../../../languageHandler'; +import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; import {Group} from 'matrix-js-sdk'; import GroupStore from "../../../stores/GroupStore"; From ed779cabc403145107110def3e3d5b29d432ebbb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 15:34:35 +0100 Subject: [PATCH 165/480] add mx_filterFlipColor to mx_MemberInfo_cancel img Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/groups/GroupMemberInfo.js | 2 +- src/components/views/rooms/MemberInfo.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/views/groups/GroupMemberInfo.js b/src/components/views/groups/GroupMemberInfo.js index 4fed293bec..ca59075912 100644 --- a/src/components/views/groups/GroupMemberInfo.js +++ b/src/components/views/groups/GroupMemberInfo.js @@ -187,7 +187,7 @@ module.exports = React.createClass({ return ( <div className="mx_MemberInfo"> <GeminiScrollbarWrapper autoshow={true}> - <AccessibleButton className="mx_MemberInfo_cancel"onClick={this._onCancel}> + <AccessibleButton className="mx_MemberInfo_cancel" onClick={this._onCancel}> <img src="img/cancel.svg" width="18" height="18" className="mx_filterFlipColor" /> </AccessibleButton> <div className="mx_MemberInfo_avatar"> diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 2789c0e4cd..75e6990120 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -902,7 +902,9 @@ module.exports = withMatrixClient(React.createClass({ return ( <div className="mx_MemberInfo"> <GeminiScrollbarWrapper autoshow={true}> - <AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> <img src="img/cancel.svg" width="18" height="18" /></AccessibleButton> + <AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> + <img src="img/cancel.svg" width="18" height="18" className="mx_filterFlipColor" /> + </AccessibleButton> <div className="mx_MemberInfo_avatar"> <MemberAvatar onClick={this.onMemberAvatarClick} member={this.props.member} width={48} height={48} /> </div> From ffcba9498ec4281c4d308476764f5fdde64ea51e Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 12 Jun 2018 16:14:24 +0100 Subject: [PATCH 166/480] Keep context menus that extend downwards vertically on screen This fixes https://github.com/vector-im/riot-web/issues/3429 in the case of RoomList context menus *and* EventTile context menus. This was mostly stolen from #1903 and it would be good to factor things out at a later date such that #1903 is replaced with similar logic within ContextualMenu. --- src/components/structures/ContextualMenu.js | 37 +++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index daac294d12..3e867ad384 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -63,6 +63,24 @@ export default class ContextualMenu extends React.Component { hasBackground: PropTypes.bool, } + constructor() { + super(); + this.state = { + contextMenuRect: null, + }; + + this.collectContextMenuRect = this.collectContextMenuRect.bind(this); + } + + collectContextMenuRect(element) { + // We don't need to clean up when unmounting, so ignore + if (!element) return; + + this.setState({ + contextMenuRect: element.getBoundingClientRect(), + }); + } + render() { const position = {}; let chevronFace = null; @@ -83,6 +101,9 @@ export default class ContextualMenu extends React.Component { chevronFace = 'right'; } + const contextMenuRect = this.state.contextMenuRect || null; + const padding = 10; + const chevronOffset = {}; if (props.chevronFace) { chevronFace = props.chevronFace; @@ -90,7 +111,19 @@ export default class ContextualMenu extends React.Component { if (chevronFace === 'top' || chevronFace === 'bottom') { chevronOffset.left = props.chevronOffset; } else { - chevronOffset.top = props.chevronOffset; + const target = position.top; + + // By default, no adjustment is made + let adjusted = target; + + // 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); + } + + position.top = adjusted; + chevronOffset.top = Math.max(props.chevronOffset, props.chevronOffset + target - adjusted); } // To override the default chevron colour, if it's been set @@ -154,7 +187,7 @@ export default class ContextualMenu extends React.Component { // FIXME: If a menu uses getDefaultProps it clobbers the onFinished // property set here so you can't close the menu from a button click! return <div className={className} style={position}> - <div className={menuClasses} style={menuStyle}> + <div className={menuClasses} style={menuStyle} ref={this.collectContextMenuRect}> { chevron } <ElementClass {...props} onFinished={props.closeMenu} onResize={props.windowResize} /> </div> From 6a382aa57c10bc8ef8817f054beac45ca34b72a1 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Tue, 12 Jun 2018 13:44:07 +0000 Subject: [PATCH 167/480] Translated using Weblate (Russian) Currently translated at 99.8% (1188 of 1190 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index bc6b51a269..bed1cb3a21 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1189,5 +1189,6 @@ "Reload widget": "Перезагрузить виджет", "To notify everyone in the room, you must be a": "Для уведомления всех в комнате, вы должны быть", "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.": "Эта комната используется для важных сообщений от сервера, поэтому вы не можете ее покинуть.", + "Try the app first": "Сначала попробуйте приложение" } From 175f1aa15cc51f28d376d550cc76520830535806 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 12 Jun 2018 16:43:54 +0100 Subject: [PATCH 168/480] don't set the displayname on registration as Synapse now does it Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MatrixChat.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index bd8f66163f..50a1f70496 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1143,11 +1143,6 @@ export default React.createClass({ } else if (this._is_registered) { this._is_registered = false; - // Set the display name = user ID localpart - MatrixClientPeg.get().setDisplayName( - MatrixClientPeg.get().getUserIdLocalpart(), - ); - if (this.props.config.welcomeUserId && getCurrentLanguage().startsWith("en")) { createRoom({ dmUserId: this.props.config.welcomeUserId, From c1d375c3fd76b252b0e12a0e9636dde96d15d8b4 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Sat, 2 Jun 2018 12:31:10 +0000 Subject: [PATCH 169/480] Translated using Weblate (Basque) Currently translated at 100.0% (1190 of 1190 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index ac2187456e..b8ebdde7e4 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1194,5 +1194,6 @@ "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.": "Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ahaztean ez dizkiogu erabiltzaile berriei edo izena eman ez dutenei erakutsiko, baina jada zure mezuak jaso dituzten erregistratutako erabiltzaileen bere kopia izaten jarraituko dute.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Ahaztu bidali ditudan mezu guztiak kontua desaktibatzean (Abisua: Honekin etorkizuneko erabiltzaileek elkarrizketaren bertsio ez oso bat ikusiko dute)", "Can't leave Server Notices room": "Ezin zara Server Notices gelatik atera", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "Gela hau mezu hasiera zerbitzariaren garrantzitsuak bidaltzeko erabiltzen da, eta ezin zara atera." + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Gela hau mezu hasiera zerbitzariaren garrantzitsuak bidaltzeko erabiltzen da, eta ezin zara atera.", + "Try the app first": "Probatu aplikazioa aurretik" } From 18d542965de969331c527e6543a2fa60b91e5f6f Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Wed, 30 May 2018 12:53:39 +0000 Subject: [PATCH 170/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1190 of 1190 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index e1709f1e0a..e9482f9b59 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1187,5 +1187,6 @@ "Terms and Conditions": "Правила и условия", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "За да продължите да ползвате %(homeserverDomain)s е необходимо да прегледате и да се съгласите с правилата и условията за ползване.", "Review terms and conditions": "Прегледай правилата и условията", - "Failed to indicate account erasure": "Неуспешно указване на желанието за изтриване на акаунта" + "Failed to indicate account erasure": "Неуспешно указване на желанието за изтриване на акаунта", + "Try the app first": "Първо пробвайте приложението" } From b477d1d976a84d8a93090d7ed7ed6847b6c1bcd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Mon, 28 May 2018 06:49:16 +0000 Subject: [PATCH 171/480] Translated using Weblate (French) Currently translated at 100.0% (1190 of 1190 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index c3cfdef5fc..4518b92c61 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1195,5 +1195,6 @@ "Yes, I want to help!": "Oui, je veux aider !", "Can't leave Server Notices room": "Impossible de quitter le salon des Annonces du serveur", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ce salon est utilisé pour les messages importants du serveur d'accueil, donc vous ne pouvez pas en partir.", - "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être un(e)" + "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être un(e)", + "Try the app first": "Essayer d'abord l'application" } From 22bec0d67d6928afedeaca9be43b45c924d3f639 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 09:13:32 +0100 Subject: [PATCH 172/480] allow CreateRoom to scale properly horizontally Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/dialogs/_CreateRoomDialog.scss | 5 +++++ src/components/views/dialogs/CreateRoomDialog.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index 888f147d21..05d5bfcebf 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -23,6 +23,10 @@ limitations under the License. padding-bottom: 12px; } +.mx_CreateRoomDialog_input_container { + padding-right: 20px; +} + .mx_CreateRoomDialog_input { font-size: 15px; border-radius: 3px; @@ -30,4 +34,5 @@ limitations under the License. padding: 9px; color: $primary-fg-color; background-color: $primary-bg-color; + width: 100%; } diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 51693a19c9..3b5369e8f6 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -52,8 +52,8 @@ export default React.createClass({ <div className="mx_CreateRoomDialog_label"> <label htmlFor="textinput"> { _t('Room name (optional)') } </label> </div> - <div> - <input id="textinput" ref="textinput" className="mx_CreateRoomDialog_input" autoFocus={true} size="64" /> + <div className="mx_CreateRoomDialog_input_container"> + <input id="textinput" ref="textinput" className="mx_CreateRoomDialog_input" autoFocus={true} /> </div> <br /> From 846c14062a424544d1aa9345c85778c17c6ba92f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 09:28:35 +0100 Subject: [PATCH 173/480] show redacted stickers like other redacted messages Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/MessageEvent.js | 3 ++- src/components/views/rooms/EventTile.js | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index 38f55c9d70..babe1bbf29 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -69,7 +69,8 @@ module.exports = React.createClass({ if (msgtype && bodyTypes[msgtype]) { BodyType = bodyTypes[msgtype]; } else if (this.props.mxEvent.getType() === 'm.sticker') { - BodyType = sdk.getComponent('messages.MStickerBody'); + // if sticker is redacted, show UnknownBody otherwise it'll fall through to elif + BodyType = this.props.mxEvent.isRedacted() ? UnknownBody : sdk.getComponent('messages.MStickerBody'); } else if (content.url) { // Fallback to MFileBody if there's a content URL BodyType = bodyTypes['m.file']; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 589524bb9e..c43ddaad11 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -490,7 +490,7 @@ module.exports = withMatrixClient(React.createClass({ } const isSending = (['sending', 'queued', 'encrypting'].indexOf(this.props.eventSendStatus) !== -1); - const isRedacted = (eventType === 'm.room.message') && this.props.isRedacted; + const isRedacted = isMessageEvent(this.props.mxEvent) && this.props.isRedacted; const isEncryptionFailure = this.props.mxEvent.isDecryptionFailure(); const classes = classNames({ @@ -715,9 +715,15 @@ module.exports = withMatrixClient(React.createClass({ }, })); +// XXX this'll eventually be dynamic based on the fields once we have extensible event types +const messageTypes = ['m.room.message', 'm.sticker']; +function isMessageEvent(ev) { + return (messageTypes.includes(ev.getType())); +} + module.exports.haveTileForEvent = function(e) { // Only messages have a tile (black-rectangle) if redacted - if (e.isRedacted() && e.getType() !== 'm.room.message') return false; + if (e.isRedacted() && !isMessageEvent(e)) return false; const handler = getHandlerTile(e); if (handler === undefined) return false; From 20caea47f81aaa46ae04d9408b15da5b28374aa8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 09:32:21 +0100 Subject: [PATCH 174/480] make more generic Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/MessageEvent.js | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index babe1bbf29..c4d29257ff 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -62,18 +62,24 @@ module.exports = React.createClass({ 'm.audio': sdk.getComponent('messages.MAudioBody'), 'm.video': sdk.getComponent('messages.MVideoBody'), }; + const evTypes = { + 'm.sticker': sdk.getComponent('messages.MStickerBody'), + }; const content = this.props.mxEvent.getContent(); + const type = this.props.mxEvent.getType(); const msgtype = content.msgtype; let BodyType = UnknownBody; - if (msgtype && bodyTypes[msgtype]) { - BodyType = bodyTypes[msgtype]; - } else if (this.props.mxEvent.getType() === 'm.sticker') { - // if sticker is redacted, show UnknownBody otherwise it'll fall through to elif - BodyType = this.props.mxEvent.isRedacted() ? UnknownBody : sdk.getComponent('messages.MStickerBody'); - } else if (content.url) { - // Fallback to MFileBody if there's a content URL - BodyType = bodyTypes['m.file']; + if (!this.props.mxEvent.isRedacted()) { + // only resolve BodyType if event is not redacted + if (msgtype && bodyTypes[msgtype]) { + BodyType = bodyTypes[msgtype]; + } else if (type && evTypes[type]) { + BodyType = evTypes[type]; + } else if (content.url) { + // Fallback to MFileBody if there's a content URL + BodyType = bodyTypes['m.file']; + } } return <BodyType From 64b86108d06ceab1d24e46c5045e8fcd50aa88c8 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 13 Jun 2018 09:38:23 +0100 Subject: [PATCH 175/480] Only track decryption failures --- src/components/structures/MatrixChat.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index d4969a8bf9..b5c5efa230 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1311,9 +1311,7 @@ export default React.createClass({ // XXX: This will do a HTTP request for each Event.decrypted event cli.on("Event.decrypted", (e) => { if (e.isDecryptionFailure()) { - Analytics.trackEvent('E2E', 'Decryption result', 'failure'); - } else { - Analytics.trackEvent('E2E', 'Decryption result', 'success'); + Analytics.trackEvent('E2E', 'Decryption failure'); } }); From 230de44071196151fbc247f0a90a9b9954286d38 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 13 Jun 2018 09:38:57 +0100 Subject: [PATCH 176/480] Adjust comment --- src/components/structures/MatrixChat.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index b5c5efa230..c94baa63ef 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1309,6 +1309,7 @@ export default React.createClass({ }); // XXX: This will do a HTTP request for each Event.decrypted event + // if the decryption was a failure cli.on("Event.decrypted", (e) => { if (e.isDecryptionFailure()) { Analytics.trackEvent('E2E', 'Decryption failure'); From 8136069046db911f231d41f56b8d657a6cde94d2 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Tue, 12 Jun 2018 21:55:54 +0000 Subject: [PATCH 177/480] Translated using Weblate (Basque) Currently translated at 100.0% (1190 of 1190 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, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index b8ebdde7e4..1be59bdbd5 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -844,8 +844,8 @@ "were unbanned %(count)s times|one": "debekua kendu zaie", "was unbanned %(count)s times|other": "%(count)s aldiz kendu zaio debekua", "was unbanned %(count)s times|one": "debekua kendu zaio", - "were kicked %(count)s times|other": "%(count)s kanporatu zaie", - "were kicked %(count)s times|one": "kanporatu zaie", + "were kicked %(count)s times|other": "%(count)s aldiz kanporatu zaie", + "were kicked %(count)s times|one": "(r) kanporatu zaie", "was kicked %(count)s times|other": "%(count)s aldiz kanporatu zaio", "was kicked %(count)s times|one": "kanporatu zaio", "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s erabiltzaileek bere izena aldatu dute %(count)s aldiz", From 41be46a7120075b5792194bcdf2c56f6e9b240fa Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 09:51:35 +0100 Subject: [PATCH 178/480] apply roomlist searchFilter to aliases if it begins with a `#` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index fb82ee067b..17daa8553b 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -105,8 +105,15 @@ var RoomSubList = React.createClass({ applySearchFilter: function(list, filter) { if (filter === "") return list; + const lcFilter = filter.toLowerCase(); return list.filter((room) => { - return room.name && room.name.toLowerCase().indexOf(filter.toLowerCase()) >= 0 + if (room.name && room.name.toLowerCase().includes(lcFilter)) return true; + // only apply search filter to aliases if it looks like an alias (starts with `#`) + // to prevent loads of false positives with server names, e.g `matrix` + if (filter[0] === '#' && room.getAliases().some((alias) => { + return alias.toLowerCase().startsWith(lcFilter); + })) return true; + return false; }); }, From 1cb794753e4114c86132de7058d13a920fafe448 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 13 Jun 2018 10:39:52 +0100 Subject: [PATCH 179/480] Simplify & refactor some widget stuff * ScalarMessaging onMessage was getting the current room ID by listening for view_and remembering the room id or alias, and so having to look up the alias if it was alias. We have RoomViewStore for this. * Move waitForUserWidget into WidgetUtils * s/require/import/ --- src/ScalarMessaging.js | 193 +++++++++++++---------------------------- src/WidgetUtils.js | 46 ++++++++++ 2 files changed, 106 insertions(+), 133 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 9457e6ccfb..dd3975dfe5 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -231,11 +232,12 @@ Example: } */ -const SdkConfig = require('./SdkConfig'); -const MatrixClientPeg = require("./MatrixClientPeg"); -const MatrixEvent = require("matrix-js-sdk").MatrixEvent; -const dis = require("./dispatcher"); -const Widgets = require('./utils/widgets'); +import SdkConfig from './SdkConfig'; +import MatrixClientPeg from './MatrixClientPeg'; +import { MatrixEvent } from 'matrix-js-sdk'; +import dis from './dispatcher'; +import Widgets from './utils/widgets'; +import RoomViewStore from './stores/RoomViewStore'; import { _t } from './languageHandler'; function sendResponse(event, res) { @@ -286,51 +288,6 @@ function inviteUser(event, roomId, userId) { }); } -/** - * Returns a promise that resolves when a widget with the given - * ID has been added as a user widget (ie. the accountData event - * arrives) or rejects after a timeout - * - * @param {string} widgetId The ID of the widget to wait for - * @param {boolean} add True to wait for the widget to be added, - * false to wait for it to be deleted. - * @returns {Promise} that resolves when the widget is available - */ -function waitForUserWidget(widgetId, add) { - return new Promise((resolve, reject) => { - const currentAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); - - // Tests an account data event, returning true if it's in the state - // we're waiting for it to be in - function eventInIntendedState(ev) { - if (!ev || !currentAccountDataEvent.getContent()) return false; - if (add) { - return ev.getContent()[widgetId] !== undefined; - } else { - return ev.getContent()[widgetId] === undefined; - } - } - - if (eventInIntendedState(currentAccountDataEvent)) { - resolve(); - return; - } - - function onAccountData(ev) { - if (eventInIntendedState(currentAccountDataEvent)) { - MatrixClientPeg.get().removeListener('accountData', onAccountData); - clearTimeout(timerId); - resolve(); - } - } - const timerId = setTimeout(() => { - MatrixClientPeg.get().removeListener('accountData', onAccountData); - reject(new Error("Timed out waiting for widget ID " + widgetId + " to appear")); - }, 10000); - MatrixClientPeg.get().on('accountData', onAccountData); - }); -} - function setWidget(event, roomId) { const widgetId = event.data.widget_id; const widgetType = event.data.type; @@ -637,19 +594,6 @@ function returnStateEvent(event, roomId, eventType, stateKey) { sendResponse(event, stateEvent.getContent()); } -let currentRoomId = null; -let currentRoomAlias = null; - -// Listen for when a room is viewed -dis.register(onAction); -function onAction(payload) { - if (payload.action !== "view_room") { - return; - } - currentRoomId = payload.room_id; - currentRoomAlias = payload.room_alias; -} - const onMessage = function(event) { if (!event.origin) { // stupid chrome event.origin = event.originalEvent.origin; @@ -700,80 +644,63 @@ const onMessage = function(event) { return; } } - let promise = Promise.resolve(currentRoomId); - if (!currentRoomId) { - if (!currentRoomAlias) { - sendError(event, _t('Must be viewing a room')); - return; - } - // no room ID but there is an alias, look it up. - console.log("Looking up alias " + currentRoomAlias); - promise = MatrixClientPeg.get().getRoomIdForAlias(currentRoomAlias).then((res) => { - return res.room_id; - }); + + if (roomId !== RoomViewStore.getRoomId()) { + sendError(event, _t('Room %(roomId)s not visible', {roomId: roomId})); + return; } - promise.then((viewingRoomId) => { - if (roomId !== viewingRoomId) { - sendError(event, _t('Room %(roomId)s not visible', {roomId: roomId})); - return; - } + // Get and set room-based widgets + if (event.data.action === "get_widgets") { + getWidgets(event, roomId); + return; + } else if (event.data.action === "set_widget") { + setWidget(event, roomId); + return; + } - // Get and set room-based widgets - if (event.data.action === "get_widgets") { - getWidgets(event, roomId); - return; - } else if (event.data.action === "set_widget") { - setWidget(event, roomId); - return; - } + // These APIs don't require userId + if (event.data.action === "join_rules_state") { + getJoinRules(event, roomId); + return; + } else if (event.data.action === "set_plumbing_state") { + setPlumbingState(event, roomId, event.data.status); + return; + } else if (event.data.action === "get_membership_count") { + getMembershipCount(event, roomId); + return; + } else if (event.data.action === "get_room_enc_state") { + getRoomEncState(event, roomId); + return; + } else if (event.data.action === "can_send_event") { + canSendEvent(event, roomId); + return; + } - // These APIs don't require userId - if (event.data.action === "join_rules_state") { - getJoinRules(event, roomId); - return; - } else if (event.data.action === "set_plumbing_state") { - setPlumbingState(event, roomId, event.data.status); - return; - } else if (event.data.action === "get_membership_count") { - getMembershipCount(event, roomId); - return; - } else if (event.data.action === "get_room_enc_state") { - getRoomEncState(event, roomId); - return; - } else if (event.data.action === "can_send_event") { - canSendEvent(event, roomId); - return; - } - - if (!userId) { - sendError(event, _t('Missing user_id in request')); - return; - } - switch (event.data.action) { - case "membership_state": - getMembershipState(event, roomId, userId); - break; - case "invite": - inviteUser(event, roomId, userId); - break; - case "bot_options": - botOptions(event, roomId, userId); - break; - case "set_bot_options": - setBotOptions(event, roomId, userId); - break; - case "set_bot_power": - setBotPower(event, roomId, userId, event.data.level); - break; - default: - console.warn("Unhandled postMessage event with action '" + event.data.action +"'"); - break; - } - }, (err) => { - console.error(err); - sendError(event, _t('Failed to lookup current room') + '.'); - }); + if (!userId) { + sendError(event, _t('Missing user_id in request')); + return; + } + switch (event.data.action) { + case "membership_state": + getMembershipState(event, roomId, userId); + break; + case "invite": + inviteUser(event, roomId, userId); + break; + case "bot_options": + botOptions(event, roomId, userId); + break; + case "set_bot_options": + setBotOptions(event, roomId, userId); + break; + case "set_bot_power": + setBotPower(event, roomId, userId, event.data.level); + break; + default: + console.warn("Unhandled postMessage event with action '" + event.data.action +"'"); + break; + } }; let listenerCount = 0; diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 10cd473904..c6816d28b6 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -90,4 +91,49 @@ export default class WidgetUtils { } return false; } + + /** + * Returns a promise that resolves when a widget with the given + * ID has been added as a user widget (ie. the accountData event + * arrives) or rejects after a timeout + * + * @param {string} widgetId The ID of the widget to wait for + * @param {boolean} add True to wait for the widget to be added, + * false to wait for it to be deleted. + * @returns {Promise} that resolves when the widget is available + */ + static waitForUserWidget(widgetId, add) { + return new Promise((resolve, reject) => { + const currentAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); + + // Tests an account data event, returning true if it's in the state + // we're waiting for it to be in + function eventInIntendedState(ev) { + if (!ev || !currentAccountDataEvent.getContent()) return false; + if (add) { + return ev.getContent()[widgetId] !== undefined; + } else { + return ev.getContent()[widgetId] === undefined; + } + } + + if (eventInIntendedState(currentAccountDataEvent)) { + resolve(); + return; + } + + function onAccountData(ev) { + if (eventInIntendedState(currentAccountDataEvent)) { + MatrixClientPeg.get().removeListener('accountData', onAccountData); + clearTimeout(timerId); + resolve(); + } + } + const timerId = setTimeout(() => { + MatrixClientPeg.get().removeListener('accountData', onAccountData); + reject(new Error("Timed out waiting for widget ID " + widgetId + " to appear")); + }, 10000); + MatrixClientPeg.get().on('accountData', onAccountData); + }); + } } From e98112254d7061e3ab913a3c7e2d0edbf078cec2 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki <nekomanma@pixiv.co.jp> Date: Mon, 21 May 2018 19:37:07 +0900 Subject: [PATCH 180/480] Update lolex to 2.7.0 Signed-off-by: Akihiko Odaki <nekomanma@pixiv.co.jp> --- package-lock.json | 379 +++++----------------------------------------- package.json | 2 +- 2 files changed, 41 insertions(+), 340 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97ed7b5dea..433ed3ea4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.4", + "version": "0.12.7", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -52,17 +52,6 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ajv-keywords": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", @@ -86,11 +75,6 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, - "another-json": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", - "integrity": "sha1-tfQBnJc7bdXGUGotk0acttMq7tw=" - }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", @@ -205,11 +189,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, "assert": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", @@ -219,11 +198,6 @@ "util": "0.10.3" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", @@ -236,21 +210,6 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" - }, "babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", @@ -1145,15 +1104,6 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1321,11 +1271,6 @@ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -1420,7 +1365,8 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "code-point-at": { "version": "1.1.0", @@ -1443,14 +1389,6 @@ "lodash": "^4.5.0" } }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", @@ -1538,7 +1476,8 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true }, "convert-source-map": { "version": "1.5.0", @@ -1611,14 +1550,6 @@ "es5-ext": "^0.10.9" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-names": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/date-names/-/date-names-0.1.10.tgz", @@ -1676,11 +1607,6 @@ "rimraf": "^2.2.8" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", @@ -1805,15 +1731,6 @@ "resolved": "https://registry.npmjs.org/draft-js-utils/-/draft-js-utils-1.2.0.tgz", "integrity": "sha1-9csj6xZzJf/tPXmIL9wxdyHS/RI=" }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2382,21 +2299,6 @@ "is-extglob": "^1.0.0" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -2610,21 +2512,6 @@ "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", @@ -2669,8 +2556,8 @@ "dev": true, "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -2750,7 +2637,6 @@ "version": "2.10.1", "bundled": true, "dev": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -2988,8 +2874,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -3004,17 +2890,16 @@ "dev": true, "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { "version": "2.16.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "http-signature": { "version": "1.1.1", @@ -3197,8 +3082,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -3294,10 +3179,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3389,7 +3274,7 @@ "dev": true, "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -3422,9 +3307,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3432,7 +3317,7 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -3446,7 +3331,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3487,7 +3372,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -3496,7 +3381,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3558,10 +3443,6 @@ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-2.7.4.tgz", "integrity": "sha1-luQg/efvARrEnCWKYhMU/ldlNvk=" }, - "gemini-scrollbar": { - "version": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b", - "from": "gemini-scrollbar@github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" - }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -3577,14 +3458,6 @@ "is-property": "^1.0.0" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "gfm.css": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/gfm.css/-/gfm.css-1.1.2.tgz", @@ -3663,20 +3536,6 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", @@ -3785,16 +3644,6 @@ "requires-port": "1.x.x" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", @@ -4108,11 +3957,6 @@ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -4148,15 +3992,11 @@ "whatwg-fetch": ">=0.10.0" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "jquery": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=", + "optional": true }, "js-tokens": { "version": "3.0.2", @@ -4173,12 +4013,6 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -4191,16 +4025,6 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", @@ -4210,11 +4034,6 @@ "jsonify": "~0.0.0" } }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", @@ -4239,17 +4058,6 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "jsx-ast-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", @@ -4532,9 +4340,9 @@ } }, "lolex": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", - "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.0.tgz", + "integrity": "sha512-uJkH2e0BVfU5KOJUevbTOtpDduooSarH5PopO+LfM/vZf8Z9sJzODqKev804JYM2i++ktJfUmC1le4LwFQ1VMg==" }, "longest": { "version": "1.0.1", @@ -4556,19 +4364,6 @@ "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", "dev": true }, - "matrix-js-sdk": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-0.10.2.tgz", - "integrity": "sha512-7o9a+4wWmxoW4cfdGVLGjZgTFLpWf/I0UqyicIzdV73qotYIO/q6k1bLf1+G0hgwZ/umwke4CB7GemxvvvxMcA==", - "requires": { - "another-json": "^0.2.0", - "babel-runtime": "^6.26.0", - "bluebird": "^3.5.0", - "browser-request": "^0.3.3", - "content-type": "^1.0.2", - "request": "^2.53.0" - } - }, "matrix-mock-request": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/matrix-mock-request/-/matrix-mock-request-1.2.1.tgz", @@ -4645,12 +4440,14 @@ "mime-db": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true }, "mime-types": { "version": "2.1.17", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, "requires": { "mime-db": "~1.30.0" } @@ -4877,11 +4674,6 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5242,7 +5034,8 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, "qjobs": { "version": "1.1.5", @@ -5253,7 +5046,8 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true }, "querystring": { "version": "0.2.0", @@ -5389,13 +5183,6 @@ "prop-types": "^15.5.10" } }, - "react-gemini-scrollbar": { - "version": "github:matrix-org/react-gemini-scrollbar#5e97aef7e034efc8db1431f4b0efe3b26e249ae9", - "from": "react-gemini-scrollbar@github:matrix-org/react-gemini-scrollbar#5e97aef7e034efc8db1431f4b0efe3b26e249ae9", - "requires": { - "gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" - } - }, "react-motion": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", @@ -5592,33 +5379,6 @@ "is-finite": "^1.0.0" } }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } - }, "require-json": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/require-json/-/require-json-0.0.1.tgz", @@ -6049,21 +5809,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - } - }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -6288,14 +6033,6 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "requires": { - "punycode": "^1.4.1" - } - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -6314,20 +6051,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -6462,11 +6185,6 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, "v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", @@ -6476,23 +6194,6 @@ "user-home": "^1.1.1" } }, - "velocity-vector": { - "version": "github:vector-im/velocity#059e3b2348f1110888d033974d3109fd5a3af00f", - "from": "velocity-vector@github:vector-im/velocity#059e3b2348f1110888d033974d3109fd5a3af00f", - "requires": { - "jquery": ">= 1.4.3" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", diff --git a/package.json b/package.json index 1fed55748c..885d37d754 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "isomorphic-fetch": "^2.2.1", "linkifyjs": "^2.1.3", "lodash": "^4.13.1", - "lolex": "2.3.2", + "lolex": "^2.7.0", "matrix-js-sdk": "0.10.4", "optimist": "^0.6.1", "pako": "^1.0.5", From 3cadbd3974a4ccc7aae395c96f63332dced9ff72 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 13 Jun 2018 11:21:26 +0100 Subject: [PATCH 181/480] Include decryption error in decryption failure metrics --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index c94baa63ef..da729a1a2d 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1312,7 +1312,7 @@ export default React.createClass({ // if the decryption was a failure cli.on("Event.decrypted", (e) => { if (e.isDecryptionFailure()) { - Analytics.trackEvent('E2E', 'Decryption failure'); + Analytics.trackEvent('E2E', 'Decryption failure', 'ev.content.body: ' + e.getContent().body); } }); From d4b2f06a63a65e4897d6cbbb6a46df22be933b83 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 13:51:04 +0100 Subject: [PATCH 182/480] fix message appears unencrypted while in flight Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/img/e2e-pending.svg | 12 ++++++++++++ src/components/views/rooms/EventTile.js | 24 ++++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 res/img/e2e-pending.svg diff --git a/res/img/e2e-pending.svg b/res/img/e2e-pending.svg new file mode 100644 index 0000000000..469611cc8d --- /dev/null +++ b/res/img/e2e-pending.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="10px" height="12px" viewBox="0 0 10 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> +<title>48BF5D32-306C-4B20-88EB-24B1F743CAC9</title> +<desc>Created with sketchtool.</desc> +<defs></defs> +<g id="Typing-Indicator" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.4"> + <g id="typing-indicator" transform="translate(-301.000000, -172.000000)" fill="#76CFA6"> + <path d="M309.666667,175.666667 C309.666667,173.633333 308.033333,172 306,172 C303.966667,172 302.333333,173.633333 302.333333,175.666667 L302.333333,176.666667 L301,176.666667 L301,184 L306,184 L311,184 L311,176.666667 L309.666667,176.666667 L309.666667,175.666667 Z M306,176.666667 L303.666667,176.666667 L303.666667,175.666667 C303.666667,174.366667 304.7,173.333333 306,173.333333 C307.3,173.333333 308.333333,174.366667 308.333333,175.666667 L308.333333,176.666667 L306,176.666667 L306,176.666667 Z" id="verified_icon"></path> + </g> +</g> +</svg> diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 589524bb9e..50fe0928b0 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -34,6 +34,7 @@ const ContextualMenu = require('../../structures/ContextualMenu'); import dis from '../../../dispatcher'; import {makeEventPermalink} from "../../../matrix-to"; import SettingsStore from "../../../settings/SettingsStore"; +import {EventStatus} from 'matrix-js-sdk'; const ObjectUtils = require('../../../ObjectUtils'); @@ -442,7 +443,6 @@ module.exports = withMatrixClient(React.createClass({ const ev = this.props.mxEvent; const props = {onClick: this.onCryptoClicked}; - if (ev.getContent().msgtype === 'm.bad.encrypted') { return <E2ePadlockUndecryptable {...props} />; } else if (ev.isEncrypted()) { @@ -451,15 +451,15 @@ module.exports = withMatrixClient(React.createClass({ } else { return <E2ePadlockUnverified {...props} />; } - } else { - // XXX: if the event is being encrypted (ie eventSendStatus === - // encrypting), it might be nice to show something other than the - // open padlock? - - // if the event is not encrypted, but it's an e2e room, show the - // open padlock - const e2eEnabled = this.props.matrixClient.isRoomEncrypted(ev.getRoomId()); - if (e2eEnabled) { + } else if (this.props.matrixClient.isRoomEncrypted(ev.getRoomId())) { + // else if room is encrypted + // and event is being encrypted or is not_sent (Unknown Devices/Network Error) + if (ev.status === EventStatus.ENCRYPTING || ev.status === EventStatus.NOT_SENT) { + // XXX: if the event is being encrypted (ie eventSendStatus === encrypting), + // it might be nice to show something other than the open padlock? + return <E2ePadlockPending {...props} />; + } else { + // if the event is not encrypted, but it's an e2e room, show the open padlock return <E2ePadlockUnencrypted {...props} />; } } @@ -736,6 +736,10 @@ function E2ePadlockUndecryptable(props) { ); } +function E2ePadlockPending(props) { + return <E2ePadlock alt={_t('Encrypting')} src="img/e2e-pending.svg" width="10" height="12" {...props} />; +} + function E2ePadlockVerified(props) { return ( <E2ePadlock alt={_t("Encrypted by a verified device")} From 94125fb5668150a64c173356ee94a30798e6ecc8 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 13 Jun 2018 15:50:19 +0100 Subject: [PATCH 183/480] Fix widgets re-appearing after being deleted Widgets would sometimes briefly re-appear after having been deleted. This was because of the following race: * User presses delete, send POST req, we set `deleting`. Widget hides. * POST request completes, we unset `deleting` so widget unhides. * State event comes down sync so widget hides again. This fixes this by introducing `waitForRoomWidget` and using it to wait until the state event comes down the sync until clearing the `deleting` flag. Since we now have `waitForRoomWidget`, this also uses it when adding a widget so the 'widget saved' appears at the same time the widget does. --- src/ScalarMessaging.js | 9 ++-- src/WidgetUtils.js | 60 ++++++++++++++++++++++-- src/components/views/elements/AppTile.js | 4 +- 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index dd3975dfe5..f80162e635 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -237,6 +237,7 @@ import MatrixClientPeg from './MatrixClientPeg'; import { MatrixEvent } from 'matrix-js-sdk'; import dis from './dispatcher'; import Widgets from './utils/widgets'; +import WidgetUtils from './WidgetUtils'; import RoomViewStore from './stores/RoomViewStore'; import { _t } from './languageHandler'; @@ -362,7 +363,7 @@ function setWidget(event, roomId) { // wait for this, the action will complete but if the user is fast enough, // the widget still won't actually be there. client.setAccountData('m.widgets', userWidgets).then(() => { - return waitForUserWidget(widgetId, widgetUrl !== null); + return WidgetUtils.waitForUserWidget(widgetId, widgetUrl !== null); }).then(() => { sendResponse(event, { success: true, @@ -382,9 +383,9 @@ function setWidget(event, roomId) { } // TODO - Room widgets need to be moved to 'm.widget' state events // https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing - client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).done(() => { - // XXX: We should probably wait for the echo of the state event to come back from the server, - // as we do with user widgets. + client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).then(() => { + return WidgetUtils.waitForRoomWidget(widgetId, roomId, widgetUrl !== null); + }).then(() => { sendResponse(event, { success: true, }); diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index c6816d28b6..14fe3f59bd 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -104,12 +104,10 @@ export default class WidgetUtils { */ static waitForUserWidget(widgetId, add) { return new Promise((resolve, reject) => { - const currentAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); - // Tests an account data event, returning true if it's in the state // we're waiting for it to be in function eventInIntendedState(ev) { - if (!ev || !currentAccountDataEvent.getContent()) return false; + if (!ev || !ev.getContent()) return false; if (add) { return ev.getContent()[widgetId] !== undefined; } else { @@ -117,12 +115,14 @@ export default class WidgetUtils { } } - if (eventInIntendedState(currentAccountDataEvent)) { + const startingAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); + if (eventInIntendedState(startingAccountDataEvent)) { resolve(); return; } function onAccountData(ev) { + const currentAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); if (eventInIntendedState(currentAccountDataEvent)) { MatrixClientPeg.get().removeListener('accountData', onAccountData); clearTimeout(timerId); @@ -136,4 +136,56 @@ export default class WidgetUtils { MatrixClientPeg.get().on('accountData', onAccountData); }); } + + /** + * Returns a promise that resolves when a widget with the given + * ID has been added as a room widget in the given room (ie. the + * room state event arrives) or rejects after a timeout + * + * @param {string} widgetId The ID of the widget to wait for + * @param {string} roomId The ID of the room to wait for the widget in + * @param {boolean} add True to wait for the widget to be added, + * false to wait for it to be deleted. + * @returns {Promise} that resolves when the widget is available + */ + static waitForRoomWidget(widgetId, roomId, add) { + return new Promise((resolve, reject) => { + // Tests a list of state events, returning true if it's in the state + // we're waiting for it to be in + function eventsInIntendedState(evList) { + const widgetPresent = evList.some((ev) => { + return ev.getContent() && ev.getContent()['id'] === widgetId; + }); + if (add) { + return widgetPresent; + } else { + return !widgetPresent; + } + } + + const room = MatrixClientPeg.get().getRoom(roomId); + const startingWidgetEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); + if (eventsInIntendedState(startingWidgetEvents)) { + resolve(); + return; + } + + function onRoomStateEvents(ev) { + if (ev.getRoomId() !== roomId) return; + + const currentWidgetEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); + + if (eventsInIntendedState(currentWidgetEvents)) { + MatrixClientPeg.get().removeListener('RoomState.events', onRoomStateEvents); + clearTimeout(timerId); + resolve(); + } + } + const timerId = setTimeout(() => { + MatrixClientPeg.get().removeListener('RoomState.events', onRoomStateEvents); + reject(new Error("Timed out waiting for widget ID " + widgetId + " to appear")); + }, 10000); + MatrixClientPeg.get().on('RoomState.events', onRoomStateEvents); + }); + } } diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 429b5941b9..70b5bd651e 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -324,7 +324,9 @@ export default class AppTile extends React.Component { 'im.vector.modular.widgets', {}, // empty content this.props.id, - ).catch((e) => { + ).then(() => { + return WidgetUtils.waitForRoomWidget(this.props.id, this.props.room.roomId, false); + }).catch((e) => { console.error('Failed to delete widget', e); }).finally(() => { this.setState({deleting: false}); From 5cc2361737608ec7875b46151ea84c5989e6e8d3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 15:52:50 +0100 Subject: [PATCH 184/480] change not_sent e2e lock to match colour of text Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../{e2e-pending.svg => e2e-encrypting.svg} | 0 res/img/e2e-not_sent.svg | 12 ++++++ src/components/views/rooms/EventTile.js | 38 +++++++++++-------- 3 files changed, 34 insertions(+), 16 deletions(-) rename res/img/{e2e-pending.svg => e2e-encrypting.svg} (100%) create mode 100644 res/img/e2e-not_sent.svg diff --git a/res/img/e2e-pending.svg b/res/img/e2e-encrypting.svg similarity index 100% rename from res/img/e2e-pending.svg rename to res/img/e2e-encrypting.svg diff --git a/res/img/e2e-not_sent.svg b/res/img/e2e-not_sent.svg new file mode 100644 index 0000000000..fca79ae547 --- /dev/null +++ b/res/img/e2e-not_sent.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="10px" height="12px" viewBox="0 0 10 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> +<title>48BF5D32-306C-4B20-88EB-24B1F743CAC9</title> +<desc>Created with sketchtool.</desc> +<defs></defs> +<g id="Typing-Indicator" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="typing-indicator" transform="translate(-301.000000, -172.000000)" fill="#f44"> + <path d="M309.666667,175.666667 C309.666667,173.633333 308.033333,172 306,172 C303.966667,172 302.333333,173.633333 302.333333,175.666667 L302.333333,176.666667 L301,176.666667 L301,184 L306,184 L311,184 L311,176.666667 L309.666667,176.666667 L309.666667,175.666667 Z M306,176.666667 L303.666667,176.666667 L303.666667,175.666667 C303.666667,174.366667 304.7,173.333333 306,173.333333 C307.3,173.333333 308.333333,174.366667 308.333333,175.666667 L308.333333,176.666667 L306,176.666667 L306,176.666667 Z" id="verified_icon"></path> + </g> +</g> +</svg> diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 50fe0928b0..9863a1c60a 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -443,25 +443,27 @@ module.exports = withMatrixClient(React.createClass({ const ev = this.props.mxEvent; const props = {onClick: this.onCryptoClicked}; + // event could not be decrypted if (ev.getContent().msgtype === 'm.bad.encrypted') { return <E2ePadlockUndecryptable {...props} />; - } else if (ev.isEncrypted()) { - if (this.state.verified) { - return <E2ePadlockVerified {...props} />; - } else { - return <E2ePadlockUnverified {...props} />; - } - } else if (this.props.matrixClient.isRoomEncrypted(ev.getRoomId())) { + } + + // event is encrypted, display padlock corresponding to whether or not it is verified + if (ev.isEncrypted()) { + return this.state.verified ? <E2ePadlockVerified {...props} /> : <E2ePadlockUnverified {...props} />; + } + + if (this.props.matrixClient.isRoomEncrypted(ev.getRoomId())) { // else if room is encrypted // and event is being encrypted or is not_sent (Unknown Devices/Network Error) - if (ev.status === EventStatus.ENCRYPTING || ev.status === EventStatus.NOT_SENT) { - // XXX: if the event is being encrypted (ie eventSendStatus === encrypting), - // it might be nice to show something other than the open padlock? - return <E2ePadlockPending {...props} />; - } else { - // if the event is not encrypted, but it's an e2e room, show the open padlock - return <E2ePadlockUnencrypted {...props} />; + if (ev.status === EventStatus.ENCRYPTING) { + return <E2ePadlockEncrypting {...props} />; } + if (ev.status === EventStatus.NOT_SENT) { + return <E2ePadlockNotSent {...props} />; + } + // if the event is not encrypted, but it's an e2e room, show the open padlock + return <E2ePadlockUnencrypted {...props} />; } // no padlock needed @@ -736,8 +738,12 @@ function E2ePadlockUndecryptable(props) { ); } -function E2ePadlockPending(props) { - return <E2ePadlock alt={_t('Encrypting')} src="img/e2e-pending.svg" width="10" height="12" {...props} />; +function E2ePadlockEncrypting(props) { + return <E2ePadlock alt={_t("Encrypting")} src="img/e2e-encrypting.svg" width="10" height="12" {...props} />; +} + +function E2ePadlockNotSent(props) { + return <E2ePadlock alt={_t("Encrypted, not sent")} src="img/e2e-not_sent.svg" width="10" height="12" {...props} />; } function E2ePadlockVerified(props) { From ac77b2d9ec1106427f0e887f416deb3b7eed04bc Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 16:00:57 +0100 Subject: [PATCH 185/480] run gen-i18n and prune-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/de_DE.json | 3 -- src/i18n/strings/en_EN.json | 64 ++++++++++++++++++----------------- src/i18n/strings/eu.json | 7 ---- src/i18n/strings/fr.json | 8 ----- src/i18n/strings/hu.json | 8 ----- src/i18n/strings/is.json | 1 - src/i18n/strings/it.json | 3 -- src/i18n/strings/ru.json | 4 --- src/i18n/strings/sv.json | 2 -- src/i18n/strings/zh_Hant.json | 3 -- 10 files changed, 33 insertions(+), 70 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index aaf51f0d9e..c3ff855020 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1168,9 +1168,6 @@ "At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.", "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren", "Send analytics data": "Analysedaten senden", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden. (Siehe unsere <PolicyLink>Datenschutzerklärung</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Möchtest du Riot helfen indem du Nutzungsdaten sendest? Dies wird ein Cookie verwenden.", - "Yes please": "Ja, bitte", "e.g. %(exampleValue)s": "z.B. %(exampleValue)s", "Reload widget": "Widget neu laden", "To notify everyone in the room, you must be a": "Notwendiges Berechtigungslevel, um jeden im Raum zu benachrichten:", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f182ecdbad..1a761c2c5c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,6 +42,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -81,6 +85,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -104,7 +109,6 @@ "You need to be logged in.": "You need to be logged in.", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "Unable to create widget.": "Unable to create widget.", - "Reload widget": "Reload widget", "Missing roomId.": "Missing roomId.", "Failed to send request.": "Failed to send request.", "This room is not recognised.": "This room is not recognised.", @@ -180,11 +184,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -298,6 +297,29 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -316,6 +338,8 @@ "Key request sent.": "Key request sent.", "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Re-request encryption keys</requestLink> from your other devices.", "Undecryptable": "Undecryptable", + "Encrypting": "Encrypting", + "Encrypted, not sent": "Encrypted, not sent", "Encrypted by a verified device": "Encrypted by a verified device", "Encrypted by an unverified device": "Encrypted by an unverified device", "Unencrypted message": "Unencrypted message", @@ -394,11 +418,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -531,29 +555,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -664,6 +665,7 @@ "Delete widget": "Delete widget", "Revoke widget access": "Revoke widget access", "Minimize apps": "Minimize apps", + "Reload widget": "Reload widget", "Popout widget": "Popout widget", "Picture": "Picture", "Edit": "Edit", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index ac2187456e..af04f66fa6 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1169,20 +1169,13 @@ "Enable widget screenshots on supported widgets": "Gaitu trepeten pantaila-argazkiak onartzen duten trepetetan", "Send analytics data": "Bidali datu analitikoak", "Muted Users": "Mutututako erabiltzaileak", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du. (Ikusi gure <PolicyLink>Cookie eta pribatutasun politikak</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Riot hobetzen lagundu nahi erabilera datuak bidaliz? Honek cookie bat erabiliko du.", - "Yes please": "Bai mesedez", "Warning: This widget might use cookies.": "Abisua: Trepeta honek cookie-ak erabili litzake.", "Terms and Conditions": "Termino eta baldintzak", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "%(homeserverDomain)s hasiera-zerbitzaria erabiltzen jarraitzeko gure termino eta baldintzak irakurri eta onartu behar dituzu.", "Review terms and conditions": "Irakurri termino eta baldintzak", "Failed to indicate account erasure": "Ezin izan da kontuaren ezabaketa jakinarazi", - "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. <b>This action is irreversible.</b>": "Honek zure kontua betiko erabilgaitz bihurtuko du. Ezin izango duzu saioa hasi, eta beste inork ezin izango du erabiltzaile ID bera erabili. <b>Ez dago ekintza hau desegiterik.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Zure kontua desaktibatzean <b>ez dira lehenetsita zuk bidalitako mezuak ezabatuko.</b> Zuk bidalitako mezuak ezabatu nahi badituzu, markatu beheko kutxa.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Matrix-eko mezuen ikusgaitasuna, e-mail mezuen antzekoa da. Zure mezuak ezabatzeak esan nahi du bidali dituzun mezuak ez direla erabiltzaile berriekin partekatuko, baina aurretik zure mezuak jaso dituzten erabiltzaile erregistratuek bere kopia izango dute.", "To continue, please enter your password:": "Jarraitzeko, sartu zure pasahitza:", "password": "pasahitza", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Ezabatu bidali ditudan mezu guztiak nire kontua desaktibatzean. (Abisua: Etorkizuneko erabiltzaileek elkarrizketa partzialak ikusiko dituzte, esperientzia kaskarra sortuz).", "e.g. %(exampleValue)s": "adib. %(exampleValue)s", "Reload widget": "Birkargatu trepeta", "To notify everyone in the room, you must be a": "Gelan dauden guztiei jakinarazteko", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index c3cfdef5fc..9f276f4699 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1168,25 +1168,17 @@ "Collapse Reply Thread": "Dévoiler le fil de réponse", "Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge", "Send analytics data": "Envoyer les données analytiques", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Aider Riot à s'améliorer en envoyant des données d'utilisation ? Ceci utilisera un cookie.", - "Yes please": "Oui, s'il vous plaît", "Muted Users": "Utilisateurs ignorés", "Warning: This widget might use cookies.": "Avertissement : ce widget utilise peut-être des cookies.", "Terms and Conditions": "Conditions générales", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Pour continuer à utiliser le serveur d'accueil %(homeserverDomain)s, vous devez lire et accepter nos conditions générales.", "Review terms and conditions": "Voir les conditions générales", "Failed to indicate account erasure": "Échec de notification de la suppression du compte", - "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. <b>This action is irreversible.</b>": "Cela rendra votre compte inutilisable de façon permanente. Vous ne pourrez plus vous connecter et ne pourrez plus vous enregistrer avec le même identifiant d'utilisateur. <b>Cette action est irréversible.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "Désactiver votre compte <b>ne supprime pas les messages que vous avez envoyés par défaut.</b> Si vous souhaitez supprimer vos messages, cochez la case ci-dessous.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Supprimer vos messages signifie que les messages que vous avez envoyés ne seront pas partagés avec de nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à vos messages continueront d'en avoir une copie.", "To continue, please enter your password:": "Pour continuer, veuillez renseigner votre mot de passe :", "password": "mot de passe", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Veuillez supprimer tous les messages que j'ai envoyé quand mon compte est désactivé. (Attention : les futurs utilisateurs verront alors des conversations incomplètes, ce qui est une mauvaise expérience).", "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. <b>This action is irreversible.</b>": "Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous reconnecter et personne ne pourra se réenregistrer avec le même identifiant d'utilisateur. Votre compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d'identité. <b>Cette action est irréversible.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "La désactivation du compte <b>ne nous fait pas oublier les messages que vous avez envoyés par défaut.</b> Si vous souhaitez que nous les oubliions, cochez la case ci-dessous.", "e.g. %(exampleValue)s": "par ex. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aider Riot à s'améliorer en envoyant <UsageDataLink>des données d'utilisation</UsageDataLink> ? Cela utilisera un cookie. (Voir nos <PolicyLink>politiques de cookie et de confidentialité</PolicyLink>).", "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.": "La visibilité des messages dans Matrix est la même que celle des e-mails. Quand nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront partagés avec aucun nouvel utilisateur ou avec les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà eu accès à ces messages en conserveront leur propre copie.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Veuillez oublier tous les messages que j'ai envoyé quand mon compte sera désactivé (<b>Avertissement :</b> les futurs utilisateurs verront des conversations incomplètes)", "Reload widget": "Recharger le widget", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index aa1904d0bf..0be5087d55 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1168,27 +1168,19 @@ "Collapse Reply Thread": "Beszélgetés szál becsukása", "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése", "Send analytics data": "Analitikai adatok küldése", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ. (Nézd meg a <PolicyLink>sütikről és titoktartási irányelvekről</PolicyLink> szóló leírást).", - "Help improve Riot by sending usage data? This will use a cookie.": "Szeretnél segíteni a Riot javításában analitikai adatok elküldésével? Ez sütit (cookie) használ.", - "Yes please": "Igen, kérlek", "Muted Users": "Elnémított felhasználók", "Warning: This widget might use cookies.": "Figyelmeztetés: Ez a kisalkalmazás sütiket (cookies) használhat.", "Terms and Conditions": "Általános Szerződési Feltételek", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.", "Review terms and conditions": "Általános Szerződési Feltételek elolvasása", "Failed to indicate account erasure": "A fiók törlésének jelzése sikertelen", - "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. <b>This action is irreversible.</b>": "Ezzel a felhasználói fiókod végleg használhatatlanná válik. Nem tudsz bejelentkezni, és senki más sem fog tudni újra regisztrálni ugyanezzel az azonosítóval. <b>Ez a művelet visszafordíthatatlan.</b>", - "Deactivating your account <b>does not by default erase messages you have sent.</b> If you would like to erase your messages, please tick the box below.": "A felhasználói fiók felfüggesztése <b>alapértelmezetten nem töröli semelyik általad küldött üzenetet.</b> Ha az elküldött üzeneteidet törölni szeretnéd pipáld be a jelölőnégyzetet alul.", - "Message visibility in Matrix is similar to email. Erasing your messages means that messages have you sent will not be shared with any new or unregistered users, but registered users who already had access to these messages will still have access to their copy.": "Az üzenetek láthatósága a Matrixban olyan mint az e-mail. Az üzeneted törlése azt jelenti, hogy amit elküldtél már nem lesz megosztva új- vagy vendég felhasználóval, de azok a regisztrált felhasználók akik már látták az üzenetet továbbra is hozzáférnek a saját példányukhoz.", "To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:", "password": "jelszó", - "Please erase all messages I have sent when my account is deactivated. (Warning: this will cause future users to see an incomplete view of conversations, which is a bad experience).": "Töröld az összes üzenetet amit küldtem amikor felfüggeszted a felhasználói fiókomat. (Figyelem: ezzel a jövőbeni felhasználók csak részleges beszélgetést láthatnak majd, ami rosszul eshet).", "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. <b>This action is irreversible.</b>": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az \"identity\" szerverről. <b>Ez a művelet visszafordíthatatlan.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "A fiókod felfüggesztése <b>nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek.</b> Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.", "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.": "Az üzenetek láthatósága a Matrixban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.", "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)", "e.g. %(exampleValue)s": "pl. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Segítesz jobbá tenni a Riotot <UsageDataLink>használati adat</UsageDataLink> küldésével? Ez sütit (cookie) fog használni. (Nézd meg az <PolicyLink>Általános Szerződési Feltételeket</PolicyLink>).", "Reload widget": "Kisalkalmazás újratöltése", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Kérlek segíts javítani a Riot.im-et azzal, hogy <UsageDataLink>anonim felhasználási adatokat</UsageDataLink> küldesz. Ez szütit (cookie) fog használni (lásd a <PolicyLink>sütire vonatkozó szabályozásunkat</PolicyLink>).", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Kérlek segíts javítani a Riot.im-et azzal, hogy <UsageDataLink>anonim felhasználási adatokat</UsageDataLink> küldesz. Ez szütit (cookie) fog használni.", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index d901c52f60..234def7dba 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -628,7 +628,6 @@ "No Microphones detected": "Engir hljóðnemar fundust", "No Webcams detected": "Engar vefmyndavélar fundust", "Homeserver is": "Heimanetþjónn er", - "Login as guest": "Skrá inn sem gestur", "Sign in to get started": "Skráðu þig inn til að komast í gang", "Failed to fetch avatar URL": "Ekki tókst að sækja slóð á auðkennismynd", "Set a display name:": "Stilltu birtingarnafn:", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 884dac4269..61c80b6789 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1158,9 +1158,6 @@ "Refresh": "Aggiorna", "We encountered an error trying to restore your previous session.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente.", "Send analytics data": "Invia dati statistici", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie. (Vedi la nostra <PolicyLink>politica sui cookie e sulla privacy</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Aiutare a migliorare Riot inviando statistiche d'uso? Verrà usato un cookie.", - "Yes please": "Sì grazie", "Clear Storage and Sign Out": "Elimina lo storage e disconnetti", "Send Logs": "Invia i log", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Eliminare lo storage del browser potrebbe risolvere il problema, ma verrai disconnesso e la cronologia delle chat criptate sarà illeggibile.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index a7e590c7ed..55840f752e 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1166,16 +1166,12 @@ "Enable widget screenshots on supported widgets": "Включить скриншоты виджета в поддерживаемых виджетах", "Collapse Reply Thread": "Ответить с цитированием", "Send analytics data": "Отправить данные аналитики", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie. (См. наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", - "Help improve Riot by sending usage data? This will use a cookie.": "Помогите улучшить Riot, отправляя данные об использовании? Будут использоваться файлы cookie.", - "Yes please": "Да, пожалуйста", "Muted Users": "Приглушенные пользователи", "Warning: This widget might use cookies.": "Внимание: этот виджет может использовать cookie.", "Terms and Conditions": "Условия и положения", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Для продолжения использования сервера %(homeserverDomain)s вы должны ознакомиться и принять условия и положения.", "Review terms and conditions": "Просмотр условий и положений", "e.g. %(exampleValue)s": "напр. %(exampleValue)s", - "Help improve Riot by sending <UsageDataLink>usage data</UsageDataLink>? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "Помогите улучшить Riot, отправляя <UsageDataLink>данные использования</UsageDataLink>? Будут использоваться файлы cookie. (Смотрите наши <PolicyLink>политики cookie и конфиденциальности</PolicyLink>).", "Failed to indicate account erasure": "Не удается удалить учетную запись", "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. <b>This action is irreversible.</b>": "Это навсегда сделает вашу учетную запись невозможной для использования. Вы не сможете войти в систему, и никто не сможет перерегистрировать тот же идентификатор пользователя. Это приведет к тому, что ваша учетная запись выйдет из всех комнат, в которые она входит, и будут удалены данные вашей учетной записи с сервера идентификации. <b>Это действие необратимо.</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "По умолчанию деактивация вашей учетной записи <b>не приведет к удалению всех ваших сообщений.</b> Если вы хотите, чтобы мы удалили ваши сообщения, поставьте отметку в поле ниже.", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 5e27d5713d..9dcc74d790 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -900,8 +900,6 @@ "This setting cannot be changed later!": "Den här inställningen kan inte ändras senare!", "Unknown error": "Okänt fel", "Incorrect password": "Felaktigt lösenord", - "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Detta kommer att göra ditt konto permanent oanvändbart. Du kommer inte att kunna registrera samma användar-ID igen.", - "This action is irreversible.": "Denna åtgärd går inte att ångra.", "To verify that this device 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 device matches the key below:": "För att verifiera att denna enhet kan litas på, vänligen kontakta ägaren på annat sätt (t ex personligen eller med ett telefonsamtal) och fråga om nyckeln ägaren har i sina användarinställningar för enheten matchar nyckeln nedan:", "Device name": "Enhetsnamn", "Device key": "Enhetsnyckel", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index e8217e0277..88cc5b6ad2 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1169,9 +1169,6 @@ "Enable widget screenshots on supported widgets": "在支援的小工具上啟用小工具螢幕快照", "Send analytics data": "傳送分析資料", "Muted Users": "已靜音的使用者", - "Help improve Riot by sending usage data? This will use a cookie. (See our <PolicyLink>cookie and privacy policies</PolicyLink>).": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。(參見我們的 <PolicyLink>cookie 與隱私政策</PolicyLink>)。", - "Help improve Riot by sending usage data? This will use a cookie.": "透過傳送使用情形資料來協助改善 Riot?這會使用 cookie。", - "Yes please": "好的,請", "e.g. %(exampleValue)s": "範例:%(exampleValue)s", "Reload widget": "重新載入小工具", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "請透過傳送<UsageDataLink>匿名使用資料</UsageDataLink>來協助改善 Riot.im。這將會使用 cookie(請參見我們的 <PolicyLink>Cookie 政策</PolicyLink>)。", From 75abb415d437d337382dc57717277fae67f57580 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 16:17:26 +0100 Subject: [PATCH 186/480] improve tag panel accessibility and remove a no-op dispatch Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/TagPanel.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 0b6dc9fc75..77259c863d 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -84,7 +84,10 @@ const TagPanel = React.createClass({ }, onMouseDown(e) { - dis.dispatch({action: 'deselect_tags'}); + // only dispatch if its not a no-op + if (this.state.selectedTags.length > 0) { + dis.dispatch({action: 'deselect_tags'}); + } }, onCreateGroupClick(ev) { @@ -113,17 +116,18 @@ const TagPanel = React.createClass({ />; }); - const clearButton = this.state.selectedTags.length > 0 ? - <TintableSvg src="img/icons-close.svg" width="24" height="24" - alt={_t("Clear filter")} - title={_t("Clear filter")} - /> : - <div />; + let clearButton; + if (this.state.selectedTags.length > 0) { + clearButton = <AccessibleButton className="mx_TagPanel_clearButton" onClick={this.onClearFilterClick}> + <TintableSvg src="img/icons-close.svg" width="24" height="24" + alt={_t("Clear filter")} + title={_t("Clear filter")} + /> + </AccessibleButton>; + } return <div className="mx_TagPanel"> - <AccessibleButton className="mx_TagPanel_clearButton" onClick={this.onClearFilterClick}> - { clearButton } - </AccessibleButton> + { clearButton } <div className="mx_TagPanel_divider" /> <GeminiScrollbarWrapper className="mx_TagPanel_scroller" From b81e12e4ccf098a04df9876eb8db02357cc0bf96 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 13 Jun 2018 16:55:16 +0100 Subject: [PATCH 187/480] Fix exception when opening dev tools Apparently draft sometimes gets unhappy when you try to move to the end of an empty state, so only move to the end if we actually created a non-empty state. This will be irrelevant once https://github.com/matrix-org/matrix-react-sdk/pull/1890 is merged, but I have the fix now, and this is probably otherwise going to annoy me now I'm doing things where devtools is very useful. Fixes https://github.com/vector-im/riot-web/issues/6436 --- src/components/views/rooms/MessageComposerInput.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 97e8780f0f..66bae869ff 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -244,12 +244,14 @@ export default class MessageComposerInput extends React.Component { let editorState = null; if (contentState) { - editorState = EditorState.createWithContent(contentState, compositeDecorator); + editorState = EditorState.moveFocusToEnd( + EditorState.createWithContent(contentState, compositeDecorator) + ); } else { editorState = EditorState.createEmpty(compositeDecorator); } - return EditorState.moveFocusToEnd(editorState); + return editorState; } componentDidMount() { From 77708d5b659f498e3b4279014c887f1f4bdbe04f Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Wed, 13 Jun 2018 09:20:33 +0000 Subject: [PATCH 188/480] Translated using Weblate (Basque) Currently translated at 100.0% (1190 of 1190 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 1be59bdbd5..caeca8daf9 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -586,7 +586,7 @@ "Please enter the code it contains:": "Sartu dakarren kodea:", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ez baduzu e-mail helbide bat zehazten, ezin izango duzu zure pasahitza berrezarri. Ziur zaude?", "You are registering with %(SelectedTeamName)s": "%(SelectedTeamName)s erabiliz erregistratzen ari zara", - "Default server": "Zerbitzari lenetetsia", + "Default server": "Zerbitzari lehenetsia", "Custom server": "Zerbitzari aukeratua", "Home server URL": "Hasiera zerbitzariaren URLa", "Identity server URL": "Identitate zerbitzariaren URLa", From d4578783ef3b3ae6a788b2059f57d4b23381fea2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 18:46:02 +0100 Subject: [PATCH 189/480] apply pr review feedback fix copyright headers fix user settings link accessibility fix typo and add noopener Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/ContextualMenu.js | 2 +- src/components/structures/UserSettings.js | 4 ++-- src/components/views/dialogs/ShareDialog.js | 9 +++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index d6a11ca974..12603c1b45 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -1,6 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd -Copyright 2018 Vector Creations Ltd +Copyright 2018 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. diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 8511010ed6..25ca70056b 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -1304,9 +1304,9 @@ module.exports = React.createClass({ <div className="mx_UserSettings_section"> <div className="mx_UserSettings_advanced"> { _t("Logged in as:") + ' ' } - <span onClick={this.onSelfShareClick} className="mx_UserSettings_link"> + <a onClick={this.onSelfShareClick} className="mx_UserSettings_link"> { this._me } - </span> + </a> </div> <div className="mx_UserSettings_advanced"> { _t('Access Token:') + ' ' } diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index a88052ee6d..e68922d35a 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -1,5 +1,5 @@ /* -Copyright 2018 Vector Creations Ltd +Copyright 2018 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. @@ -37,7 +37,7 @@ const socials = [ img: 'img/social/', url: (url) => `https://plus.google.com/share?url=${url}`, },*/ { - name: 'Linked In', + name: 'LinkedIn', img: 'img/social/linkedin.png', url: (url) => `https://www.linkedin.com/shareArticle?mini=true&url=${url}`, }, { @@ -193,13 +193,14 @@ export default class ShareDialog extends React.Component { <h3>Social</h3> <div className="mx_ShareDialog_social_container"> { - socials.map((social) => <a target="_blank" + socials.map((social) => <a rel="noopener" + target="_blank" key={social.name} name={social.name} href={social.url(encodedUrl)} className="mx_ShareDialog_social_icon" > - <img src={social.img} height={64} width={64} /> + <img src={social.img} alt={social.name} height={64} width={64} /> </a>) } </div> From a257dc27c5c7af9ad4af3847ea1b91d49db5ae3c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 13 Jun 2018 19:08:24 +0100 Subject: [PATCH 190/480] move css rule to be more generic; remove overriden rule Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/messages/_MTextBody.scss | 5 ----- res/css/views/rooms/_EventTile.scss | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/res/css/views/messages/_MTextBody.scss b/res/css/views/messages/_MTextBody.scss index fcf397fd2d..93a89ad1b7 100644 --- a/res/css/views/messages/_MTextBody.scss +++ b/res/css/views/messages/_MTextBody.scss @@ -17,8 +17,3 @@ limitations under the License. .mx_MTextBody { white-space: pre-wrap; } - -.mx_MTextBody pre{ - overflow-y: auto; - max-height: 30vh; -} diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index ce2bf9c8a4..80d2cd3418 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -391,6 +391,7 @@ limitations under the License. .mx_EventTile_content .markdown-body pre { overflow-x: overlay; overflow-y: visible; + max-height: 30vh; } .mx_EventTile_content .markdown-body code { From 3c4d62ddf85924777b7b883f5c71096b83fef5c1 Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Sun, 27 May 2018 19:14:49 +0000 Subject: [PATCH 191/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1190 of 1190 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 aa1904d0bf..ce0e859a22 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1195,5 +1195,6 @@ "Yes, I want to help!": "Igen, segítek!", "Can't leave Server Notices room": "Nem lehet elhagyni a Szerver Üzenetek szobát", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba fontos szerverüzenetek közlésére jött létre, nem tudsz kilépni belőle.", - "To notify everyone in the room, you must be a": "Hogy mindenkinek tudj üzenni ahhoz ilyen szinten kell lenned:" + "To notify everyone in the room, you must be a": "Hogy mindenkinek tudj üzenni ahhoz ilyen szinten kell lenned:", + "Try the app first": "Először próbáld ki az alkalmazást" } From 5dced2f699777fad937115fc0e072c0d1c27fdfb Mon Sep 17 00:00:00 2001 From: Sotiris Papatheodorou <sotirisp@protonmail.com> Date: Wed, 13 Jun 2018 22:21:32 +0000 Subject: [PATCH 192/480] Translated using Weblate (Greek) Currently translated at 71.8% (855 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/el/ --- src/i18n/strings/el.json | 88 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 929ca5e7df..1b22679520 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -107,7 +107,7 @@ "Failed to reject invitation": "Δεν ήταν δυνατή η απόρριψη της πρόσκλησης", "Failed to save settings": "Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων", "Failed to send email": "Δεν ήταν δυνατή η αποστολή ηλ. αλληλογραφίας", - "Failed to verify email address: make sure you clicked the link in the email": "Δεν ήταν δυνατή η επιβεβαίωση του μηνύματος ηλεκτρονικής αλληλογραφίας βεβαιωθείτε οτι κάνατε κλικ στον σύνδεσμο που σας στάλθηκε", + "Failed to verify email address: make sure you clicked the link in the email": "Δεν ήταν δυνατή η επιβεβαίωση της διεύθυνσης ηλεκτρονικής αλληλογραφίας: βεβαιωθείτε οτι κάνατε κλικ στον σύνδεσμο που σας στάλθηκε", "Favourite": "Αγαπημένο", "Favourites": "Αγαπημένα", "Fill screen": "Γέμισε την οθόνη", @@ -264,7 +264,7 @@ "Room %(roomId)s not visible": "Το δωμάτιο %(roomId)s δεν είναι ορατό", "%(roomName)s does not exist.": "Το %(roomName)s δεν υπάρχει.", "Searches DuckDuckGo for results": "Γίνεται αναζήτηση στο DuckDuckGo για αποτελέσματα", - "Seen by %(userName)s at %(dateTime)s": "Διαβάστηκε από %(userName)s στις %(dateTime)s", + "Seen by %(userName)s at %(dateTime)s": "Διαβάστηκε από τον/την %(userName)s στις %(dateTime)s", "Send anyway": "Αποστολή ούτως ή άλλως", "Send Invites": "Αποστολή προσκλήσεων", "Send Reset Email": "Αποστολή μηνύματος επαναφοράς", @@ -465,7 +465,7 @@ "%(senderName)s removed their profile picture.": "Ο %(senderName)s αφαίρεσε τη φωτογραφία του προφίλ του.", "%(senderName)s requested a VoIP conference.": "Ο %(senderName)s αιτήθηκε μια συνδιάσκεψη VoIP.", "Riot does not have permission to send you notifications - please check your browser settings": "Το Riot δεν έχει δικαιώματα για αποστολή ειδοποιήσεων - παρακαλούμε ελέγξτε τις ρυθμίσεις του περιηγητή σας", - "Riot was not given permission to send notifications - please try again": "Δεν δόθηκαν δικαιώματα στο Riot να αποστείλει ειδοποιήσεις - παρακαλούμε προσπαθήστε ξανά", + "Riot was not given permission to send notifications - please try again": "Δεν δόθηκαν δικαιώματα αποστολής ειδοποιήσεων στο Riot - παρακαλούμε προσπαθήστε ξανά", "Room contains unknown devices": "Το δωμάτιο περιέχει άγνωστες συσκευές", "%(roomName)s is not accessible at this time.": "Το %(roomName)s δεν είναι προσβάσιμο αυτή τη στιγμή.", "Scroll to bottom of page": "Μετάβαση στο τέλος της σελίδας", @@ -773,5 +773,85 @@ "e.g. <CurrentPageURL>": "π.χ. <CurrentPageURL>", "Your device resolution": "Η ανάλυση της συσκευής σας", "The information being sent to us to help make Riot.im better includes:": "Οι πληροφορίες που στέλνονται σε εμάς με σκοπό την βελτίωση του Riot.im περιλαμβάνουν:", - "Call Failed": "Η κλήση απέτυχε" + "Call Failed": "Η κλήση απέτυχε", + "Whether or not you're logged in (we don't record your user name)": "Εάν είστε συνδεδεμένος/η ή όχι (δεν καταγράφουμε το όνομα χρήστη σας)", + "e.g. %(exampleValue)s": "π.χ. %(exampleValue)s", + "Review Devices": "Ανασκόπηση συσκευών", + "Call Anyway": "Κλήση όπως και να 'χει", + "Answer Anyway": "Απάντηση όπως και να 'χει", + "Call": "Κλήση", + "Answer": "Απάντηση", + "AM": "ΠΜ", + "PM": "ΜΜ", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", + "Who would you like to add to this community?": "Ποιον/α θα θέλατε να προσθέσετε σε αυτή την κοινότητα;", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Προσοχή: κάθε άτομο που προσθέτετε στην κοινότητα θε είναι δημοσίως ορατό σε οποιονδήποτε γνωρίζει το αναγνωριστικό της κοινότητας", + "Invite new community members": "Προσκαλέστε νέα μέλη στην κοινότητα", + "Name or matrix ID": "Όνομα ή αναγνωριστικό του matrix", + "Invite to Community": "Πρόσκληση στην κοινότητα", + "Which rooms would you like to add to this community?": "Ποια δωμάτια θα θέλατε να προσθέσετε σε αυτή την κοινότητα;", + "Add rooms to the community": "Προσθήκη δωματίων στην κοινότητα", + "Add to community": "Προσθήκη στην κοινότητα", + "Failed to invite the following users to %(groupId)s:": "Αποτυχία πρόσκλησης των ακόλουθων χρηστών στο %(groupId)s :", + "Failed to invite users to community": "Αποτυχία πρόσκλησης χρηστών στην κοινότητα", + "Failed to invite users to %(groupId)s": "Αποτυχία πρόσκλησης χρηστών στο %(groupId)s", + "Failed to add the following rooms to %(groupId)s:": "Αποτυχία προσθήκης των ακόλουθων δωματίων στο %(groupId)s:", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Υπάρχουν άγνωστες συσκευές στο δωμάτιο: εάν συνεχίσετε χωρίς να τις επιβεβαιώσετε, θα μπορούσε κάποιος να κρυφακούει την κλήση σας.", + "Show these rooms to non-members on the community page and room list?": "Εμφάνιση αυτών των δωματίων σε μη-μέλη στην σελίδα της κοινότητας και στη λίστα δωματίων;", + "Room name or alias": "Όνομα η ψευδώνυμο δωματίου", + "Restricted": "Περιορισμένο", + "Unable to create widget.": "Αδυναμία δημιουργίας widget.", + "Reload widget": "Ανανέωση widget", + "You are not in this room.": "Δεν είστε μέλος αυτού του δωματίου.", + "You do not have permission to do that in this room.": "Δεν έχετε την άδεια να το κάνετε αυτό σε αυτό το δωμάτιο.", + "You are now ignoring %(userId)s": "Τώρα αγνοείτε τον/την %(userId)s", + "You are no longer ignoring %(userId)s": "Δεν αγνοείτε πια τον/την %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "Ο/Η %(oldDisplayName)s άλλαξε το εμφανιζόμενο όνομά του/της σε %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "Ο/Η %(senderName)s άλλαξε τα καρφιτσωμένα μηνύματα του δωματίου.", + "%(widgetName)s widget modified by %(senderName)s": "Έγινε αλλαγή στο widget %(widgetName)s από τον/την %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "Προστέθηκε το widget %(widgetName)s από τον/την %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Το widget %(widgetName)s αφαιρέθηκε από τον/την %(senderName)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 και άλλος ένας πληκτρολογούν", + "Message Replies": "Απαντήσεις", + "Message Pinning": "Καρφίτσωμα Μηνυμάτων", + "Hide avatar changes": "Απόκρυψη αλλαγών εικονιδίων χρηστών", + "Hide display name changes": "Απόκρυψη αλλαγών εμφανιζόμενων ονομάτων", + "Hide avatars in user and room mentions": "Απόκρυψη εικονιδίων στις αναφορές χρηστών και δωματίων", + "Enable URL previews for this room (only affects you)": "Ενεργοποίηση προεπισκόπισης URL για αυτό το δωμάτιο (επηρεάζει μόνο εσάς)", + "Delete %(count)s devices|other": "Διαγραφή %(count)s συσκευών", + "Delete %(count)s devices|one": "Διαγραφή συσκευής", + "Select devices": "Επιλογή συσκευών", + "Cannot add any more widgets": "Δεν είναι δυνατή η προσθήκη άλλων widget", + "The maximum permitted number of widgets have already been added to this room.": "Ο μέγιστος επιτρεπτός αριθμός widget έχει ήδη προστεθεί σε αυτό το δωμάτιο.", + "Add a widget": "Προσθήκη widget", + "%(senderName)s sent an image": "Ο/Η %(senderName)s έστειλε μία εικόνα", + "%(senderName)s sent a video": "Ο/Η %(senderName)s έστειλε ένα βίντεο", + "%(senderName)s uploaded a file": "Ο/Η %(senderName)s αναφόρτωσε ένα αρχείο", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Εάν οι άλλες συσκευές σας δεν έχουν το κλειδί για αυτό το μήνυμα, τότε δεν θα μπορείτε να το αποκρυπτογραφήσετε.", + "Disinvite this user?": "Ακύρωση πρόσκλησης αυτού του χρήστη;", + "Mention": "Αναφορά", + "Invite": "Πρόσκληση", + "User Options": "Επιλογές Χρήστη", + "Send an encrypted reply…": "Αποστολή κρυπτογραφημένης απάντησης…", + "Send a reply (unencrypted)…": "Αποστολή απάντησης (μη κρυπτογραφημένης)…", + "Send an encrypted message…": "Αποστολή κρυπτογραφημένου μηνύματος…", + "Send a message (unencrypted)…": "Αποστολή μηνύματος (μη κρυπτογραφημένου)…", + "Unable to reply": "Αδυναμία απάντησης", + "Unpin Message": "Ξεκαρφίτσωμα μηνύματος", + "Jump to message": "Πηγαίντε στο μήνυμα", + "No pinned messages.": "Κανένα καρφιτσωμένο μήνυμα.", + "Loading...": "Φόρτωση...", + "Pinned Messages": "Καρφιτσωμένα Μηνύματα", + "%(duration)ss": "%(duration)sδ", + "%(duration)sm": "%(duration)sλ", + "%(duration)sh": "%(duration)sω", + "%(duration)sd": "%(duration)sμ", + "Online for %(duration)s": "Σε σύνδεση για %(duration)s", + "Idle for %(duration)s": "Αδρανής για %(duration)s", + "Offline for %(duration)s": "Εκτός σύνδεσης για %(duration)s", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Διαβάστηκε από τον/την %(displayName)s (%(userName)s) στις %(dateTime)s", + "Room Notification": "Ειδοποίηση Δωματίου", + "Notify the whole room": "Ειδοποιήστε όλο το δωμάτιο", + "Sets the room topic": "Ορίζει το θέμα του δωματίου" } From 05e1dd55f0890eb11d354e2e35cefa75402b3ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=BE=20=D0=9C=2E=20=D0=9A=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=9B?= <marko.m.kostic@gmail.com> Date: Wed, 13 Jun 2018 17:55:34 +0000 Subject: [PATCH 193/480] Translated using Weblate (Serbian) Currently translated at 99.6% (1186 of 1190 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sr/ --- src/i18n/strings/sr.json | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index e73107376b..b2eee28b37 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -1160,5 +1160,29 @@ "Clear Storage and Sign Out": "Очисти складиште и одјави ме", "Refresh": "Освежи", "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.": "Чишћење складишта вашег прегледача може решити проблем али ће вас то одјавити и учинити шифровани историјат ћаскања нечитљивим." + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Чишћење складишта вашег прегледача може решити проблем али ће вас то одјавити и учинити шифровани историјат ћаскања нечитљивим.", + "e.g. %(exampleValue)s": "нпр.: %(exampleValue)s", + "Reload widget": "Поново учитај виџет", + "Send analytics data": "Пошаљи аналитичке податке", + "Enable widget screenshots on supported widgets": "Омогући снимке екрана виџета у подржаним виџетима", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "У овом тренутку није могуће одговорити са датотеком тако да ово неће бити послато у облику одговора.", + "Unable to reply": "Не могу да одговорим", + "At this time it is not possible to reply with an emote.": "У овом тренутку није могуће одговорити са емотиконом.", + "To notify everyone in the room, you must be a": "Да бисте обавестили све у соби, морате бити", + "Muted Users": "Утишани корисници", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Помозите побољшавање Riot.im програма тако што ћете послати <UsageDataLink>анонимне податке о коришћењу</UsageDataLink>. Ово ће захтевати коришћење колачића (погледајте нашу <PolicyLink>политику о колачићима</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Помозите побољшавање Riot.im програма тако што ћете послати <UsageDataLink>анонимне податке о коришћењу</UsageDataLink>. Ово ће захтевати коришћење колачића.", + "Yes, I want to help!": "Да, желим помоћи!", + "Warning: This widget might use cookies.": "Упозорење: овај виџет ће можда користити колачиће.", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не могу да учитам догађај на који је послат одговор, или не постоји или немате овлашћење да га погледате.", + "Failed to indicate account erasure": "Неуспех при наговештавању да је налог обрисан", + "To continue, please enter your password:": "Да бисте наставили, унесите вашу лозинку:", + "password": "лозинка", + "Collapse Reply Thread": "Скупи нит са одговорима", + "Can't leave Server Notices room": "Не могу да напустим собу са напоменама сервера", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ова соба се користи за важне поруке са Кућног сервера, не можете изаћи из ове собе.", + "Terms and Conditions": "Услови коришћења", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Да бисте наставили са коришћењем Кућног сервера %(homeserverDomain)s морате погледати и пристати на наше услове коришћења.", + "Review terms and conditions": "Погледај услове коришћења", + "Try the app first": "Пробајте прво апликацију" } From 666d46922266974004f8662ca654c932e865b58c Mon Sep 17 00:00:00 2001 From: David Baker <dbkr@users.noreply.github.com> Date: Thu, 14 Jun 2018 10:52:39 +0100 Subject: [PATCH 194/480] Revert "Fix exception when opening dev tools" --- src/components/views/rooms/MessageComposerInput.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 66bae869ff..97e8780f0f 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -244,14 +244,12 @@ export default class MessageComposerInput extends React.Component { let editorState = null; if (contentState) { - editorState = EditorState.moveFocusToEnd( - EditorState.createWithContent(contentState, compositeDecorator) - ); + editorState = EditorState.createWithContent(contentState, compositeDecorator); } else { editorState = EditorState.createEmpty(compositeDecorator); } - return editorState; + return EditorState.moveFocusToEnd(editorState); } componentDidMount() { From ebee8a8b5d3d801235a6a75b3ec1e17f7ff8545c Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Thu, 14 Jun 2018 09:58:17 +0000 Subject: [PATCH 195/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1192 of 1192 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index f878ca7b7d..d0b204bed6 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1188,5 +1188,7 @@ "Can't leave Server Notices room": "Nem lehet elhagyni a Szerver Üzenetek szobát", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba fontos szerverüzenetek közlésére jött létre, nem tudsz kilépni belőle.", "To notify everyone in the room, you must be a": "Hogy mindenkinek tudj üzenni ahhoz ilyen szinten kell lenned:", - "Try the app first": "Először próbáld ki az alkalmazást" + "Try the app first": "Először próbáld ki az alkalmazást", + "Encrypting": "Titkosít", + "Encrypted, not sent": "Titkosítva, de nincs elküldve" } From f6d75f865464d864fe5f31e2363711eae3391b13 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Thu, 14 Jun 2018 10:04:20 +0000 Subject: [PATCH 196/480] Translated using Weblate (Russian) Currently translated at 99.8% (1190 of 1192 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, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 859b1f2b3c..794a36e91f 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1186,5 +1186,7 @@ "To notify everyone in the room, you must be a": "Для уведомления всех в комнате, вы должны быть", "Can't leave Server Notices room": "Невозможно покинуть комнату сервера уведомлений", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Эта комната используется для важных сообщений от сервера, поэтому вы не можете ее покинуть.", - "Try the app first": "Сначала попробуйте приложение" + "Try the app first": "Сначала попробуйте приложение", + "Encrypting": "Шифрование", + "Encrypted, not sent": "Зашифровано, не отправлено" } From 384c9745896fa79311a3e4be474eb200d64656f9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 11:16:57 +0100 Subject: [PATCH 197/480] tidy up if statements and fix up comments Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 17daa8553b..33ff17caa4 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -106,15 +106,10 @@ var RoomSubList = React.createClass({ applySearchFilter: function(list, filter) { if (filter === "") return list; const lcFilter = filter.toLowerCase(); - return list.filter((room) => { - if (room.name && room.name.toLowerCase().includes(lcFilter)) return true; - // only apply search filter to aliases if it looks like an alias (starts with `#`) - // to prevent loads of false positives with server names, e.g `matrix` - if (filter[0] === '#' && room.getAliases().some((alias) => { - return alias.toLowerCase().startsWith(lcFilter); - })) return true; - return false; - }); + // case insensitive if room name includes filter, + // or if starts with `#` and one of room's aliases starts with filter + return list.filter((room) => (room.name && room.name.toLowerCase().includes(lcFilter)) || + (filter[0] === '#' && room.getAliases().some((alias) => alias.toLowerCase().startsWith(lcFilter)))); }, // The header is collapsable if it is hidden or not stuck From c811c30c0dd525aafa91409a19c3d3982535f200 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 11:36:04 +0100 Subject: [PATCH 198/480] fix styling of clearButton when its not there Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/_TagPanel.scss | 2 +- src/components/structures/TagPanel.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index ab1d4feac3..a76c04805d 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -25,7 +25,7 @@ limitations under the License. justify-content: space-between; } -.mx_TagPanel .mx_TagPanel_clearButton { +.mx_TagPanel .mx_TagPanel_clearButton_container { /* Constant height within flex mx_TagPanel */ height: 70px; width: 60px; diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 77259c863d..6b6b09c5dc 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -127,7 +127,9 @@ const TagPanel = React.createClass({ } return <div className="mx_TagPanel"> - { clearButton } + <div className="mx_TagPanel_clearButton_container"> + { clearButton } + </div> <div className="mx_TagPanel_divider" /> <GeminiScrollbarWrapper className="mx_TagPanel_scroller" From 3b501137a58f5f08a5c3e08c0249a114d7a87026 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 11:42:21 +0100 Subject: [PATCH 199/480] change cursor:pointer iff clicking TagPanel background does something Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/_TagPanel.scss | 5 ++++- src/components/structures/TagPanel.js | 13 ++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index a76c04805d..415aafd924 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -17,7 +17,6 @@ limitations under the License. .mx_TagPanel { flex: 0 0 60px; background-color: $tertiary-accent-color; - cursor: pointer; display: flex; flex-direction: column; @@ -25,6 +24,10 @@ limitations under the License. justify-content: space-between; } +.mx_TagPanel_items_selected { + cursor: pointer; +} + .mx_TagPanel .mx_TagPanel_clearButton_container { /* Constant height within flex mx_TagPanel */ height: 70px; diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 6b6b09c5dc..652211595b 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -1,5 +1,5 @@ /* -Copyright 2017 New Vector Ltd. +Copyright 2017, 2018 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. @@ -26,6 +26,7 @@ import dis from '../../dispatcher'; import { _t } from '../../languageHandler'; import { Droppable } from 'react-beautiful-dnd'; +import classNames from 'classnames'; const TagPanel = React.createClass({ displayName: 'TagPanel', @@ -116,8 +117,10 @@ const TagPanel = React.createClass({ />; }); + const itemsSelected = this.state.selectedTags.length > 0; + let clearButton; - if (this.state.selectedTags.length > 0) { + if (itemsSelected) { clearButton = <AccessibleButton className="mx_TagPanel_clearButton" onClick={this.onClearFilterClick}> <TintableSvg src="img/icons-close.svg" width="24" height="24" alt={_t("Clear filter")} @@ -126,7 +129,11 @@ const TagPanel = React.createClass({ </AccessibleButton>; } - return <div className="mx_TagPanel"> + const classes = classNames('mx_TagPanel', { + mx_TagPanel_items_selected: itemsSelected, + }); + + return <div className={classes}> <div className="mx_TagPanel_clearButton_container"> { clearButton } </div> From 68e2ee4e51784a7de27bd9765b47b95262b66bb8 Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Thu, 14 Jun 2018 10:45:23 +0000 Subject: [PATCH 200/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1194 of 1194 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index d0b204bed6..427d6b89ea 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1190,5 +1190,7 @@ "To notify everyone in the room, you must be a": "Hogy mindenkinek tudj üzenni ahhoz ilyen szinten kell lenned:", "Try the app first": "Először próbáld ki az alkalmazást", "Encrypting": "Titkosít", - "Encrypted, not sent": "Titkosítva, de nincs elküldve" + "Encrypted, not sent": "Titkosítva, de nincs elküldve", + "No Audio Outputs detected": "Nem található hang kimenet", + "Audio Output": "Hang kimenet" } From 63e9c0aa1e02d066544e52691f5280570349e0b3 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Thu, 14 Jun 2018 10:21:15 +0000 Subject: [PATCH 201/480] Translated using Weblate (Russian) Currently translated at 99.8% (1192 of 1194 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, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 794a36e91f..9853c8a173 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1188,5 +1188,7 @@ "This room is used for important messages from the Homeserver, so you cannot leave it.": "Эта комната используется для важных сообщений от сервера, поэтому вы не можете ее покинуть.", "Try the app first": "Сначала попробуйте приложение", "Encrypting": "Шифрование", - "Encrypted, not sent": "Зашифровано, не отправлено" + "Encrypted, not sent": "Зашифровано, не отправлено", + "No Audio Outputs detected": "Аудиовыход не обнаружен", + "Audio Output": "Аудиовыход" } From 9a225840ce6a43f5e62a03a18cbe28ba6a1ecc7b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 12:00:53 +0100 Subject: [PATCH 202/480] check type before msgtype in the case of `m.sticker` with msgtype (undef) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/MessageEvent.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index c4d29257ff..fd51e6074b 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -72,10 +72,10 @@ module.exports = React.createClass({ let BodyType = UnknownBody; if (!this.props.mxEvent.isRedacted()) { // only resolve BodyType if event is not redacted - if (msgtype && bodyTypes[msgtype]) { - BodyType = bodyTypes[msgtype]; - } else if (type && evTypes[type]) { + if (type && evTypes[type]) { BodyType = evTypes[type]; + } else if (msgtype && bodyTypes[msgtype]) { + BodyType = bodyTypes[msgtype]; } else if (content.url) { // Fallback to MFileBody if there's a content URL BodyType = bodyTypes['m.file']; From d5fdfdaf8a1ee7ad219012e2ccefddb6d0351ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Thu, 14 Jun 2018 11:25:26 +0000 Subject: [PATCH 203/480] Translated using Weblate (French) Currently translated at 100.0% (1194 of 1194 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 50f801e94c..0b7abd6af5 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1188,5 +1188,9 @@ "Can't leave Server Notices room": "Impossible de quitter le salon des Annonces du serveur", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ce salon est utilisé pour les messages importants du serveur d'accueil, donc vous ne pouvez pas en partir.", "To notify everyone in the room, you must be a": "Pour notifier tout le monde dans le salon, vous devez être un(e)", - "Try the app first": "Essayer d'abord l'application" + "Try the app first": "Essayer d'abord l'application", + "Encrypting": "Chiffrement en cours", + "Encrypted, not sent": "Chiffré, pas envoyé", + "No Audio Outputs detected": "Aucune sortie audio détectée", + "Audio Output": "Sortie audio" } From 36574ca0fb1b0a14a5886a953b3d6dbaad2ea7d2 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 14 Jun 2018 13:03:42 +0100 Subject: [PATCH 204/480] Fix doc --- src/WidgetUtils.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 14fe3f59bd..98ee935f35 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -100,7 +100,8 @@ export default class WidgetUtils { * @param {string} widgetId The ID of the widget to wait for * @param {boolean} add True to wait for the widget to be added, * false to wait for it to be deleted. - * @returns {Promise} that resolves when the widget is available + * @returns {Promise} that resolves when the widget is the the + * requested state according to the `add` param */ static waitForUserWidget(widgetId, add) { return new Promise((resolve, reject) => { @@ -146,7 +147,8 @@ export default class WidgetUtils { * @param {string} roomId The ID of the room to wait for the widget in * @param {boolean} add True to wait for the widget to be added, * false to wait for it to be deleted. - * @returns {Promise} that resolves when the widget is available + * @returns {Promise} that resolves when the widget is the the + * requested state according to the `add` param */ static waitForRoomWidget(widgetId, roomId, add) { return new Promise((resolve, reject) => { From aa7d62b7402499297853fad02950679f8a279ce8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 13:20:16 +0100 Subject: [PATCH 205/480] fix naming of methods and fields Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/ShareDialog.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index e68922d35a..97d496adbc 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -67,10 +67,10 @@ export default class ShareDialog extends React.Component { super(props); this.onCopyClick = this.onCopyClick.bind(this); - this.onCheckboxClick = this.onCheckboxClick.bind(this); + this.onLinkRecentCheckboxClick = this.onLinkRecentCheckboxClick.bind(this); this.state = { - ticked: false, + linkRecentTicked: false, }; } @@ -116,9 +116,9 @@ export default class ShareDialog extends React.Component { e.target.onmouseleave = close; } - onCheckboxClick() { + onLinkRecentCheckboxClick() { this.setState({ - ticked: !this.state.ticked, + linkRecentTicked: !this.state.linkRecentTicked, }); } @@ -135,16 +135,16 @@ export default class ShareDialog extends React.Component { if (events.length > 0) { checkbox = <div> <input type="checkbox" - value={this.state.ticked} + value={this.state.linkRecentTicked} id="mx_ShareDialog_checkbox" - onClick={this.onCheckboxClick} /> + onClick={this.onLinkRecentCheckboxClick} /> <label htmlFor="mx_ShareDialog_checkbox"> { _t('Link to most recent message') } </label> </div>; } - if (this.state.ticked) { + if (this.state.linkRecentTicked) { matrixToUrl = makeEventPermalink(this.props.target.roomId, events[events.length - 1].getId()); } else { matrixToUrl = makeRoomPermalink(this.props.target.roomId); From 7d7a6f3d9c904874c352470d658b981196b3c8c9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 13:35:35 +0100 Subject: [PATCH 206/480] ShareDialog share Message, link to timestamp and permalink in ctx menu Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/context_menus/MessageContextMenu.js | 11 ++++++++++- src/components/views/dialogs/ShareDialog.js | 7 +++++-- src/components/views/rooms/EventTile.js | 15 +++++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index 99ec493ced..bdd267c4ee 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -184,6 +184,15 @@ module.exports = React.createClass({ this.closeMenu(); }, + onPermalinkClick: function(e: Event) { + e.preventDefault(); + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room message dialog', '', ShareDialog, { + target: this.props.mxEvent, + }); + this.closeMenu(); + }, + onReplyClick: function() { dis.dispatch({ action: 'reply_to_event', @@ -290,7 +299,7 @@ module.exports = React.createClass({ const permalinkButton = ( <div className="mx_MessageContextMenu_field"> <a href={makeEventPermalink(this.props.mxEvent.getRoomId(), this.props.mxEvent.getId())} - target="_blank" rel="noopener" onClick={this.closeMenu}>{ _t('Permalink') }</a> + target="_blank" rel="noopener" onClick={this.onPermalinkClick}>{ _t('Share Message') }</a> </div> ); diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index 97d496adbc..12efc8b919 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -16,7 +16,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import {Room, User, Group, RoomMember} from 'matrix-js-sdk'; +import {Room, User, Group, RoomMember, MatrixEvent} from 'matrix-js-sdk'; import sdk from '../../../index'; import { _t } from '../../../languageHandler'; import QRCode from 'qrcode-react'; @@ -59,7 +59,7 @@ export default class ShareDialog extends React.Component { PropTypes.instanceOf(User), PropTypes.instanceOf(Group), PropTypes.instanceOf(RoomMember), - // PropTypes.instanceOf(MatrixEvent), + PropTypes.instanceOf(MatrixEvent), ]).isRequired, }; @@ -155,6 +155,9 @@ export default class ShareDialog extends React.Component { } 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'); + matrixToUrl = makeEventPermalink(this.props.target.roomId, this.props.target.eventId); } const encodedUrl = encodeURIComponent(matrixToUrl); diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 589524bb9e..1160c7c886 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -438,6 +438,17 @@ module.exports = withMatrixClient(React.createClass({ }); }, + onPermalinkShareClicked: function(e) { + // These permalinks are like above, can be opened in new tab/window to matrix.to + // but otherwise fire the ShareDialog as it makes little sense to click permalink + // whilst it is in the current room + e.preventDefault(); + const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); + Modal.createTrackedDialog('share room event dialog', '', ShareDialog, { + target: this.props.mxEvent, + }); + }, + _renderE2EPadlock: function() { const ev = this.props.mxEvent; const props = {onClick: this.onCryptoClicked}; @@ -667,7 +678,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender } <div className="mx_EventTile_reply"> - <a href={permalink} onClick={this.onPermalinkClicked}> + <a href={permalink} onClick={this.onPermalinkShareClicked}> { timestamp } </a> { this._renderE2EPadlock() } @@ -694,7 +705,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender } <div className="mx_EventTile_line"> - <a href={permalink} onClick={this.onPermalinkClicked}> + <a href={permalink} onClick={this.onPermalinkShareClicked}> { timestamp } </a> { this._renderE2EPadlock() } From e1d3c2e4c73536f1f755edeb6aa18e7533b7b3fb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 13:36:39 +0100 Subject: [PATCH 207/480] run gen-i18n and prune-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/be.json | 1 - src/i18n/strings/bg.json | 1 - src/i18n/strings/ca.json | 1 - src/i18n/strings/cs.json | 1 - src/i18n/strings/da.json | 1 - src/i18n/strings/de_DE.json | 1 - src/i18n/strings/el.json | 1 - src/i18n/strings/en_EN.json | 3 ++- src/i18n/strings/en_US.json | 1 - src/i18n/strings/eo.json | 1 - src/i18n/strings/es.json | 1 - src/i18n/strings/eu.json | 1 - src/i18n/strings/fa.json | 1 - src/i18n/strings/fi.json | 1 - src/i18n/strings/fr.json | 1 - src/i18n/strings/gl.json | 1 - src/i18n/strings/he.json | 1 - src/i18n/strings/hu.json | 1 - src/i18n/strings/id.json | 1 - src/i18n/strings/is.json | 1 - src/i18n/strings/it.json | 1 - src/i18n/strings/ja.json | 1 - src/i18n/strings/ko.json | 1 - src/i18n/strings/lt.json | 1 - src/i18n/strings/lv.json | 1 - src/i18n/strings/ml.json | 1 - src/i18n/strings/nb_NO.json | 1 - src/i18n/strings/nl.json | 1 - src/i18n/strings/pl.json | 1 - src/i18n/strings/pt.json | 1 - src/i18n/strings/pt_BR.json | 1 - src/i18n/strings/ru.json | 1 - src/i18n/strings/sk.json | 1 - src/i18n/strings/sq.json | 1 - src/i18n/strings/sr.json | 1 - src/i18n/strings/sv.json | 1 - src/i18n/strings/ta.json | 1 - src/i18n/strings/th.json | 1 - src/i18n/strings/tr.json | 1 - src/i18n/strings/uk.json | 1 - src/i18n/strings/zh_Hans.json | 1 - src/i18n/strings/zh_Hant.json | 1 - 42 files changed, 2 insertions(+), 42 deletions(-) diff --git a/src/i18n/strings/be.json b/src/i18n/strings/be.json index 7e79f5d355..31360c87f4 100644 --- a/src/i18n/strings/be.json +++ b/src/i18n/strings/be.json @@ -31,7 +31,6 @@ "Noisy": "Шумна", "Resend": "Паўторна", "On": "Уключыць", - "Permalink": "Пастаянная спасылка", "remove %(name)s from the directory.": "выдаліць %(name)s з каталога.", "Off": "Выключыць", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Выдаліць псеўданім пакоя %(alias)s і выдаліць %(name)s з каталога?", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index d157f4dff8..b86941b3b7 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1125,7 +1125,6 @@ "Set Password": "Задаване на парола", "An error occurred whilst saving your email notification preferences.": "Възникна грешка при запазване на настройките за имейл известяване.", "Enable audible notifications in web client": "Включване на звукови известия в уеб клиент", - "Permalink": "Permalink", "Off": "Изключено", "Riot does not know how to join a room on this network": "Riot не знае как да се присъедини към стая от тази мрежа", "Mentions only": "Само при споменаване", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 407b9f61d4..f7212619b2 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -1004,7 +1004,6 @@ "Unable to fetch notification target list": "No s'ha pogut obtenir la llista d'objectius de les notificacions", "Set Password": "Establiu una contrasenya", "Enable audible notifications in web client": "Habilita les notificacions d'àudio al client web", - "Permalink": "Enllaç permanent", "Off": "Apagat", "Riot does not know how to join a room on this network": "El Riot no sap com unir-se a una sala en aquesta xarxa", "Mentions only": "Només mencions", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 33c7a3d5f1..99424d6043 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1062,7 +1062,6 @@ "Set Password": "Nastavit heslo", "An error occurred whilst saving your email notification preferences.": "Při ukládání nastavení e-mailových upozornění nastala chyba.", "Enable audible notifications in web client": "Povolit zvuková upozornění ve webové aplikaci", - "Permalink": "Trvalý odkaz", "Off": "Vypnout", "#example": "#příklad", "Mentions only": "Pouze zmínky", diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 2a59530d5a..02497a7934 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -371,7 +371,6 @@ "Unable to fetch notification target list": "Kan ikke hente meddelelsesmålliste", "Set Password": "Indstil Password", "Enable audible notifications in web client": "Aktivér hørbare underretninger i webklienten", - "Permalink": "Permanent link", "Resend": "Send igen", "Riot does not know how to join a room on this network": "Riot ved ikke, hvordan man kan deltage i et rum på dette netværk", "Mentions only": "Kun nævninger", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 8f75b71689..9688f4da8f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1126,7 +1126,6 @@ "Unable to fetch notification target list": "Liste der Benachrichtigungsempfänger konnte nicht abgerufen werden", "Set Password": "Passwort einrichten", "Enable audible notifications in web client": "Audio-Benachrichtigungen im Web-Client aktivieren", - "Permalink": "Permanenter Link", "Off": "Aus", "Riot does not know how to join a room on this network": "Riot weiß nicht, wie es einem Raum auf diesem Netzwerk beitreten soll", "Mentions only": "Nur, wenn du erwähnt wirst", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index fabd88c74a..e12f9223a2 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -746,7 +746,6 @@ "What's New": "Τι νέο υπάρχει", "Set Password": "Ορισμός κωδικού πρόσβασης", "Enable audible notifications in web client": "Ενεργοποίηση ηχητικών ειδοποιήσεων", - "Permalink": "Μόνιμος σύνδεσμος", "Off": "Ανενεργό", "#example": "#παράδειγμα", "Mentions only": "Μόνο αναφορές", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 76d0cb6f33..bb5ad5405b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -862,6 +862,7 @@ "Link to most recent message": "Link to most recent message", "Share User": "Share User", "Share Community": "Share Community", + "Share Room Message": "Share Room Message", "COPY": "COPY", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", @@ -881,7 +882,7 @@ "View Source": "View Source", "View Decrypted Source": "View Decrypted Source", "Unhide Preview": "Unhide Preview", - "Permalink": "Permalink", + "Share Message": "Share Message", "Quote": "Quote", "Source URL": "Source URL", "Collapse Reply Thread": "Collapse Reply Thread", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index 43e2041020..be71d0ae1d 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -816,7 +816,6 @@ "Unable to fetch notification target list": "Unable to fetch notification target list", "Set Password": "Set Password", "Enable audible notifications in web client": "Enable audible notifications in web client", - "Permalink": "Permalink", "Off": "Off", "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network", "Mentions only": "Mentions only", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 68645ffd9c..3c20baef9e 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1077,7 +1077,6 @@ "Unable to fetch notification target list": "Malsukcesis akiri la liston de celoj por sciigoj", "Set Password": "Agordi pasvorton", "Enable audible notifications in web client": "Ŝalti aŭdeblajn sciigojn en la retkliento", - "Permalink": "Konstanta ligilo", "Off": "For", "Riot does not know how to join a room on this network": "Riot ne scias aliĝi al ĉambroj en tiu ĉi reto", "Mentions only": "Nur mencioj", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 8e7925ba36..b377e97e74 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -717,7 +717,6 @@ "Riot does not know how to join a room on this network": "Riot no sabe cómo unirse a una sala en esta red", "Set Password": "Establecer contraseña", "Enable audible notifications in web client": "Habilitar notificaciones audibles en el cliente web", - "Permalink": "Enlace permanente", "Off": "Apagado", "#example": "#ejemplo", "Mentions only": "Sólo menciones", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index fe9d3db424..229c9d648e 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1127,7 +1127,6 @@ "Unable to fetch notification target list": "Ezin izan da jakinarazpen helburuen zerrenda eskuratu", "Set Password": "Ezarri pasahitza", "Enable audible notifications in web client": "Gaitu jakinarazpen entzungarriak web bezeroan", - "Permalink": "Esteka iraunkorra", "Off": "Ez", "Riot does not know how to join a room on this network": "Riotek ez daki nola elkartu gela batetara sare honetan", "Mentions only": "Aipamenak besterik ez", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index 0e532d9483..2b18ba7693 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -124,7 +124,6 @@ "Set Password": "پسوردتان را انتخاب کنید", "An error occurred whilst saving your email notification preferences.": "خطایی در حین ذخیرهی ترجیجات شما دربارهی رایانامه رخ داد.", "Enable audible notifications in web client": "آگاهسازی صدادار را در کارگزار وب فعال کن", - "Permalink": "پایاپیوند", "Off": "خاموش", "Riot does not know how to join a room on this network": "رایوت از چگونگی ورود به یک گپ در این شبکه اطلاعی ندارد", "Mentions only": "فقط نامبردنها", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index e5787ab561..204ed4ba87 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -1050,7 +1050,6 @@ "Set Password": "Aseta salasana", "An error occurred whilst saving your email notification preferences.": "Sähköposti-ilmoitusasetuksia tallettaessa tapahtui virhe.", "Enable audible notifications in web client": "Ota käyttöön äänelliset ilmoitukset", - "Permalink": "Pysyvä linkki", "remove %(name)s from the directory.": "poista %(name)s hakemistosta.", "Off": "Pois päältä", "Riot does not know how to join a room on this network": "Riot ei tiedä miten liittya huoneeseen tässä verkossa", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 367e89d2b6..fa33d58846 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1121,7 +1121,6 @@ "Unable to fetch notification target list": "Impossible de récupérer la liste des appareils recevant les notifications", "Set Password": "Définir un mot de passe", "Enable audible notifications in web client": "Activer les notifications sonores pour le client web", - "Permalink": "Permalien", "Off": "Désactivé", "Riot does not know how to join a room on this network": "Riot ne peut pas joindre un salon sur ce réseau", "Mentions only": "Seulement les mentions", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index fdab066031..70d0889ae0 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1127,7 +1127,6 @@ "Unable to fetch notification target list": "Non se puido procesar a lista de obxetivo de notificacións", "Set Password": "Establecer contrasinal", "Enable audible notifications in web client": "Habilitar notificacións audibles no cliente web", - "Permalink": "Ligazón permanente", "Off": "Off", "Riot does not know how to join a room on this network": "Riot non sabe cómo conectar con unha sala en esta rede", "Mentions only": "Só mencións", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index dbae2858a9..7d96dfa089 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -221,7 +221,6 @@ "Unable to fetch notification target list": "לא ניתן לאחזר רשימת יעדי התראה", "Set Password": "הגדר סיסמא", "Enable audible notifications in web client": "אפשר התראות קוליות בדפדפן", - "Permalink": "קישור קבוע", "Off": "סגור", "Riot does not know how to join a room on this network": "Riot אינו יודע כיצד להצטרף לחדר ברשת זו", "Mentions only": "מאזכר בלבד", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 3d8100d8f1..e142e7506a 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1126,7 +1126,6 @@ "Unable to fetch notification target list": "Nem sikerült letölteni az értesítési célok listáját", "Set Password": "Jelszó beállítása", "Enable audible notifications in web client": "Hangértesítések engedélyezése a webkliensben", - "Permalink": "Állandó hivatkozás", "Off": "Ki", "Riot does not know how to join a room on this network": "A Riot nem tud csatlakozni szobához ezen a hálózaton", "Mentions only": "Csak ha megemlítenek", diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index 9db1a4a99c..f0506d873e 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -324,7 +324,6 @@ "Unable to fetch notification target list": "Tidak dapat mengambil daftar notifikasi target", "Set Password": "Ubah Password", "Enable audible notifications in web client": "Aktifkan notifikasi suara di klien web", - "Permalink": "Permalink", "Off": "Mati", "Riot does not know how to join a room on this network": "Riot tidak tau bagaimana gabung ruang di jaringan ini", "Mentions only": "Hanya jika disinggung", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index d901c52f60..39f03156f5 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -380,7 +380,6 @@ "View Source": "Skoða frumkóða", "View Decrypted Source": "Skoða afkóðaða upprunaskrá", "Unhide Preview": "Birta forskoðun", - "Permalink": "Varanlegur tengill", "Quote": "Tilvitnun", "Source URL": "Upprunaslóð", "All messages (noisy)": "Öll skilaboð (hávært)", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index c73dc8b60d..d96c315363 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1122,7 +1122,6 @@ "What's New": "Novità", "Set Password": "Imposta Password", "Enable audible notifications in web client": "Abilita notifiche audio nel client web", - "Permalink": "Link permanente", "Off": "Spento", "#example": "#esempio", "Mentions only": "Solo le citazioni", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 80bd4f1ff5..741de4b551 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -223,7 +223,6 @@ "Event Type": "イベントの形式", "What's New": "新着", "Enable audible notifications in web client": "ウェブクライアントで音による通知を有効化", - "Permalink": "パーマリンク", "remove %(name)s from the directory.": "ディレクトリから %(name)s を消去する。", "Riot does not know how to join a room on this network": "Riotはこのネットワークで部屋に参加する方法を知りません", "You can now return to your account after signing out, and sign in on other devices.": "サインアウト後にあなたの\nアカウントに戻る、また、他の端末でサインインすることができます。", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 4e0a988223..7e58b9a253 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -754,7 +754,6 @@ "Riot does not know how to join a room on this network": "라이엇이 이 네트워크에서 방에 들어가는 법을 알 수 없어요", "Set Password": "비밀번호 설정", "Enable audible notifications in web client": "웹 클라이언트에서 알림 소리 켜기", - "Permalink": "고유주소", "Off": "끄기", "#example": "#예", "Mentions only": "답만 하기", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index bd46c25ed8..e1525f7af1 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -161,7 +161,6 @@ "Set Password": "Nustatyti slaptažodį", "An error occurred whilst saving your email notification preferences.": "Įrašant pranešimų el. paštu nuostatas, įvyko klaida.", "Unable to join network": "Nepavyko prisijungti prie tinklo", - "Permalink": "Pastovioji nuoroda", "Register": "Registruotis", "Off": "Išjungta", "Edit": "Koreguoti", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 01e3ae5c6d..5622dcb408 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -1115,7 +1115,6 @@ "Unable to fetch notification target list": "Neizdevās iegūt paziņojumu mērķu sarakstu", "Set Password": "Iestatīt paroli", "Enable audible notifications in web client": "Iespējot skaņus paziņojumus web klientā", - "Permalink": "Pastāvīgā saite", "Off": "izslēgts", "Riot does not know how to join a room on this network": "Riot nezin kā pievienoties šajā tīklā esošajai istabai", "Mentions only": "Vienīgi atsauces", diff --git a/src/i18n/strings/ml.json b/src/i18n/strings/ml.json index 6de7e92df7..a4bf0b421a 100644 --- a/src/i18n/strings/ml.json +++ b/src/i18n/strings/ml.json @@ -137,7 +137,6 @@ "Unable to fetch notification target list": "നോട്ടിഫിക്കേഷന് ടാര്ഗെറ്റ് ലിസ്റ്റ് നേടാനായില്ല", "Set Password": "രഹസ്യവാക്ക് സജ്ജീകരിക്കുക", "Enable audible notifications in web client": "വെബ് പതിപ്പിലെ അറിയിപ്പുകള് കേള്ക്കാവുന്നതാക്കുക", - "Permalink": "പെര്മാലിങ്ക്", "remove %(name)s from the directory.": "%(name)s ഡയറക്റ്ററിയില് നിന്ന് നീക്കം ചെയ്യുക.", "Off": "ഓഫ്", "Riot does not know how to join a room on this network": "ഈ നെറ്റ്വര്ക്കിലെ ഒരു റൂമില് എങ്ങനെ അംഗമാകാമെന്ന് റയട്ടിന് അറിയില്ല", diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 47da50122c..9a2b859854 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -98,7 +98,6 @@ "Riot does not know how to join a room on this network": "Riot vet ikke hvordan man kan komme inn på et rom på dette nettverket", "An error occurred whilst saving your email notification preferences.": "En feil oppsto i forbindelse med lagring av epost varsel innstillinger.", "Enable audible notifications in web client": "Aktiver lyd-varsel i webklient", - "Permalink": "Permanent lenke", "remove %(name)s from the directory.": "fjern %(name)s fra katalogen.", "Off": "Av", "#example": "#eksempel", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index f09c63118e..bda64146cc 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1120,7 +1120,6 @@ "Unable to fetch notification target list": "Het is mislukt om de lijst van notificatiedoelen op te halen", "Set Password": "Wachtwoord instellen", "Enable audible notifications in web client": "Geluidsmeldingen in de webclient aanzetten", - "Permalink": "Permanente link", "Off": "Uit", "Riot does not know how to join a room on this network": "Riot weet niet hoe het moet deelnemen in een ruimte op dit netwerk", "Mentions only": "Alleen vermeldingen", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index d3dcb72f49..30afa07202 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -901,7 +901,6 @@ "Unable to fetch notification target list": "Nie można pobrać listy docelowej dla powiadomień", "Set Password": "Ustaw hasło", "Enable audible notifications in web client": "Włącz dźwiękowe powiadomienia w kliencie internetowym", - "Permalink": "Odnośnik bezpośredni", "Off": "Wyłącz", "Riot does not know how to join a room on this network": "Riot nie wie, jak dołączyć do pokoju w tej sieci", "Mentions only": "Tylko, gdy wymienieni", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index d165c6c057..c8f7a45dcf 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -826,7 +826,6 @@ "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação", "Set Password": "Definir palavra-passe", "Enable audible notifications in web client": "Ativar notificações de áudio no cliente web", - "Permalink": "Link permanente", "Off": "Desativado", "Riot does not know how to join a room on this network": "O Riot não sabe como entrar numa sala nesta rede", "Mentions only": "Apenas menções", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 0a4d847805..a5c4e06922 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1101,7 +1101,6 @@ "Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação", "Set Password": "Definir senha", "Enable audible notifications in web client": "Ativar notificações de áudio no cliente web", - "Permalink": "Link permanente", "Off": "Desativado", "Riot does not know how to join a room on this network": "O sistema não sabe como entrar na sala desta rede", "Mentions only": "Apenas menções", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 2bdce2fe4f..599847ab84 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1125,7 +1125,6 @@ "Unable to fetch notification target list": "Не удалось получить список устройств для уведомлений", "Set Password": "Задать пароль", "Enable audible notifications in web client": "Включить звуковые уведомления в веб-клиенте", - "Permalink": "Постоянная ссылка", "Off": "Выключить", "Riot does not know how to join a room on this network": "Riot не знает, как присоединиться к комнате, принадлежащей к этой сети", "Mentions only": "Только при упоминаниях", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index ed07ff5c09..fb49973550 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1126,7 +1126,6 @@ "Set Password": "Nastaviť Heslo", "An error occurred whilst saving your email notification preferences.": "Počas ukladania vašich nastavení oznamovania emailom sa vyskytla chyba.", "Enable audible notifications in web client": "Povoliť zvukové oznámenia vo webovom klientovi", - "Permalink": "Trvalý odkaz", "Off": "Zakázané", "Riot does not know how to join a room on this network": "Riot nedokáže vstúpiť do miestnosti na tejto sieti", "Mentions only": "Len zmienky", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 2936695a6d..66f6f032b7 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -269,7 +269,6 @@ "Set Password": "Caktoni Fjalëkalim", "An error occurred whilst saving your email notification preferences.": "Ndodhi një gabim teksa ruheshin parapëlqimet tuaja për njoftime me email.", "Enable audible notifications in web client": "Aktivizoni njoftime audio te klienti web", - "Permalink": "Permalidhje", "Register": "Regjistrohuni", "Off": "Off", "Edit": "Përpunoni", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index ebacd28a5c..e24fa93c09 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -1101,7 +1101,6 @@ "Set Password": "Постави лозинку", "An error occurred whilst saving your email notification preferences.": "Догодила се грешка при чувању ваших поставки мејл обавештења.", "Enable audible notifications in web client": "Омогући звучна обавештења у веб клијенту", - "Permalink": "Трајна веза", "Resend": "Поново пошаљи", "Riot does not know how to join a room on this network": "Riot не зна како да приступи соби на овој мрежи", "Mentions only": "Само спомињања", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index ff64f1a8e6..91d1477190 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -547,7 +547,6 @@ "Unable to fetch notification target list": "Det gick inte att hämta aviseringsmållistan", "Set Password": "Välj lösenord", "Enable audible notifications in web client": "Sätt på högljudda aviseringar i webbklienten", - "Permalink": "Permanent länk", "Off": "Av", "Riot does not know how to join a room on this network": "Riot kan inte gå med i ett rum på det här nätverket", "Mentions only": "Endast omnämnande", diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json index 6aecb54bfd..b8fe318b46 100644 --- a/src/i18n/strings/ta.json +++ b/src/i18n/strings/ta.json @@ -78,7 +78,6 @@ "Off": "அமை", "On": "மீது", "Operation failed": "செயல்பாடு தோல்வியுற்றது", - "Permalink": "நிரந்தரத் தொடுப்பு", "powered by Matrix": "Matrix-ஆல் ஆனது", "Quote": "மேற்கோள்", "Reject": "நிராகரி", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 6fa7febabd..dac3656631 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -544,7 +544,6 @@ "Riot does not know how to join a room on this network": "Riot ไม่รู้วิธีเข้าร่วมห้องในเครือข่ายนี้", "Set Password": "ตั้งรหัสผ่าน", "Enable audible notifications in web client": "เปิดใช้งานเสียงแจ้งเตือนบนเว็บไคลเอนต์", - "Permalink": "ลิงก์ถาวร", "Off": "ปิด", "#example": "#example", "Mentions only": "เมื่อถูกกล่าวถึงเท่านั้น", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 797fed79ce..43ba89c968 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -741,7 +741,6 @@ "Unable to fetch notification target list": "Bildirim hedef listesi çekilemedi", "An error occurred whilst saving your email notification preferences.": "E-posta bildirim tercihlerinizi kaydetme işlemi sırasında bir hata oluştu.", "Enable audible notifications in web client": "Web istemcisinde sesli bildirimleri etkinleştir", - "Permalink": "Kalıcı Bağlantı(permalink)", "Off": "Kapalı", "Riot does not know how to join a room on this network": "Riot bu ağdaki bir odaya nasıl gireceğini bilmiyor", "Mentions only": "Sadece Mention'lar", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 74bf855d22..b07a5dadab 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -232,7 +232,6 @@ "Unable to fetch notification target list": "Неможливо отримати перелік цілей сповіщення", "Set Password": "Задати пароль", "Enable audible notifications in web client": "Увімкнути звукові сповіщення у мережевому застосунку", - "Permalink": "Постійне посилання", "Off": "Вимкнено", "Riot does not know how to join a room on this network": "Riot не знає як приєднатись до кімнати у цій мережі", "Mentions only": "Тільки згадки", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 8e2dc6e0f8..b1547170b0 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -1099,7 +1099,6 @@ "Unable to fetch notification target list": "无法获取通知目标列表", "Set Password": "设置密码", "Enable audible notifications in web client": "在网页客户端启用音频通知", - "Permalink": "永久链接", "Off": "关闭", "Riot does not know how to join a room on this network": "Riot 不知道如何在此网络中加入聊天室", "Mentions only": "只限提及", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 95424eaefb..1e43f27a59 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1126,7 +1126,6 @@ "Riot does not know how to join a room on this network": "Riot 不知道如何在此網路中加入聊天室", "Set Password": "設定密碼", "Enable audible notifications in web client": "在網頁客戶端啟用音訊通知", - "Permalink": "永久連結", "Off": "關閉", "#example": "#範例", "Mentions only": "僅提及", From bef435e15af87ebd622d88647f98df086e06be2f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 13:41:12 +0100 Subject: [PATCH 208/480] allow ShareEvent to devolve into ShareRoom using checkbox + i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/ShareDialog.js | 31 +++++++++++++++------ src/i18n/strings/en_EN.json | 1 + 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index 12efc8b919..873fcc4dee 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -67,10 +67,11 @@ export default class ShareDialog extends React.Component { super(props); this.onCopyClick = this.onCopyClick.bind(this); - this.onLinkRecentCheckboxClick = this.onLinkRecentCheckboxClick.bind(this); + this.onLinkSpecificEventCheckboxClick = this.onLinkSpecificEventCheckboxClick.bind(this); this.state = { - linkRecentTicked: false, + // MatrixEvent defaults to share linkSpecificEvent + linkSpecificEvent: this.props.target instanceof MatrixEvent, }; } @@ -116,9 +117,9 @@ export default class ShareDialog extends React.Component { e.target.onmouseleave = close; } - onLinkRecentCheckboxClick() { + onLinkSpecificEventCheckboxClick() { this.setState({ - linkRecentTicked: !this.state.linkRecentTicked, + linkSpecificEvent: !this.state.linkSpecificEvent, }); } @@ -135,16 +136,16 @@ export default class ShareDialog extends React.Component { if (events.length > 0) { checkbox = <div> <input type="checkbox" - value={this.state.linkRecentTicked} + value={this.state.linkSpecificEvent} id="mx_ShareDialog_checkbox" - onClick={this.onLinkRecentCheckboxClick} /> + onClick={this.onLinkSpecificEventCheckboxClick} /> <label htmlFor="mx_ShareDialog_checkbox"> { _t('Link to most recent message') } </label> </div>; } - if (this.state.linkRecentTicked) { + if (this.state.linkSpecificEvent) { matrixToUrl = makeEventPermalink(this.props.target.roomId, events[events.length - 1].getId()); } else { matrixToUrl = makeRoomPermalink(this.props.target.roomId); @@ -157,7 +158,21 @@ export default class ShareDialog extends React.Component { matrixToUrl = makeGroupPermalink(this.props.target.groupId); } else if (this.props.target instanceof MatrixEvent) { title = _t('Share Room Message'); - matrixToUrl = makeEventPermalink(this.props.target.roomId, this.props.target.eventId); + checkbox = <div> + <input type="checkbox" + value={this.state.linkSpecificEvent} + id="mx_ShareDialog_checkbox" + onClick={this.onLinkSpecificEventCheckboxClick} /> + <label htmlFor="mx_ShareDialog_checkbox"> + { _t('Link to selected message') } + </label> + </div>; + + if (this.state.linkSpecificEvent) { + matrixToUrl = makeEventPermalink(this.props.target.roomId, this.props.target.eventId); + } else { + matrixToUrl = makeRoomPermalink(this.props.target.roomId); + } } const encodedUrl = encodeURIComponent(matrixToUrl); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index bb5ad5405b..3802c73431 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -863,6 +863,7 @@ "Share User": "Share User", "Share Community": "Share Community", "Share Room Message": "Share Room Message", + "Link to selected message": "Link to selected message", "COPY": "COPY", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", From e870399084ec9163f3fb655dbe586f9464c32287 Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Thu, 14 Jun 2018 12:41:44 +0000 Subject: [PATCH 209/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1194 of 1194 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 87886ec652..3f2e2d9dd5 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1187,5 +1187,10 @@ "Terms and Conditions": "條款與細則", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "要繼續使用 %(homeserverDomain)s 家伺服器,您必須審閱並同意我們的條款與細則。", "Review terms and conditions": "審閱條款與細則", - "To notify everyone in the room, you must be a": "為了通知每個在聊天室裡的人,您必須為" + "To notify everyone in the room, you must be a": "為了通知每個在聊天室裡的人,您必須為", + "Encrypting": "正在加密", + "Encrypted, not sent": "已加密,未傳送", + "No Audio Outputs detected": "未偵測到音訊輸出", + "Audio Output": "音訊輸出", + "Try the app first": "先試試看應用程式" } From ef178b282c2f82181584a284b14b3d3e56a22f87 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 13:44:05 +0100 Subject: [PATCH 210/480] use getters on MatrixEvent for roomId and eventId Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/ShareDialog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index 873fcc4dee..bbd381ad29 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -169,9 +169,9 @@ export default class ShareDialog extends React.Component { </div>; if (this.state.linkSpecificEvent) { - matrixToUrl = makeEventPermalink(this.props.target.roomId, this.props.target.eventId); + matrixToUrl = makeEventPermalink(this.props.target.getRoomId(), this.props.target.getId()); } else { - matrixToUrl = makeRoomPermalink(this.props.target.roomId); + matrixToUrl = makeRoomPermalink(this.props.target.getRoomId()); } } From 33a3cfead6e2766d9a0b7211f074290c92ae0257 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 13:47:33 +0100 Subject: [PATCH 211/480] controlled checkboxes use `checked` not `value` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/ShareDialog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index bbd381ad29..a1a8598fdb 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -136,8 +136,8 @@ export default class ShareDialog extends React.Component { if (events.length > 0) { checkbox = <div> <input type="checkbox" - value={this.state.linkSpecificEvent} id="mx_ShareDialog_checkbox" + checked={this.state.linkSpecificEvent} onClick={this.onLinkSpecificEventCheckboxClick} /> <label htmlFor="mx_ShareDialog_checkbox"> { _t('Link to most recent message') } @@ -160,8 +160,8 @@ export default class ShareDialog extends React.Component { title = _t('Share Room Message'); checkbox = <div> <input type="checkbox" - value={this.state.linkSpecificEvent} id="mx_ShareDialog_checkbox" + checked={this.state.linkSpecificEvent} onClick={this.onLinkSpecificEventCheckboxClick} /> <label htmlFor="mx_ShareDialog_checkbox"> { _t('Link to selected message') } From 3e6b3215cfe15532e19fd48288caf9fe23fd465e Mon Sep 17 00:00:00 2001 From: David Baker <dbkr@users.noreply.github.com> Date: Thu, 14 Jun 2018 13:49:23 +0100 Subject: [PATCH 212/480] Update WidgetUtils.js Fix fixed comment --- src/WidgetUtils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 98ee935f35..2e2dcf30cd 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -100,7 +100,7 @@ export default class WidgetUtils { * @param {string} widgetId The ID of the widget to wait for * @param {boolean} add True to wait for the widget to be added, * false to wait for it to be deleted. - * @returns {Promise} that resolves when the widget is the the + * @returns {Promise} that resolves when the widget is in the * requested state according to the `add` param */ static waitForUserWidget(widgetId, add) { @@ -147,7 +147,7 @@ export default class WidgetUtils { * @param {string} roomId The ID of the room to wait for the widget in * @param {boolean} add True to wait for the widget to be added, * false to wait for it to be deleted. - * @returns {Promise} that resolves when the widget is the the + * @returns {Promise} that resolves when the widget is in the * requested state according to the `add` param */ static waitForRoomWidget(widgetId, roomId, add) { From 4e216714b533722e4c0b4bef3f0068a0d0bccb91 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 13:53:02 +0100 Subject: [PATCH 213/480] remove commented code and move modal.close into a finally block Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/context_menus/GroupInviteTileContextMenu.js | 5 +++-- src/components/views/groups/GroupInviteTile.js | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/context_menus/GroupInviteTileContextMenu.js b/src/components/views/context_menus/GroupInviteTileContextMenu.js index bbdc3a4244..e30acca16d 100644 --- a/src/components/views/context_menus/GroupInviteTileContextMenu.js +++ b/src/components/views/context_menus/GroupInviteTileContextMenu.js @@ -58,14 +58,15 @@ export default class GroupInviteTileContextMenu extends React.Component { try { await GroupStore.leaveGroup(this.props.group.groupId); } catch (e) { - console.error(e); + console.error("Error rejecting community invite: ", e); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Error rejecting invite', '', ErrorDialog, { title: _t("Error"), description: _t("Unable to reject invite"), }); + } finally { + modal.close(); } - modal.close(); }, }); diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 65e8a07d5a..4d5f3c6f3a 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -94,7 +94,6 @@ export default React.createClass({ group: this.props.group, onFinished: () => { this.setState({ menuDisplayed: false }); - // this.props.refreshSubList(); }, }); this.setState({ menuDisplayed: true }); From 1346f47a12a2850b64e9555e999c8f3faab480d4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 14:18:39 +0100 Subject: [PATCH 214/480] allow filtering Group Invite Tiles with the same search filter Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomList.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 2722bad88b..c329e3f2a0 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -583,13 +583,18 @@ module.exports = React.createClass({ } }, - _makeGroupInviteTiles() { + _makeGroupInviteTiles(filter) { const ret = []; + const lcFilter = filter && filter.toLowerCase(); const GroupInviteTile = sdk.getComponent('groups.GroupInviteTile'); for (const group of MatrixClientPeg.get().getGroups()) { - if (group.myMembership !== 'invite') continue; - ret.push(<GroupInviteTile key={group.groupId} group={group} collapsed={this.props.collapsed} />); + const {groupId: id, name, myMembership: membership} = group; + // filter to only groups in invite state and group_id starts with filter or group name includes it + if (membership !== 'invite') continue; + if (lcFilter && !id.toLowerCase().startsWith(lcFilter) && + !(name && name.toLowerCase().includes(lcFilter))) continue; + ret.push(<GroupInviteTile key={id} group={group} collapsed={this.props.collapsed} />); } return ret; @@ -609,7 +614,7 @@ module.exports = React.createClass({ autoshow={true} onScroll={self._whenScrolling} wrappedRef={this._collectGemini}> <div className="mx_RoomList"> <RoomSubList list={[]} - extraTiles={this._makeGroupInviteTiles()} + extraTiles={this._makeGroupInviteTiles(self.props.searchFilter)} label={_t('Community Invites')} editable={false} order="recent" From c8d233c0a6178020d6fc77c4dbcb9a6240b45eac Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 14 Jun 2018 14:19:30 +0100 Subject: [PATCH 215/480] If unspecified, don't crash if missing thumbnail info applies to stickers/images. We might want to consider to do that is better than assuming a aspect ratio of 600 x 800 (4:3). --- src/components/views/messages/MImageBody.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index c42840b03a..8ab3705766 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -185,7 +185,7 @@ export default class extends React.Component { const content = this.props.mxEvent.getContent(); if (content.file !== undefined && this.state.decryptedUrl === null) { let thumbnailPromise = Promise.resolve(null); - if (content.info.thumbnail_file) { + if (content.info && content.info.thumbnail_file) { thumbnailPromise = decryptFile( content.info.thumbnail_file, ).then(function(blob) { @@ -239,11 +239,20 @@ export default class extends React.Component { } _messageContent(contentUrl, thumbUrl, content) { + // If unspecifide in the thumbnail info, assume width x height to be 800 x 600. + let infoHeight = 600; + let infoWidth = 800; + + if (content.info && content.info.h && content.info.w) { + infoHeight = content.info.h; + infoWidth = content.info.w; + } + // The maximum height of the thumbnail as it is rendered as an <img> - const maxHeight = Math.min(this.props.maxImageHeight || 600, content.info.h); + const maxHeight = Math.min(this.props.maxImageHeight || 600, infoHeight); // The maximum width of the thumbnail, as dictated by its natural // maximum height. - const maxWidth = content.info.w * maxHeight / content.info.h; + const maxWidth = infoWidth * maxHeight / infoHeight; let img = null; let placeholder = null; @@ -274,12 +283,12 @@ export default class extends React.Component { const thumbnail = ( <div className="mx_MImageBody_thumbnail_container" style={{ "max-height": maxHeight + "px" }} > { /* Calculate aspect ratio, using %padding will size _container correctly */ } - <div style={{ paddingBottom: (100 * content.info.h / content.info.w) + '%' }}></div> + <div style={{ paddingBottom: (100 * infoHeight / infoWidth) + '%' }}></div> { showPlaceholder && <div className="mx_MImageBody_thumbnail" style={{ // Constrain width here so that spinner appears central to the loaded thumbnail - "max-width": content.info.w + "px", + "max-width": infoWidth + "px", }}> <div className="mx_MImageBody_thumbnail_spinner"> { placeholder } From 2d14d51ecb6bbe9f5922f4144054457f456151c5 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 14 Jun 2018 15:44:55 +0100 Subject: [PATCH 216/480] Handle images without width/height info correctly Prior to #1912, height fix up of image events without an `info` in their content would fail, setting `style.height = null + "px"`. Now that all thumbnail sizing is done through one path, we can fix the same problem for all cases (images, stickers, e2e/non-e2e) by handling images without `info` correctly. At the bare minimum, we use a null-guard that will make sure an image without an `info` does not appear in the timeline (as a spinner or otherwise until loaded). When loaded, we size it like any other image by using the natural dimensions of the loaded image in place of `info`. Note that we do not apply the same logic to images that *do* specify an `info` with `w` and `h` keys. If the aspect ratio of the image does not match that of the event, we use the one in `info` even when the image has loaded. --- src/components/views/messages/MImageBody.js | 38 +++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 8ab3705766..c13f963545 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -147,7 +147,16 @@ export default class extends React.Component { onImageLoad() { this.props.onWidgetLoad(); - this.setState({ imgLoaded: true }); + + let loadedImageDimensions; + + if (this.refs.image) { + const { naturalWidth, naturalHeight } = this.refs.image; + + loadedImageDimensions = { naturalWidth, naturalHeight }; + } + + this.setState({ imgLoaded: true, loadedImageDimensions }); } _getContentUrl() { @@ -239,13 +248,30 @@ export default class extends React.Component { } _messageContent(contentUrl, thumbUrl, content) { - // If unspecifide in the thumbnail info, assume width x height to be 800 x 600. - let infoHeight = 600; - let infoWidth = 800; + let infoWidth; + let infoHeight; - if (content.info && content.info.h && content.info.w) { - infoHeight = content.info.h; + if (content && content.info && content.info.w && content.info.h) { infoWidth = content.info.w; + infoHeight = content.info.h; + } else { + // Whilst the image loads, display nothing. + // + // Once loaded, use the loaded image dimensions stored in `loadedImageDimensions`. + // + // By doing this, the image "pops" into the timeline, but is still restricted + // by the same width and height logic below. + if (!this.state.loadedImageDimensions) { + return this.wrapImage(contentUrl, + <img style={{display: 'none'}} src={thumbUrl} ref="image" + alt={content.body} + onError={this.onImageError} + onLoad={this.onImageLoad} + />, + ); + } + infoWidth = this.state.loadedImageDimensions.naturalWidth; + infoHeight = this.state.loadedImageDimensions.naturalHeight; } // The maximum height of the thumbnail as it is rendered as an <img> From 2eb23ed234c6114658dc5fe6829884db3a6beea1 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 14 Jun 2018 15:53:49 +0100 Subject: [PATCH 217/480] Add loadedImageDimensions to initial state --- src/components/views/messages/MImageBody.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index c13f963545..1b6bdeb588 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -65,6 +65,7 @@ export default class extends React.Component { error: null, imgError: false, imgLoaded: false, + loadedImageDimensions: null, hover: false, }; } From 3b141d7a84dada258067b57d33f0f67cea52b161 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 16:48:00 +0100 Subject: [PATCH 218/480] change variable names for clarity Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomList.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index c329e3f2a0..167603ecfb 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -589,12 +589,12 @@ module.exports = React.createClass({ const GroupInviteTile = sdk.getComponent('groups.GroupInviteTile'); for (const group of MatrixClientPeg.get().getGroups()) { - const {groupId: id, name, myMembership: membership} = group; + const {groupId, name, myMembership} = group; // filter to only groups in invite state and group_id starts with filter or group name includes it - if (membership !== 'invite') continue; - if (lcFilter && !id.toLowerCase().startsWith(lcFilter) && + if (myMembership !== 'invite') continue; + if (lcFilter && !groupId.toLowerCase().startsWith(lcFilter) && !(name && name.toLowerCase().includes(lcFilter))) continue; - ret.push(<GroupInviteTile key={id} group={group} collapsed={this.props.collapsed} />); + ret.push(<GroupInviteTile key={groupId} group={group} collapsed={this.props.collapsed} />); } return ret; From 7de7275c6d526f5ab5214cc4f488d5aae587e6cf Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 18:56:46 +0100 Subject: [PATCH 219/480] remove subheadings in ShareDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/dialogs/_ShareDialog.scss | 6 ++-- src/components/views/dialogs/ShareDialog.js | 34 +++++++++------------ 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/res/css/views/dialogs/_ShareDialog.scss b/res/css/views/dialogs/_ShareDialog.scss index ab340ad758..116bef8dfd 100644 --- a/res/css/views/dialogs/_ShareDialog.scss +++ b/res/css/views/dialogs/_ShareDialog.scss @@ -21,7 +21,7 @@ limitations under the License. .mx_ShareDialog hr { margin-top: 25px; - margin-bottom: 10px; + margin-bottom: 25px; border-color: $light-fg-color; } @@ -78,12 +78,12 @@ limitations under the License. } .mx_ShareDialog_social_container { - display: flex; - flex-wrap: wrap; + display: inline-block; width: 299px; } .mx_ShareDialog_social_icon { + display: inline-grid; margin-right: 10px; margin-bottom: 10px; } diff --git a/src/components/views/dialogs/ShareDialog.js b/src/components/views/dialogs/ShareDialog.js index a1a8598fdb..f074d9b1fa 100644 --- a/src/components/views/dialogs/ShareDialog.js +++ b/src/components/views/dialogs/ShareDialog.js @@ -201,27 +201,21 @@ export default class ShareDialog extends React.Component { <hr /> <div className="mx_ShareDialog_split"> - <div className="mx_ShareDialog_left"> - <h3>QR Code</h3> - <div className="mx_ShareDialog_qrcode_container"> - <QRCode value={matrixToUrl} size={256} logoWidth={48} logo="img/matrix-m.svg" /> - </div> + <div className="mx_ShareDialog_qrcode_container"> + <QRCode value={matrixToUrl} size={256} logoWidth={48} logo="img/matrix-m.svg" /> </div> - <div className="mx_ShareDialog_right"> - <h3>Social</h3> - <div className="mx_ShareDialog_social_container"> - { - socials.map((social) => <a rel="noopener" - target="_blank" - key={social.name} - name={social.name} - href={social.url(encodedUrl)} - className="mx_ShareDialog_social_icon" - > - <img src={social.img} alt={social.name} height={64} width={64} /> - </a>) - } - </div> + <div className="mx_ShareDialog_social_container"> + { + socials.map((social) => <a rel="noopener" + target="_blank" + key={social.name} + name={social.name} + href={social.url(encodedUrl)} + className="mx_ShareDialog_social_icon" + > + <img src={social.img} alt={social.name} height={64} width={64} /> + </a>) + } </div> </div> </div> From 7adbff69dc1febb1b58c36cc67ade338f06e9641 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 14 Jun 2018 18:58:38 +0100 Subject: [PATCH 220/480] QuestionDialog pass hasCancelButton to DialogButtons otherwise E2E Q Dialog has OK and Cancel which makes 0 sense as its just an info dialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/QuestionDialog.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/QuestionDialog.js b/src/components/views/dialogs/QuestionDialog.js index 21d3a54bc2..ed73bdcbdf 100644 --- a/src/components/views/dialogs/QuestionDialog.js +++ b/src/components/views/dialogs/QuestionDialog.js @@ -67,9 +67,10 @@ export default React.createClass({ { this.props.description } </div> <DialogButtons primaryButton={this.props.button || _t('OK')} - cancelButton={this.props.cancelButton} - onPrimaryButtonClick={this.onOk} primaryButtonClass={primaryButtonClass} + cancelButton={this.props.cancelButton} + hasCancel={this.props.hasCancelButton} + onPrimaryButtonClick={this.onOk} focus={this.props.focus} onCancel={this.onCancel} > From 826df5765caf9a38d82999b40457ef8b79372f34 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 10:27:21 +0100 Subject: [PATCH 221/480] add rel noopener to cross origin loader (currently rel="undefined") Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/MFileBody.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/messages/MFileBody.js b/src/components/views/messages/MFileBody.js index 246ea6891f..292ac25d42 100644 --- a/src/components/views/messages/MFileBody.js +++ b/src/components/views/messages/MFileBody.js @@ -327,6 +327,7 @@ module.exports = React.createClass({ // will have the correct name when the user tries to download it. // We can't provide a Content-Disposition header like we would for HTTP. download: fileName, + rel: "noopener", target: "_blank", textContent: _t("Download %(text)s", { text: text }), }, "*"); From da93c6d04076e01fbbfe3a692c5e5a3705f5a9e0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 10:27:39 +0100 Subject: [PATCH 222/480] pass omitFilename to stop sending filename=undefined Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/ContentMessages.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ContentMessages.js b/src/ContentMessages.js index 7fe625f8b9..1d61b6de6a 100644 --- a/src/ContentMessages.js +++ b/src/ContentMessages.js @@ -243,6 +243,7 @@ function uploadFile(matrixClient, roomId, file, progressHandler) { const blob = new Blob([encryptResult.data]); return matrixClient.uploadContent(blob, { progressHandler: progressHandler, + omitFilename: true, }).then(function(url) { // If the attachment is encrypted then bundle the URL along // with the information needed to decrypt the attachment and From 9567ffcb9f30843971d1deda2c06888c5075e8c6 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 15 Jun 2018 11:56:44 +0100 Subject: [PATCH 223/480] Remove tag panel feature flag We forgot to remove this when taking tagpanel out of labs, so now this flag just does nothing. --- src/settings/Settings.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/settings/Settings.js b/src/settings/Settings.js index d1d0cf19aa..039bd78d79 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -88,12 +88,6 @@ export const SETTINGS = { supportedLevels: LEVELS_FEATURE, default: false, }, - "feature_tag_panel": { - isFeature: true, - displayName: _td("Tag Panel"), - supportedLevels: LEVELS_FEATURE, - default: false, - }, "MessageComposerInput.dontSuggestEmoji": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, displayName: _td('Disable Emoji suggestions while typing'), From 7bda6d3623fc0ecef804e2ab6ffce631902b589b Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Fri, 15 Jun 2018 11:03:40 +0000 Subject: [PATCH 224/480] Translated using Weblate (Russian) Currently translated at 99.6% (1199 of 1203 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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 2dc8118b2e..e402f45233 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1189,5 +1189,13 @@ "Encrypting": "Шифрование", "Encrypted, not sent": "Зашифровано, не отправлено", "No Audio Outputs detected": "Аудиовыход не обнаружен", - "Audio Output": "Аудиовыход" + "Audio Output": "Аудиовыход", + "Share Link to User": "Поделиться ссылкой с пользователем", + "Share room": "Поделиться комнатой", + "Share Room": "Поделиться комнатой", + "Link to most recent message": "Ссылка на последнее сообщение", + "Share User": "Поделиться пользователем", + "Share Community": "Поделиться сообществом", + "Link to selected message": "Ссылка на выбранное сообщение", + "COPY": "КОПИРОВАТЬ" } From bed9b9851d69b35cff8dde8b8cd9f6731d0447f7 Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Fri, 15 Jun 2018 11:48:39 +0000 Subject: [PATCH 225/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1203 of 1203 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 9eb8842033..8c7f3d1f16 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1191,5 +1191,15 @@ "Encrypting": "Titkosít", "Encrypted, not sent": "Titkosítva, de nincs elküldve", "No Audio Outputs detected": "Nem található hang kimenet", - "Audio Output": "Hang kimenet" + "Audio Output": "Hang kimenet", + "Share Link to User": "Hivatkozás megosztása felhasználóval", + "Share room": "Szoba megosztása", + "Share Room": "Szoba megosztása", + "Link to most recent message": "A legfrissebb üzenetre hivatkozás", + "Share User": "Felhasználó megosztás", + "Share Community": "Közösség megosztás", + "Share Room Message": "Szoba üzenet megosztás", + "Link to selected message": "Hivatkozás a kijelölt üzenetre", + "COPY": "Másol", + "Share Message": "Üzenet megosztása" } From 62601d657da3afa34a392e3b02ba8800785f0000 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 13:33:07 +0100 Subject: [PATCH 226/480] Implement DecryptionFailureTracker for less agressive tracking Instead of pinging Analytics once per failed decryption, add the failure to a list of failures and after a grace period, add it to a FIFO for tracking. On an interval, track a single failure from the FIFO. --- src/DecryptionFailureTracker.js | 124 +++++++++++++++++++++++ src/components/structures/MatrixChat.js | 16 +-- test/DecryptionFailureTracker-test.js | 128 ++++++++++++++++++++++++ 3 files changed, 262 insertions(+), 6 deletions(-) create mode 100644 src/DecryptionFailureTracker.js create mode 100644 test/DecryptionFailureTracker-test.js diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js new file mode 100644 index 0000000000..0f86093209 --- /dev/null +++ b/src/DecryptionFailureTracker.js @@ -0,0 +1,124 @@ +/* +Copyright 2018 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. +*/ + +class DecryptionFailure { + constructor(failedEventId) { + this.failedEventId = failedEventId; + this.ts = Date.now(); + } +} + +export default class DecryptionFailureTracker { + // Array of items of type DecryptionFailure. Every `CHECK_INTERVAL_MS`, this list + // is checked for failures that happened > `GRACE_PERIOD_MS` ago. Those that did + // are added to `failuresToTrack`. + failures = []; + + // Every TRACK_INTERVAL_MS (so as to spread the number of hits done on Analytics), + // one DecryptionFailure of this FIFO is removed and tracked. + failuresToTrack = []; + + // Spread the load on `Analytics` by sending at most 1 event per + // `TRACK_INTERVAL_MS`. + static TRACK_INTERVAL_MS = 1000; + + // Call `checkFailures` every `CHECK_INTERVAL_MS`. + static CHECK_INTERVAL_MS = 5000; + + // Give events a chance to be decrypted by waiting `GRACE_PERIOD_MS` before moving + // the failure to `failuresToTrack`. + static GRACE_PERIOD_MS = 5000; + + constructor(fn) { + if (!fn || typeof fn !== 'function') { + throw new Error('DecryptionFailureTracker requires tracking function'); + } + + this.trackDecryptionFailure = fn; + } + + eventDecrypted(e) { + if (e.isDecryptionFailure()) { + this.addDecryptionFailureForEvent(e); + } else { + // Could be an event in the failures, remove it + this.removeDecryptionFailuresForEvent(e); + } + } + + addDecryptionFailureForEvent(e) { + this.failures.push(new DecryptionFailure(e.getId())); + } + + removeDecryptionFailuresForEvent(e) { + this.failures = this.failures.filter((f) => f.failedEventId !== e.getId()); + } + + /** + * Start checking for and tracking failures. + * @return {function} a function that clears state and causes DFT to stop checking for + * and tracking failures. + */ + start() { + const checkInterval = setInterval( + () => this.checkFailures(Date.now()), + DecryptionFailureTracker.CHECK_INTERVAL_MS, + ); + + const trackInterval = setInterval( + () => this.trackFailure(), + DecryptionFailureTracker.TRACK_INTERVAL_MS, + ); + + return () => { + clearInterval(checkInterval); + clearInterval(trackInterval); + + this.failures = []; + this.failuresToTrack = []; + }; + } + + /** + * Mark failures that occured before nowTs - GRACE_PERIOD_MS as failures that should be + * tracked. Only mark one failure per event ID. + * @param {number} nowTs the timestamp that represents the time now. + */ + checkFailures(nowTs) { + const failuresGivenGrace = this.failures.filter( + (f) => nowTs > f.ts + DecryptionFailureTracker.GRACE_PERIOD_MS, + ); + + // Only track one failure per event + const dedupedFailuresMap = failuresGivenGrace.reduce( + (result, failure) => ({...result, [failure.failedEventId]: failure}), + {}, + ); + const dedupedFailures = Object.keys(dedupedFailuresMap).map((k) => dedupedFailuresMap[k]); + + this.failuresToTrack = [...this.failuresToTrack, ...dedupedFailures]; + } + + /** + * If there is a failure that should be tracked, call the given trackDecryptionFailure + * function with the first failure in the FIFO of failures that should be tracked. + */ + trackFailure() { + if (this.failuresToTrack.length > 0) { + this.trackDecryptionFailure(this.failuresToTrack.shift()); + } + } +} diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index da729a1a2d..7884829a76 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -23,6 +23,7 @@ import PropTypes from 'prop-types'; import Matrix from "matrix-js-sdk"; import Analytics from "../../Analytics"; +import DecryptionFailureTracker from "../../DecryptionFailureTracker"; import MatrixClientPeg from "../../MatrixClientPeg"; import PlatformPeg from "../../PlatformPeg"; import SdkConfig from "../../SdkConfig"; @@ -1308,14 +1309,17 @@ export default React.createClass({ } }); - // XXX: This will do a HTTP request for each Event.decrypted event - // if the decryption was a failure - cli.on("Event.decrypted", (e) => { - if (e.isDecryptionFailure()) { - Analytics.trackEvent('E2E', 'Decryption failure', 'ev.content.body: ' + e.getContent().body); - } + const dft = new DecryptionFailureTracker((failure) => { + // TODO: Pass reason for failure as third argument to trackEvent + Analytics.trackEvent('E2E', 'Decryption failure'); }); + const stopDft = dft.start(); + + // When logging out, stop tracking failures and destroy state + cli.on("Session.logged_out", stopDft); + cli.on("Event.decrypted", dft.eventDecrypted); + const krh = new KeyRequestHandler(cli); cli.on("crypto.roomKeyRequest", (req) => { krh.handleKeyRequest(req); diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js new file mode 100644 index 0000000000..9d3b035bf5 --- /dev/null +++ b/test/DecryptionFailureTracker-test.js @@ -0,0 +1,128 @@ +/* +Copyright 2018 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 expect from 'expect'; + +import DecryptionFailureTracker from '../src/DecryptionFailureTracker'; + +import { MatrixEvent } from 'matrix-js-sdk'; + +function createFailedDecryptionEvent() { + const event = new MatrixEvent({ + event_id: "event-id-" + Math.random().toString(16).slice(2), + }); + event._setClearData( + event._badEncryptedMessage(":("), + ); + return event; +} + +describe.only('DecryptionFailureTracker', function() { + it('tracks a failed decryption', function(done) { + const failedDecryptionEvent = createFailedDecryptionEvent(); + let trackedFailure = null; + const tracker = new DecryptionFailureTracker((failure) => { + trackedFailure = failure; + }); + + tracker.eventDecrypted(failedDecryptionEvent); + + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); + + // Immediately track the newest failure, if there is one + tracker.trackFailure(); + + expect(trackedFailure).toNotBe(null, 'should track a failure for an event that failed decryption'); + + done(); + }); + + it('does not track a failed decryption where the event is subsequently successfully decrypted', (done) => { + const decryptedEvent = createFailedDecryptionEvent(); + const tracker = new DecryptionFailureTracker((failure) => { + expect(true).toBe(false, 'should not track an event that has since been decrypted correctly'); + }); + + tracker.eventDecrypted(decryptedEvent); + + // Indicate successful decryption: clear data can be anything where the msgtype is not m.bad.encrypted + decryptedEvent._setClearData({}); + tracker.eventDecrypted(decryptedEvent); + + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); + + // Immediately track the newest failure, if there is one + tracker.trackFailure(); + done(); + }); + + it('only tracks a single failure per event, despite multiple failed decryptions for multiple events', (done) => { + const decryptedEvent = createFailedDecryptionEvent(); + const decryptedEvent2 = createFailedDecryptionEvent(); + + let count = 0; + const tracker = new DecryptionFailureTracker((failure) => count++); + + // Arbitrary number of failed decryptions for both events + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent2); + tracker.eventDecrypted(decryptedEvent2); + tracker.eventDecrypted(decryptedEvent2); + + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); + + // Simulated polling of `trackFailure`, an arbitrary number ( > 2 ) times + tracker.trackFailure(); + tracker.trackFailure(); + tracker.trackFailure(); + tracker.trackFailure(); + + expect(count).toBe(2, count + ' failures tracked, should only track a single failure per event'); + + done(); + }); + + it('track failures in the order they occured', (done) => { + const decryptedEvent = createFailedDecryptionEvent(); + const decryptedEvent2 = createFailedDecryptionEvent(); + + const failures = []; + const tracker = new DecryptionFailureTracker((failure) => failures.push(failure)); + + // Indicate decryption + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent2); + + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); + + // Simulated polling of `trackFailure`, an arbitrary number ( > 2 ) times + tracker.trackFailure(); + tracker.trackFailure(); + + expect(failures[0].failedEventId).toBe(decryptedEvent.getId(), 'the first failure should be tracked first'); + expect(failures[1].failedEventId).toBe(decryptedEvent2.getId(), 'the second failure should be tracked second'); + + done(); + }); +}); From 9e73c2e253ac7200e52a0c0303650b12b0963a03 Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Fri, 15 Jun 2018 13:36:21 +0000 Subject: [PATCH 227/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1203 of 1203 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 a1eeaa951a..8de7676f57 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1191,5 +1191,15 @@ "Encrypted, not sent": "已加密,未傳送", "No Audio Outputs detected": "未偵測到音訊輸出", "Audio Output": "音訊輸出", - "Try the app first": "先試試看應用程式" + "Try the app first": "先試試看應用程式", + "Share Link to User": "分享連結給使用者", + "Share room": "分享聊天室", + "Share Room": "分享聊天室", + "Link to most recent message": "連結到最近的訊息", + "Share User": "分享使用者", + "Share Community": "分享社群", + "Share Room Message": "分享聊天室訊息", + "Link to selected message": "連結到選定的訊息", + "COPY": "複製", + "Share Message": "分享訊息" } From 4a8442901d30e2721b7f581c1ab45db97a0ddd26 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 14:45:11 +0100 Subject: [PATCH 228/480] Remove failures when marking them for tracking --- src/DecryptionFailureTracker.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 0f86093209..9eadb332a8 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -98,9 +98,17 @@ export default class DecryptionFailureTracker { * @param {number} nowTs the timestamp that represents the time now. */ checkFailures(nowTs) { - const failuresGivenGrace = this.failures.filter( - (f) => nowTs > f.ts + DecryptionFailureTracker.GRACE_PERIOD_MS, - ); + const failuresGivenGrace = []; + const failuresNotReady = []; + while (this.failures.length > 0) { + const f = this.failures.shift(); + if (nowTs > f.ts + DecryptionFailureTracker.GRACE_PERIOD_MS) { + failuresGivenGrace.push(f); + } else { + failuresNotReady.push(f); + } + } + this.failures = failuresNotReady; // Only track one failure per event const dedupedFailuresMap = failuresGivenGrace.reduce( From ac0416af960da4f5c160314ea69d03b36e72a785 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 14:48:20 +0100 Subject: [PATCH 229/480] Do not track previously tracked failures --- src/DecryptionFailureTracker.js | 27 +++++++++++++++++++++++++-- test/DecryptionFailureTracker-test.js | 24 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 9eadb332a8..7bdfd6bfd0 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -21,6 +21,10 @@ class DecryptionFailure { } } +function eventIdHash(eventId) { + return crypto.subtle.digest('SHA-256', eventId); +} + export default class DecryptionFailureTracker { // Array of items of type DecryptionFailure. Every `CHECK_INTERVAL_MS`, this list // is checked for failures that happened > `GRACE_PERIOD_MS` ago. Those that did @@ -31,6 +35,11 @@ export default class DecryptionFailureTracker { // one DecryptionFailure of this FIFO is removed and tracked. failuresToTrack = []; + // Event IDs of failures that were tracked previously + eventTrackedPreviously = { + // [eventIdHash(eventId)]: true + }; + // Spread the load on `Analytics` by sending at most 1 event per // `TRACK_INTERVAL_MS`. static TRACK_INTERVAL_MS = 1000; @@ -112,10 +121,24 @@ export default class DecryptionFailureTracker { // Only track one failure per event const dedupedFailuresMap = failuresGivenGrace.reduce( - (result, failure) => ({...result, [failure.failedEventId]: failure}), + (result, failure) => { + if (!this.eventTrackedPreviously[eventIdHash(failure.failedEventId)]) { + return {...result, [failure.failedEventId]: failure}; + } else { + return result; + } + }, {}, ); - const dedupedFailures = Object.keys(dedupedFailuresMap).map((k) => dedupedFailuresMap[k]); + + const trackedEventIds = Object.keys(dedupedFailuresMap); + + this.eventTrackedPreviously = trackedEventIds.reduce( + (result, eventId) => ({...result, [eventIdHash(eventId)]: true}), + this.eventTrackedPreviously, + ); + + const dedupedFailures = trackedEventIds.map((k) => dedupedFailuresMap[k]); this.failuresToTrack = [...this.failuresToTrack, ...dedupedFailures]; } diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index 9d3b035bf5..34e2df2b6e 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -125,4 +125,28 @@ describe.only('DecryptionFailureTracker', function() { done(); }); + + it('should not track a failure for an event that was tracked previously', (done) => { + const decryptedEvent = createFailedDecryptionEvent(); + + const failures = []; + const tracker = new DecryptionFailureTracker((failure) => failures.push(failure)); + + // Indicate decryption + tracker.eventDecrypted(decryptedEvent); + + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); + + tracker.trackFailure(); + + // Indicate a second decryption, after having tracked the failure + tracker.eventDecrypted(decryptedEvent); + + tracker.trackFailure(); + + expect(failures.length).toBe(1, 'should only track a single failure per event'); + + done(); + }); }); From 8cf17a66e5b409b68fd122491a5ad833e0e0d9aa Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 15 Jun 2018 15:12:32 +0100 Subject: [PATCH 230/480] Very basic Jitsi integration Replaces the conference calling by adding a Jitsi widget. No support for continuing the call on room change currently, so hidden behind a feature flag. Existing behaviour is preserved by default. --- src/CallHandler.js | 139 +++++++++++++----- src/components/views/rooms/AppsDrawer.js | 8 - src/components/views/rooms/MessageComposer.js | 34 ----- src/i18n/strings/en_EN.json | 74 +++++----- src/settings/Settings.js | 7 + 5 files changed, 149 insertions(+), 113 deletions(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index fd56d7f1b1..da764ec4b6 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -1,6 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -60,6 +60,7 @@ import { _t } from './languageHandler'; import Matrix from 'matrix-js-sdk'; import dis from './dispatcher'; import { showUnknownDeviceDialogForCalls } from './cryptodevices'; +import SettingsStore from "./settings/SettingsStore"; global.mxCalls = { //room_id: MatrixCall @@ -294,18 +295,8 @@ function _onAction(payload) { break; case 'place_conference_call': console.log("Place conference call in %s", payload.room_id); - if (!ConferenceHandler) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Call Handler', 'Conference call unsupported client', ErrorDialog, { - description: _t('Conference calls are not supported in this client'), - }); - } else if (!MatrixClientPeg.get().supportsVoip()) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Call Handler', 'VoIP is unsupported', ErrorDialog, { - title: _t('VoIP is unsupported'), - description: _t('You cannot place VoIP calls in this browser.'), - }); - } else if (MatrixClientPeg.get().isRoomEncrypted(payload.room_id)) { + + if (MatrixClientPeg.get().isRoomEncrypted(payload.room_id)) { // Conference calls are implemented by sending the media to central // server which combines the audio from all the participants together // into a single stream. This is incompatible with end-to-end encryption @@ -316,28 +307,46 @@ function _onAction(payload) { Modal.createTrackedDialog('Call Handler', 'Conference calls unsupported e2e', ErrorDialog, { description: _t('Conference calls are not supported in encrypted rooms'), }); + return; + } + + if (SettingsStore.isFeatureEnabled('feature_jitsi')) { + _startCallApp(payload.room_id, payload.type); } else { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog('Call Handler', 'Conference calling in development', QuestionDialog, { - title: _t('Warning!'), - description: _t('Conference calling is in development and may not be reliable.'), - onFinished: (confirm)=>{ - if (confirm) { - ConferenceHandler.createNewMatrixCall( - MatrixClientPeg.get(), payload.room_id, - ).done(function(call) { - placeCall(call); - }, function(err) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - console.error("Conference call failed: " + err); - Modal.createTrackedDialog('Call Handler', 'Failed to set up conference call', ErrorDialog, { - title: _t('Failed to set up conference call'), - description: _t('Conference call failed.') + ' ' + ((err && err.message) ? err.message : ''), + if (!ConferenceHandler) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Call Handler', 'Conference call unsupported client', ErrorDialog, { + description: _t('Conference calls are not supported in this client'), + }); + } else if (!MatrixClientPeg.get().supportsVoip()) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Call Handler', 'VoIP is unsupported', ErrorDialog, { + title: _t('VoIP is unsupported'), + description: _t('You cannot place VoIP calls in this browser.'), + }); + } else { + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + Modal.createTrackedDialog('Call Handler', 'Conference calling in development', QuestionDialog, { + title: _t('Warning!'), + description: _t('Conference calling is in development and may not be reliable.'), + onFinished: (confirm)=>{ + if (confirm) { + ConferenceHandler.createNewMatrixCall( + MatrixClientPeg.get(), payload.room_id, + ).done(function(call) { + placeCall(call); + }, function(err) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + console.error("Conference call failed: " + err); + Modal.createTrackedDialog('Call Handler', 'Failed to set up conference call', ErrorDialog, { + title: _t('Failed to set up conference call'), + description: _t('Conference call failed.') + ' ' + ((err && err.message) ? err.message : ''), + }); }); - }); - } - }, - }); + } + }, + }); + } } break; case 'incoming_call': @@ -378,6 +387,70 @@ function _onAction(payload) { break; } } + +function _startCallApp(roomId, type) { + dis.dispatch({ + action: 'appsDrawer', + show: true, + }); + + const room = MatrixClientPeg.get().getRoom(roomId); + if (!room) { + console.error("Attempted to start conference call widget in unknown room: " + roomId); + return; + } + + const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); + const currentJitsiWidgets = appsStateEvents.filter((ev) => { + ev.getContent().type == 'jitsi'; + }); + if (currentJitsiWidgets.length > 0) { + console.warn( + "Refusing to start conference call widget in " + roomId + + " a conference call widget is already present", + ); + return; + } + + // This inherits its poor naming from the field of the same name that goes into + // the event. It's just a random string to make the Jitsi URLs unique. + const widgetSessionId = Math.random().toString(36).substring(2); + const confId = room.roomId.replace(/[^A-Za-z0-9]/g, '') + widgetSessionId; + // NB. we can't just encodeURICompoent all of these because the $ signs need to be there + const queryString = [ + 'confId='+encodeURIComponent(confId), + 'isAudioConf='+(type === 'voice' ? 'true' : 'false'), + 'displayName=$matrix_display_name', + 'avatarUrl=$matrix_avatar_url', + 'email=$matrix_user_id', + ].join('&'); + const widgetUrl = ( + 'https://scalar.vector.im/api/widgets' + + '/jitsi.html?' + + queryString + ); + + const jitsiEvent = { + type: 'jitsi', + url: widgetUrl, + data: { + widgetSessionId: widgetSessionId, + }, + }; + const widgetId = ( + 'jitsi_' + + MatrixClientPeg.get().credentials.userId + + '_' + + Date.now() + ); + MatrixClientPeg.get().sendStateEvent( + roomId, + 'im.vector.modular.widgets', + jitsiEvent, + widgetId, + ).then(() => console.log('Sent state'), (e) => console.error(e)); +} + // FIXME: Nasty way of making sure we only register // with the dispatcher once if (!global.mxCallHandler) { diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 8763ea3d7f..f0b7eaa1d7 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -94,15 +94,7 @@ module.exports = React.createClass({ const hideWidgetKey = this.props.room.roomId + '_hide_widget_drawer'; switch (action.action) { case 'appsDrawer': - // When opening the app drawer when there aren't any apps, - // auto-launch the integrations manager to skip the awkward - // click on "Add widget" if (action.show) { - const apps = this._getApps(); - if (apps.length === 0) { - this._launchManageIntegrations(); - } - localStorage.removeItem(hideWidgetKey); } else { // Store hidden state of widget diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 28a90b375a..bac996e65c 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -159,54 +159,20 @@ export default class MessageComposer extends React.Component { }); } - // _startCallApp(isAudioConf) { - // dis.dispatch({ - // action: 'appsDrawer', - // show: true, - // }); - - // const appsStateEvents = this.props.room.currentState.getStateEvents('im.vector.modular.widgets', ''); - // let appsStateEvent = {}; - // if (appsStateEvents) { - // appsStateEvent = appsStateEvents.getContent(); - // } - // if (!appsStateEvent.videoConf) { - // appsStateEvent.videoConf = { - // type: 'jitsi', - // // FIXME -- This should not be localhost - // url: 'http://localhost:8000/jitsi.html', - // data: { - // confId: this.props.room.roomId.replace(/[^A-Za-z0-9]/g, '_') + Date.now(), - // isAudioConf: isAudioConf, - // }, - // }; - // MatrixClientPeg.get().sendStateEvent( - // this.props.room.roomId, - // 'im.vector.modular.widgets', - // appsStateEvent, - // '', - // ).then(() => console.log('Sent state'), (e) => console.error(e)); - // } - // } - onCallClick(ev) { - // NOTE -- Will be replaced by Jitsi code (currently commented) dis.dispatch({ action: 'place_call', type: ev.shiftKey ? "screensharing" : "video", room_id: this.props.room.roomId, }); - // this._startCallApp(false); } onVoiceCallClick(ev) { - // NOTE -- Will be replaced by Jitsi code (currently commented) dis.dispatch({ action: 'place_call', type: "voice", room_id: this.props.room.roomId, }); - // this._startCallApp(true); } onInputContentChanged(content: string, selection: {start: number, end: number}) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 41f67ad9d9..9af90d39d4 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -33,8 +33,8 @@ "VoIP is unsupported": "VoIP is unsupported", "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.", "You cannot place a call with yourself.": "You cannot place a call with yourself.", - "Conference calls are not supported in this client": "Conference calls are not supported in this client", "Conference calls are not supported in encrypted rooms": "Conference calls are not supported in encrypted rooms", + "Conference calls are not supported in this client": "Conference calls are not supported in this client", "Warning!": "Warning!", "Conference calling is in development and may not be reliable.": "Conference calling is in development and may not be reliable.", "Failed to set up conference call": "Failed to set up conference call", @@ -42,10 +42,6 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -85,7 +81,6 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", - "Unnamed Room": "Unnamed Room", "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", @@ -116,10 +111,8 @@ "You are not in this room.": "You are not in this room.", "You do not have permission to do that in this room.": "You do not have permission to do that in this room.", "Missing room_id in request": "Missing room_id in request", - "Must be viewing a room": "Must be viewing a room", "Room %(roomId)s not visible": "Room %(roomId)s not visible", "Missing user_id in request": "Missing user_id in request", - "Failed to lookup current room": "Failed to lookup current room", "Usage": "Usage", "/ddg is not a command": "/ddg is not a command", "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", @@ -184,13 +177,18 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", + "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", "Failed to join room": "Failed to join room", "Message Replies": "Message Replies", "Message Pinning": "Message Pinning", - "Tag Panel": "Tag Panel", + "Jitsi Conference Calling": "Jitsi Conference Calling", "Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing", "Use compact timeline layout": "Use compact timeline layout", "Hide removed messages": "Hide removed messages", @@ -297,29 +295,6 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -419,11 +394,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -557,6 +532,29 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -876,6 +874,10 @@ "Public Chat": "Public Chat", "Custom": "Custom", "Alias (optional)": "Alias (optional)", + "Reject invitation": "Reject invitation", + "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", + "Unable to reject invite": "Unable to reject invite", + "Reject": "Reject", "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", "Resend": "Resend", "Cancel Sending": "Cancel Sending", @@ -895,7 +897,6 @@ "Mentions only": "Mentions only", "Leave": "Leave", "Forget": "Forget", - "Reject": "Reject", "Low Priority": "Low Priority", "Direct Chat": "Direct Chat", "View Community": "View Community", @@ -930,7 +931,6 @@ "Failed to upload image": "Failed to upload image", "Failed to update community": "Failed to update community", "Unable to accept invite": "Unable to accept invite", - "Unable to reject invite": "Unable to reject invite", "Unable to join community": "Unable to join community", "Leave Community": "Leave Community", "Leave %(groupName)s?": "Leave %(groupName)s?", @@ -956,8 +956,6 @@ "Failed to load %(groupId)s": "Failed to load %(groupId)s", "Couldn't load home page": "Couldn't load home page", "Login": "Login", - "Reject invitation": "Reject invitation", - "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", "Failed to reject invitation": "Failed to reject invitation", "This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.", "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 039bd78d79..1eb30f5cc1 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -1,5 +1,6 @@ /* Copyright 2017 Travis Ralston +Copyright 2018 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. @@ -88,6 +89,12 @@ export const SETTINGS = { supportedLevels: LEVELS_FEATURE, default: false, }, + "feature_jitsi": { + isFeature: true, + displayName: _td("Jitsi Conference Calling"), + supportedLevels: LEVELS_FEATURE, + default: false, + }, "MessageComposerInput.dontSuggestEmoji": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, displayName: _td('Disable Emoji suggestions while typing'), From cfe52a2888b1231f687e4d09420263eab7a96725 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 15:13:59 +0100 Subject: [PATCH 231/480] Instead of passing dft.eventDecrypted, call it instead So that `this` has the correct reference. --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 7884829a76..2a2fee1a21 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1318,7 +1318,7 @@ export default React.createClass({ // When logging out, stop tracking failures and destroy state cli.on("Session.logged_out", stopDft); - cli.on("Event.decrypted", dft.eventDecrypted); + cli.on("Event.decrypted", (e) => dft.eventDecrypted(e)); const krh = new KeyRequestHandler(cli); cli.on("crypto.roomKeyRequest", (req) => { From 011154396ce3f86a96f7070d4190be1bf821a73b Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 15:15:48 +0100 Subject: [PATCH 232/480] Add extra, useful expectation to test --- test/DecryptionFailureTracker-test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index 34e2df2b6e..66bc6daf4b 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -120,6 +120,7 @@ describe.only('DecryptionFailureTracker', function() { tracker.trackFailure(); tracker.trackFailure(); + expect(failures.length).toBe(2, 'expected 2 failures to be tracked, got ' + failures.length); expect(failures[0].failedEventId).toBe(decryptedEvent.getId(), 'the first failure should be tracked first'); expect(failures[1].failedEventId).toBe(decryptedEvent2.getId(), 'the second failure should be tracked second'); From f08274585e873607963de9822f27458c51423d61 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 15:26:53 +0100 Subject: [PATCH 233/480] Persist tracked event ID hash using localStorage --- src/DecryptionFailureTracker.js | 18 +++++++++++---- src/components/structures/MatrixChat.js | 1 + test/DecryptionFailureTracker-test.js | 30 +++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 7bdfd6bfd0..2f3d286d55 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -36,7 +36,7 @@ export default class DecryptionFailureTracker { failuresToTrack = []; // Event IDs of failures that were tracked previously - eventTrackedPreviously = { + trackedEventHashMap = { // [eventIdHash(eventId)]: true }; @@ -59,6 +59,14 @@ export default class DecryptionFailureTracker { this.trackDecryptionFailure = fn; } + loadTrackedEventHashMap() { + this.trackedEventHashMap = JSON.parse(localStorage.getItem('mx-decryption-failure-event-id-hashes')); + } + + saveTrackedEventHashMap() { + localStorage.setItem('mx-decryption-failure-event-id-hashes', JSON.stringify(this.trackedEventHashMap)); + } + eventDecrypted(e) { if (e.isDecryptionFailure()) { this.addDecryptionFailureForEvent(e); @@ -122,7 +130,7 @@ export default class DecryptionFailureTracker { // Only track one failure per event const dedupedFailuresMap = failuresGivenGrace.reduce( (result, failure) => { - if (!this.eventTrackedPreviously[eventIdHash(failure.failedEventId)]) { + if (!this.trackedEventHashMap[eventIdHash(failure.failedEventId)]) { return {...result, [failure.failedEventId]: failure}; } else { return result; @@ -133,11 +141,13 @@ export default class DecryptionFailureTracker { const trackedEventIds = Object.keys(dedupedFailuresMap); - this.eventTrackedPreviously = trackedEventIds.reduce( + this.trackedEventHashMap = trackedEventIds.reduce( (result, eventId) => ({...result, [eventIdHash(eventId)]: true}), - this.eventTrackedPreviously, + this.trackedEventHashMap, ); + this.saveTrackedEventHashMap(); + const dedupedFailures = trackedEventIds.map((k) => dedupedFailuresMap[k]); this.failuresToTrack = [...this.failuresToTrack, ...dedupedFailures]; diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 2a2fee1a21..19c0c17d1d 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1313,6 +1313,7 @@ export default React.createClass({ // TODO: Pass reason for failure as third argument to trackEvent Analytics.trackEvent('E2E', 'Decryption failure'); }); + dft.loadEventTrackedPreviously(); const stopDft = dft.start(); diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index 66bc6daf4b..0ea710e5c7 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -150,4 +150,34 @@ describe.only('DecryptionFailureTracker', function() { done(); }); + + it('should not track a failure for an event that was tracked in a previous session', (done) => { + // This test uses localStorage, clear it beforehand + localStorage.clear(); + + const decryptedEvent = createFailedDecryptionEvent(); + + const failures = []; + const tracker = new DecryptionFailureTracker((failure) => failures.push(failure)); + + // Indicate decryption + tracker.eventDecrypted(decryptedEvent); + + // Pretend "now" is Infinity + // NB: This saves to localStorage specific to DFT + tracker.checkFailures(Infinity); + + tracker.trackFailure(); + + // Simulate the browser refreshing by destroying tracker and creating a new tracker + const secondTracker = new DecryptionFailureTracker((failure) => failures.push(failure)); + secondTracker.loadTrackedEventHashMap(); + secondTracker.eventDecrypted(decryptedEvent); + secondTracker.checkFailures(Infinity); + secondTracker.trackFailure(); + + expect(failures.length).toBe(1, 'should track a single failure per event per session, got ' + failures.length); + + done(); + }); }); From f22f2d7bd68b88d8b9ca200b0cdc2cff8481151a Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 15:49:33 +0100 Subject: [PATCH 234/480] Use a Map instead of Object to preserve failure ordering --- src/DecryptionFailureTracker.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 2f3d286d55..e668884f64 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -129,17 +129,18 @@ export default class DecryptionFailureTracker { // Only track one failure per event const dedupedFailuresMap = failuresGivenGrace.reduce( - (result, failure) => { + (map, failure) => { if (!this.trackedEventHashMap[eventIdHash(failure.failedEventId)]) { - return {...result, [failure.failedEventId]: failure}; + return map.set(failure.failedEventId, failure); } else { - return result; + return map; } }, - {}, + // Use a map to preseve key ordering + new Map(), ); - const trackedEventIds = Object.keys(dedupedFailuresMap); + const trackedEventIds = [...dedupedFailuresMap.keys()]; this.trackedEventHashMap = trackedEventIds.reduce( (result, eventId) => ({...result, [eventIdHash(eventId)]: true}), @@ -148,7 +149,7 @@ export default class DecryptionFailureTracker { this.saveTrackedEventHashMap(); - const dedupedFailures = trackedEventIds.map((k) => dedupedFailuresMap[k]); + const dedupedFailures = dedupedFailuresMap.values(); this.failuresToTrack = [...this.failuresToTrack, ...dedupedFailures]; } From 7489d7d5313b2f1aa59efd6a0332382a404a7f57 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 16:50:52 +0100 Subject: [PATCH 235/480] Fix incorrect call to DFT --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 19c0c17d1d..818d058271 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1313,7 +1313,7 @@ export default React.createClass({ // TODO: Pass reason for failure as third argument to trackEvent Analytics.trackEvent('E2E', 'Decryption failure'); }); - dft.loadEventTrackedPreviously(); + dft.loadTrackedEventHashMap(); const stopDft = dft.start(); From c5252be4a86b52ef15074f45ab2accbc763aeefb Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 16:51:11 +0100 Subject: [PATCH 236/480] Test everything, not just DFT --- test/DecryptionFailureTracker-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index 0ea710e5c7..dc77b4f1d8 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -30,7 +30,7 @@ function createFailedDecryptionEvent() { return event; } -describe.only('DecryptionFailureTracker', function() { +describe('DecryptionFailureTracker', function() { it('tracks a failed decryption', function(done) { const failedDecryptionEvent = createFailedDecryptionEvent(); let trackedFailure = null; From 98ed93ee5bd9da1bd937e5c1c714f76f74a144bf Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 16:59:42 +0100 Subject: [PATCH 237/480] Don't hash the eventId (it's uneccessary) --- src/DecryptionFailureTracker.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index e668884f64..2a7f2a4e26 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -21,10 +21,6 @@ class DecryptionFailure { } } -function eventIdHash(eventId) { - return crypto.subtle.digest('SHA-256', eventId); -} - export default class DecryptionFailureTracker { // Array of items of type DecryptionFailure. Every `CHECK_INTERVAL_MS`, this list // is checked for failures that happened > `GRACE_PERIOD_MS` ago. Those that did @@ -37,7 +33,7 @@ export default class DecryptionFailureTracker { // Event IDs of failures that were tracked previously trackedEventHashMap = { - // [eventIdHash(eventId)]: true + // [eventId]: true }; // Spread the load on `Analytics` by sending at most 1 event per @@ -130,7 +126,7 @@ export default class DecryptionFailureTracker { // Only track one failure per event const dedupedFailuresMap = failuresGivenGrace.reduce( (map, failure) => { - if (!this.trackedEventHashMap[eventIdHash(failure.failedEventId)]) { + if (!this.trackedEventHashMap[failure.failedEventId]) { return map.set(failure.failedEventId, failure); } else { return map; @@ -143,7 +139,7 @@ export default class DecryptionFailureTracker { const trackedEventIds = [...dedupedFailuresMap.keys()]; this.trackedEventHashMap = trackedEventIds.reduce( - (result, eventId) => ({...result, [eventIdHash(eventId)]: true}), + (result, eventId) => ({...result, [eventId]: true}), this.trackedEventHashMap, ); From edfc9a0841f8b23d3bb99744be692e99d9431364 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 17:00:12 +0100 Subject: [PATCH 238/480] Fix bug with localStorage loading --- src/DecryptionFailureTracker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 2a7f2a4e26..337f4b08c3 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -56,7 +56,7 @@ export default class DecryptionFailureTracker { } loadTrackedEventHashMap() { - this.trackedEventHashMap = JSON.parse(localStorage.getItem('mx-decryption-failure-event-id-hashes')); + this.trackedEventHashMap = JSON.parse(localStorage.getItem('mx-decryption-failure-event-id-hashes')) || {}; } saveTrackedEventHashMap() { From 488cc416cf33fea9016fbb7dfa68130f7a0b91af Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 17:08:11 +0100 Subject: [PATCH 239/480] For now, shelve persistance across sessions --- src/DecryptionFailureTracker.js | 16 +++++++++------- src/components/structures/MatrixChat.js | 5 ++++- test/DecryptionFailureTracker-test.js | 6 ++++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 337f4b08c3..069d06bbd1 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -55,13 +55,13 @@ export default class DecryptionFailureTracker { this.trackDecryptionFailure = fn; } - loadTrackedEventHashMap() { - this.trackedEventHashMap = JSON.parse(localStorage.getItem('mx-decryption-failure-event-id-hashes')) || {}; - } + // loadTrackedEventHashMap() { + // this.trackedEventHashMap = JSON.parse(localStorage.getItem('mx-decryption-failure-event-id-hashes')) || {}; + // } - saveTrackedEventHashMap() { - localStorage.setItem('mx-decryption-failure-event-id-hashes', JSON.stringify(this.trackedEventHashMap)); - } + // saveTrackedEventHashMap() { + // localStorage.setItem('mx-decryption-failure-event-id-hashes', JSON.stringify(this.trackedEventHashMap)); + // } eventDecrypted(e) { if (e.isDecryptionFailure()) { @@ -143,7 +143,9 @@ export default class DecryptionFailureTracker { this.trackedEventHashMap, ); - this.saveTrackedEventHashMap(); + // Commented out for now for expediency, we need to consider unbound nature of storing + // this in localStorage + // this.saveTrackedEventHashMap(); const dedupedFailures = dedupedFailuresMap.values(); diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 818d058271..8b36658de4 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1313,7 +1313,10 @@ export default React.createClass({ // TODO: Pass reason for failure as third argument to trackEvent Analytics.trackEvent('E2E', 'Decryption failure'); }); - dft.loadTrackedEventHashMap(); + + // Shelved for later date when we have time to think about persisting history of + // tracked events across sessions. + // dft.loadTrackedEventHashMap(); const stopDft = dft.start(); diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index dc77b4f1d8..c4f3116cba 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -151,7 +151,7 @@ describe('DecryptionFailureTracker', function() { done(); }); - it('should not track a failure for an event that was tracked in a previous session', (done) => { + xit('should not track a failure for an event that was tracked in a previous session', (done) => { // This test uses localStorage, clear it beforehand localStorage.clear(); @@ -171,7 +171,9 @@ describe('DecryptionFailureTracker', function() { // Simulate the browser refreshing by destroying tracker and creating a new tracker const secondTracker = new DecryptionFailureTracker((failure) => failures.push(failure)); - secondTracker.loadTrackedEventHashMap(); + + //secondTracker.loadTrackedEventHashMap(); + secondTracker.eventDecrypted(decryptedEvent); secondTracker.checkFailures(Infinity); secondTracker.trackFailure(); From 949daf6efd65f67ba06ca97979019b2b7e775a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Fri, 15 Jun 2018 16:08:40 +0000 Subject: [PATCH 240/480] Translated using Weblate (French) Currently translated at 100.0% (1203 of 1203 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 97414b7e72..7291e8b6fb 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1191,5 +1191,15 @@ "Encrypting": "Chiffrement en cours", "Encrypted, not sent": "Chiffré, pas envoyé", "No Audio Outputs detected": "Aucune sortie audio détectée", - "Audio Output": "Sortie audio" + "Audio Output": "Sortie audio", + "Share Link to User": "Partager le lien à l'utilisateur", + "Share room": "Partager le salon", + "Share Room": "Partager le salon", + "Link to most recent message": "Lien vers le message le plus récent", + "Share User": "Partager l'utilisateur", + "Share Community": "Partager la communauté", + "Share Room Message": "Partager le message du salon", + "Link to selected message": "Lien vers le message sélectionné", + "COPY": "COPIER", + "Share Message": "Partager le message" } From b0a277288927597dad8c7c6522e8b04a68377481 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 15 Jun 2018 17:58:43 +0100 Subject: [PATCH 241/480] Use more consistent start/stop pattern --- src/DecryptionFailureTracker.js | 25 +++++++++++++++---------- src/components/structures/MatrixChat.js | 4 ++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 069d06bbd1..b1c6a71289 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -36,6 +36,10 @@ export default class DecryptionFailureTracker { // [eventId]: true }; + // Set to an interval ID when `start` is called + checkInterval = null; + trackInterval = null; + // Spread the load on `Analytics` by sending at most 1 event per // `TRACK_INTERVAL_MS`. static TRACK_INTERVAL_MS = 1000; @@ -82,27 +86,28 @@ export default class DecryptionFailureTracker { /** * Start checking for and tracking failures. - * @return {function} a function that clears state and causes DFT to stop checking for - * and tracking failures. */ start() { - const checkInterval = setInterval( + this.checkInterval = setInterval( () => this.checkFailures(Date.now()), DecryptionFailureTracker.CHECK_INTERVAL_MS, ); - const trackInterval = setInterval( + this.trackInterval = setInterval( () => this.trackFailure(), DecryptionFailureTracker.TRACK_INTERVAL_MS, ); + } - return () => { - clearInterval(checkInterval); - clearInterval(trackInterval); + /** + * Clear state and stop checking for and tracking failures. + */ + stop() { + clearInterval(this.checkInterval); + clearInterval(this.trackInterval); - this.failures = []; - this.failuresToTrack = []; - }; + this.failures = []; + this.failuresToTrack = []; } /** diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 8b36658de4..2794e81788 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1318,10 +1318,10 @@ export default React.createClass({ // tracked events across sessions. // dft.loadTrackedEventHashMap(); - const stopDft = dft.start(); + dft.start(); // When logging out, stop tracking failures and destroy state - cli.on("Session.logged_out", stopDft); + cli.on("Session.logged_out", () => dft.stop()); cli.on("Event.decrypted", (e) => dft.eventDecrypted(e)); const krh = new KeyRequestHandler(cli); From 856d1ee5f997e1558c7d01c8a01537ebb9066bc2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 18:39:12 +0100 Subject: [PATCH 242/480] fix: Invalid prop `focus` of type `string` supplied to `DialogButtons` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/ChatCreateOrReuseDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/ChatCreateOrReuseDialog.js b/src/components/views/dialogs/ChatCreateOrReuseDialog.js index e2387064cf..80c6b8502c 100644 --- a/src/components/views/dialogs/ChatCreateOrReuseDialog.js +++ b/src/components/views/dialogs/ChatCreateOrReuseDialog.js @@ -170,7 +170,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { { profile } </div> <DialogButtons primaryButton={_t('Start Chatting')} - onPrimaryButtonClick={this.props.onNewDMClick} focus="true" /> + onPrimaryButtonClick={this.props.onNewDMClick} focus={true} /> </div>; } From 5fbadbc44f415589bb70d79bcafc607403819ebb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 18:42:51 +0100 Subject: [PATCH 243/480] comment out `visibility:hidden` div as it seems unfinished and refers to undefined method `this._onJoinGroupClick` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MyGroups.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/MyGroups.js b/src/components/structures/MyGroups.js index 7a93cfb886..0bfb30674e 100644 --- a/src/components/structures/MyGroups.js +++ b/src/components/structures/MyGroups.js @@ -124,7 +124,7 @@ export default withMatrixClient(React.createClass({ ) } </div> </div> - <div className="mx_MyGroups_joinBox mx_MyGroups_headerCard"> + {/*<div className="mx_MyGroups_joinBox mx_MyGroups_headerCard"> <AccessibleButton className='mx_MyGroups_headerCard_button' onClick={this._onJoinGroupClick}> <TintableSvg src="img/icons-create-room.svg" width="50" height="50" /> </AccessibleButton> @@ -140,7 +140,7 @@ export default withMatrixClient(React.createClass({ { 'i': (sub) => <i>{ sub }</i> }) } </div> - </div> + </div>*/} </div> <div className="mx_MyGroups_content"> { contentHeader } From a2219472f6a115897ba23c6dcdfea64722d568b0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 18:47:15 +0100 Subject: [PATCH 244/480] inline redundant `bodyNodes`, fixes react no unique key warning too Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/GroupView.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/components/structures/GroupView.js b/src/components/structures/GroupView.js index c7610219f7..365aadffa5 100644 --- a/src/components/structures/GroupView.js +++ b/src/components/structures/GroupView.js @@ -1127,10 +1127,6 @@ export default React.createClass({ let avatarNode; let nameNode; let shortDescNode; - const bodyNodes = [ - this._getMembershipSection(), - this._getGroupSection(), - ]; const rightButtons = []; if (this.state.editing && this.state.isUserPrivileged) { let avatarImage; @@ -1269,7 +1265,8 @@ export default React.createClass({ </div> </div> <GeminiScrollbarWrapper className="mx_GroupView_body"> - { bodyNodes } + { this._getMembershipSection() } + { this._getGroupSection() } </GeminiScrollbarWrapper> </div> ); From a7f5059aca1b6e61ade8ce5512ea782a22b20d08 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 18:55:21 +0100 Subject: [PATCH 245/480] add nop to fix `onClick` being required warning Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/groups/GroupTile.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/groups/GroupTile.js b/src/components/views/groups/GroupTile.js index c1554cd9ed..509c209baa 100644 --- a/src/components/views/groups/GroupTile.js +++ b/src/components/views/groups/GroupTile.js @@ -22,6 +22,7 @@ import sdk from '../../../index'; import dis from '../../../dispatcher'; import FlairStore from '../../../stores/FlairStore'; +function nop() {} const GroupTile = React.createClass({ displayName: 'GroupTile', @@ -81,7 +82,7 @@ const GroupTile = React.createClass({ ) : null; // XXX: Use onMouseDown as a workaround for https://github.com/atlassian/react-beautiful-dnd/issues/273 // instead of onClick. Otherwise we experience https://github.com/vector-im/riot-web/issues/6156 - return <AccessibleButton className="mx_GroupTile" onMouseDown={this.onMouseDown}> + return <AccessibleButton className="mx_GroupTile" onMouseDown={this.onMouseDown} onClick={nop}> <Droppable droppableId="my-groups-droppable" type="draggable-TagTile"> { (droppableProvided, droppableSnapshot) => ( <div ref={droppableProvided.innerRef}> From a899871d52f6c296285064ff9a08ec38cab24fdd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 18:55:37 +0100 Subject: [PATCH 246/480] specify unique key to make react happy Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MyGroups.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MyGroups.js b/src/components/structures/MyGroups.js index 0bfb30674e..edb50fcedb 100644 --- a/src/components/structures/MyGroups.js +++ b/src/components/structures/MyGroups.js @@ -70,7 +70,7 @@ export default withMatrixClient(React.createClass({ if (this.state.groups) { const groupNodes = []; this.state.groups.forEach((g) => { - groupNodes.push(<GroupTile groupId={g} />); + groupNodes.push(<GroupTile key={g} groupId={g} />); }); contentHeader = groupNodes.length > 0 ? <h3>{ _t('Your Communities') }</h3> : <div />; content = groupNodes.length > 0 ? From 43681026b8f93f14bb5fbd7f97b52e36f506866f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 19:01:12 +0100 Subject: [PATCH 247/480] s/onClick/onChange because react cries about it Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/GroupView.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/GroupView.js b/src/components/structures/GroupView.js index 365aadffa5..96dea14c1f 100644 --- a/src/components/structures/GroupView.js +++ b/src/components/structures/GroupView.js @@ -1052,7 +1052,7 @@ export default React.createClass({ <input type="radio" value={GROUP_JOINPOLICY_INVITE} checked={this.state.joinableForm.policyType === GROUP_JOINPOLICY_INVITE} - onClick={this._onJoinableChange} + onChange={this._onJoinableChange} /> <div className="mx_GroupView_label_text"> { _t('Only people who have been invited') } @@ -1064,7 +1064,7 @@ export default React.createClass({ <input type="radio" value={GROUP_JOINPOLICY_OPEN} checked={this.state.joinableForm.policyType === GROUP_JOINPOLICY_OPEN} - onClick={this._onJoinableChange} + onChange={this._onJoinableChange} /> <div className="mx_GroupView_label_text"> { _t('Everyone') } From b97aa77acac821a429e727edce3ce46365e88819 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 19:27:23 +0100 Subject: [PATCH 248/480] factor out warn self demote and apply to muting yourself Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/MemberInfo.js | 53 +++++++++++++++++------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 2789c0e4cd..4a163b6a00 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -332,13 +332,42 @@ module.exports = withMatrixClient(React.createClass({ }); }, - onMuteToggle: function() { + _warnSelfDemote: function() { + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + return new Promise((resolve) => { + Modal.createTrackedDialog('Demoting Self', '', QuestionDialog, { + title: _t("Warning!"), + description: + <div> + { _t("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.") } + <br /> + { _t("Are you sure?") } + </div>, + button: _t("Continue"), + onFinished: resolve, + }); + }); + }, + + onMuteToggle: async function() { const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const roomId = this.props.member.roomId; const target = this.props.member.userId; const room = this.props.matrixClient.getRoom(roomId); if (!room) return; + // if muting self, warn as it may be irreversible + if (target === this.props.matrixClient.getUserId()) { + try { + if (!await this._warnSelfDemote()) return; + } catch (e) { + console.error("Failed to warn about self demotion: ", e); + return; + } + } + const powerLevelEvent = room.currentState.getStateEvents("m.room.power_levels", ""); if (!powerLevelEvent) return; @@ -436,7 +465,7 @@ module.exports = withMatrixClient(React.createClass({ }).done(); }, - onPowerChange: function(powerLevel) { + onPowerChange: async function(powerLevel) { const roomId = this.props.member.roomId; const target = this.props.member.userId; const room = this.props.matrixClient.getRoom(roomId); @@ -455,20 +484,12 @@ module.exports = withMatrixClient(React.createClass({ // If we are changing our own PL it can only ever be decreasing, which we cannot reverse. if (myUserId === target) { - Modal.createTrackedDialog('Demoting Self', '', QuestionDialog, { - title: _t("Warning!"), - description: - <div> - { _t("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.") }<br /> - { _t("Are you sure?") } - </div>, - button: _t("Continue"), - onFinished: (confirmed) => { - if (confirmed) { - this._applyPowerChange(roomId, target, powerLevel, powerLevelEvent); - } - }, - }); + try { + if (!await this._warnSelfDemote()) return; + this._applyPowerChange(roomId, target, powerLevel, powerLevelEvent); + } catch (e) { + console.error("Failed to warn about self demotion: ", e); + } return; } From df1584148334646e0e278617b6041f7520989b82 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 15 Jun 2018 19:28:23 +0100 Subject: [PATCH 249/480] split too long line Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/MemberInfo.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 4a163b6a00..6680e7d02c 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -499,7 +499,8 @@ module.exports = withMatrixClient(React.createClass({ title: _t("Warning!"), description: <div> - { _t("You will not be able to undo this change as you are promoting the user to have the same power level as yourself.") }<br /> + { _t("You will not be able to undo this change as you are promoting the user " + + "to have the same power level as yourself.") }<br /> { _t("Are you sure?") } </div>, button: _t("Continue"), From 4f693a1ff5f51e876ed94d717d4903e89f782ccd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 08:27:17 +0100 Subject: [PATCH 250/480] implement group links in matrixLinkify:MATRIXTO. Simplify if/else w/ map Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/linkify-matrix.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 6bbea77733..328cb98888 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -169,11 +169,18 @@ matrixLinkify.VECTOR_URL_PATTERN = "^(?:https?:\/\/)?(?:" + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" + ")(#.*)"; -matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?:\/\/)?(?:www\\.)?matrix\\.to/#/((#|@|!).*)"; +matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?:\/\/)?(?:www\\.)?matrix\\.to/#/([#@!+].*)"; matrixLinkify.MATRIXTO_MD_LINK_PATTERN = - '\\[([^\\]]*)\\]\\((?:https?:\/\/)?(?:www\\.)?matrix\\.to/#/((#|@|!)[^\\)]*)\\)'; + '\\[([^\\]]*)\\]\\((?:https?:\/\/)?(?:www\\.)?matrix\\.to/#/([#@!+][^\\)]*)\\)'; matrixLinkify.MATRIXTO_BASE_URL= baseUrl; +const matrixToEntityMap = { + '@': '#/user/', + '#': '#/room/', + '!': '#/room/', + '+': '#/group/', +}; + matrixLinkify.options = { events: function(href, type) { switch (type) { @@ -204,24 +211,20 @@ matrixLinkify.options = { case 'userid': case 'groupid': return matrixLinkify.MATRIXTO_BASE_URL + '/#/' + href; - default: - var m; + default: { // FIXME: horrible duplication with HtmlUtils' transform tags - m = href.match(matrixLinkify.VECTOR_URL_PATTERN); + let m = href.match(matrixLinkify.VECTOR_URL_PATTERN); if (m) { return m[1]; } m = href.match(matrixLinkify.MATRIXTO_URL_PATTERN); if (m) { const entity = m[1]; - if (entity[0] === '@') { - return '#/user/' + entity; - } else if (entity[0] === '#' || entity[0] === '!') { - return '#/room/' + entity; - } + if (matrixToEntityMap[entity[0]]) return matrixToEntityMap[entity[0]] + entity; } return href; + } } }, From 3ebec92ac592e0c10f37f1f47fa09989536319d8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 08:27:47 +0100 Subject: [PATCH 251/480] replace hardcoded `matrix.to` with reference to const in matrix-to for easier changing Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/TextualBody.js | 3 ++- src/matrix-to.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 018754411c..60377a47d7 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -36,6 +36,7 @@ import * as ContextualMenu from '../../structures/ContextualMenu'; import SettingsStore from "../../../settings/SettingsStore"; import PushProcessor from 'matrix-js-sdk/lib/pushprocessor'; import ReplyThread from "../elements/ReplyThread"; +import {host as matrixtoHost} from '../../../matrix-to'; linkifyMatrix(linkify); @@ -304,7 +305,7 @@ module.exports = React.createClass({ // never preview matrix.to links (if anything we should give a smart // preview of the room/user they point to: nobody needs to be reminded // what the matrix.to site looks like). - if (host == 'matrix.to') return false; + if (host === matrixtoHost) return false; if (node.textContent.toLowerCase().trim().startsWith(host.toLowerCase())) { // it's a "foo.pl" style link diff --git a/src/matrix-to.js b/src/matrix-to.js index 72fb3c38fc..90b0a66090 100644 --- a/src/matrix-to.js +++ b/src/matrix-to.js @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -export const baseUrl = "https://matrix.to"; +export const host = "matrix.to"; +export const baseUrl = `https://${host}`; export function makeEventPermalink(roomId, eventId) { return `${baseUrl}/#/${roomId}/${eventId}`; From efaccf734478cc01d0bb67208d26d0ffbf34d074 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 08:42:28 +0100 Subject: [PATCH 252/480] implement `hitting enter after Ctrl-K should switch to the first result` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LeftPanel.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index 5acceb1009..f3ca005f55 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -93,6 +93,11 @@ var LeftPanel = React.createClass({ this._onMoveFocus(false); handled = true; break; + case KeyCode.ENTER: + this._onMoveFocus(false); + this.focusedElement.click(); + handled = true; + break; } if (handled) { From 897121163917e9576c92e66eed067121e3665217 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 08:42:40 +0100 Subject: [PATCH 253/480] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LeftPanel.js | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index f3ca005f55..416012c5f1 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -107,37 +107,33 @@ var LeftPanel = React.createClass({ }, _onMoveFocus: function(up) { - var element = this.focusedElement; + let element = this.focusedElement; // unclear why this isn't needed // var descending = (up == this.focusDirection) ? this.focusDescending : !this.focusDescending; // this.focusDirection = up; - var descending = false; // are we currently descending or ascending through the DOM tree? - var classes; + let descending = false; // are we currently descending or ascending through the DOM tree? + let classes; do { - var child = up ? element.lastElementChild : element.firstElementChild; - var sibling = up ? element.previousElementSibling : element.nextElementSibling; + const child = up ? element.lastElementChild : element.firstElementChild; + const sibling = up ? element.previousElementSibling : element.nextElementSibling; if (descending) { if (child) { element = child; - } - else if (sibling) { + } else if (sibling) { element = sibling; - } - else { + } else { descending = false; element = element.parentElement; } - } - else { + } else { if (sibling) { element = sibling; descending = true; - } - else { + } else { element = element.parentElement; } } @@ -149,8 +145,7 @@ var LeftPanel = React.createClass({ descending = true; } } - - } while(element && !( + } while (element && !( classes.contains("mx_RoomTile") || classes.contains("mx_SearchBox_search") || classes.contains("mx_RoomSubList_ellipsis"))); From 1afdb0e3c053dd45dd25fe8742c44449c2552269 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 08:44:57 +0100 Subject: [PATCH 254/480] add null-guard Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LeftPanel.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index 416012c5f1..7517103d88 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -95,7 +95,9 @@ var LeftPanel = React.createClass({ break; case KeyCode.ENTER: this._onMoveFocus(false); - this.focusedElement.click(); + if (this.focusedElement) { + this.focusedElement.click(); + } handled = true; break; } From ff33ef4b5150439f97e9bb21bee9e42e5efa4338 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 08:50:53 +0100 Subject: [PATCH 255/480] allow using tab to navigate room list smarter Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LeftPanel.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index 5acceb1009..7a930fa233 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -85,6 +85,10 @@ var LeftPanel = React.createClass({ let handled = false; switch (ev.keyCode) { + case KeyCode.TAB: + this._onMoveFocus(ev.shiftKey); + handled = true; + break; case KeyCode.UP: this._onMoveFocus(true); handled = true; From 423b8939e7c015eadbbe9e778031773b99614ff4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 08:52:14 +0100 Subject: [PATCH 256/480] simplify handled logic by inverting it Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/LeftPanel.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index 7a930fa233..7b115a6c4b 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -82,21 +82,20 @@ var LeftPanel = React.createClass({ _onKeyDown: function(ev) { if (!this.focusedElement) return; - let handled = false; + let handled = true; switch (ev.keyCode) { case KeyCode.TAB: this._onMoveFocus(ev.shiftKey); - handled = true; break; case KeyCode.UP: this._onMoveFocus(true); - handled = true; break; case KeyCode.DOWN: this._onMoveFocus(false); - handled = true; break; + default: + handled = false; } if (handled) { From 8fa96e19d562666410786ee7cfa506463693ea88 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 09:07:16 +0100 Subject: [PATCH 257/480] allow rightclicking for exposing room tile context menus Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/groups/GroupInviteTile.js | 16 +++++++++++++--- src/components/views/rooms/RoomTile.js | 17 ++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 4d5f3c6f3a..fff9aafac1 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -66,6 +66,11 @@ export default React.createClass({ }); }, + onContextMenu: function(e) { + this.onBadgeClicked(e); + e.preventDefault(); + }, + onBadgeClicked: function(e) { // Prevent the RoomTile onClick event firing as well e.stopPropagation(); @@ -79,7 +84,7 @@ export default React.createClass({ } const RoomTileContextMenu = sdk.getComponent('context_menus.GroupInviteTileContextMenu'); - const elementRect = e.target.getBoundingClientRect(); + const elementRect = this.refs.badge.getBoundingClientRect(); // The window X and Y offsets are to adjust position when zoomed in to page const x = elementRect.right + window.pageXOffset + 3; @@ -125,7 +130,7 @@ export default React.createClass({ }); const badgeContent = badgeEllipsis ? '\u00B7\u00B7\u00B7' : '!'; - const badge = <div className={badgeClasses} onClick={this.onBadgeClicked}>{ badgeContent }</div>; + const badge = <div className={badgeClasses} ref="badge" onClick={this.onBadgeClicked}>{ badgeContent }</div>; let tooltip; if (this.props.collapsed && this.state.hover) { @@ -139,7 +144,12 @@ export default React.createClass({ }); return ( - <AccessibleButton className={classes} onClick={this.onClick} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}> + <AccessibleButton className={classes} + onClick={this.onClick} + onMouseEnter={this.onMouseEnter} + onMouseLeave={this.onMouseLeave} + onContextMenu={this.onContextMenu} + > <div className="mx_RoomTile_avatar"> { av } </div> diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 11eb2090f2..1a9e404012 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -187,6 +187,11 @@ module.exports = React.createClass({ this.badgeOnMouseLeave(); }, + onContextMenu: function(e) { + this.onBadgeClicked(e); + e.preventDefault(); + }, + badgeOnMouseEnter: function() { // Only allow non-guests to access the context menu // and only change it if it needs to change @@ -208,7 +213,7 @@ module.exports = React.createClass({ } const RoomTileContextMenu = sdk.getComponent('context_menus.RoomTileContextMenu'); - const elementRect = e.target.getBoundingClientRect(); + const elementRect = this.refs.badge.getBoundingClientRect(); // The window X and Y offsets are to adjust position when zoomed in to page const x = elementRect.right + window.pageXOffset + 3; @@ -280,7 +285,7 @@ module.exports = React.createClass({ badgeContent = '\u200B'; } - badge = <div className={badgeClasses} onClick={this.onBadgeClicked}>{ badgeContent }</div>; + badge = <div className={badgeClasses} ref="badge" onClick={this.onBadgeClicked}>{ badgeContent }</div>; const EmojiText = sdk.getComponent('elements.EmojiText'); let label; @@ -317,7 +322,13 @@ module.exports = React.createClass({ directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm" />; } - return <AccessibleButton className={classes} tabIndex="0" onClick={this.onClick} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}> + return <AccessibleButton tabIndex="0" + className={classes} + onClick={this.onClick} + onMouseEnter={this.onMouseEnter} + onMouseLeave={this.onMouseLeave} + onContextMenu={this.onContextMenu} + > <div className={avatarClasses}> <div className="mx_RoomTile_avatar_container"> <RoomAvatar room={this.props.room} width={24} height={24} /> From 4fdb64a04957309d691d8f80aeaf6971ab5a17f3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 09:10:13 +0100 Subject: [PATCH 258/480] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomTile.js | 38 +++++++++++--------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 1a9e404012..bb9e0a8d3b 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -1,6 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,19 +16,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; -const React = require('react'); -const ReactDOM = require("react-dom"); +import React from 'react'; import PropTypes from 'prop-types'; -const classNames = require('classnames'); +import classNames from 'classnames'; import dis from '../../../dispatcher'; -const MatrixClientPeg = require('../../../MatrixClientPeg'); +import MatrixClientPeg from '../../../MatrixClientPeg'; import DMRoomMap from '../../../utils/DMRoomMap'; -const sdk = require('../../../index'); -const ContextualMenu = require('../../structures/ContextualMenu'); -const RoomNotifs = require('../../../RoomNotifs'); -const FormattingUtils = require('../../../utils/FormattingUtils'); +import sdk from '../../../index'; +import ContextualMenu from '../../structures/ContextualMenu'; +import * as RoomNotifs from '../../../RoomNotifs'; +import * as FormattingUtils from '../../../utils/FormattingUtils'; import AccessibleButton from '../elements/AccessibleButton'; import ActiveRoomObserver from '../../../ActiveRoomObserver'; import RoomViewStore from '../../../stores/RoomViewStore'; @@ -72,16 +71,12 @@ module.exports = React.createClass({ }, _shouldShowMentionBadge: function() { - return this.state.notifState != RoomNotifs.MUTE; + return this.state.notifState !== RoomNotifs.MUTE; }, _isDirectMessageRoom: function(roomId) { const dmRooms = DMRoomMap.shared().getUserIdForRoomId(roomId); - if (dmRooms) { - return true; - } else { - return false; - } + return Boolean(dmRooms); }, onRoomTimeline: function(ev, room) { @@ -99,7 +94,7 @@ module.exports = React.createClass({ }, onAccountData: function(accountDataEvent) { - if (accountDataEvent.getType() == 'm.push_rules') { + if (accountDataEvent.getType() === 'm.push_rules') { this.setState({ notifState: RoomNotifs.getRoomNotifsState(this.props.room.roomId), }); @@ -255,7 +250,7 @@ module.exports = React.createClass({ 'mx_RoomTile_unread': this.props.unread, 'mx_RoomTile_unreadNotify': notifBadges, 'mx_RoomTile_highlight': mentionBadges, - 'mx_RoomTile_invited': (me && me.membership == 'invite'), + 'mx_RoomTile_invited': (me && me.membership === 'invite'), 'mx_RoomTile_menuDisplayed': this.state.menuDisplayed, 'mx_RoomTile_noBadges': !badges, 'mx_RoomTile_transparent': this.props.transparent, @@ -273,7 +268,6 @@ module.exports = React.createClass({ let name = this.state.roomName; name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon - let badge; let badgeContent; if (this.state.badgeHover || this.state.menuDisplayed) { @@ -285,7 +279,7 @@ module.exports = React.createClass({ badgeContent = '\u200B'; } - badge = <div className={badgeClasses} ref="badge" onClick={this.onBadgeClicked}>{ badgeContent }</div>; + const badge = <div className={badgeClasses} ref="badge" onClick={this.onBadgeClicked}>{ badgeContent }</div>; const EmojiText = sdk.getComponent('elements.EmojiText'); let label; @@ -317,9 +311,9 @@ module.exports = React.createClass({ const RoomAvatar = sdk.getComponent('avatars.RoomAvatar'); - let directMessageIndicator; + let dmIndicator; if (this._isDirectMessageRoom(this.props.room.roomId)) { - directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm" />; + dmIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm" />; } return <AccessibleButton tabIndex="0" @@ -332,7 +326,7 @@ module.exports = React.createClass({ <div className={avatarClasses}> <div className="mx_RoomTile_avatar_container"> <RoomAvatar room={this.props.room} width={24} height={24} /> - { directMessageIndicator } + { dmIndicator } </div> </div> <div className="mx_RoomTile_nameContainer"> From 61e09395d0c49981663a3f6bbc110498127e9709 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 09:45:06 +0100 Subject: [PATCH 259/480] split continuations if longer than N Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MessagePanel.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 50bdb37734..6e4697a8f0 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -1,5 +1,6 @@ /* Copyright 2016 OpenMarket Ltd +Copyright 2018 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. @@ -25,6 +26,9 @@ import sdk from '../../index'; import MatrixClientPeg from '../../MatrixClientPeg'; +const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes +const continuedTypes = ['m.sticker', 'm.room.message']; + /* (almost) stateless UI component which builds the event tiles in the room timeline. */ module.exports = React.createClass({ @@ -449,16 +453,17 @@ module.exports = React.createClass({ // Some events should appear as continuations from previous events of // different types. - const continuedTypes = ['m.sticker', 'm.room.message']; + const eventTypeContinues = prevEvent !== null && continuedTypes.includes(mxEv.getType()) && continuedTypes.includes(prevEvent.getType()); - if (prevEvent !== null - && prevEvent.sender && mxEv.sender - && mxEv.sender.userId === prevEvent.sender.userId - && (mxEv.getType() == prevEvent.getType() || eventTypeContinues)) { + // if there is a previous event and it has the same sender as this event + // and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL + if (prevEvent !== null && prevEvent.sender && mxEv.sender && mxEv.sender.userId === prevEvent.sender.userId && + (mxEv.getType() === prevEvent.getType() || eventTypeContinues) && + (mxEv.getTs() - prevEvent.getTs() <= CONTINUATION_MAX_INTERVAL)) { continuation = true; } From 7d19841e6860c4a0de465398180cba85f314b8b6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 09:48:57 +0100 Subject: [PATCH 260/480] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/MessagePanel.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 6e4697a8f0..f5fa2ceabf 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -193,7 +193,7 @@ module.exports = React.createClass({ /** * Page up/down. * - * mult: -1 to page up, +1 to page down + * @param {number} mult: -1 to page up, +1 to page down */ scrollRelative: function(mult) { if (this.refs.scrollPanel) { @@ -203,6 +203,8 @@ module.exports = React.createClass({ /** * Scroll up/down in response to a scroll key + * + * @param {KeyboardEvent} ev: the keyboard event to handle */ handleScrollKey: function(ev) { if (this.refs.scrollPanel) { @@ -261,6 +263,7 @@ module.exports = React.createClass({ this.eventNodes = {}; + let visible = false; let i; // first figure out which is the last event in the list which we're @@ -301,7 +304,7 @@ module.exports = React.createClass({ // if the readmarker has moved, cancel any active ghost. if (this.currentReadMarkerEventId && this.props.readMarkerEventId && this.props.readMarkerVisible && - this.currentReadMarkerEventId != this.props.readMarkerEventId) { + this.currentReadMarkerEventId !== this.props.readMarkerEventId) { this.currentGhostEventId = null; } @@ -408,8 +411,8 @@ module.exports = React.createClass({ let isVisibleReadMarker = false; - if (eventId == this.props.readMarkerEventId) { - var visible = this.props.readMarkerVisible; + if (eventId === this.props.readMarkerEventId) { + visible = this.props.readMarkerVisible; // if the read marker comes at the end of the timeline (except // for local echoes, which are excluded from RMs, because they @@ -427,11 +430,11 @@ module.exports = React.createClass({ // XXX: there should be no need for a ghost tile - we should just use a // a dispatch (user_activity_end) to start the RM animation. - if (eventId == this.currentGhostEventId) { + if (eventId === this.currentGhostEventId) { // if we're showing an animation, continue to show it. ret.push(this._getReadMarkerGhostTile()); } else if (!isVisibleReadMarker && - eventId == this.currentReadMarkerEventId) { + eventId === this.currentReadMarkerEventId) { // there is currently a read-up-to marker at this point, but no // more. Show an animation of it disappearing. ret.push(this._getReadMarkerGhostTile()); @@ -498,7 +501,7 @@ module.exports = React.createClass({ } const eventId = mxEv.getId(); - const highlight = (eventId == this.props.highlightedEventId); + const highlight = (eventId === this.props.highlightedEventId); // we can't use local echoes as scroll tokens, because their event IDs change. // Local echos have a send "status". @@ -637,7 +640,8 @@ module.exports = React.createClass({ render: function() { const ScrollPanel = sdk.getComponent("structures.ScrollPanel"); const Spinner = sdk.getComponent("elements.Spinner"); - let topSpinner, bottomSpinner; + let topSpinner; + let bottomSpinner; if (this.props.backPaginating) { topSpinner = <li key="_topSpinner"><Spinner /></li>; } From 01a6b7f77fe25514a2a93b4224e5434e34da0c29 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 10:27:42 +0100 Subject: [PATCH 261/480] affix copyButton so that it doesn't get scrolled horizontally Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/rooms/_EventTile.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 80d2cd3418..525855f3ed 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -392,6 +392,7 @@ limitations under the License. overflow-x: overlay; overflow-y: visible; max-height: 30vh; + position: static; } .mx_EventTile_content .markdown-body code { @@ -406,7 +407,7 @@ limitations under the License. visibility: hidden; cursor: pointer; top: 6px; - right: 6px; + right: 36px; width: 19px; height: 19px; background-image: url($copy-button-url); From fd90992294c62464e1755731e242cc7fc67bd6da Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 15:58:16 +0100 Subject: [PATCH 262/480] s/onClick/onChange on checkbox to make React happy Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/groups/GroupPublicityToggle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/groups/GroupPublicityToggle.js b/src/components/views/groups/GroupPublicityToggle.js index 78522c2f55..ff0fc553b8 100644 --- a/src/components/views/groups/GroupPublicityToggle.js +++ b/src/components/views/groups/GroupPublicityToggle.js @@ -69,7 +69,7 @@ export default React.createClass({ render() { const GroupTile = sdk.getComponent('groups.GroupTile'); const input = <input type="checkbox" - onClick={this._onPublicityToggle} + onChange={this._onPublicityToggle} checked={this.state.isGroupPublicised} />; const labelText = !this.state.ready ? _t("Loading...") : From f152ad84b88c4f943a73e596a94b42b8a42f35eb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 16:40:44 +0100 Subject: [PATCH 263/480] Improve CommandProvider for Autocomplete improve Regexp so it leaves autocomplete up whilst typing arguments improve completion so it doesn't discard your arguments on-hover add a way to list all commands by using `/<TAB>` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 38 +++++++++++++++-------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index e33fa7861f..2618b41c7d 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -2,6 +2,7 @@ Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd Copyright 2017 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,6 +22,7 @@ import { _t, _td } from '../languageHandler'; import AutocompleteProvider from './AutocompleteProvider'; import FuzzyMatcher from './FuzzyMatcher'; import {TextualCompletion} from './Components'; +import type {SelectionRange} from "./Autocompleter"; // TODO merge this with the factory mechanics of SlashCommands? // Warning: Since the description string will be translated in _t(result.description), all these strings below must be in i18n/strings/en_EN.json file @@ -110,10 +112,9 @@ const COMMANDS = [ args: '', description: _td('Opens the Developer Tools dialog'), }, - // Omitting `/markdown` as it only seems to apply to OldComposer ]; -const COMMAND_RE = /(^\/\w*)/g; +const COMMAND_RE = /(^\/\w*)(?: .*)?/g; export default class CommandProvider extends AutocompleteProvider { constructor() { @@ -123,23 +124,24 @@ export default class CommandProvider extends AutocompleteProvider { }); } - async getCompletions(query: string, selection: {start: number, end: number}) { - let completions = []; + async getCompletions(query: string, selection: SelectionRange, force?: boolean) { const {command, range} = this.getCurrentCommand(query, selection); - if (command) { - completions = this.matcher.match(command[0]).map((result) => { - return { - completion: result.command + ' ', - component: (<TextualCompletion - title={result.command} - subtitle={result.args} - description={_t(result.description)} - />), - range, - }; - }); - } - return completions; + if (!command) return []; + + // if the query is just `/` and the user hit TAB, show them all COMMANDS otherwise FuzzyMatch them + const matches = query === '/' && force ? COMMANDS : this.matcher.match(command[1]); + return matches.map((result) => { + return { + // If the command is the same as the one they entered, we don't want to discard their arguments + completion: result.command === command[1] ? command[0] : (result.command + ' '), + component: (<TextualCompletion + title={result.command} + subtitle={result.args} + description={_t(result.description)} + />), + range, + }; + }); } getName() { From a50f6094cce296f8a4017a1e45116f2b95a79cae Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 16:44:13 +0100 Subject: [PATCH 264/480] allow `/` + wait to also show all commands Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index 2618b41c7d..b162f2f92a 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -128,8 +128,8 @@ export default class CommandProvider extends AutocompleteProvider { const {command, range} = this.getCurrentCommand(query, selection); if (!command) return []; - // if the query is just `/` and the user hit TAB, show them all COMMANDS otherwise FuzzyMatch them - const matches = query === '/' && force ? COMMANDS : this.matcher.match(command[1]); + // if the query is just `/` (and the user hit TAB or waits), show them all COMMANDS otherwise FuzzyMatch them + const matches = query === '/' ? COMMANDS : this.matcher.match(command[1]); return matches.map((result) => { return { // If the command is the same as the one they entered, we don't want to discard their arguments From 6d978e018530208d55305cbf32d840bbd24c522f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Fri, 15 Jun 2018 16:09:24 +0000 Subject: [PATCH 265/480] Translated using Weblate (French) Currently translated at 100.0% (1203 of 1203 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 7291e8b6fb..71a6f27c0e 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1192,7 +1192,7 @@ "Encrypted, not sent": "Chiffré, pas envoyé", "No Audio Outputs detected": "Aucune sortie audio détectée", "Audio Output": "Sortie audio", - "Share Link to User": "Partager le lien à l'utilisateur", + "Share Link to User": "Partager le lien vers l'utilisateur", "Share room": "Partager le salon", "Share Room": "Partager le salon", "Link to most recent message": "Lien vers le message le plus récent", From b87824ba929334a567935dbe11ba14bb3a391c72 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 19:49:53 +0100 Subject: [PATCH 266/480] hide `m.room.avatar` from FilePanel via sync filter Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/FilePanel.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 3249cae22c..7d1d23839e 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -69,6 +69,7 @@ const FilePanel = React.createClass({ "timeline": { "contains_url": true, "not_types": [ + "m.room.avatar", "m.sticker", ], }, From eb32dda260bb421865c987dccb4f0f9c9d6b8898 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 16 Jun 2018 19:52:15 +0100 Subject: [PATCH 267/480] given we also want to hide widget events, hide all except m.room.message Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/FilePanel.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 7d1d23839e..927449750c 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -68,9 +68,8 @@ const FilePanel = React.createClass({ "room": { "timeline": { "contains_url": true, - "not_types": [ - "m.room.avatar", - "m.sticker", + "types": [ + "m.room.message", ], }, }, From 9251c80783a553f09262409a09fa1be166cc280c Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Sun, 17 Jun 2018 08:34:39 +0000 Subject: [PATCH 268/480] Translated using Weblate (Basque) Currently translated at 100.0% (1203 of 1203 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 720f6a3235..594d826a6c 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1187,5 +1187,19 @@ "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Ahaztu bidali ditudan mezu guztiak kontua desaktibatzean (Abisua: Honekin etorkizuneko erabiltzaileek elkarrizketaren bertsio ez oso bat ikusiko dute)", "Can't leave Server Notices room": "Ezin zara Server Notices gelatik atera", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Gela hau mezu hasiera zerbitzariaren garrantzitsuak bidaltzeko erabiltzen da, eta ezin zara atera.", - "Try the app first": "Probatu aplikazioa aurretik" + "Try the app first": "Probatu aplikazioa aurretik", + "Encrypting": "Zifratzen", + "Encrypted, not sent": "Zifratua, bidali gabe", + "Share Link to User": "Partekatu esteka erabiltzailearekin", + "Share room": "Partekatu gela", + "Share Room": "Partekatu gela", + "Link to most recent message": "Esteka azken mezura", + "Share User": "Partekatu erabiltzailea", + "Share Community": "Partekatu komunitatea", + "Share Room Message": "Partekatu gelako mezua", + "Link to selected message": "Esteka hautatutako mezura", + "COPY": "KOPIATU", + "Share Message": "Partekatu mezua", + "No Audio Outputs detected": "Ez da audio irteerarik antzeman", + "Audio Output": "Audio irteera" } From 21bbf5dd9b888ec8ba23fe3c270de35c1776dd70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Kozio=C5=82?= <translate.riot.im@www.koziolek.biz> Date: Sun, 17 Jun 2018 12:22:35 +0000 Subject: [PATCH 269/480] Translated using Weblate (Polish) Currently translated at 79.7% (959 of 1203 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 | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index d0b71cdb8d..63e4cd3529 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -920,5 +920,42 @@ "Collapse panel": "Ukryj panel", "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!": "Z Twoją obecną przeglądarką, wygląd oraz wrażenia z używania aplikacji mogą być niepoprawne, a niektóre funkcje wcale nie działać. Kontynuuj jeśli chcesz spróbować, jednak trudno będzie pomóc w przypadku błędów, które mogą nastąpić!", "Checking for an update...": "Sprawdzanie aktualizacji...", - "There are advanced notifications which are not shown here": "Masz zaawansowane powiadomienia, nie pokazane tutaj" + "There are advanced notifications which are not shown here": "Masz zaawansowane powiadomienia, nie pokazane tutaj", + "e.g. %(exampleValue)s": "np. %(exampleValue)s", + "Always show encryption icons": "Zawsze wyświetlaj ikony szyfrowania", + "Send analytics data": "Wysyłaj dane analityczne", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)sg", + "%(duration)sd": "%(duration)sd", + "%(user)s is a %(userRole)s": "%(user)s ma rolę %(userRole)s", + "Members only (since the point in time of selecting this option)": "Tylko członkowie (od momentu włączenia tej opcji)", + "Members only (since they were invited)": "Tylko członkowie (od kiedy zostali zaproszeni)", + "Members only (since they joined)": "Tylko członkowie (od kiedy dołączyli)", + "Copied!": "Skopiowano!", + "Failed to copy": "Kopiowanie nieudane", + "Message removed by %(userId)s": "Wiadomość usunięta przez %(userId)s", + "Message removed": "Wiadomość usunięta", + "An email has been sent to %(emailAddress)s": "Email został wysłany do %(emailAddress)s", + "A text message has been sent to %(msisdn)s": "Wysłano wiadomość tekstową do %(msisdn)s", + "Code": "Kod", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Pomóż nam ulepszyć Riot.im wysyłając <UsageDataLink>anonimowe dane analityczne</ UsageDataLink>. Spowoduje to użycie pliku cookie (zobacz naszą <PolicyLink>Politykę plików cookie</ PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Pomóż nam ulepszyć Riot.im wysyłając <UsageDataLink>anonimowe dane analityczne</ UsageDataLink>. Spowoduje to użycie pliku cookie.", + "Yes, I want to help!": "Tak, chcę pomóc!", + "Warning: This widget might use cookies.": "Uwaga: Ten widżet może używać ciasteczek.", + "Delete Widget": "Usuń widżet", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Usunięcie widżetu usuwa go dla wszystkich użytkowników w tym pokoju. Czy na pewno chcesz usunąć ten widżet?", + "Communities": "Społeczności", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "collapse": "Zwiń", + "expand": "Rozwiń", + "Custom of %(powerLevel)s": "Poziom niestandardowy %(powerLevel)s", + "<a>In reply to</a> <pill>": "<a>W odpowiedzi do</a> <pill>", + "Matrix ID": "Matrix ID", + "email address": "adres e-mail", + "example": "przykład", + "Advanced options": "Opcje zaawansowane", + "To continue, please enter your password:": "Aby kontynuować, proszę wprowadzić swoje hasło:", + "password": "hasło", + "Refresh": "Odśwież" } From a7f82365a85fc0b4ef64e1e7afef11b92286c07b Mon Sep 17 00:00:00 2001 From: Krombel <krombel@krombel.de> Date: Mon, 18 Jun 2018 10:50:41 +0000 Subject: [PATCH 270/480] Translated using Weblate (German) Currently translated at 99.1% (1193 of 1203 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ba31308e3a..a4ecc140a0 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1186,5 +1186,10 @@ "This room is used for important messages from the Homeserver, so you cannot leave it.": "Du kannst diesen Raum nicht verlassen, da dieser Raum für wichtige Nachrichten vom Heimserver verwendet wird.", "Terms and Conditions": "Geschäftsbedingungen", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Um den %(homeserverDomain)s -Heimserver weiter zu verwenden, musst du die Geschäftsbedingungen sichten und ihnen zustimmen.", - "Review terms and conditions": "Geschäftsbedingungen anzeigen" + "Review terms and conditions": "Geschäftsbedingungen anzeigen", + "Encrypting": "Verschlüssele", + "Encrypted, not sent": "Verschlüsselt, nicht gesendet", + "Share Link to User": "Sende Link an Benutzer", + "Share room": "Teile Raum", + "Share Room": "Teile Raum" } From 1a236499b1f33df966635b3bb6f4bfd8ee41f5a7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 11:54:06 +0100 Subject: [PATCH 271/480] fix import Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomTile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index bb9e0a8d3b..776bd5cd70 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -24,7 +24,7 @@ import dis from '../../../dispatcher'; import MatrixClientPeg from '../../../MatrixClientPeg'; import DMRoomMap from '../../../utils/DMRoomMap'; import sdk from '../../../index'; -import ContextualMenu from '../../structures/ContextualMenu'; +import {createMenu} from '../../structures/ContextualMenu'; import * as RoomNotifs from '../../../RoomNotifs'; import * as FormattingUtils from '../../../utils/FormattingUtils'; import AccessibleButton from '../elements/AccessibleButton'; @@ -217,7 +217,7 @@ module.exports = React.createClass({ y = y - (chevronOffset + 8); // where 8 is half the height of the chevron const self = this; - ContextualMenu.createMenu(RoomTileContextMenu, { + createMenu(RoomTileContextMenu, { chevronOffset: chevronOffset, left: x, top: y, From 15892a8c6a46a5d01fad9f80ef07a1db8d26755d Mon Sep 17 00:00:00 2001 From: Krombel <krombel@krombel.de> Date: Mon, 18 Jun 2018 10:54:30 +0000 Subject: [PATCH 272/480] Translated using Weblate (German) Currently translated at 100.0% (1203 of 1203 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index a4ecc140a0..ef34cb78fe 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1191,5 +1191,15 @@ "Encrypted, not sent": "Verschlüsselt, nicht gesendet", "Share Link to User": "Sende Link an Benutzer", "Share room": "Teile Raum", - "Share Room": "Teile Raum" + "Share Room": "Teile Raum", + "Link to most recent message": "Link zur aktuellsten Nachricht", + "Share User": "Teile Benutzer", + "Share Community": "Teile Community", + "Share Room Message": "Teile Raumnachricht", + "Link to selected message": "Link zur ausgewählten Nachricht", + "COPY": "KOPIEREN", + "Share Message": "Teile Nachricht", + "No Audio Outputs detected": "Keine Ton-Ausgabe erkannt", + "Audio Output": "Ton-Ausgabe", + "Try the app first": "App erst ausprobieren" } From e0d36b18c92ec42f8827dbae88bbdc5baf0c144d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 12:05:57 +0100 Subject: [PATCH 273/480] make RoomTile context menu appear where you right clicked instead Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomTile.js | 71 +++++++++++++++----------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 776bd5cd70..ee7f8a76c7 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -182,9 +182,30 @@ module.exports = React.createClass({ this.badgeOnMouseLeave(); }, + _showContextMenu: function(x, y, chevronOffset) { + const RoomTileContextMenu = sdk.getComponent('context_menus.RoomTileContextMenu'); + + createMenu(RoomTileContextMenu, { + chevronOffset, + left: x, + top: y, + room: this.props.room, + onFinished: () => { + this.setState({ menuDisplayed: false }); + this.props.refreshSubList(); + }, + }); + this.setState({ menuDisplayed: true }); + }, + onContextMenu: function(e) { - this.onBadgeClicked(e); + // Prevent the RoomTile onClick event firing as well e.preventDefault(); + // Only allow non-guests to access the context menu + if (MatrixClientPeg.get().isGuest()) return; + + const chevronOffset = 12; + this._showContextMenu(e.clientX, e.clientY - (chevronOffset + 8), chevronOffset); }, badgeOnMouseEnter: function() { @@ -200,37 +221,25 @@ module.exports = React.createClass({ }, onBadgeClicked: function(e) { - // Only allow none guests to access the context menu - if (!MatrixClientPeg.get().isGuest()) { - // If the badge is clicked, then no longer show tooltip - if (this.props.collapsed) { - this.setState({ hover: false }); - } - - const RoomTileContextMenu = sdk.getComponent('context_menus.RoomTileContextMenu'); - const elementRect = this.refs.badge.getBoundingClientRect(); - - // The window X and Y offsets are to adjust position when zoomed in to page - const x = elementRect.right + window.pageXOffset + 3; - const chevronOffset = 12; - let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset); - y = y - (chevronOffset + 8); // where 8 is half the height of the chevron - - const self = this; - createMenu(RoomTileContextMenu, { - chevronOffset: chevronOffset, - left: x, - top: y, - room: this.props.room, - onFinished: function() { - self.setState({ menuDisplayed: false }); - self.props.refreshSubList(); - }, - }); - this.setState({ menuDisplayed: true }); - } // Prevent the RoomTile onClick event firing as well e.stopPropagation(); + // Only allow non-guests to access the context menu + if (MatrixClientPeg.get().isGuest()) return; + + // If the badge is clicked, then no longer show tooltip + if (this.props.collapsed) { + this.setState({ hover: false }); + } + + const elementRect = e.target.getBoundingClientRect(); + + // The window X and Y offsets are to adjust position when zoomed in to page + const x = elementRect.right + window.pageXOffset + 3; + const chevronOffset = 12; + let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset); + y = y - (chevronOffset + 8); // where 8 is half the height of the chevron + + this._showContextMenu(x, y, chevronOffset); }, render: function() { @@ -279,7 +288,7 @@ module.exports = React.createClass({ badgeContent = '\u200B'; } - const badge = <div className={badgeClasses} ref="badge" onClick={this.onBadgeClicked}>{ badgeContent }</div>; + const badge = <div className={badgeClasses} onClick={this.onBadgeClicked}>{ badgeContent }</div>; const EmojiText = sdk.getComponent('elements.EmojiText'); let label; From f88a2fd8fcffbe6bf2d8fdf954591c97113dd4b4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 12:16:33 +0100 Subject: [PATCH 274/480] make GroupInviteTile context menu appear where you right clicked instead Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/groups/GroupInviteTile.js | 69 +++++++++++-------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index fff9aafac1..25dba130f9 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -1,5 +1,6 @@ /* Copyright 2017, 2018 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,8 +21,9 @@ import { MatrixClient } from 'matrix-js-sdk'; import sdk from '../../../index'; import dis from '../../../dispatcher'; import AccessibleButton from '../elements/AccessibleButton'; -import * as ContextualMenu from "../../structures/ContextualMenu"; import classNames from 'classnames'; +import MatrixClientPeg from "../../../MatrixClientPeg"; +import {createMenu} from "../../structures/ContextualMenu"; export default React.createClass({ displayName: 'GroupInviteTile', @@ -66,34 +68,11 @@ export default React.createClass({ }); }, - onContextMenu: function(e) { - this.onBadgeClicked(e); - e.preventDefault(); - }, + _showContextMenu: function(x, y, chevronOffset) { + const GroupInviteTileContextMenu = sdk.getComponent('context_menus.GroupInviteTileContextMenu'); - onBadgeClicked: function(e) { - // Prevent the RoomTile onClick event firing as well - e.stopPropagation(); - - // Only allow none guests to access the context menu - if (this.context.matrixClient.isGuest()) return; - - // If the badge is clicked, then no longer show tooltip - if (this.props.collapsed) { - this.setState({ hover: false }); - } - - const RoomTileContextMenu = sdk.getComponent('context_menus.GroupInviteTileContextMenu'); - const elementRect = this.refs.badge.getBoundingClientRect(); - - // The window X and Y offsets are to adjust position when zoomed in to page - const x = elementRect.right + window.pageXOffset + 3; - const chevronOffset = 12; - let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset); - y = y - (chevronOffset + 8); // where 8 is half the height of the chevron - - ContextualMenu.createMenu(RoomTileContextMenu, { - chevronOffset: chevronOffset, + createMenu(GroupInviteTileContextMenu, { + chevronOffset, left: x, top: y, group: this.props.group, @@ -104,6 +83,38 @@ export default React.createClass({ this.setState({ menuDisplayed: true }); }, + onContextMenu: function(e) { + // Prevent the RoomTile onClick event firing as well + e.preventDefault(); + // Only allow non-guests to access the context menu + if (MatrixClientPeg.get().isGuest()) return; + + const chevronOffset = 12; + this._showContextMenu(e.clientX, e.clientY - (chevronOffset + 8), chevronOffset); + }, + + onBadgeClicked: function(e) { + // Prevent the RoomTile onClick event firing as well + e.stopPropagation(); + // Only allow non-guests to access the context menu + if (MatrixClientPeg.get().isGuest()) return; + + // If the badge is clicked, then no longer show tooltip + if (this.props.collapsed) { + this.setState({ hover: false }); + } + + const elementRect = e.target.getBoundingClientRect(); + + // The window X and Y offsets are to adjust position when zoomed in to page + const x = elementRect.right + window.pageXOffset + 3; + const chevronOffset = 12; + let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset); + y = y - (chevronOffset + 8); // where 8 is half the height of the chevron + + this._showContextMenu(x, y, chevronOffset); + }, + render: function() { const BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); const EmojiText = sdk.getComponent('elements.EmojiText'); @@ -130,7 +141,7 @@ export default React.createClass({ }); const badgeContent = badgeEllipsis ? '\u00B7\u00B7\u00B7' : '!'; - const badge = <div className={badgeClasses} ref="badge" onClick={this.onBadgeClicked}>{ badgeContent }</div>; + const badge = <div className={badgeClasses} onClick={this.onBadgeClicked}>{ badgeContent }</div>; let tooltip; if (this.props.collapsed && this.state.hover) { From 1ae51a83328362581d2df74b10469d7ebba60866 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 13:48:23 +0100 Subject: [PATCH 275/480] use changed argument in js-sdk Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/ContentMessages.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ContentMessages.js b/src/ContentMessages.js index 1d61b6de6a..fd21977108 100644 --- a/src/ContentMessages.js +++ b/src/ContentMessages.js @@ -243,7 +243,7 @@ function uploadFile(matrixClient, roomId, file, progressHandler) { const blob = new Blob([encryptResult.data]); return matrixClient.uploadContent(blob, { progressHandler: progressHandler, - omitFilename: true, + includeFilename: false, }).then(function(url) { // If the attachment is encrypted then bundle the URL along // with the information needed to decrypt the attachment and From 276c7a9c4d3ab43c2c443d6b7e5b2c3b46ad37d7 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Mon, 18 Jun 2018 15:24:34 +0100 Subject: [PATCH 276/480] Fix blank sticker picker Let the battle of z-indexes commence https://github.com/matrix-org/matrix-react-sdk/pull/1948/files#diff-8bc8827809a72c7548846c443d19f00aR29 --- src/components/views/elements/PersistedElement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js index c4bac27b4e..8115a36eeb 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.js @@ -36,7 +36,7 @@ function getOrCreateContainer() { } // Greater than that of the ContextualMenu -const PE_Z_INDEX = 3000; +const PE_Z_INDEX = 5000; /* * Class of component that renders its children in a separate ReactDOM virtual tree From e1e60cb1474a519846eb417f6f379d4edf9f9d62 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Mon, 18 Jun 2018 16:00:42 +0100 Subject: [PATCH 277/480] delint CallHandler --- .eslintignore.errorfiles | 1 - src/CallHandler.js | 132 +++++++++++++++++++++------------------ 2 files changed, 72 insertions(+), 61 deletions(-) diff --git a/.eslintignore.errorfiles b/.eslintignore.errorfiles index 42818244b3..e5eb9d70c8 100644 --- a/.eslintignore.errorfiles +++ b/.eslintignore.errorfiles @@ -4,7 +4,6 @@ src/autocomplete/AutocompleteProvider.js src/autocomplete/Autocompleter.js src/autocomplete/EmojiProvider.js src/autocomplete/UserProvider.js -src/CallHandler.js src/component-index.js src/components/structures/BottomLeftMenu.js src/components/structures/CompatibilityPage.js diff --git a/src/CallHandler.js b/src/CallHandler.js index da764ec4b6..55a05798af 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -124,7 +124,7 @@ function _setCallListeners(call) { description: _t( "There are unknown devices in this room: "+ "if you proceed without verifying them, it will be "+ - "possible for someone to eavesdrop on your call." + "possible for someone to eavesdrop on your call.", ), button: _t('Review Devices'), onFinished: function(confirmed) { @@ -247,50 +247,52 @@ function _onAction(payload) { switch (payload.action) { case 'place_call': - if (module.exports.getAnyActiveCall()) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Call Handler', 'Existing Call', ErrorDialog, { - title: _t('Existing Call'), - description: _t('You are already in a call.'), - }); - return; // don't allow >1 call to be placed. - } + { + if (module.exports.getAnyActiveCall()) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Call Handler', 'Existing Call', ErrorDialog, { + title: _t('Existing Call'), + description: _t('You are already in a call.'), + }); + return; // don't allow >1 call to be placed. + } - // if the runtime env doesn't do VoIP, whine. - if (!MatrixClientPeg.get().supportsVoip()) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Call Handler', 'VoIP is unsupported', ErrorDialog, { - title: _t('VoIP is unsupported'), - description: _t('You cannot place VoIP calls in this browser.'), - }); - return; - } + // if the runtime env doesn't do VoIP, whine. + if (!MatrixClientPeg.get().supportsVoip()) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Call Handler', 'VoIP is unsupported', ErrorDialog, { + title: _t('VoIP is unsupported'), + description: _t('You cannot place VoIP calls in this browser.'), + }); + return; + } - var room = MatrixClientPeg.get().getRoom(payload.room_id); - if (!room) { - console.error("Room %s does not exist.", payload.room_id); - return; - } + const room = MatrixClientPeg.get().getRoom(payload.room_id); + if (!room) { + console.error("Room %s does not exist.", payload.room_id); + return; + } - var members = room.getJoinedMembers(); - if (members.length <= 1) { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Call Handler', 'Cannot place call with self', ErrorDialog, { - description: _t('You cannot place a call with yourself.'), - }); - return; - } else if (members.length === 2) { - console.log("Place %s call in %s", payload.type, payload.room_id); - const call = Matrix.createNewMatrixCall(MatrixClientPeg.get(), payload.room_id); - placeCall(call); - } else { // > 2 - dis.dispatch({ - action: "place_conference_call", - room_id: payload.room_id, - type: payload.type, - remote_element: payload.remote_element, - local_element: payload.local_element, - }); + const members = room.getJoinedMembers(); + if (members.length <= 1) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Call Handler', 'Cannot place call with self', ErrorDialog, { + description: _t('You cannot place a call with yourself.'), + }); + return; + } else if (members.length === 2) { + console.log("Place %s call in %s", payload.type, payload.room_id); + const call = Matrix.createNewMatrixCall(MatrixClientPeg.get(), payload.room_id); + placeCall(call); + } else { // > 2 + dis.dispatch({ + action: "place_conference_call", + room_id: payload.room_id, + type: payload.type, + remote_element: payload.remote_element, + local_element: payload.local_element, + }); + } } break; case 'place_conference_call': @@ -338,10 +340,18 @@ function _onAction(payload) { }, function(err) { const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Conference call failed: " + err); - Modal.createTrackedDialog('Call Handler', 'Failed to set up conference call', ErrorDialog, { - title: _t('Failed to set up conference call'), - description: _t('Conference call failed.') + ' ' + ((err && err.message) ? err.message : ''), - }); + Modal.createTrackedDialog( + 'Call Handler', + 'Failed to set up conference call', + ErrorDialog, + { + title: _t('Failed to set up conference call'), + description: ( + _t('Conference call failed.') + + ' ' + ((err && err.message) ? err.message : '') + ), + }, + ); }); } }, @@ -350,22 +360,24 @@ function _onAction(payload) { } break; case 'incoming_call': - if (module.exports.getAnyActiveCall()) { - // ignore multiple incoming calls. in future, we may want a line-1/line-2 setup. - // we avoid rejecting with "busy" in case the user wants to answer it on a different device. - // in future we could signal a "local busy" as a warning to the caller. - // see https://github.com/vector-im/vector-web/issues/1964 - return; - } + { + if (module.exports.getAnyActiveCall()) { + // ignore multiple incoming calls. in future, we may want a line-1/line-2 setup. + // we avoid rejecting with "busy" in case the user wants to answer it on a different device. + // in future we could signal a "local busy" as a warning to the caller. + // see https://github.com/vector-im/vector-web/issues/1964 + return; + } - // if the runtime env doesn't do VoIP, stop here. - if (!MatrixClientPeg.get().supportsVoip()) { - return; - } + // if the runtime env doesn't do VoIP, stop here. + if (!MatrixClientPeg.get().supportsVoip()) { + return; + } - var call = payload.call; - _setCallListeners(call); - _setCallState(call, call.roomId, "ringing"); + const call = payload.call; + _setCallListeners(call); + _setCallState(call, call.roomId, "ringing"); + } break; case 'hangup': if (!calls[payload.room_id]) { From 03bec1b51519956b3e72d495ad6740e900a0f133 Mon Sep 17 00:00:00 2001 From: Miguel Branco <mgl.branco@gmail.com> Date: Mon, 18 Jun 2018 13:59:04 +0000 Subject: [PATCH 278/480] Translated using Weblate (Galician) Currently translated at 98.5% (1185 of 1203 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index aaf84f717d..665ed03cba 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1164,5 +1164,24 @@ "Refresh": "Actualizar", "We encountered an error trying to restore your previous session.": "Atopamos un fallo intentando restablecer a súa sesión anterior.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Limpando o almacenamento do navegador podería resolver o problema, pero desconectarao e non poderá ler o historial cifrado da conversa.", - "Collapse Reply Thread": "Comprimir o fío de respostas" + "Collapse Reply Thread": "Comprimir o fío de respostas", + "e.g. %(exampleValue)s": "p.ex.%(exampleValue)s", + "Send analytics data": "Enviar datos de análises", + "Enable widget screenshots on supported widgets": "Activar as capturas de widgets para aqueles que as permiten", + "Encrypting": "Cifrando", + "Encrypted, not sent": "Cifrado, sen enviar", + "Share Link to User": "Compartir a ligazón co usuario", + "Share room": "Compartir sala", + "To notify everyone in the room, you must be a": "Para avisar a todos os da sala ten que ser", + "Muted Users": "Usuarios silenciados", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Mellore Riot.im enviando <UsageDataLink>os datos anónimos de uso</UsageDataLink>. Iso suporá o emprego dunha cookie (véxase a nosa <PolicyLink>Política de Cookies</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Mellore Riot.im enviando <UsageDataLink>o uso de datos anónimo</UsageDataLink>. Iso usará unha cookie.", + "Yes, I want to help!": "Si, quero axuda", + "Warning: This widget might use cookies.": "Aviso: este widget podería usar algunha cookie.", + "Reload widget": "Volver a cargar o widget", + "Failed to indicate account erasure": "Non se deu indicado a eliminación de conta", + "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. <b>This action is irreversible.</b>": "Iso fará que a súa deixe de ter uso de xeito permanente. Non poderá acceder e ninguén vai a poder volver a rexistrar esa mesma ID de usuario. Suporá que saía de todas as salas de conversas nas que estaba e eliminará os detalles da súa conta do servidores de identificación.<b>Isto non se poderá desfacer</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Desactivando a súa conta <b>non supón que por defecto esquezamos as súas mensaxes enviadas.</b> Se quere que nos esquezamos das súas mensaxes, prema na caixa de embaixo.", + "To continue, please enter your password:": "Para continuar introduza o seu contrasinal:", + "password": "contrasinal" } From 55a6a4dd8fcaadc2e0fab0b42c389bcab4328ba4 Mon Sep 17 00:00:00 2001 From: Miguel Branco <mgl.branco@gmail.com> Date: Mon, 18 Jun 2018 15:28:27 +0000 Subject: [PATCH 279/480] Translated using Weblate (Galician) Currently translated at 100.0% (1203 of 1203 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 548 ++++++++++++++++++++------------------- 1 file changed, 283 insertions(+), 265 deletions(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 665ed03cba..41f98676b6 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1,31 +1,31 @@ { - "This email address is already in use": "Este enderezo de correo xa está a ser utilizado", - "This phone number is already in use": "Este número de teléfono xa está a ser utilizado", + "This email address is already in use": "Xa se está a usar este correo", + "This phone number is already in use": "Xa se está a usar este teléfono", "Failed to verify email address: make sure you clicked the link in the email": "Fallo na verificación do enderezo de correo: asegúrese de ter picado na ligazón do correo", "The remote side failed to pick up": "O interlocutor non respondeu", - "Unable to capture screen": "Non se puido pillar a pantalla", - "Existing Call": "Chamada existente", + "Unable to capture screen": "Non se puido capturar a pantalla", + "Existing Call": "Rexistro de chamadas", "You are already in a call.": "Xa está nunha chamada.", - "VoIP is unsupported": "VoIP non admitida", - "You cannot place VoIP calls in this browser.": "Non pode establecer chamadas VoIP en este navegador.", - "You cannot place a call with yourself.": "Non pode chamarse a vostede mesma.", - "Conference calls are not supported in this client": "Non pode establecer chamadas de Reunión en este cliente", - "Conference calls are not supported in encrypted rooms": "Nas salas cifradas non se pode establecer Chamadas de Reunión", + "VoIP is unsupported": "Sen soporte para VoIP", + "You cannot place VoIP calls in this browser.": "Non pode establecer chamadas VoIP neste navegador.", + "You cannot place a call with yourself.": "Non pode facer unha chamada a si mesmo.", + "Conference calls are not supported in this client": "Non pode establecer chamadas de reunión neste cliente", + "Conference calls are not supported in encrypted rooms": "Nas salas cifradas non se pode establecer chamadas de reunión", "Warning!": "Aviso!", - "Conference calling is in development and may not be reliable.": "As chamadas de Reunión poderían non ser totalmente estables xa que están en desenvolvemento.", + "Conference calling is in development and may not be reliable.": "As chamadas de reunión poderían non ser totalmente estables xa que están en desenvolvemento.", "Failed to set up conference call": "Fallo ao establecer a chamada de reunión", "Conference call failed.": "Fallo na chamada de reunión.", "Call Failed": "Fallou a chamada", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hai dispositivos descoñecidos en esta sala: si sigue adiante sen verificalos, pode ser posible que alguén bote un ollo a súa chamada.", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hai dispositivos descoñecidos en esta sala: se segue adiante sen verificalos, pode ser posible que alguén bote un ollo a súa chamada.", "Review Devices": "Revisar dispositivos", "Call Anyway": "Chamar igualmente", - "Answer Anyway": "Respostar igualmente", + "Answer Anyway": "Responder igualmente", "Call": "Chamar", - "Answer": "Respostar", - "Call Timeout": "Finou a chamada", - "The file '%(fileName)s' failed to upload": "O ficheiro '%(fileName)s' non se puido subir", - "The file '%(fileName)s' exceeds this home server's size limit for uploads": "O ficheiro '%(fileName)s' excede o límite establecido polo servidor para subidas", - "Upload Failed": "Fallou a subida", + "Answer": "Resposta", + "Call Timeout": "Tempo de resposta de chamada", + "The file '%(fileName)s' failed to upload": "Non se puido subir o ficheiro '%(fileName)s'", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "O ficheiro '%(fileName)s' excede o límite de tamaño establecido para este servidor", + "Upload Failed": "Fallou o envío", "Sun": "Dom", "Mon": "Lun", "Tue": "Mar", @@ -50,66 +50,66 @@ "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s", - "Who would you like to add to this community?": "A quén lle gustaría engadir a esta comunidade?", - "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Aviso: calquer persoa que vostede engada a unha comunidade será públicamente visible para calquera que coñeza o ID da comunidade", - "Invite new community members": "Convidar a novos membros da comunidade", + "Who would you like to add to this community?": "A quen quere engadir a esta comunidade?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Aviso: calquera persoa que engada a unha comunidade estará publicamente visible para calquera que coñeza a ID da comunidade", + "Invite new community members": "Convidará comunidade a novos participantes ", "Name or matrix ID": "Nome ou ID matrix", - "Invite to Community": "Convide a comunidade", - "Which rooms would you like to add to this community?": "Qué salas desexaría engadir a esta comunidade?", - "Show these rooms to non-members on the community page and room list?": "Mostrar estas salas a non-membros na páxina da comunidade e lista de salas?", - "Add rooms to the community": "Engadir salas a comunidade", + "Invite to Community": "Convidar á comunidade", + "Which rooms would you like to add to this community?": "Que salas desexaría engadir a esta comunidade?", + "Show these rooms to non-members on the community page and room list?": "Quere que estas salas se lle mostren a outros membros de fóra da comunidade na lista de salas?", + "Add rooms to the community": "Engadir salas á comunidade", "Room name or alias": "Nome da sala ou alcume", - "Add to community": "Engadir a comunidade", - "Failed to invite the following users to %(groupId)s:": "Fallo ao convidar as seguintes usuarias a %(groupId)s:", - "Failed to invite users to community": "Fallou o convite de usuarias a comunidade", - "Failed to invite users to %(groupId)s": "Fallou o convite de usuarias a %(groupId)s", + "Add to community": "Engadir á comunidade", + "Failed to invite the following users to %(groupId)s:": "Fallo ao convidar os seguintes usuarios a %(groupId)s:", + "Failed to invite users to community": "Houbo un fallo convidando usuarios á comunidade", + "Failed to invite users to %(groupId)s": "Houbo un fallo convidando usuarios a %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Fallo ao engadir as seguintes salas a %(groupId)s:", - "Riot does not have permission to send you notifications - please check your browser settings": "Riot non ten permiso para enviarlle notificacións - por favor comprobe os axustes do navegador", - "Riot was not given permission to send notifications - please try again": "Riot non ten permiso para enviar notificacións - inténteo de novo", - "Unable to enable Notifications": "Non se puideron habilitar as notificacións", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot non ten permiso para enviarlle notificacións: comprobe os axustes do navegador", + "Riot was not given permission to send notifications - please try again": "Riot non ten permiso para enviar notificacións: inténteo de novo", + "Unable to enable Notifications": "Non se puideron activar as notificacións", "This email address was not found": "Non se atopou este enderezo de correo", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu enderezo de correo semella non estar asociado a un ID Matrix en este servidor.", - "Default": "Por omisión", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu enderezo de correo semella non estar asociado a un ID Matrix neste servidor.", + "Default": "Por defecto", "Restricted": "Restrinxido", "Moderator": "Moderador", "Admin": "Administrador", "Start a chat": "Iniciar unha conversa", - "Who would you like to communicate with?": "Con quén desexa comunicarse?", + "Who would you like to communicate with?": "Con quen desexa comunicarse?", "Email, name or matrix ID": "Correo, nome ou ID matrix", "Start Chat": "Iniciar conversa", - "Invite new room members": "Convidar a sala a novos membros", - "Who would you like to add to this room?": "A quén desexaría engadir a esta sala?", + "Invite new room members": "Convidar a novos participantes", + "Who would you like to add to this room?": "A quen desexaría engadir a esta sala?", "Send Invites": "Enviar convites", "Failed to invite user": "Fallo ao convidar usuaria", "Operation failed": "Fallou a operación", "Failed to invite": "Fallou o convite", - "Failed to invite the following users to the %(roomName)s room:": "Non se puideron convidar as seguintes usuarias a sala %(roomName)s:", + "Failed to invite the following users to the %(roomName)s room:": "Houbo un fallo convidando os seguintes usuarios á sala %(roomName)s:", "You need to be logged in.": "Precisa estar conectada.", - "You need to be able to invite users to do that.": "Vostede precisa estar autorizada a convidar usuarias para facer iso.", - "Unable to create widget.": "Non se puido crear o widget.", + "You need to be able to invite users to do that.": "Precisa autorización para convidar a outros usuarias para poder facer iso.", + "Unable to create widget.": "Non se puido crear o trebello.", "Failed to send request.": "Fallo ao enviar a petición.", "This room is not recognised.": "Non se recoñece esta sala.", "Power level must be positive integer.": "O nivel de poder ten que ser un enteiro positivo.", - "You are not in this room.": "Vostede non está en esta sala.", - "You do not have permission to do that in this room.": "Non ten permiso para facer eso en esta sala.", + "You are not in this room.": "Non está nesta sala.", + "You do not have permission to do that in this room.": "Non ten permiso para facer iso nesta sala.", "Missing room_id in request": "Falta o room_id na petición", "Must be viewing a room": "Debería estar vendo unha sala", "Room %(roomId)s not visible": "A sala %(roomId)s non é visible", - "Missing user_id in request": "Falata o user_id na petición", + "Missing user_id in request": "Falta o user_id na petición", "Usage": "Uso", "/ddg is not a command": "/ddg non é unha orde", "To use it, just wait for autocomplete results to load and tab through them.": "Para utilizala, agarde que carguen os resultados de autocompletado e escolla entre eles.", "Unrecognised room alias:": "Alcumes de sala non recoñecidos:", "Ignored user": "Usuaria ignorada", "You are now ignoring %(userId)s": "Agora está a ignorar %(userId)s", - "Unignored user": "Usuarias non ignorada", + "Unignored user": "Usuarios non ignorados", "You are no longer ignoring %(userId)s": "Xa non está a ignorar a %(userId)s", "Unknown (user, device) pair:": "Parella descoñecida (dispositivo, usuaria):", "Device already verified!": "Dispositivo xa verificado!", - "WARNING: Device already verified, but keys do NOT MATCH!": "AVISO: o dispositivo xa está verificado, que as chaves NON CONCORDAN!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "AVISO: FALLOU A VERIFICACIÓN DE CHAVES! A chave de firma para %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\" que non concorda coa chave proporcionada \"%(fingerprint)s\". Esto podería significar que as súas comunicacións están a ser interceptadas!", + "WARNING: Device already verified, but keys do NOT MATCH!": "Aviso: o dispositivo xa está verificado só que as chaves NON CONCORDAN!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "AVISO: FALLOU A VERIFICACIÓN DE CHAVES! A chave de firma para o %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\" que non concorda coa chave proporcionada \"%(fingerprint)s\". Isto podería significar que as súas comunicacións están a ser interceptadas!", "Verified key": "Chave verificada", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "A chave de firma que proporcionou concorda coa chave de firma que recibeu do dispositivo %(deviceId)s de %(userId)s. Dispositivo marcado como verificado.", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "A chave de firma que proporcionou concorda coa chave de firma que recibiu do dispositivo %(deviceId)s de %(userId)s. Dispositivo marcado como verificado.", "Unrecognised command:": "Orde non recoñecida:", "Reason": "Razón", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceptou o convite para %(displayName)s.", @@ -123,7 +123,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s cambiou a súa imaxe de perfil.", "%(senderName)s set a profile picture.": "%(senderName)s estableceu a imaxe de perfil.", "VoIP conference started.": "Comezou a conferencia VoIP.", - "%(targetName)s joined the room.": "%(targetName)s uneuse a sala.", + "%(targetName)s joined the room.": "%(targetName)s uniuse a sala.", "VoIP conference finished.": "Rematou a conferencia VoIP.", "%(targetName)s rejected the invitation.": "%(targetName)s rexeitou a invitación.", "%(targetName)s left the room.": "%(targetName)s deixou a sala.", @@ -143,25 +143,25 @@ "%(senderName)s ended the call.": "%(senderName)s rematou a chamada.", "%(senderName)s placed a %(callType)s call.": "%(senderName)s estableceu unha chamada %(callType)s.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou un convite a %(targetDisplayName)s para unirse a sala.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s fixo o historial da sala visible para toda a membresía, desde o punto en que foron convidadas.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s estableceu o historial futuro visible a toda a membresía, desde o punto en que se uniron.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s fixo visible para toda a membresía o historial futuro da sala.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s fixo o historial da sala visible para todos os participantes, desde o punto en que foron convidadas.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s estableceu o historial futuro visible a todos os participantes, desde o punto en que se uniron.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s fixo visible para todos participantes o historial futuro da sala.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s fixo visible para calquera o historial futuro da sala.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s fixo visible o historial futuro da sala para descoñecidos (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s activou o cifrado extremo-a-extremo (algoritmo %(algorithm)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s activou o cifrado de par-a-par (algoritmo %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s desde %(fromPowerLevel)s a %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s cambiou o nivel de autoridade a %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s cambiou as mensaxes fixadas para a sala.", - "%(widgetName)s widget modified by %(senderName)s": "O engadido %(widgetName)s modificado por %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "O %(widgetName)s engadido por %(senderName)s", + "%(widgetName)s widget modified by %(senderName)s": "O trebello %(widgetName)s modificado por %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "O trebello %(widgetName)s engadido por %(senderName)s", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s eliminado por %(senderName)s", "%(displayName)s is typing": "%(displayName)s está a escribir", "%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras están a escribir", "%(names)s and %(count)s others are typing|one": "%(names)s e outra está a escribir", "%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s están a escribir", - "Failure to create room": "Fallo ao crear a sala", + "Failure to create room": "Fallou a creación da sala", "Server may be unavailable, overloaded, or you hit a bug.": "O servidor podería non estar dispoñible, con sobrecarga ou ter un fallo.", - "Send anyway": "Enviar de todos xeitos", + "Send anyway": "Enviar de todos os xeitos", "Send": "Enviar", "Unnamed Room": "Sala sen nome", "Your browser does not support the required cryptography extensions": "O seu navegador non soporta as extensións de criptografía necesarias", @@ -170,7 +170,7 @@ "Failed to join room": "Non se puido unir a sala", "Message Pinning": "Fixando mensaxe", "Tag Panel": "Panel de etiquetas", - "Disable Emoji suggestions while typing": "Deshabilitar a suxestión de Emoji mentras escribe", + "Disable Emoji suggestions while typing": "Desactivar a suxestión de Emoji mentres escribe", "Use compact timeline layout": "Utilizar a disposición compacta da liña temporal", "Hide removed messages": "Ocultar mensaxes eliminadas", "Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensaxes de unión/saída (convites/expulsións/bloqueos non afectados)", @@ -178,19 +178,19 @@ "Hide display name changes": "Ocultar cambios no nome público", "Hide read receipts": "Ocultar avisos de recepción", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostrar marcas de tempo con formato 12 horas (ex. 2:30pm)", - "Always show message timestamps": "Mostar sempre marcas de tempo", + "Always show message timestamps": "Mostrar sempre marcas de tempo", "Autoplay GIFs and videos": "Reprodución automática de GIFs e vídeos", - "Enable automatic language detection for syntax highlighting": "Habilitar a detección automática de idioma para o resalte da sintaxe", + "Enable automatic language detection for syntax highlighting": "Activar a detección automática de idioma para o resalte da sintaxe", "Hide avatars in user and room mentions": "Ocultar avatares nas mencións de usuarios e salas", - "Disable big emoji in chat": "Deshabilitar emojis grandes nas conversas", + "Disable big emoji in chat": "Desactivar emojis grandes nas conversas", "Don't send typing notifications": "Non enviar notificacións de escritura", "Automatically replace plain text Emoji": "Substituír automaticamente Emoji en texto plano", - "Disable Peer-to-Peer for 1:1 calls": "Deshabilitar Peer-to-Peer para chamadas 1:1", - "Never send encrypted messages to unverified devices from this device": "Non enviar mensaxes cifradas a dispositivos non verificados desde este dispositivo", - "Never send encrypted messages to unverified devices in this room from this device": "Non enviar mensaxes cifradas a dispositivos non verificados en esta sala desde este dispositivo", - "Enable inline URL previews by default": "Habilitar por omisión vistas previas en liña de URL", - "Enable URL previews for this room (only affects you)": "Habilitar vista previa de URL en esta sala (só lle afecta a vostede)", - "Enable URL previews by default for participants in this room": "Habilitar vista previa de URL por omisión para as participantes en esta sala", + "Disable Peer-to-Peer for 1:1 calls": "Desactivar Peer-to-Peer para chamadas 1:1", + "Never send encrypted messages to unverified devices from this device": "Nunca enviar mensaxes cifradas aos dispositivos que non estean verificados neste dispositivo", + "Never send encrypted messages to unverified devices in this room from this device": "Nunca enviar mensaxes cifradas aos dispositivos que non estean verificados nesta sala desde este dispositivo", + "Enable inline URL previews by default": "Activar por defecto as vistas previas en liña de URL", + "Enable URL previews for this room (only affects you)": "Activar avista previa de URL nesta sala (só lle afecta a vostede)", + "Enable URL previews by default for participants in this room": "Activar a vista previa de URL por defecto para as participantes nesta sala", "Room Colour": "Cor da sala", "Active call (%(roomName)s)": "Chamada activa (%(roomName)s)", "unknown caller": "interlocutora descoñecida", @@ -211,8 +211,8 @@ "Upload new:": "Subir nova:", "No display name": "Sen nome público", "New passwords don't match": "Os contrasinais novos non coinciden", - "Passwords can't be empty": "Os contranais non poden estar baldeiros", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao cambiar o contrasinal restablecerá todas as chaves de cifrado extremo-a-extremo en todos os dispositivos, facendo ilexible o historial da conversa a menos que primeiro exporte as chaves da sala e posteriormente as importe. No futuro melloraremos esto.", + "Passwords can't be empty": "Os contrasinais non poden estar baleiros", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao cambiar o contrasinal restablecerá todas as chaves de cifrado extremo-a-extremo en todos os dispositivos, facendo ilexible o historial da conversa a menos que primeiro exporte as chaves da sala e posteriormente as importe. No futuro melloraremos isto.", "Continue": "Continuar", "Export E2E room keys": "Exportar chaves E2E da sala", "Do you want to set an email address?": "Quere establecer un enderezo de correo electrónico?", @@ -231,14 +231,14 @@ "Last seen": "Visto por última vez", "Select devices": "Escolla dispositivos", "Failed to set display name": "Fallo ao establecer o nome público", - "Disable Notifications": "Deshabilitar notificacións", - "Enable Notifications": "Habilitar notificacións", + "Disable Notifications": "Desactivar notificacións", + "Enable Notifications": "Activar ass notificacións", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", "Message Replies": "Respostas a mensaxe", "Mirror local video feed": "Copiar fonte de vídeo local", - "Cannot add any more widgets": "Non pode engadir máis widgets", - "The maximum permitted number of widgets have already been added to this room.": "Xa se engadeu o número máximo de widgets a esta sala.", - "Add a widget": "Engadir widget", + "Cannot add any more widgets": "Non pode engadir máis trebellos", + "The maximum permitted number of widgets have already been added to this room.": "Xa se lle engadiron o número máximo de trebellos a esta sala.", + "Add a widget": "Engadir un trebello", "Drop File Here": "Solte aquí o ficheiro", "Drop file here to upload": "Solte aquí o ficheiro para subilo", " (unsupported)": " (non soportado)", @@ -246,7 +246,7 @@ "Ongoing conference call%(supportedText)s.": "Chamada de conferencia en curso%(supportedText)s.", "%(senderName)s sent an image": "%(senderName)s enviou unha imaxe", "%(senderName)s sent a video": "%(senderName)s enviou un vídeo", - "%(senderName)s uploaded a file": "%(senderName)s subeu un ficheiro", + "%(senderName)s uploaded a file": "%(senderName)s subiu un ficheiro", "Options": "Axustes", "Undecryptable": "Non descifrable", "Encrypted by a verified device": "Cifrado por un dispositivo verificado", @@ -271,7 +271,7 @@ "Failed to toggle moderator status": "Fallo ao mudar a estado de moderador", "Failed to change power level": "Fallo ao cambiar o nivel de permisos", "Are you sure?": "Está segura?", - "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Non poderá desfacer este cambio xa que está promovendo a usaria a ter o mesmo nivel de permisos que vostede.", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Non poderá desfacer este cambio xa que lle estará promocionando e outorgándolle a outra persoa os mesmos permisos que os seus.", "No devices with registered encryption keys": "Sen dispositivos con chaves de cifrado rexistradas", "Devices": "Dispositivos", "Unignore": "Non ignorar", @@ -290,7 +290,7 @@ "and %(count)s others...|other": "e %(count)s outras...", "and %(count)s others...|one": "e outra máis...", "Invited": "Convidada", - "Filter room members": "Filtrar membros da conversa", + "Filter room members": "Filtrar os participantes da conversa", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (permiso %(powerLevelNumber)s)", "Attachment": "Anexo", "Upload Files": "Subir ficheiros", @@ -306,9 +306,9 @@ "Send a reply (unencrypted)…": "Enviar unha resposta (non cifrada)…", "Send an encrypted message…": "Enviar unha mensaxe cifrada…", "Send a message (unencrypted)…": "Enviar unha mensaxe (non cifrada)…", - "You do not have permission to post to this room": "Non ten permiso para comentar en esta sala", - "Turn Markdown on": "Habilitar Markdown", - "Turn Markdown off": "Deshabilitar Markdown", + "You do not have permission to post to this room": "Non ten permiso para comentar nesta sala", + "Turn Markdown on": "Activar Markdown", + "Turn Markdown off": "Desactivar Markdown", "Hide Text Formatting Toolbar": "Agochar barra de formato de texto", "Server error": "Fallo no servidor", "Server unavailable, overloaded, or something else went wrong.": "Servidor non dispoñible, sobrecargado, ou outra cousa puido fallar.", @@ -321,8 +321,8 @@ "quote": "cita", "bullet": "lista", "numbullet": "lista numerada", - "Markdown is disabled": "Markdown deshabilitado", - "Markdown is enabled": "Markdown habilitado", + "Markdown is disabled": "Markdown desactivado", + "Markdown is enabled": "Markdown activado", "Unpin Message": "Desfixar mensaxe", "Jump to message": "Ir a mensaxe", "No pinned messages.": "Sen mensaxes fixadas.", @@ -340,7 +340,7 @@ "Idle": "En pausa", "Offline": "Fóra de liña", "Unknown": "Descoñecido", - "Replying": "Respostando", + "Replying": "Respondendo", "Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s as %(dateTime)s", "No rooms to show": "Sen salas que mostrar", "Unnamed room": "Sala sen nome", @@ -357,11 +357,11 @@ "Forget room": "Esquecer sala", "Search": "Busca", "Show panel": "Mostra panel", - "Drop here to favourite": "Solte aqui para favorito", + "Drop here to favourite": "Solte aquí para favorito", "Drop here to tag direct chat": "Solte aquí para etiquetar chat directo", "Drop here to restore": "Solte aquí para restablecer", "Drop here to tag %(section)s": "Solte aquí para etiquetar %(section)s", - "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.": "Non poderá desfacer este cambio xa que está a diminuír a súa autoridade, si vostede é a única usuaria con autorización na sala será imposible voltar a obter privilexios.", + "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.": "Non poderá desfacer este cambio xa que está a diminuír a súa autoridade, se é a única persoa con autorización na sala será imposible volver a obter privilexios.", "Drop here to demote": "Arrastre aquí para degradar", "Press <StartChatButton> to start a chat with someone": "Pulse <StartChatButton> para iniciar a conversa con alguén", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Aínda non está en ningunha sala! Pulse <CreateRoomButton> para crear unha sala ou <RoomDirectoryButton> para buscar no directorio", @@ -377,75 +377,75 @@ "You have been invited to join this room by %(inviterName)s": "Foi convidada por %(inviterName)s a unirse a esta sala", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Quere <acceptText>aceptar</acceptText> ou <declineText>rexeitar</declineText> este convite?", "Reason: %(reasonText)s": "Razón: %(reasonText)s", - "Rejoin": "Voltar a unirse", + "Rejoin": "Volver a unirse", "You have been kicked from %(roomName)s by %(userName)s.": "Foi expulsada de %(roomName)s por %(userName)s.", - "You have been kicked from this room by %(userName)s.": "Foi expulsada de esta sala por %(userName)s.", + "You have been kicked from this room by %(userName)s.": "Foi expulsada desta sala por %(userName)s.", "You have been banned from %(roomName)s by %(userName)s.": "Non se lle permite acceder a %(roomName)s por %(userName)s.", "You have been banned from this room by %(userName)s.": "Non se lle permite o acceso a esta sala por %(userName)s.", "This room": "Esta sala", "%(roomName)s does not exist.": "%(roomName)s non existe.", - "%(roomName)s is not accessible at this time.": "%(roomName)s non está accesible en este momento.", + "%(roomName)s is not accessible at this time.": "%(roomName)s non está accesible neste momento.", "You are trying to access %(roomName)s.": "Está intentando acceder a %(roomName)s.", "You are trying to access a room.": "Está intentando acceder a unha sala.", "<a>Click here</a> to join the discussion!": "<a>Pulse aquí</a> para unirse a conversa!", - "This is a preview of this room. Room interactions have been disabled": "Esta é unha vista previa de esta sala. Desactiváronse as interaccións coa sala", + "This is a preview of this room. Room interactions have been disabled": "Esta é unha vista previa desta sala. Desactiváronse as interaccións coa sala", "To change the room's avatar, you must be a": "Para cambiar o avatar da sala, debe ser", "To change the room's name, you must be a": "Para cambiar o nome da sala, debe ser", "To change the room's main address, you must be a": "Para cambiar o enderezo principal da sala, debe ser", "To change the room's history visibility, you must be a": "Para cambiar a visibilidade do histórico da sala, debe ser", "To change the permissions in the room, you must be a": "Para cambiar os permisos na sala, debe ser", "To change the topic, you must be a": "Para cambiar o asunto, debe ser", - "To modify widgets in the room, you must be a": "Para modificar os widgets da sala, debe ser", + "To modify widgets in the room, you must be a": "Para modificar os trebellos da sala, debe ser", "Failed to unban": "Fallou eliminar a prohibición", "Banned by %(displayName)s": "Non aceptado por %(displayName)s", "Privacy warning": "Aviso de intimidade", - "Changes to who can read history will only apply to future messages in this room": "Os cambios sobre quen pode ler o histórico serán de aplicación a futuras mensaxes en esta sala", + "Changes to who can read history will only apply to future messages in this room": "Os cambios sobre quen pode ler o histórico serán de aplicación para as futuras mensaxes nesta sala", "The visibility of existing history will be unchanged": "A visibilidade do histórico existente non cambiará", "unknown error code": "código de fallo descoñecido", "Failed to forget room %(errCode)s": "Fallo ao esquecer sala %(errCode)s", - "End-to-end encryption is in beta and may not be reliable": "O cifrado de extremo-a-extremo está en beta e podería non ser fiable", + "End-to-end encryption is in beta and may not be reliable": "O cifrado de par-a-par está en beta e podería non ser fiable", "You should not yet trust it to secure data": "Polo de agora non debería confiarlle datos seguros", "Devices will not yet be able to decrypt history from before they joined the room": "Os dispositivos non poderán descifrar o histórico anterior a que se uniron a sala", - "Once encryption is enabled for a room it cannot be turned off again (for now)": "Unha vez habilitado o cifrado para unha sala non se poderá desactivar (por agora)", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Unha vez activou o cifrado para unha sala non se poderá desactivar (por agora)", "Encrypted messages will not be visible on clients that do not yet implement encryption": "As mensaxes cifradas non será visibles en clientes que non aínda non teñan implementado o cifrado", - "Enable encryption": "Habilitar cifrado", - "(warning: cannot be disabled again!)": "(aviso: non se pode deshabilitar!)", - "Encryption is enabled in this room": "O cifrado está habilitado en esta sala", - "Encryption is not enabled in this room": "O cifrado non se habilitou para esta sala", + "Enable encryption": "Activar o cifrado", + "(warning: cannot be disabled again!)": "(aviso: non se pode desactivar!)", + "Encryption is enabled in this room": "O cifrado está activado nesta sala", + "Encryption is not enabled in this room": "Non se activou o cifrado nesta sala", "Privileged Users": "Usuarios con privilexios", - "No users have specific privileges in this room": "Non hai usuarias con privilexios específicos en esta sala", - "Banned users": "Usuarias non permitidas", + "No users have specific privileges in this room": "Non hai usuarios con privilexios específicos nesta sala", + "Banned users": "Usuarios excluídos", "This room is not accessible by remote Matrix servers": "Esta sala non é accesible por servidores Matrix remotos", "Leave room": "Deixar a sala", "Favourite": "Favorita", "Tagged as: ": "Etiquetada como: ", "To link to a room it must have <a>an address</a>.": "Para ligar a unha sala deberá ter <a>un enderezo</a>.", - "Guests cannot join this room even if explicitly invited.": "As convidadas non se poden unir a esta sala incluso se foro explicitamente convidadas.", + "Guests cannot join this room even if explicitly invited.": "Os convidados non se poden unir a esta sala inda que fosen convidados explicitamente.", "Click here to fix": "Pulse aquí para solución", - "Who can access this room?": "Quén pode acceder a esta sala?", + "Who can access this room?": "Quen pode acceder a esta sala?", "Only people who have been invited": "Só persoas que foron convidadas", "Anyone who knows the room's link, apart from guests": "Calquera que coñeza o enderezo da sala, aparte das convidadas", "Anyone who knows the room's link, including guests": "Calquera que coñeza a ligazón a sala, incluíndo as convidadas", "Publish this room to the public in %(domain)s's room directory?": "Publicar esta sala no directorio público de salas de %(domain)s?", - "Who can read history?": "Quén pode ler o histórico?", + "Who can read history?": "Quen pode ler o histórico?", "Anyone": "Calquera", "Members only (since the point in time of selecting this option)": "Só membros (desde o momento en que se selecciona esta opción)", "Members only (since they were invited)": "Só membros (desde que foron convidados)", "Members only (since they joined)": "Só membros (desde que se uniron)", "Permissions": "Permisos", - "The default role for new room members is": "Por omisión o rol na sala para novos membros é", + "The default role for new room members is": "O rol por defecto na sala para novos participantes é", "To send messages, you must be a": "Para enviar mensaxes, deberá ser", - "To invite users into the room, you must be a": "Para convidar a usuarias a esta sala, debe ser", + "To invite users into the room, you must be a": "Para convidar a usuarios a esta sala, debe ser", "To configure the room, you must be a": "Para configurar a sala, debe ser", - "To kick users, you must be a": "Para expulsar usuarias, debe ser", - "To ban users, you must be a": "Para prohibir usuarias, debe ser", - "To remove other users' messages, you must be a": "Para eliminar mensaxes de outras usuarias, debe ser", + "To kick users, you must be a": "Para expulsar usuarios, debe ser", + "To ban users, you must be a": "Para prohibir usuarios, debe ser", + "To remove other users' messages, you must be a": "Para eliminar mensaxes doutras usuarios, debe ser", "To send events of type <eventType/>, you must be a": "Para enviar eventos de tipo <eventType/>, debe ser", "Advanced": "Avanzado", - "This room's internal ID is": "O ID interno de esta sala é", + "This room's internal ID is": "O ID interno desta sala é", "Add a topic": "Engadir asunto", "Cancel": "Cancelar", - "Scroll to unread messages": "Desplace ate mensaxes non lidas", + "Scroll to unread messages": "Desprazarse ate mensaxes non lidas", "Jump to first unread message.": "Ir a primeira mensaxe non lida.", "Close": "Pechar", "Invalid alias format": "Formato de alias non válido", @@ -463,10 +463,10 @@ "Invalid community ID": "ID da comunidade non válido", "'%(groupId)s' is not a valid community ID": "'%(groupId)s' non é un ID de comunidade válido", "New community ID (e.g. +foo:%(localDomain)s)": "Novo ID da comunidade (ex. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "Vostede <a>habilitou</a> a vista previa de URL por omisión.", - "You have <a>disabled</a> URL previews by default.": "Vostede <a>desactivou</a> a vista previa de URL por omisión.", - "URL previews are enabled by default for participants in this room.": "As vistas previas de URL están habilitadas por omisión para os participantes de esta sala.", - "URL previews are disabled by default for participants in this room.": "As vistas previas de URL están desactivadas por omisión para os participantes de esta sala.", + "You have <a>enabled</a> URL previews by default.": "<a>Activou</a> a vista previa de URL por defecto.", + "You have <a>disabled</a> URL previews by default.": "<a>Desactivou</a> a vista previa de URL por defecto.", + "URL previews are enabled by default for participants in this room.": "As vistas previas de URL están activas por defecto para os participantes desta sala.", + "URL previews are disabled by default for participants in this room.": "As vistas previas de URL están desactivadas por defecto para os participantes desta sala.", "URL Previews": "Vista previa de URL", "Error decrypting audio": "Fallo ao descifrar audio", "Error decrypting attachment": "Fallo descifrando o anexo", @@ -486,17 +486,17 @@ "Message removed by %(userId)s": "Mensaxe eliminada por %(userId)s", "Message removed": "Mensaxe eliminada", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Comprobación por Robot non está dispoñible en escritorio - por favor utilice un <a>navegador web</a>", - "This Home Server would like to make sure you are not a robot": "Este Servidor quere asegurarse de que vostede non é un robot", + "This Home Server would like to make sure you are not a robot": "Este servidor quere asegurarse de que vostede non é un robot", "Sign in with CAS": "Conectarse con CAS", "Custom Server Options": "Opcións personalizadas do servidor", "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Pode utilizar as opcións personalizadas do servidor para conectarse a outros servidores Matrix indicando un URL de servidor de inicio diferente.", - "This allows you to use this app with an existing Matrix account on a different home server.": "Así pode utilizar este aplicativo con unha conta Matrix existente en un servidor de incio diferente.", - "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Tamén pode establecer un servidor de identidade personalizado pero esto normalmente dificulta a interacción con usuarias basándose non enderezo de correo.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Así pode utilizar este aplicativo con unha conta Matrix existente en un servidor de inicio diferente.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Tamén pode establecer un servidor de identidade personalizado pero isto normalmente dificulta a interacción con usuarios baseándose non enderezo de correo.", "Dismiss": "Rexeitar", "To continue, please enter your password.": "Para continuar, por favor introduza o seu contrasinal.", "Password:": "Contrasinal:", "An email has been sent to %(emailAddress)s": "Enviouse un correo a %(emailAddress)s", - "Please check your email to continue registration.": "Por favor comprobe o seu correo para continuar co rexistro.", + "Please check your email to continue registration.": "Comprobe o seu correo para continuar co rexistro.", "Token incorrect": "Testemuño incorrecto", "A text message has been sent to %(msisdn)s": "Enviouse unha mensaxe de texto a %(msisdn)s", "Please enter the code it contains:": "Por favor introduza o código que contén:", @@ -510,22 +510,22 @@ "Sign in with": "Conectarse con", "Email address": "Enderezo de correo", "Sign in": "Conectar", - "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Si non indica un enderezo de correo non poderá restablecer o contrasinal, está segura?", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Se non indica un enderezo de correo non poderá restablecer o contrasinal, está seguro?", "Email address (optional)": "Enderezo de correo (opcional)", "You are registering with %(SelectedTeamName)s": "Estase a rexistrar con %(SelectedTeamName)s", "Mobile phone number (optional)": "Número de teléfono móbil (opcional)", - "Register": "Rexistar", - "Default server": "Servidor por omisión", + "Register": "Rexistrar", + "Default server": "Servidor por defecto", "Custom server": "Servidor personalizado", "Home server URL": "URL do servidor de inicio", "Identity server URL": "URL do servidor de identidade", - "What does this mean?": "Qué significa esto?", + "What does this mean?": "Que significa isto?", "Remove from community": "Eliminar da comunidade", "Disinvite this user from community?": "Retirar o convite a comunidade a esta usuaria?", "Remove this user from community?": "Quitar a esta usuaria da comunidade?", "Failed to withdraw invitation": "Fallo ao retirar o convite", "Failed to remove user from community": "Fallo ao quitar a usuaria da comunidade", - "Filter community members": "Filtrar membros da comunidade", + "Filter community members": "Filtrar participantes na comunidade", "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Está segura de que quere eliminar '%(roomName)s' de %(groupId)s?", "Removing a room from the community will also remove it from the community page.": "Eliminar unha sala da comunidade tamén a quitará da páxina da comunidade.", "Remove": "Eliminar", @@ -535,18 +535,18 @@ "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "A visibilidade de '%(roomName)s' en %(groupId)s non se puido actualizar.", "Visibility in Room List": "Visibilidade na Lista de Salas", "Visible to everyone": "Visible para todo o mundo", - "Only visible to community members": "Só visible para membros da comunidade", + "Only visible to community members": "Só visible para os participantes da comunidade", "Filter community rooms": "Filtrar salas da comunidade", "Something went wrong when trying to get your communities.": "Algo fallou ao intentar obter as súas comunidades.", "You're not currently a member of any communities.": "Ate o momento non é membro de ningunha comunidade.", "Unknown Address": "Enderezo descoñecido", - "NOTE: Apps are not end-to-end encrypted": "NOTA: As Apps non están cifradas de extremo-a-extremo", - "Do you want to load widget from URL:": "Quere cargar o widget da URL:", + "NOTE: Apps are not end-to-end encrypted": "NOTA: As Apps non están cifradas de par-a-par", + "Do you want to load widget from URL:": "Quere cargar o trebello da URL:", "Allow": "Permitir", - "Delete Widget": "Eliminar Widget", - "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Quitando un widget eliminao para todas as usuarias de esta sala. Está segura de querer eliminar este widget?", - "Delete widget": "Eliminar widget", - "Revoke widget access": "Retirar acceso ao widget", + "Delete Widget": "Eliminar trebello", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Quitando un trebello elimínao para todas os usuarios desta sala. Está seguro de querer eliminar este trebello?", + "Delete widget": "Eliminar trebello", + "Revoke widget access": "Retirar acceso ao trebello", "Minimize apps": "Minimizar apps", "Edit": "Editar", "Create new room": "Crear unha nova sala", @@ -565,25 +565,25 @@ "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s uníronse %(count)s veces", "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s uníronse", "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s uniuse %(count)s veces", - "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s uníuse", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s uniuse", "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s saíron %(count)s veces", "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s saíron", - "%(oneUser)sleft %(count)s times|other": "%(oneUser)s saiu %(count)s veces", - "%(oneUser)sleft %(count)s times|one": "%(oneUser)s saiu", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s saíu %(count)s veces", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s saio", "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s uníronse e saíron %(count)s veces", "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s uníronse e saíron", - "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s uniuse e saiu %(count)s veces", - "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s uníuse e saiu", - "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s saíron e voltaron %(count)s veces", - "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s saíron e voltaron", - "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s saiu e voltou %(count)s veces", - "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s saiu e voltou", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s uniuse e saio %(count)s veces", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s uniuse e saíu", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s saíron e volveron %(count)s veces", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s saíron e votaron", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s saíu e volveu %(count)s veces", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s saíu e volveu", "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s rexeitaron convites %(count)s veces", "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s rexeitaron os seus convites", "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s rexeitou o seu convite %(count)s veces", "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s rexeitou o seu convite", "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "retiróuselle o convite a %(severalUsers)s %(count)s veces", - "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "retirouselle o convite a %(severalUsers)s", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "retiróuselle o convite a %(severalUsers)s", "%(oneUser)shad their invitation withdrawn %(count)s times|other": "retiróuselle o convite a %(oneUser)s %(count)s veces", "%(oneUser)shad their invitation withdrawn %(count)s times|one": "retiróuselle o convite a %(oneUser)s", "were invited %(count)s times|other": "foron convidados %(count)s veces", @@ -594,9 +594,9 @@ "were banned %(count)s times|one": "foron prohibidas", "was banned %(count)s times|other": "foi prohibida %(count)s veces", "was banned %(count)s times|one": "foi prohibida", - "were unbanned %(count)s times|other": "retirouselle a prohibición %(count)s veces", - "were unbanned %(count)s times|one": "retirouselle a prohibición", - "was unbanned %(count)s times|other": "retirouselle a prohibición %(count)s veces", + "were unbanned %(count)s times|other": "retiróuselle a prohibición %(count)s veces", + "were unbanned %(count)s times|one": "retrouseille a prohibición", + "was unbanned %(count)s times|other": "retrouseille a prohibición %(count)s veces", "was unbanned %(count)s times|one": "retiróuselle a prohibición", "were kicked %(count)s times|other": "foron expulsadas %(count)s veces", "were kicked %(count)s times|one": "foron expulsadas", @@ -626,7 +626,7 @@ "Matrix Room ID": "ID sala Matrix", "email address": "enderezo de correo", "Try using one of the following valid address types: %(validTypesList)s.": "Intentar utilizar algún dos seguintes tipos de enderezo válidos: %(validTypesList)s.", - "You have entered an invalid address.": "Introduxo un enderezo non válido.", + "You have entered an invalid address.": "Introduciu un enderezo non válido.", "Create a new chat or reuse an existing one": "Crear un novo chat ou reutilizar un xa existente", "Start new chat": "Iniciar un novo chat", "You already have existing direct chats with this user:": "Xa ten unha conversa directa con esta usuaria:", @@ -634,10 +634,10 @@ "Click on the button below to start chatting!": "Pulse non botón inferior para iniciar a conversar!", "Start Chatting": "Iniciar a conversa", "Confirm Removal": "Confirme a retirada", - "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.": "Está certa de que quere quitar (eliminar) este evento? Sepa que si elimina un nome de sala ou cambia o asunto, podería desfacer o cambio.", + "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.": "Está certa de que quere quitar (eliminar) este evento? Saiba que si elimina un nome de sala ou cambia o asunto, podería desfacer o cambio.", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Os ID de comunidade só poden conter caracteres a-z, 0-9, or '=_-./'", "Community IDs cannot not be empty.": "O ID de comunidade non pode quedar baldeiro.", - "Something went wrong whilst creating your community": "Algo fallou mentras se creaba a súa comunidade", + "Something went wrong whilst creating your community": "Algo fallou mentres se creaba a súa comunidade", "Create Community": "Crear comunidade", "Community Name": "Nome da comunidade", "Example": "Exemplo", @@ -647,37 +647,37 @@ "Create Room": "Crear sala", "Room name (optional)": "Nome da sala (opcional)", "Advanced options": "Axustes avanzados", - "Block users on other matrix homeservers from joining this room": "Evitar que usuarias de outros servidores matrix se unan a esta sala", + "Block users on other matrix homeservers from joining this room": "Evitar que usuarios doutros servidores matrix se unan a esta sala", "This setting cannot be changed later!": "Esta preferencia non se pode cambiar máis tarde!", "Unknown error": "Fallo descoñecido", "Incorrect password": "Contrasinal incorrecto", "Deactivate Account": "Desactivar conta", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Non se pode determinar si o enderezo ao que foi enviado este convite coincide con un dos asociados a súa conta.", - "To verify that this device 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 device matches the key below:": "Para verificar que se pode confiar en este dispositivo, contacte co seu dono utilizando algún outro medio (ex. en persoa ou chamada de teléfono) e pregúntelle si a chave que ven nos Axustes de Usuaria do se dispositivo coincide coa chave inferior:", + "To verify that this device 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 device matches the key below:": "Para verificar que se pode confiar neste dispositivo, contacte co seu dono utilizando algún outro medio (ex. en persoa ou chamada de teléfono) e pregúntelle se a clave que ven nos axustes de usuario do se dispositivo coincide coa clave inferior:", "Device name": "Nome do dispositivo", "Device key": "Chave do dispositivo", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Si concorda, pulse o botón verificar. Si non, entón alguén está interceptando este dispositivo e probablemente vostede desexe pulsar o botón lista negra.", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Se concorda, pulse o botón verificar. Si non, entón alguén está interceptando este dispositivo e probablemente vostede desexe pulsar o botón lista negra.", "In future this verification process will be more sophisticated.": "No futuro este proceso de verificación será máis sofisticado.", "Verify device": "Verificar dispositivo", "I verify that the keys match": "Certifico que coinciden as chaves", "An error has occurred.": "Algo fallou.", "OK": "OK", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Engadeu un novo dispositivo '%(displayName)s', que está a solicitar as chaves de cifrado.", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Engadiu un novo dispositivo '%(displayName)s', que está a solicitar as chaves de cifrado.", "Your unverified device '%(displayName)s' is requesting encryption keys.": "O seu dispositivo non verificado '%(displayName)s' está solicitando chaves de cifrado.", "Start verification": "Iniciar verificación", - "Share without verifying": "Compartir sin verificar", + "Share without verifying": "Compartir sen verificar", "Ignore request": "Ignorar petición", "Loading device info...": "Cargando información do dispositivo...", "Encryption key request": "Petición de chave de cifrado", "Unable to restore session": "Non se puido restaurar a sesión", - "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.": "Si anteriormente utilizou unha versión máis recente de Riot, a súa sesión podería non ser compatible con esta versión. Peche esta ventá e volte a versión máis recente.", - "Invalid Email Address": "Enderezo de email non válido", - "This doesn't appear to be a valid email address": "Este non semella ser un enderezo de email válido", + "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.": "Si anteriormente utilizou unha versión máis recente de Riot, a súa sesión podería non ser compatible con esta versión. Peche esta ventá e volva a versión máis recente.", + "Invalid Email Address": "Enderezo de correo non válido", + "This doesn't appear to be a valid email address": "Este non semella ser un enderezo de correo válido", "Verification Pending": "Verificación pendente", - "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor comprobe o seu email e pulse na ligazón que contén. Unha vez feito, pulse continuar.", - "Unable to add email address": "Non se puido engadir enderezo de email", - "Unable to verify email address.": "Non se puido verificar enderezo de email.", - "This will allow you to reset your password and receive notifications.": "Esto permitiralle restablecer o seu contrasinal e recibir notificacións.", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Comprobe o seu correo electrónico e pulse na ligazón que contén. Unha vez feito iso prema continuar.", + "Unable to add email address": "Non se puido engadir enderezo de correo", + "Unable to verify email address.": "Non se puido verificar enderezo de correo electrónico.", + "This will allow you to reset your password and receive notifications.": "Isto permitiralle restablecer o seu contrasinal e recibir notificacións.", "Skip": "Saltar", "User names may only contain letters, numbers, dots, hyphens and underscores.": "Os nomes de usuaria só poden conter letras, números, puntos e guión alto e baixo.", "Username not available": "Nome de usuaria non dispoñible", @@ -686,8 +686,8 @@ "Username available": "Nome de usuaria dispoñible", "To get started, please pick a username!": "Para comezar, escolla un nome de usuaria!", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Este será o nome da súa conta no <span></span> servidor, ou pode escoller un <a>servidor diferente</a>.", - "If you already have a Matrix account you can <a>log in</a> instead.": "Si xa ten unha conta Matrix entón pode <a>conectarse</a>.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "En este momento está por na lista negra os dispositivos non verificados; para enviar mensaxes a eses dispositivos debe verificalos.", + "If you already have a Matrix account you can <a>log in</a> instead.": "Se xa ten unha conta Matrix entón pode <a>conectarse</a>.", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Neste momento está por na lista negra os dispositivos non verificados; para enviar mensaxes a eses dispositivos debe verificalos.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Recomendámoslle que vaia ao proceso de verificación para cada dispositivo para confirmar que pertencen ao seu dono lexítimos, pero se o prefire pode enviar a mensaxe sen ter verificado.", "Room contains unknown devices": "A sala contén dispositivos descoñecidos", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contén dispositivos que vostede non vira antes.", @@ -699,22 +699,22 @@ "Name": "Nome", "Topic": "Asunto", "Make this room private": "Facer que esta sala sexa privada", - "Share message history with new users": "Compartir o histórico de mensaxes coas novas usuarias", - "Encrypt room": "Cifrar sala", + "Share message history with new users": "Compartir o histórico de mensaxes cos novos usuarios", + "Encrypt room": "Cifrar a sala", "You must <a>register</a> to use this functionality": "Debe <a>rexistrarse</a> para utilizar esta función", "You must join the room to see its files": "Debe unirse a sala para ver os seus ficheiros", - "There are no visible files in this room": "Non hai ficheiros visibles en esta sala", + "There are no visible files in this room": "Non hai ficheiros visibles nesta sala", "<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>HTML para a páxina da súa comunidade</h1>\n<p>\n Utilice a descrición longa para presentar novos membros a comunidade, ou publicar algunha <a href=\"foo\">ligazón</a> importante\n \n</p>\n<p>\n Tamén pode utilizar etiquetas 'img'\n</p>\n", "Add rooms to the community summary": "Engadir salas ao resumo da comunidade", - "Which rooms would you like to add to this summary?": "Qué salas desexa engadir a este resumo?", + "Which rooms would you like to add to this summary?": "Que salas desexa engadir a este resumo?", "Add to summary": "Engadir ao resumo", "Failed to add the following rooms to the summary of %(groupId)s:": "Algo fallou ao engadir estas salas ao resumo de %(groupId)s:", "Add a Room": "Engadir unha sala", "Failed to remove the room from the summary of %(groupId)s": "Algo fallou ao quitar a sala do resumo de %(groupId)s", "The room '%(roomName)s' could not be removed from the summary.": "A sala '%(roomName)s' non se puido eliminar do resumo.", - "Add users to the community summary": "Engadir usuarias ao resumo da comunidade", - "Who would you like to add to this summary?": "A quén desexa engadir a este resumo?", - "Failed to add the following users to the summary of %(groupId)s:": "Algo fallou ao engadir as seguintes usuarias ao resumo de %(groupId)s:", + "Add users to the community summary": "Engadir usuarios ao resumo da comunidade", + "Who would you like to add to this summary?": "A quen desexa engadir a este resumo?", + "Failed to add the following users to the summary of %(groupId)s:": "Algo fallou ao engadir aos seguintes usuarios ao resumo de %(groupId)s:", "Add a User": "Engadir unha usuaria", "Failed to remove a user from the summary of %(groupId)s": "Algo fallou ao eliminar a usuaria do resumo de %(groupId)s", "The user '%(displayName)s' could not be removed from the summary.": "A usuaria '%(displayName)s' non se puido eliminar do resumo.", @@ -726,14 +726,14 @@ "Leave %(groupName)s?": "Deixar %(groupName)s?", "Leave": "Saír", "Community Settings": "Axustes da comunidade", - "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Estas salas son mostradas aos membros da comunidade na páxina da comunidade. Os membros da comunidade poden unirse as salas pulsando en elas.", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Estas salas móstranselle aos membros da comunidade na páxina da comunidade.Os participantes da comunidade poden unirse ás salas premendo nelas.", "Add rooms to this community": "Engadir salas a esta comunidade", "Featured Rooms:": "Salas destacadas:", - "Featured Users:": "Usuarias destacadas:", + "Featured Users:": "Usuarios destacados:", "%(inviter)s has invited you to join this community": "%(inviter)s convidouna a unirse a esta comunidade", "You are an administrator of this community": "Vostede administra esta comunidade", - "You are a member of this community": "Vostede é membro de esta comunidade", - "Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "A súa comunidade non ten unha Descrición Longa, unha páxina HTML para mostrar aos membros.<br />Pulse aquí para abrir os axustes e publicar unha!", + "You are a member of this community": "É membro desta comunidade", + "Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "A súa comunidade non ten unha descrición longa, ou unha páxina HTML que lle mostrar aos seus participantes.<br />Pulse aquí para abrir os axustes e publicar unha!", "Long Description (HTML)": "Descrición longa (HTML)", "Description": "Descrición", "Community %(groupId)s not found": "Non se atopou a comunidade %(groupId)s", @@ -749,13 +749,13 @@ "Old cryptography data detected": "Detectouse o uso de criptografía sobre datos antigos", "Logout": "Desconectar", "Your Communities": "As súas Comunidades", - "Error whilst fetching joined communities": "Fallo mentras se obtiñas as comunidades unidas", + "Error whilst fetching joined communities": "Fallo mentres se obtiñas as comunidades unidas", "Create a new community": "Crear unha nova comunidade", - "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crear unha comunidade para agrupar usuarias e salas! Poña unha páxina de inicio personalizada para destacar o seu lugar no universo Matrix.", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crear unha comunidade para agrupar usuaria/os e salas! Poña unha páxina de inicio personalizada para destacar o seu lugar no universo Matrix.", "Join an existing community": "Unirse a unha comunidade existente", "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Para unirse a unha comunidade existente deberá coñecer o identificador de esa comunidade; terá un aspecto como <i>+exemplo:matrix.org</i>.", "You have no visible notifications": "Non ten notificacións visibles", - "Scroll to bottom of page": "Desplácese ate o final da páxina", + "Scroll to bottom of page": "Desprácese ate o final da páxina", "Message not sent due to unknown devices being present": "Non se enviou a mensaxe porque hai dispositivos non coñecidos", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Mostrar dispositivos</showDevicesText>, <sendAnywayText>enviar igualmente</sendAnywayText> ou <cancelText>cancelar</cancelText>.", "%(count)s of your messages have not been sent.|other": "Algunha das súas mensaxes non foron enviadas.", @@ -764,7 +764,7 @@ "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Reenviar mensaxe</resendText> ou <cancelText>cancelar mensaxe</cancelText> agora.", "Warning": "Aviso", "Connectivity to the server has been lost.": "Perdeuse a conexión ao servidor.", - "Sent messages will be stored until your connection has returned.": "As mensaxes enviadas gardaránse ate que retome a conexión.", + "Sent messages will be stored until your connection has returned.": "As mensaxes enviadas gardaranse ate que retome a conexión.", "%(count)s new messages|other": "%(count)s novas mensaxes", "%(count)s new messages|one": "%(count)s nova mensaxe", "Active call": "Chamada activa", @@ -785,19 +785,19 @@ "Click to mute video": "Pulse para acalar video", "Click to unmute audio": "Pulse para escoitar audio", "Click to mute audio": "Pulse para acalar audio", - "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Intentouse cargar un punto concreto do historial de esta sala, pero vostede non ten permiso para ver a mensaxe en cuestión.", - "Tried to load a specific point in this room's timeline, but was unable to find it.": "Intentouse cargar un punto específico do historial de esta sala, pero non se puido atopar.", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Intentouse cargar un punto concreto do historial desta sala, pero non ten permiso para ver a mensaxe en cuestión.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Intentouse cargar un punto específico do historial desta sala, pero non se puido atopar.", "Failed to load timeline position": "Fallo ao cargar posición da liña temporal", "Uploading %(filename)s and %(count)s others|other": "Subindo %(filename)s e %(count)s máis", "Uploading %(filename)s and %(count)s others|zero": "Subindo %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Subindo %(filename)s e %(count)s máis", "Light theme": "Decorado claro", - "Dark theme": "Decorado oscuro", + "Dark theme": "Decorado escuro", "Status.im theme": "Decorado Status.im", "Can't load user settings": "Non se puideron cargar os axustes de usuaria", "Server may be unavailable or overloaded": "O servidor podería non está dispoñible ou sobrecargado", "Sign out": "Desconectar", - "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por seguridade, ao desconectarse borrará todas as chaves de cifrado extremo-a-extremo en este navegador. Si quere poder descifrar o historial da conversa en futuras sesións en Riot, por favor exporte as chaves da sala e gárdeas en lugar seguro.", + "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por seguridade, ao desconectarse borrará todas as chaves de cifrado par-a-par ste navegador. Se quere poder descifrar o historial da conversa en futuras sesións en Riot, por favor exporte as chaves da sala e gárdeas en lugar seguro.", "Failed to change password. Is your password correct?": "Fallo ao cambiar o contrasinal. É correcto o contrasinal?", "Success": "Parabéns", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "O seu contrasinal cambiouse correctamente. Non recibirá notificacións tipo push en outros dispositivos ate que se conecte novamente en eles", @@ -807,17 +807,17 @@ "Refer a friend to Riot:": "Convide a un amigo a Riot:", "Interface Language": "Idioma da Interface", "User Interface": "Interface de usuaria", - "Autocomplete Delay (ms):": "Retraso no autocompletado (ms):", + "Autocomplete Delay (ms):": "Atraso no autocompletado (ms):", "<not supported>": "<non soportado>", "Import E2E room keys": "Importar chaves E2E da sala", "Cryptography": "Criptografía", "Device ID:": "ID de dispositivo:", "Device key:": "Chave do dispositivo:", - "Ignored Users": "Usuarias ignoradas", + "Ignored Users": "Usuarios ignorados", "Analytics": "Analytics", "Riot collects anonymous analytics to allow us to improve the application.": "Riot recolle información analítica anónima para permitirnos mellorar o aplicativo.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "A intimidade impórtanos, así que non recollemos información personal ou identificable nos datos dos nosos análises.", - "Learn more about how we use analytics.": "Saber máis sobre cómo utilizamos analytics.", + "Learn more about how we use analytics.": "Saber máis sobre como utilizamos analytics.", "Labs": "Labs", "These are experimental features that may break in unexpected ways": "Estas son características experimentais que poderían dar lugar a fallos non agardados", "Use with caution": "Utilice con precaución", @@ -828,24 +828,24 @@ "Check for update": "Comprobar actualización", "Reject all %(invitedRooms)s invites": "Rexeitar todos os %(invitedRooms)s convites", "Bulk Options": "Opcións en bloque", - "Desktop specific": "Específicas de escritorio", - "Start automatically after system login": "Iniciar automáticamente despóis de iniciar sesión", + "Desktop specific": "Configuracións de escritorio", + "Start automatically after system login": "Iniciar automaticamente despois de iniciar sesión", "No media permissions": "Sen permisos de medios", "You may need to manually permit Riot to access your microphone/webcam": "Igual ten que permitir manualmente a Riot acceder ao seus micrófono e cámara", "Missing Media Permissions, click here to request.": "Faltan permisos de medios, pulse aquí para solicitalos.", "No Microphones detected": "Non se detectaron micrófonos", "No Webcams detected": "Non se detectaron cámaras", - "Default Device": "Dispositivo por omisión", + "Default Device": "Dispositivo por defecto", "Microphone": "Micrófono", "Camera": "Cámara", "VoIP": "VoIP", - "Email": "Correo-e", - "Add email address": "Engadir enderezo correo-e", + "Email": "Correo electrónico", + "Add email address": "Engadir enderezo correo electrónico", "Notifications": "Notificacións", "Profile": "Perfil", "Display name": "Nome mostrado", "Account": "Conta", - "To return to your account in future you need to set a password": "Estableza un contrasinal para voltar a súa conta con posterioridade", + "To return to your account in future you need to set a password": "Estableza un contrasinal para volver a súa conta con posterioridade", "Logged in as:": "Conectada como:", "Access Token:": "Testemuño de acceso:", "click to reveal": "pulse para revelar", @@ -854,31 +854,31 @@ "matrix-react-sdk version:": "versión matrix-react-sdk:", "riot-web version:": "versión riot-web:", "olm version:": "versión olm:", - "Failed to send email": "Fallo ao enviar correo-e", - "The email address linked to your account must be entered.": "Debe introducir o correo-e ligado a súa conta.", + "Failed to send email": "Fallo ao enviar correo electrónico", + "The email address linked to your account must be entered.": "Debe introducir o correo electrónico ligado a súa conta.", "A new password must be entered.": "Debe introducir un novo contrasinal.", "New passwords must match each other.": "Os novos contrasinais deben ser coincidentes.", - "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.": "Detectáronse datos de una versión anterior de Riot. Esto causará un mal funcionamento da criptografía extremo-a-extremo na versión antiga. As mensaxes cifradas extremo-a-extremo intercambiadas mentras utilizaba a versión anterior poderían non ser descifrables en esta versión. Esto tamén podería causar que mensaxes intercambiadas con esta versión tampouco funcionasen. Si ten problemas, desconéctese e conéctese de novo. Para manter o historial de mensaxes, exporte e reimporte as súas chaves.", - "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "O restablecemento do contrasinal restablecerá tamén as chaves de cifrado extremo-a-extremo en todos os dispositivos, facendo o historial de chat cifrado non lexible, a menos que primeiro exporte as chaves da sala e as reimporte posteriormente. No futuro melloraremos esto.", - "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Enviouse un email a %(emailAddress)s. Unha vez siga a ligazón que contén, pulse abaixo.", - "I have verified my email address": "Validei o meu enderezo de correo-e", + "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.": "Detectáronse datos de una versión anterior de Riot. Isto causará un mal funcionamento da criptografía extremo-a-extremo na versión antiga. As mensaxes cifradas extremo-a-extremo intercambiadas mentres utilizaba a versión anterior poderían non ser descifrables en esta versión. Isto tamén podería causar que mensaxes intercambiadas con esta versión tampouco funcionasen. Se ten problemas, desconéctese e conéctese de novo. Para manter o historial de mensaxes, exporte e reimporte as súas chaves.", + "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "O restablecemento do contrasinal restablecerá tamén as chaves de cifrado extremo-a-extremo en todos os dispositivos, facendo o historial de chat cifrado non lexible, a menos que primeiro exporte as chaves da sala e as reimporte posteriormente. No futuro melloraremos isto.", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Enviouse un correo a %(emailAddress)s. Unha vez siga a ligazón que contén, pulse abaixo.", + "I have verified my email address": "Validei o meu enderezo de correo electrónico", "Your password has been reset": "Restableceuse o seu contrasinal", "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Foi desconectado de todos os seus dispositivos e xa non recibirá notificacións push. Para reactivar as notificacións, conéctese de novo en cada dispositivo", - "Return to login screen": "Voltar a pantalla de conexión", + "Return to login screen": "Volver a pantalla de conexión", "To reset your password, enter the email address linked to your account": "Para restablecer o seu contrasinal, introduza o enderezo de correo electrónico ligado a súa conta", "New password": "Novo contrasinal", "Confirm your new password": "Confirme o seu novo contrasinal", - "Send Reset Email": "Enviar correo-e de restablecemento", + "Send Reset Email": "Enviar correo electrónico de restablecemento", "Create an account": "Crear unha conta", - "This Home Server does not support login using email address.": "Este servidor non soporta a conexión utilizando un enderezo de correo-e.", + "This Home Server does not support login using email address.": "Este servidor non soporta a conexión utilizando un enderezo de correo electrónico.", "Incorrect username and/or password.": "Nome de usuaria ou contrasinal non válidos.", "Please note you are logging into the %(hs)s server, not matrix.org.": "Teña en conta que se está a conectar ao servidor %(hs)s, non a matrix.org.", - "Guest access is disabled on this Home Server.": "O acceso de convidados está deshabilitado en este servidor de inicio.", + "Guest access is disabled on this Home Server.": "O acceso de convidados está desactivado neste servidor de inicio.", "The phone number entered looks invalid": "O número de teléfono introducido non semella ser válido", "This homeserver doesn't offer any login flows which are supported by this client.": "Este servidor non ofrece ningún sistema de conexión que soporte este cliente.", "Error: Problem communicating with the given homeserver.": "Fallo: problema ao comunicarse con servidor proporcionado.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Non se pode conectar ao servidor vía HTTP cando na barra de enderezos do navegador está HTTPS. Utilice HTTPS ou <a>active scripts non seguros</a>.", - "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Non se conectou ao servidor - por favor comprobe a conexión, asegúrese de o <a>certificado SSL do servidor</a> é de confianza, e que ningún engadido do navegador está bloqueando as peticións.", + "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Non se conectou ao servidor - por favor comprobe a conexión, asegúrese de que o<a>certificado SSL do servidor</a> sexa de confianza, e que ningún engadido do navegador estea bloqueando as peticións.", "Sign in to get started": "Conéctese para iniciar", "Failed to fetch avatar URL": "Fallo ao obter o URL do avatar", "Set a display name:": "Establecer nome público:", @@ -887,7 +887,7 @@ "Missing password.": "Falta contrasinal.", "Passwords don't match.": "Non coinciden os contrasinais.", "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Contrasinal demasiado curto (min %(MIN_PASSWORD_LENGTH)s).", - "This doesn't look like a valid email address.": "Non semella ser un enderezo de correo-e válido.", + "This doesn't look like a valid email address.": "Non semella ser un enderezo de correo electrónico válido.", "This doesn't look like a valid phone number.": "Non semella ser un número de teléfono válido.", "You need to enter a user name.": "É preciso que introduza un nome de usuaria.", "An unknown error occurred.": "Aconteceu un erro descoñecido.", @@ -910,8 +910,8 @@ "Results from DuckDuckGo": "Resultados desde DuckDuckGo", "Emoji": "Emoji", "Notify the whole room": "Notificar a toda a sala", - "Room Notification": "Notificación da Sala", - "Users": "Usuarias", + "Room Notification": "Notificación da sala", + "Users": "Usuarios", "unknown device": "dispositivo descoñecido", "NOT verified": "Non validado", "verified": "validado", @@ -931,28 +931,28 @@ "Passphrases must match": "As frases de paso deben coincidir", "Passphrase must not be empty": "A frase de paso non pode quedar baldeira", "Export room keys": "Exportar chaves da sala", - "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Este proceso permítelle exportar a un ficheiro local as chaves para as mensaxes que recibeu en salas cifradas. Posteriormente permitiralle importar as chaves en outro cliente Matrix no futuro, así o cliente poderá descifrar esas mensaxes.", - "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O ficheiro exportado permitiralle a calquera que poida lelo descifrar e cifrar mensaxes que vostede ve, así que debería ter coidado e gardalo de xeito seguro. Para axudarlle, debe introducir unha frase de paso aquí abaixo que será utilizada para cifrar os datos exportados. Só será posible importar os datos utilizando a misma frase de paso.", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Este proceso permítelle exportar a un ficheiro local as chaves para as mensaxes que recibiu en salas cifradas. Posteriormente permitiralle importar as chaves en outro cliente Matrix no futuro, así o cliente poderá descifrar esas mensaxes.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O ficheiro exportado permitiralle a calquera que poida lelo descifrar e cifrar mensaxes que vostede ve, así que debería ter coidado e gardalo de xeito seguro. Para axudarlle, debe introducir unha frase de paso aquí abaixo que será utilizada para cifrar os datos exportados. Só será posible importar os datos utilizando a mesma frase de paso.", "Enter passphrase": "Introduza a frase de paso", "Confirm passphrase": "Confirme a frase de paso", "Export": "Exportar", "Import room keys": "Importar chaves de sala", - "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Este proceso permítelle importar chaves de cifrado que vostede exportou de outro cliente Matrix. Así poderá descifrar calquer mensaxe que o outro cliente puidese cifrar.", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Este proceso permítelle importar chaves de cifrado que vostede exportou de outro cliente Matrix. Así poderá descifrar calquera mensaxe que o outro cliente puidese cifrar.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "O ficheiro exportado estará protexido con unha frase de paso. Debe introducir aquí esa frase de paso para descifrar o ficheiro.", "File to import": "Ficheiro a importar", "Import": "Importar", "The information being sent to us to help make Riot.im better includes:": "A información enviada a Riot.im para axudarnos a mellorar inclúe:", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Si esta páxina inclúe información identificable como ID de grupo, usuario ou sala, estes datos son eliminados antes de ser enviados ao servidor.", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Se esta páxina inclúe información identificable como ID de grupo, usuario ou sala, estes datos son eliminados antes de ser enviados ao servidor.", "The platform you're on": "A plataforma na que está", "The version of Riot.im": "A versión de Riot.im", - "Whether or not you're logged in (we don't record your user name)": "Si está ou non conectada (non gardamos o nome de usuaria)", + "Whether or not you're logged in (we don't record your user name)": "Se está ou non conectado/a (non gardamos os nomes de usuarios)", "Your language of choice": "A súa preferencia de idioma", - "Which officially provided instance you are using, if any": "Qué instancia oficial está a utilizar, si algunha", - "Whether or not you're using the Richtext mode of the Rich Text Editor": "Si utiliza o modo Richtext ou non do Editor Rich Text", + "Which officially provided instance you are using, if any": "Se a houbese, que instancia oficial está a utilizar", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Se utiliza o modo Richtext ou non do editor de texto enriquecido", "Your homeserver's URL": "O URL do seu servidor de inicio", "Your identity server's URL": "O URL da súa identidade no servidor", "<a>In reply to</a> <pill>": "<a>En resposta a</a> <pill>", - "This room is not public. You will not be able to rejoin without an invite.": "Esta sala non é pública. Non poderá voltar a ela sin un convite.", + "This room is not public. You will not be able to rejoin without an invite.": "Esta sala non é pública. Non poderá volver a ela sen un convite.", "This room is not showing flair for any communities": "Esta sala non mostra popularidade para as comunidades", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s cambiou o seu nome mostrado a %(displayName)s.", "Clear filter": "Quitar filtro", @@ -960,57 +960,57 @@ "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", "Failed to add tag %(tagName)s to room": "Fallo ao engadir a etiqueta %(tagName)s a sala", "Failed to lookup current room": "Fallo ao bloquear a sala actual", - "Disable Community Filter Panel": "Deshabilitar o panel de filtro de comunidades", + "Disable Community Filter Panel": "Desactivar o panel de filtro de comunidades", "Your key share request has been sent - please check your other devices for key share requests.": "Enviouse a solicitude de compartir chave - por favor comprobe as peticións de compartir chaves nos seus outros dispositivos.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "As peticións de compartir chaves envíanse de xeito automático aos seus outros dispositivos. Si rexeita o obvia estas peticións nos outros dispositivos, pulse aquí para solicitar novamente as chaves para esta sesión.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Si os seus outros dispositivos non teñen as chaves para est mensaxe non poderán descifrala.", + "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "As peticións de compartir chaves envíanse de xeito automático aos seus outros dispositivos. Se rexeita o obvia estas peticións nos outros dispositivos, pulse aquí para solicitar novamente as chaves para esta sesión.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "Se os seus outros dispositivos non teñen as chaves para este mensaxe non poderán descifrala.", "Key request sent.": "Petición de chave enviada.", - "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Voltar a pedir chaves de cifrado</requestLink> desde os outros dispositivos.", + "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Volver a pedir chaves de cifrado</requestLink> desde os outros dispositivos.", "%(user)s is a %(userRole)s": "%(user)s é %(userRole)s", "Flair": "Aura", "Showing flair for these communities:": "Mostrar o aura para estas comunidades:", - "Flair will appear if enabled in room settings": "O Aura aparecerá si está habilitada nas preferencias da sala", + "Flair will appear if enabled in room settings": "O Aura aparecerá si está activado nas preferencias da sala", "Flair will not appear": "O Aura non aparecerá", "Display your community flair in rooms configured to show it.": "Mostrar o aura da súa comunidade en salas configuradas para mostralo.", "Did you know: you can use communities to filter your Riot.im experience!": "Sabía que pode utilizar as comunidades para mellorar a súa experiencia con Riot.im!", - "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.": "Para establecer un filtro, arrastre un avatar da comunidade sobre o panel de filtros na parte esquerda da pantalla. Pode pulsar nun avatar no panel de filtrado en calquer moemento para ver só salas e xente asociada a esa comunidade.", + "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.": "Para establecer un filtro, arrastre un avatar da comunidade sobre o panel de filtros na parte esquerda da pantalla. Pode pulsar nun avatar no panel de filtrado en calquera momento para ver só salas e xente asociada a esa comunidade.", "Deops user with given id": "Degradar usuaria co id dado", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Visto por %(displayName)s(%(userName)s en %(dateTime)s", "Code": "Código", "Unable to join community": "Non se puido unir a comunidade", "Unable to leave community": "Non se puido deixar a comunidade", - "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Os cambios realizados a súa comunidade <bold1>name</bold1> e <bold2>avatar</bold2) poderían non ser vistos por outras usuarias ate dentro de 30 minutos.", + "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Os cambios realizados a súa comunidade <bold1>name</bold1> e <bold2>avatar</bold2> poida que non os vexan outros usuarios ate dentro de 30 minutos.", "Join this community": "Únase a esta comunidade", "Leave this community": "Deixar esta comunidade", "Debug Logs Submission": "Envío de rexistro de depuración", - "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.": "Si enviou un reporte de fallo a través de GitHub, os informes poden axudarnos a examinar o problema. Os informes de fallo conteñen datos do uso do aplicativo incluíndo o seu nome de usuaria, os IDs ou alcumes das salas e grupos que visitou e os nomes de usuaria de outras personas. Non conteñen mensaxes.", + "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.": "Si enviou un reporte de fallo a través de GitHub, os informes poden axudarnos a examinar o problema. Os informes de fallo conteñen datos do uso do aplicativo incluíndo o seu nome de usuaria, os IDs ou alcumes das salas e grupos que visitou e os nomes de usuaria de outras persoas. Non conteñen mensaxes.", "Submit debug logs": "Enviar informes de depuración", - "Opens the Developer Tools dialog": "Abre o cadro de Ferramentas de Desenvolvedoras", - "Stickerpack": "Peganitas", - "You don't currently have any stickerpacks enabled": "Non ten paquetes de pegatinas habilitados", - "Add a stickerpack": "Engadir un paquete de pegatinas", - "Hide Stickers": "Agochar pegatinas", - "Show Stickers": "Mostrar pegatinas", - "Who can join this community?": "Quén pode unirse a esta comunidade?", + "Opens the Developer Tools dialog": "Abre o cadro de Ferramentas de desenvolvemento", + "Stickerpack": "Iconas", + "You don't currently have any stickerpacks enabled": "Non ten paquetes de iconas activados", + "Add a stickerpack": "Engadir un paquete de iconas", + "Hide Stickers": "Agochar iconas", + "Show Stickers": "Mostrar iconas", + "Who can join this community?": "Quen pode unirse a esta comunidade?", "Everyone": "Todo o mundo", "Fetching third party location failed": "Fallo ao obter a localización de terceiros", "A new version of Riot is available.": "Está dispoñible unha nova versión de Riot.", "Couldn't load home page": "Non se cargou a páxina de inicio", "Send Account Data": "Enviar datos da conta", - "All notifications are currently disabled for all targets.": "Todas as notificacións están deshabilitadas para todos os destinos.", + "All notifications are currently disabled for all targets.": "Todas as notificacións están desactivadas para todos os destinos.", "Uploading report": "Informe da subida", "Sunday": "Domingo", - "Notification targets": "Obxetivos das notificacións", + "Notification targets": "Obxectivos das notificacións", "Today": "Hoxe", "Failed to get protocol list from Home Server": "Fallo ao obter a lista de protocolo desde o servidor", "You are not receiving desktop notifications": "Non está a recibir notificacións de escritorio", "Friday": "Venres", "Update": "Actualizar", - "What's New": "Qué hai de novo", + "What's New": "Que hai de novo", "Add an email address above to configure email notifications": "Engada un enderezo de correo electrónico para configurar as notificacións", "Expand panel": "Expandir panel", "On": "On", - "%(count)s Members|other": "%(count)s Membros", + "%(count)s Members|other": "%(count)s participantes", "Filter room names": "Filtrar nomes de sala", "Changelog": "Rexistro de cambios", "Waiting for response from server": "Agardando pola resposta do servidor", @@ -1018,14 +1018,14 @@ "Advanced notification settings": "Axustes avanzados de notificación", "Failed to send logs: ": "Fallo ao enviar os informes: ", "delete the alias.": "borrar alcume.", - "To return to your account in future you need to <u>set a password</u>": "Para voltar a súa conta no futuro debe <u>establecer un contrasinal>/u>", + "To return to your account in future you need to <u>set a password</u>": "Para volver a súa conta no futuro debe <u>establecer un contrasinal>/u>", "Forget": "Esquecer", "#example": "#exemplo", "Hide panel": "Agochar panel", "You cannot delete this image. (%(code)s)": "Non pode eliminar esta imaxe. (%(code)s)", "Cancel Sending": "Cancelar o envío", "This Room": "Esta sala", - "The Home Server may be too old to support third party networks": "O servidor de inicio podería ser demasiando antigo como para aceptar redes de terceiros", + "The Home Server may be too old to support third party networks": "O servidor de inicio podería ser demasiado antigo como para aceptar redes de terceiros", "Noisy": "Ruidoso", "Error saving email notification preferences": "Fallo ao cargar os axustes de notificacións", "Messages containing my display name": "Mensaxes que conteñen o meu nome público", @@ -1035,25 +1035,25 @@ "Failed to update keywords": "Fallo ao actualizar as palabras chave", "Notes:": "Notas:", "remove %(name)s from the directory.": "eliminar %(name)s do directorio.", - "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificacións das reglas de seguimento das seguintes palabras que non se mostrarán aquí:", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificacións das regras de seguimento das seguintes palabras que non se mostrarán aquí:", "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> e <operaLink>Opera</operaLink> tamén funcionan.", "Please set a password!": "Por favor estableza un contrasinal!", "You have successfully set a password!": "Mudou con éxito o seu contrasinal!", - "An error occurred whilst saving your email notification preferences.": "Algo fallou mentras se gardaban as súas preferencias de notificaicón.", + "An error occurred whilst saving your email notification preferences.": "Algo fallou mentres se gardaban as súas preferencias de notificación.", "Explore Room State": "Explorar estado da sala", "Search for a room": "Buscar unha sala", "Source URL": "URL fonte", "Messages sent by bot": "Mensaxes enviadas por bot", "Filter results": "Filtrar resultados", - "Members": "Membresía", + "Members": "Participantes", "No update available.": "Sen actualizacións.", - "Resend": "Voltar a enviar", + "Resend": "Volver a enviar", "Files": "Ficheiros", "Collecting app version information": "Obtendo información sobre a versión da app", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminar o alcume da sala %(alias)s e borrar %(name)s do directorio?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto permitiralle voltar a súa conta tras desconectarse, e conectarse en outros dispositivos.", + "This will allow you to return to your account after signing out, and sign in on other devices.": "Isto permitiralle volver a súa conta tras desconectarse, e conectarse en outros dispositivos.", "Keywords": "Palabras chave", - "Enable notifications for this account": "Habilitar notificacións para esta conta", + "Enable notifications for this account": "Activar notificacións para esta conta", "Directory": "Directorio", "Invite to this community": "Convidar a esta comunidade", "Failed to get public room list": "Fallo ao obter a lista de salas públicas", @@ -1063,22 +1063,22 @@ "Enter keywords separated by a comma:": "Introduza palabras chave separadas por vírgulas:", "Search…": "Buscar…", "Remove %(name)s from the directory?": "Eliminar %(name)s do directorio?", - "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utiliza características avanzadas do navegador, algunhas das cales non están dispoñibles ou son experimentales no seu navegador actual.", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utiliza características avanzadas do navegador, algunhas das cales non están dispoñibles ou son experimentais no seu navegador actual.", "Developer Tools": "Ferramentas para desenvolver", "Preparing to send logs": "Preparándose para enviar informe", - "Enable desktop notifications": "Habilitar notificacións de escritorio", - "Remember, you can always set an email address in user settings if you change your mind.": "Lembre, sempre poderá poñer un enderezo de correo nos axustes de usuario si cambia de idea.", + "Enable desktop notifications": "Activar as notificacións de escritorio", + "Remember, you can always set an email address in user settings if you change your mind.": "Lembre que sempre poderá poñer un enderezo de correo nos axustes de usuario se cambiase de idea.", "Explore Account Data": "Explorar datos da conta", "All messages (noisy)": "Todas as mensaxes (alto)", "Saturday": "Sábado", - "I understand the risks and wish to continue": "Entendos os riscos e desexo continuar", + "I understand the risks and wish to continue": "Entendo os riscos e desexo continuar", "Direct Chat": "Chat directo", "The server may be unavailable or overloaded": "O servidor podería non estar dispoñible ou sobrecargado", "Reject": "Rexeitar", "Failed to set Direct Message status of room": "Fallo ao establecer o estado Mensaxe Directa da sala", "Monday": "Luns", "Remove from Directory": "Eliminar do directorio", - "Enable them now": "Habilitalas agora", + "Enable them now": "Activalos agora", "Messages containing my user name": "Mensaxes que conteñen o meu nome de usuaria", "Toolbox": "Ferramentas", "Collecting logs": "Obtendo rexistros", @@ -1097,10 +1097,10 @@ "Downloading update...": "Descargando actualización...", "You have successfully set a password and an email address!": "Estableceu correctamente un contrasinal e enderezo de correo!", "Failed to send custom event.": "Fallo ao enviar evento personalizado.", - "What's new?": "Qué hai de novo?", - "Notify me for anything else": "Notificarme todo o demáis", + "What's new?": "Que hai de novo?", + "Notify me for anything else": "Notificarme todo o demais", "When I'm invited to a room": "Cando son convidado a unha sala", - "Can't update user notification settings": "Non se poden actualizar os axutes de notificación", + "Can't update user notification settings": "Non se poden actualizar os axustes de notificación", "Notify for all other messages/rooms": "Notificar para todas as outras mensaxes/salas", "Unable to look up room ID from server": "Non se puido atopar o ID da sala do servidor", "Couldn't find a matching Matrix room": "Non coincide con ningunha sala de Matrix", @@ -1112,8 +1112,8 @@ "Back": "Atrás", "Reply": "Resposta", "Show message in desktop notification": "Mostrar mensaxe nas notificacións de escritorio", - "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.": "Os informes de depuración conteñen datos de utilización do aplicativo como o seu nome de usuaria, os IDs ou alcumes de salas e grupos que vostede visitou e os nomes de usuaria de outras usuarias. Non conteñen mensaxes.", - "Unhide Preview": "Desagochar a vista previsa", + "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.": "Os informes de depuración conteñen datos de utilización do aplicativo como o seu nome de usuario, os IDs ou alcumes de salas e grupos que vostede visitou e os nomes de usuarios doutras usuarias. Non conteñen mensaxes.", + "Unhide Preview": "Desagochar a vista previa", "Unable to join network": "Non se puido conectar a rede", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Pode que os configurase nun cliente diferente de Riot. Non pode establecelos desde Riot pero aínda así aplicaranse", "Sorry, your browser is <b>not</b> able to run Riot.": "Desculpe, o seu navegador <b>non pode</b> executar Riot.", @@ -1123,40 +1123,40 @@ "Error encountered (%(errorDetail)s).": "Houbo un erro (%(errorDetail)s).", "Login": "Conectar", "Low Priority": "Baixa prioridade", - "Unable to fetch notification target list": "Non se puido procesar a lista de obxetivo de notificacións", + "Unable to fetch notification target list": "Non se puido procesar a lista de obxectivo de notificacións", "Set Password": "Establecer contrasinal", - "Enable audible notifications in web client": "Habilitar notificacións audibles no cliente web", + "Enable audible notifications in web client": "Activar as notificacións audibles no cliente web", "Off": "Off", - "Riot does not know how to join a room on this network": "Riot non sabe cómo conectar con unha sala en esta rede", + "Riot does not know how to join a room on this network": "Riot non sabe como conectar cunha sala nesta rede", "Mentions only": "Só mencións", - "You can now return to your account after signing out, and sign in on other devices.": "Pode voltar a súa contra tras desconectarse, e conectarse en outros dispositivos.", - "Enable email notifications": "Habilitar notificacións de correo", + "You can now return to your account after signing out, and sign in on other devices.": "Pode volver a súa contra tras desconectarse, e conectarse en outros dispositivos.", + "Enable email notifications": "Activar notificacións de correo", "Event Type": "Tipo de evento", "Download this file": "Descargue este ficheiro", "Pin Message": "Fixar mensaxe", "Failed to change settings": "Fallo ao cambiar os axustes", "View Community": "Ver Comunidade", - "%(count)s Members|one": "%(count)s Membro", + "%(count)s Members|one": "%(count)s participante", "Event sent!": "Evento enviado!", "View Source": "Ver fonte", "Event Content": "Contido do evento", "Thank you!": "Grazas!", "Collapse panel": "Agochar panel", - "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!": "Co seu navegador actual a apareciencia e uso do aplicativo poderían estar totalmente falseadas, e algunhas características poderían non funcionar. Se quere pode continuar, pero debe ser consciente de que poden haber fallos!", + "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!": "Co seu navegador actual a aparencia e uso do aplicativo poderían estar totalmente falseadas, e algunhas características poderían non funcionar. Se quere pode continuar, pero debe ser consciente de que poden haber fallos!", "Checking for an update...": "Comprobando as actualizacións...", "There are advanced notifications which are not shown here": "Existen notificacións avanzadas que non se mostran aquí", - "Every page you use in the app": "Cada páxina que vostede utiliza no aplicativo", - "e.g. <CurrentPageURL>": "ex. <CurrentPageURL>", - "Your User Agent": "User Agent", + "Every page you use in the app": "Cada páxina que use na aplicación", + "e.g. <CurrentPageURL>": "p.ex. <CurrentPageURL>", + "Your User Agent": "Axente de usuario", "Your device resolution": "Resolución do dispositivo", - "Missing roomId.": "Falta o id da sala.", + "Missing roomId.": "Falta o ID da sala.", "Always show encryption icons": "Mostra sempre iconas de cifrado", - "At this time it is not possible to reply with a file so this will be sent without being a reply.": "En este intre non é posible respostar con un ficheiro así que este será enviado sin ser considerado resposta.", - "Unable to reply": "Non puido respostar", - "At this time it is not possible to reply with an emote.": "En este intre non é posible respostar con un emote.", - "Popout widget": "Widget emerxente", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "Neste intre non é posible responder con un ficheiro así que este será enviado sen ser considerado resposta.", + "Unable to reply": "Non puido responder", + "At this time it is not possible to reply with an emote.": "Neste intre non é posible responder con un emote.", + "Popout widget": "trebello emerxente", "Picture": "Imaxe", - "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Non se cargou o evento ao que respostaba, ou non existe ou non ten permiso para velo.", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Non se cargou o evento ao que respondía, ou non existe ou non ten permiso para velo.", "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Os fallos de Riot séguense en GitHub: <a>crear un informe en GitHub</a>.", "Log out and remove encryption keys?": "Desconectar e eliminar as chaves de cifrado?", "Send Logs": "Enviar informes", @@ -1165,9 +1165,9 @@ "We encountered an error trying to restore your previous session.": "Atopamos un fallo intentando restablecer a súa sesión anterior.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Limpando o almacenamento do navegador podería resolver o problema, pero desconectarao e non poderá ler o historial cifrado da conversa.", "Collapse Reply Thread": "Comprimir o fío de respostas", - "e.g. %(exampleValue)s": "p.ex.%(exampleValue)s", + "e.g. %(exampleValue)s": "p.ex. %(exampleValue)s", "Send analytics data": "Enviar datos de análises", - "Enable widget screenshots on supported widgets": "Activar as capturas de widgets para aqueles que as permiten", + "Enable widget screenshots on supported widgets": "Activar as capturas de trebellos para aqueles que as permiten", "Encrypting": "Cifrando", "Encrypted, not sent": "Cifrado, sen enviar", "Share Link to User": "Compartir a ligazón co usuario", @@ -1177,11 +1177,29 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Mellore Riot.im enviando <UsageDataLink>os datos anónimos de uso</UsageDataLink>. Iso suporá o emprego dunha cookie (véxase a nosa <PolicyLink>Política de Cookies</PolicyLink>).", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Mellore Riot.im enviando <UsageDataLink>o uso de datos anónimo</UsageDataLink>. Iso usará unha cookie.", "Yes, I want to help!": "Si, quero axuda", - "Warning: This widget might use cookies.": "Aviso: este widget podería usar algunha cookie.", - "Reload widget": "Volver a cargar o widget", + "Warning: This widget might use cookies.": "Aviso: este trebello podería usar algunha cookie.", + "Reload widget": "Volver a cargar o trebello", "Failed to indicate account erasure": "Non se deu indicado a eliminación de conta", "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. <b>This action is irreversible.</b>": "Iso fará que a súa deixe de ter uso de xeito permanente. Non poderá acceder e ninguén vai a poder volver a rexistrar esa mesma ID de usuario. Suporá que saía de todas as salas de conversas nas que estaba e eliminará os detalles da súa conta do servidores de identificación.<b>Isto non se poderá desfacer</b>", "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Desactivando a súa conta <b>non supón que por defecto esquezamos as súas mensaxes enviadas.</b> Se quere que nos esquezamos das súas mensaxes, prema na caixa de embaixo.", "To continue, please enter your password:": "Para continuar introduza o seu contrasinal:", - "password": "contrasinal" + "password": "contrasinal", + "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.": "A visibilidade das mensaxes en Matrix é parecida ás dos correos electrónicos. Que esquezamos as súas mensaxes significa que as súas mensaxes non se van a compartir con ningún novo membro ou usuario que non estea rexistrado. Mais aqueles usuarios que xa tiveron acceso a estas mensaxes si que seguirán tendo acceso as súas propias copias desas mensaxes.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Esquezan todas as mensaxes que eu enviara no momento en que elimine a miña conta. (<b>Aviso</b>: iso suporá que os seguintes participantes só verán unha versión incompleta das conversas.)", + "Share Room": "Compartir sala", + "Link to most recent message": "Ligazón ás mensaxes máis recentes", + "Share User": "Compartir usuario", + "Share Community": "Compartir comunidade", + "Share Room Message": "Compartir unha mensaxe da sala", + "Link to selected message": "Ligazón á mensaxe escollida", + "COPY": "Copiar", + "Share Message": "Compartir mensaxe", + "Can't leave Server Notices room": "Non se pode saír da sala de información do servidor", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Esta sala emprégase para mensaxes importantes do servidor da sala, as que non pode saír dela.", + "Terms and Conditions": "Termos e condicións", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Para continuar usando o servidor %(homeserverDomain)s ten que revisar primeiro os seus termos e condicións e logo aceptalos.", + "Review terms and conditions": "Revise os termos e condicións", + "No Audio Outputs detected": "Non se detectou unha saída de audio", + "Audio Output": "Saída de audio", + "Try the app first": "Probe a aplicación primeiro" } From a8520335ef8d79b6e60c4f149765dcd70d5dd818 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 17:37:55 +0100 Subject: [PATCH 280/480] once command has a space, strict match instead of fuzzy match Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index b162f2f92a..38ad5efeb9 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -128,8 +128,26 @@ export default class CommandProvider extends AutocompleteProvider { const {command, range} = this.getCurrentCommand(query, selection); if (!command) return []; - // if the query is just `/` (and the user hit TAB or waits), show them all COMMANDS otherwise FuzzyMatch them - const matches = query === '/' ? COMMANDS : this.matcher.match(command[1]); + let matches; + if (command[0] !== command[1]) { + // The input looks like a command with arguments, perform exact match + const match = COMMANDS.find((o) => o.command === command[1]); + if (match) { + matches = [match]; + } + } + + // If we don't yet have matches + if (!matches) { + if (query === '/') { + // If they have just entered `/` show everything + matches = COMMANDS; + } else { + // otherwise fuzzy match against all of the fields + matches = this.matcher.match(command[1]); + } + } + return matches.map((result) => { return { // If the command is the same as the one they entered, we don't want to discard their arguments From bea52eccf836ce8e31413e66dcb18bece316122f Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Mon, 18 Jun 2018 17:40:48 +0100 Subject: [PATCH 281/480] Remove unused import, constant --- src/components/views/rooms/MessageComposerInput.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 97e8780f0f..57d433e55c 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -45,8 +45,7 @@ import Markdown from '../../../Markdown'; import ComposerHistoryManager from '../../../ComposerHistoryManager'; import MessageComposerStore from '../../../stores/MessageComposerStore'; -import {MATRIXTO_URL_PATTERN, MATRIXTO_MD_LINK_PATTERN} from '../../../linkify-matrix'; -const REGEX_MATRIXTO = new RegExp(MATRIXTO_URL_PATTERN); +import {MATRIXTO_MD_LINK_PATTERN} from '../../../linkify-matrix'; const REGEX_MATRIXTO_MARKDOWN_GLOBAL = new RegExp(MATRIXTO_MD_LINK_PATTERN, 'g'); import {asciiRegexp, shortnameToUnicode, emojioneList, asciiList, mapUnicodeToShort} from 'emojione'; From d6f0f775611209d5c06a6558e8e0f70a9c624424 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Mon, 18 Jun 2018 17:45:47 +0100 Subject: [PATCH 282/480] Fix MATRIXTO_URL_PATTERN RegExp groups Fixes https://github.com/vector-im/riot-web/issues/6900 Fixes https://github.com/vector-im/riot-web/issues/6899 --- src/linkify-matrix.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 328cb98888..d72319948a 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -169,7 +169,7 @@ matrixLinkify.VECTOR_URL_PATTERN = "^(?:https?:\/\/)?(?:" + "(?:www\\.)?(?:riot|vector)\\.im/(?:app|beta|staging|develop)/" + ")(#.*)"; -matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?:\/\/)?(?:www\\.)?matrix\\.to/#/([#@!+].*)"; +matrixLinkify.MATRIXTO_URL_PATTERN = "^(?:https?:\/\/)?(?:www\\.)?matrix\\.to/#/(([#@!+]).*)"; matrixLinkify.MATRIXTO_MD_LINK_PATTERN = '\\[([^\\]]*)\\]\\((?:https?:\/\/)?(?:www\\.)?matrix\\.to/#/([#@!+][^\\)]*)\\)'; matrixLinkify.MATRIXTO_BASE_URL= baseUrl; From 0383937e0dfb3185cfe5dd1e480a9b36ca48e937 Mon Sep 17 00:00:00 2001 From: Miguel Branco <mgl.branco@gmail.com> Date: Mon, 18 Jun 2018 15:32:05 +0000 Subject: [PATCH 283/480] Translated using Weblate (Galician) Currently translated at 100.0% (1203 of 1203 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 41f98676b6..572da43dcf 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -52,7 +52,7 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s", "Who would you like to add to this community?": "A quen quere engadir a esta comunidade?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Aviso: calquera persoa que engada a unha comunidade estará publicamente visible para calquera que coñeza a ID da comunidade", - "Invite new community members": "Convidará comunidade a novos participantes ", + "Invite new community members": "Convidará comunidade a novos participantes", "Name or matrix ID": "Nome ou ID matrix", "Invite to Community": "Convidar á comunidade", "Which rooms would you like to add to this community?": "Que salas desexaría engadir a esta comunidade?", From 015d4332351bc543e7f08676425968c48b96c26f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 18:14:48 +0100 Subject: [PATCH 284/480] fix a way to get stuck in set password/email flow Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/UserSettings.js | 1 - .../views/dialogs/SetPasswordDialog.js | 7 ++----- src/components/views/globals/PasswordNagBar.js | 16 ++-------------- src/components/views/settings/ChangePassword.js | 7 +++++-- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 2622d7bd89..6397e73434 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -429,7 +429,6 @@ module.exports = React.createClass({ "push notifications on other devices until you log back in to them", ) + ".", }); - dis.dispatch({action: 'password_changed'}); }, _onAddEmailEditFinished: function(value, shouldSubmit) { diff --git a/src/components/views/dialogs/SetPasswordDialog.js b/src/components/views/dialogs/SetPasswordDialog.js index 31c4ad7a3f..42c35ad187 100644 --- a/src/components/views/dialogs/SetPasswordDialog.js +++ b/src/components/views/dialogs/SetPasswordDialog.js @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -79,15 +80,11 @@ export default React.createClass({ Modal.createDialog(WarmFuzzy, { didSetEmail: res.didSetEmail, onFinished: () => { - this._onContinueClicked(); + this.props.onFinished(); }, }); }, - _onContinueClicked: function() { - this.props.onFinished(true); - }, - _onPasswordChangeError: function(err) { let errMsg = err.error || ""; if (err.httpStatus === 403) { diff --git a/src/components/views/globals/PasswordNagBar.js b/src/components/views/globals/PasswordNagBar.js index 93f4fe06e5..4233363b95 100644 --- a/src/components/views/globals/PasswordNagBar.js +++ b/src/components/views/globals/PasswordNagBar.js @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -14,28 +15,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - import React from 'react'; import sdk from '../../../index'; import Modal from '../../../Modal'; -import dis from '../../../dispatcher'; import { _t } from '../../../languageHandler'; export default React.createClass({ onUpdateClicked: function() { const SetPasswordDialog = sdk.getComponent('dialogs.SetPasswordDialog'); - Modal.createTrackedDialog('Set Password Dialog', 'Password Nag Bar', SetPasswordDialog, { - onFinished: (passwordChanged) => { - if (!passwordChanged) { - return; - } - // Notify SessionStore that the user's password was changed - dis.dispatch({ - action: 'password_changed', - }); - }, - }); + Modal.createTrackedDialog('Set Password Dialog', 'Password Nag Bar', SetPasswordDialog); }, render: function() { diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 9cac25e6cc..b2ffe531b5 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2018 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. @@ -14,14 +15,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - const React = require('react'); import PropTypes from 'prop-types'; const MatrixClientPeg = require("../../../MatrixClientPeg"); const Modal = require("../../../Modal"); const sdk = require("../../../index"); +import dis from "../../../dispatcher"; import Promise from 'bluebird'; import AccessibleButton from '../elements/AccessibleButton'; import { _t } from '../../../languageHandler'; @@ -143,6 +143,9 @@ module.exports = React.createClass({ }); cli.setPassword(authDict, newPassword).then(() => { + // Notify SessionStore that the user's password was changed + dis.dispatch({action: 'password_changed'}); + if (this.props.shouldAskForEmail) { return this._optionallySetEmail().then((confirmed) => { this.props.onFinished({ From 3449a60d3272a736b809d45f318ecb6d0f49cbdb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 18:17:10 +0100 Subject: [PATCH 285/480] fix onBlur breaking the SetEmail field (setting it back empty :() Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/SetEmailDialog.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/SetEmailDialog.js b/src/components/views/dialogs/SetEmailDialog.js index d80574804f..e643ddbc34 100644 --- a/src/components/views/dialogs/SetEmailDialog.js +++ b/src/components/views/dialogs/SetEmailDialog.js @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -36,7 +37,7 @@ export default React.createClass({ getInitialState: function() { return { - emailAddress: null, + emailAddress: '', emailBusy: false, }; }, @@ -127,6 +128,7 @@ export default React.createClass({ const EditableText = sdk.getComponent('elements.EditableText'); const emailInput = this.state.emailBusy ? <Spinner /> : <EditableText + initialValue={this.state.emailAddress} className="mx_SetEmailDialog_email_input" autoFocus="true" placeholder={_t("Email address")} From f2e4e515c14e2ef39cd4a9fd510a9c8c2dd134ff Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 18:21:16 +0100 Subject: [PATCH 286/480] delint EditableText Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/EditableText.js | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/components/views/elements/EditableText.js b/src/components/views/elements/EditableText.js index ce1817c272..1f49bcddae 100644 --- a/src/components/views/elements/EditableText.js +++ b/src/components/views/elements/EditableText.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2018 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. @@ -14,15 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - -const React = require('react'); +import React from 'react'; import PropTypes from 'prop-types'; -const KEY_TAB = 9; -const KEY_SHIFT = 16; -const KEY_WINDOWS = 91; - module.exports = React.createClass({ displayName: 'EditableText', @@ -66,9 +61,7 @@ module.exports = React.createClass({ }, componentWillReceiveProps: function(nextProps) { - if (nextProps.initialValue !== this.props.initialValue || - nextProps.initialValue !== this.value - ) { + if (nextProps.initialValue !== this.props.initialValue || nextProps.initialValue !== this.value) { this.value = nextProps.initialValue; if (this.refs.editable_div) { this.showPlaceholder(!this.value); @@ -139,7 +132,7 @@ module.exports = React.createClass({ this.showPlaceholder(false); } - if (ev.key == "Enter") { + if (ev.key === "Enter") { ev.stopPropagation(); ev.preventDefault(); } @@ -156,9 +149,9 @@ module.exports = React.createClass({ this.value = ev.target.textContent; } - if (ev.key == "Enter") { + if (ev.key === "Enter") { this.onFinish(ev); - } else if (ev.key == "Escape") { + } else if (ev.key === "Escape") { this.cancelEdit(); } @@ -193,7 +186,7 @@ module.exports = React.createClass({ const submit = (ev.key === "Enter") || shouldSubmit; this.setState({ phase: this.Phases.Display, - }, function() { + }, () => { if (this.value !== this.props.initialValue) { self.onValueChanged(submit); } @@ -204,23 +197,35 @@ module.exports = React.createClass({ const sel = window.getSelection(); sel.removeAllRanges(); - if (this.props.blurToCancel) {this.cancelEdit();} else {this.onFinish(ev, this.props.blurToSubmit);} + if (this.props.blurToCancel) { + this.cancelEdit(); + } else { + this.onFinish(ev, this.props.blurToSubmit); + } this.showPlaceholder(!this.value); }, render: function() { - let editable_el; + const {className, editable, initialValue, label, labelClassName} = this.props; + let editableEl; - if (!this.props.editable || (this.state.phase == this.Phases.Display && (this.props.label || this.props.labelClassName) && !this.value)) { + if (!editable || (this.state.phase === this.Phases.Display && (label || labelClassName) && !this.value)) { // show the label - editable_el = <div className={this.props.className + " " + this.props.labelClassName} onClick={this.onClickDiv}>{ this.props.label || this.props.initialValue }</div>; + editableEl = <div className={className + " " + labelClassName} onClick={this.onClickDiv}> + { label || initialValue } + </div>; } else { // show the content editable div, but manually manage its contents as react and contentEditable don't play nice together - editable_el = <div ref="editable_div" contentEditable="true" className={this.props.className} - onKeyDown={this.onKeyDown} onKeyUp={this.onKeyUp} onFocus={this.onFocus} onBlur={this.onBlur}></div>; + editableEl = <div ref="editable_div" + contentEditable={true} + className={className} + onKeyDown={this.onKeyDown} + onKeyUp={this.onKeyUp} + onFocus={this.onFocus} + onBlur={this.onBlur} />; } - return editable_el; + return editableEl; }, }); From 5bf3e5b00a5ce2c0bec94c4d0b396aa6463464ba Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 19:31:40 +0100 Subject: [PATCH 287/480] consolidate the two locations commands are defined, as it was a MESS Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.js | 768 +++++++++--------- src/autocomplete/CommandProvider.js | 98 +-- .../views/rooms/MessageComposerInput.js | 4 +- 3 files changed, 413 insertions(+), 457 deletions(-) diff --git a/src/SlashCommands.js b/src/SlashCommands.js index d45e45e84c..3743fbb98c 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -14,28 +14,31 @@ See the License for the specific language governing permissions and limitations under the License. */ -import MatrixClientPeg from "./MatrixClientPeg"; -import dis from "./dispatcher"; -import Tinter from "./Tinter"; + +import React from 'react'; +import MatrixClientPeg from './MatrixClientPeg'; +import dis from './dispatcher'; +import Tinter from './Tinter'; import sdk from './index'; -import { _t } from './languageHandler'; +import {_t, _td} from './languageHandler'; import Modal from './Modal'; -import SettingsStore, {SettingLevel} from "./settings/SettingsStore"; +import SettingsStore, {SettingLevel} from './settings/SettingsStore'; class Command { - constructor(name, paramArgs, runFn) { - this.name = name; - this.paramArgs = paramArgs; + constructor({name, args='', description, runFn}) { + this.command = name; + this.args = args; + this.description = description; this.runFn = runFn; } getCommand() { - return "/" + this.name; + return "/" + this.command; } getCommandWithArgs() { - return this.getCommand() + " " + this.paramArgs; + return this.getCommand() + " " + this.args; } run(roomId, args) { @@ -47,16 +50,12 @@ class Command { } } -function reject(msg) { - return { - error: msg, - }; +function reject(error) { + return {error}; } function success(promise) { - return { - promise: promise, - }; + return {promise}; } /* Disable the "unexpected this" error for these commands - all of the run @@ -65,352 +64,408 @@ function success(promise) { /* eslint-disable babel/no-invalid-this */ -const commands = { - ddg: new Command("ddg", "<query>", function(roomId, args) { - const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); - // TODO Don't explain this away, actually show a search UI here. - Modal.createTrackedDialog('Slash Commands', '/ddg is not a command', ErrorDialog, { - title: _t('/ddg is not a command'), - description: _t('To use it, just wait for autocomplete results to load and tab through them.'), - }); - return success(); +export const CommandMap = { + ddg: new Command({ + name: 'ddg', + args: '<query>', + description: _td('Searches DuckDuckGo for results'), + runFn: function(roomId, args) { + const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); + // TODO Don't explain this away, actually show a search UI here. + Modal.createTrackedDialog('Slash Commands', '/ddg is not a command', ErrorDialog, { + title: _t('/ddg is not a command'), + description: _t('To use it, just wait for autocomplete results to load and tab through them.'), + }); + return success(); + }, }), - // Change your nickname - nick: new Command("nick", "<display_name>", function(roomId, args) { - if (args) { - return success( - MatrixClientPeg.get().setDisplayName(args), - ); - } - return reject(this.getUsage()); - }), - - // Changes the colorscheme of your current room - tint: new Command("tint", "<color1> [<color2>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))( +(#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})))?$/); - if (matches) { - Tinter.tint(matches[1], matches[4]); - const colorScheme = {}; - colorScheme.primary_color = matches[1]; - if (matches[4]) { - colorScheme.secondary_color = matches[4]; - } else { - colorScheme.secondary_color = colorScheme.primary_color; - } - return success( - SettingsStore.setValue("roomColor", roomId, SettingLevel.ROOM_ACCOUNT, colorScheme), - ); + nick: new Command({ + name: 'nick', + args: '<display_name>', + description: _td('Changes your display nickname'), + runFn: function(roomId, args) { + if (args) { + return success(MatrixClientPeg.get().setDisplayName(args)); } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - // Change the room topic - topic: new Command("topic", "<topic>", function(roomId, args) { - if (args) { - return success( - MatrixClientPeg.get().setRoomTopic(roomId, args), - ); - } - return reject(this.getUsage()); - }), - - // Invite a user - invite: new Command("invite", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - return success( - MatrixClientPeg.get().invite(roomId, matches[1]), - ); - } - } - return reject(this.getUsage()); - }), - - // Join a room - join: new Command("join", "#alias:domain", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - let roomAlias = matches[1]; - if (roomAlias[0] !== '#') { - return reject(this.getUsage()); - } - if (!roomAlias.match(/:/)) { - roomAlias += ':' + MatrixClientPeg.get().getDomain(); - } - - dis.dispatch({ - action: 'view_room', - room_alias: roomAlias, - auto_join: true, - }); - - return success(); - } - } - return reject(this.getUsage()); - }), - - part: new Command("part", "[#alias:domain]", function(roomId, args) { - let targetRoomId; - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - let roomAlias = matches[1]; - if (roomAlias[0] !== '#') { - return reject(this.getUsage()); - } - if (!roomAlias.match(/:/)) { - roomAlias += ':' + MatrixClientPeg.get().getDomain(); - } - - // Try to find a room with this alias - const rooms = MatrixClientPeg.get().getRooms(); - for (let i = 0; i < rooms.length; i++) { - const aliasEvents = rooms[i].currentState.getStateEvents( - "m.room.aliases", - ); - for (let j = 0; j < aliasEvents.length; j++) { - const aliases = aliasEvents[j].getContent().aliases || []; - for (let k = 0; k < aliases.length; k++) { - if (aliases[k] === roomAlias) { - targetRoomId = rooms[i].roomId; - break; - } - } - if (targetRoomId) { break; } + tint: new Command({ + name: 'tint', + args: '<color1> [<color2>]', + description: _td('Changes colour scheme of current room'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(#([\da-fA-F]{3}|[\da-fA-F]{6}))( +(#([\da-fA-F]{3}|[\da-fA-F]{6})))?$/); + if (matches) { + Tinter.tint(matches[1], matches[4]); + const colorScheme = {}; + colorScheme.primary_color = matches[1]; + if (matches[4]) { + colorScheme.secondary_color = matches[4]; + } else { + colorScheme.secondary_color = colorScheme.primary_color; } - if (targetRoomId) { break; } - } - if (!targetRoomId) { - return reject(_t("Unrecognised room alias:") + ' ' + roomAlias); + return success( + SettingsStore.setValue('roomColor', roomId, SettingLevel.ROOM_ACCOUNT, colorScheme), + ); } } - } - if (!targetRoomId) targetRoomId = roomId; - return success( - MatrixClientPeg.get().leave(targetRoomId).then( - function() { - dis.dispatch({action: 'view_next_room'}); - }, - ), - ); + return reject(this.getUsage()); + }, }), - // Kick a user from the room with an optional reason - kick: new Command("kick", "<userId> [<reason>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+?)( +(.*))?$/); - if (matches) { - return success( - MatrixClientPeg.get().kick(roomId, matches[1], matches[3]), - ); + topic: new Command({ + name: 'topic', + args: '<topic>', + description: _td('Sets the room topic'), + runFn: function(roomId, args) { + if (args) { + return success(MatrixClientPeg.get().setRoomTopic(roomId, args)); } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, + }), + + invite: new Command({ + name: 'invite', + args: '<user-id>', + description: _td('Invites user with given id to current room'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + return success(MatrixClientPeg.get().invite(roomId, matches[1])); + } + } + return reject(this.getUsage()); + }, + }), + + join: new Command({ + name: 'join', + args: '<room-alias>', + description: _td('Joins room with given alias'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + let roomAlias = matches[1]; + if (roomAlias[0] !== '#') return reject(this.getUsage()); + + if (!roomAlias.includes(':')) { + roomAlias += ':' + MatrixClientPeg.get().getDomain(); + } + + dis.dispatch({ + action: 'view_room', + room_alias: roomAlias, + auto_join: true, + }); + + return success(); + } + } + return reject(this.getUsage()); + }, + }), + + part: new Command({ + name: 'part', + args: '[<room-alias>]', + description: _td('Leave room'), + runFn: function(roomId, args) { + const cli = MatrixClientPeg.get(); + + let targetRoomId; + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + let roomAlias = matches[1]; + if (roomAlias[0] !== '#') return reject(this.getUsage()); + + if (!roomAlias.includes(':')) { + roomAlias += ':' + cli.getDomain(); + } + + // Try to find a room with this alias + const rooms = cli.getRooms(); + for (let i = 0; i < rooms.length; i++) { + const aliasEvents = rooms[i].currentState.getStateEvents('m.room.aliases'); + for (let j = 0; j < aliasEvents.length; j++) { + const aliases = aliasEvents[j].getContent().aliases || []; + for (let k = 0; k < aliases.length; k++) { + if (aliases[k] === roomAlias) { + targetRoomId = rooms[i].roomId; + break; + } + } + if (targetRoomId) break; + } + if (targetRoomId) break; + } + if (!targetRoomId) return reject(_t('Unrecognised room alias:') + ' ' + roomAlias); + } + } + + if (!targetRoomId) targetRoomId = roomId; + return success( + cli.leave(targetRoomId).then(function() { + dis.dispatch({action: 'view_next_room'}); + }), + ); + }, + }), + + kick: new Command({ + name: 'kick', + args: '<user-id> [reason]', + description: _td('Kicks user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+?)( +(.*))?$/); + if (matches) { + return success(MatrixClientPeg.get().kick(roomId, matches[1], matches[3])); + } + } + return reject(this.getUsage()); + }, }), // Ban a user from the room with an optional reason - ban: new Command("ban", "<userId> [<reason>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+?)( +(.*))?$/); - if (matches) { - return success( - MatrixClientPeg.get().ban(roomId, matches[1], matches[3]), - ); + ban: new Command({ + name: 'ban', + args: '<user-id> [reason]', + description: _td('Bans user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+?)( +(.*))?$/); + if (matches) { + return success(MatrixClientPeg.get().ban(roomId, matches[1], matches[3])); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - // Unban a user from the room - unban: new Command("unban", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - // Reset the user membership to "leave" to unban him - return success( - MatrixClientPeg.get().unban(roomId, matches[1]), - ); + // Unban a user from ythe room + unban: new Command({ + name: 'unban', + args: '<user-id>', + description: _td('Unbans user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + // Reset the user membership to "leave" to unban him + return success(MatrixClientPeg.get().unban(roomId, matches[1])); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - ignore: new Command("ignore", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - const userId = matches[1]; - const ignoredUsers = MatrixClientPeg.get().getIgnoredUsers(); - ignoredUsers.push(userId); // de-duped internally in the js-sdk - return success( - MatrixClientPeg.get().setIgnoredUsers(ignoredUsers).then(() => { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog('Slash Commands', 'User ignored', QuestionDialog, { - title: _t("Ignored user"), - description: ( - <div> - <p>{ _t("You are now ignoring %(userId)s", {userId: userId}) }</p> - </div> - ), - hasCancelButton: false, - }); - }), - ); + ignore: new Command({ + name: 'ignore', + args: '<user-id>', + description: _td('Ignores a user, hiding their messages from you'), + runFn: function(roomId, args) { + if (args) { + const cli = MatrixClientPeg.get(); + + const matches = args.match(/^(\S+)$/); + if (matches) { + const userId = matches[1]; + const ignoredUsers = cli.getIgnoredUsers(); + ignoredUsers.push(userId); // de-duped internally in the js-sdk + return success( + cli.setIgnoredUsers(ignoredUsers).then(() => { + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + Modal.createTrackedDialog('Slash Commands', 'User ignored', QuestionDialog, { + title: _t('Ignored user'), + description: <div> + <p>{ _t('You are now ignoring %(userId)s', {userId}) }</p> + </div>, + hasCancelButton: false, + }); + }), + ); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - unignore: new Command("unignore", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - const userId = matches[1]; - const ignoredUsers = MatrixClientPeg.get().getIgnoredUsers(); - const index = ignoredUsers.indexOf(userId); - if (index !== -1) ignoredUsers.splice(index, 1); - return success( - MatrixClientPeg.get().setIgnoredUsers(ignoredUsers).then(() => { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog('Slash Commands', 'User unignored', QuestionDialog, { - title: _t("Unignored user"), - description: ( - <div> - <p>{ _t("You are no longer ignoring %(userId)s", {userId: userId}) }</p> - </div> - ), - hasCancelButton: false, - }); - }), - ); + unignore: new Command({ + name: 'unignore', + args: '<user-id>', + description: _td('Stops ignoring a user, showing their messages going forward'), + runFn: function(roomId, args) { + if (args) { + const cli = MatrixClientPeg.get(); + + const matches = args.match(/^(\S+)$/); + if (matches) { + const userId = matches[1]; + const ignoredUsers = cli.getIgnoredUsers(); + const index = ignoredUsers.indexOf(userId); + if (index !== -1) ignoredUsers.splice(index, 1); + return success( + cli.setIgnoredUsers(ignoredUsers).then(() => { + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + Modal.createTrackedDialog('Slash Commands', 'User unignored', QuestionDialog, { + title: _t('Unignored user'), + description: <div> + <p>{ _t('You are no longer ignoring %(userId)s', {userId}) }</p> + </div>, + hasCancelButton: false, + }); + }), + ); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), // Define the power level of a user - op: new Command("op", "<userId> [<power level>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+?)( +(-?\d+))?$/); - let powerLevel = 50; // default power level for op - if (matches) { - const userId = matches[1]; - if (matches.length === 4 && undefined !== matches[3]) { - powerLevel = parseInt(matches[3]); - } - if (!isNaN(powerLevel)) { - const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) { - return reject("Bad room ID: " + roomId); + op: new Command({ + name: 'op', + args: '<user-id> [<power-level>]', + description: _td('Define the power level of a user'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+?)( +(-?\d+))?$/); + let powerLevel = 50; // default power level for op + if (matches) { + const userId = matches[1]; + if (matches.length === 4 && undefined !== matches[3]) { + powerLevel = parseInt(matches[3]); + } + if (!isNaN(powerLevel)) { + const cli = MatrixClientPeg.get(); + const room = cli.getRoom(roomId); + if (!room) return reject('Bad room ID: ' + roomId); + + const powerLevelEvent = room.currentState.getStateEvents('m.room.power_levels', ''); + return success(cli.setPowerLevel(roomId, userId, powerLevel, powerLevelEvent)); } - const powerLevelEvent = room.currentState.getStateEvents( - "m.room.power_levels", "", - ); - return success( - MatrixClientPeg.get().setPowerLevel( - roomId, userId, powerLevel, powerLevelEvent, - ), - ); } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), // Reset the power level of a user - deop: new Command("deop", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) { - return reject("Bad room ID: " + roomId); - } + deop: new Command({ + name: 'deop', + args: '<user-id>', + description: _td('Deops user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + const cli = MatrixClientPeg.get(); + const room = cli.getRoom(roomId); + if (!room) return reject('Bad room ID: ' + roomId); - const powerLevelEvent = room.currentState.getStateEvents( - "m.room.power_levels", "", - ); - return success( - MatrixClientPeg.get().setPowerLevel( - roomId, args, undefined, powerLevelEvent, - ), - ); + const powerLevelEvent = room.currentState.getStateEvents('m.room.power_levels', ''); + return success(cli.setPowerLevel(roomId, args, undefined, powerLevelEvent)); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - // Open developer tools - devtools: new Command("devtools", "", function(roomId) { - const DevtoolsDialog = sdk.getComponent("dialogs.DevtoolsDialog"); - Modal.createDialog(DevtoolsDialog, { roomId }); - return success(); + devtools: new Command({ + name: 'devtools', + description: _td('Opens the Developer Tools dialog'), + runFn: function(roomId) { + const DevtoolsDialog = sdk.getComponent('dialogs.DevtoolsDialog'); + Modal.createDialog(DevtoolsDialog, {roomId}); + return success(); + }, }), // Verify a user, device, and pubkey tuple - verify: new Command("verify", "<userId> <deviceId> <deviceSigningKey>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+) +(\S+) +(\S+)$/); - if (matches) { - const userId = matches[1]; - const deviceId = matches[2]; - const fingerprint = matches[3]; + verify: new Command({ + name: 'verify', + args: '<user-id> <device-id> <device-signing-key>', + description: _td('Verifies a user, device, and pubkey tuple'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+) +(\S+) +(\S+)$/); + if (matches) { + const cli = MatrixClientPeg.get(); - return success( - // Promise.resolve to handle transition from static result to promise; can be removed - // in future - Promise.resolve(MatrixClientPeg.get().getStoredDevice(userId, deviceId)).then((device) => { - if (!device) { - throw new Error(_t(`Unknown (user, device) pair:`) + ` (${userId}, ${deviceId})`); - } + const userId = matches[1]; + const deviceId = matches[2]; + const fingerprint = matches[3]; - if (device.isVerified()) { - if (device.getFingerprint() === fingerprint) { - throw new Error(_t(`Device already verified!`)); - } else { - throw new Error(_t(`WARNING: Device already verified, but keys do NOT MATCH!`)); + return success( + // Promise.resolve to handle transition from static result to promise; can be removed + // in future + Promise.resolve(cli.getStoredDevice(userId, deviceId)).then((device) => { + if (!device) { + throw new Error(_t('Unknown (user, device) pair:') + ` (${userId}, ${deviceId})`); } - } - if (device.getFingerprint() !== fingerprint) { - const fprint = device.getFingerprint(); - throw new Error( - _t('WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device' + - ' %(deviceId)s is "%(fprint)s" which does not match the provided key' + - ' "%(fingerprint)s". This could mean your communications are being intercepted!', - {deviceId: deviceId, fprint: fprint, userId: userId, fingerprint: fingerprint})); - } + if (device.isVerified()) { + if (device.getFingerprint() === fingerprint) { + throw new Error(_t('Device already verified!')); + } else { + throw new Error(_t('WARNING: Device already verified, but keys do NOT MATCH!')); + } + } - return MatrixClientPeg.get().setDeviceVerified(userId, deviceId, true); - }).then(() => { - // Tell the user we verified everything - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog('Slash Commands', 'Verified key', QuestionDialog, { - title: _t("Verified key"), - description: ( - <div> - <p> - { - _t("The signing key you provided matches the signing key you received " + - "from %(userId)s's device %(deviceId)s. Device marked as verified.", - {userId: userId, deviceId: deviceId}) - } - </p> - </div> - ), - hasCancelButton: false, - }); - }), - ); + if (device.getFingerprint() !== fingerprint) { + const fprint = device.getFingerprint(); + throw new Error( + _t('WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device' + + ' %(deviceId)s is "%(fprint)s" which does not match the provided key ' + + '"%(fingerprint)s". This could mean your communications are being intercepted!', + { + fprint, + userId, + deviceId, + fingerprint, + })); + } + + return cli.setDeviceVerified(userId, deviceId, true); + }).then(() => { + // Tell the user we verified everything + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + Modal.createTrackedDialog('Slash Commands', 'Verified key', QuestionDialog, { + title: _t('Verified key'), + description: <div> + <p> + { + _t('The signing key you provided matches the signing key you received ' + + 'from %(userId)s\'s device %(deviceId)s. Device marked as verified.', + {userId, deviceId}) + } + </p> + </div>, + hasCancelButton: false, + }); + }), + ); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, + }), + + // Command definitions for autocompletion ONLY: + + // /me is special because its not handled by SlashCommands.js and is instead done inside the Composer classes + me: new Command({ + name: 'me', + args: '<message>', + description: _td('Displays action'), }), }; /* eslint-enable babel/no-invalid-this */ @@ -421,50 +476,39 @@ const aliases = { j: "join", }; -module.exports = { - /** - * Process the given text for /commands and perform them. - * @param {string} roomId The room in which the command was performed. - * @param {string} input The raw text input by the user. - * @return {Object|null} 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. - */ - processInput: function(roomId, input) { - // trim any trailing whitespace, as it can confuse the parser for - // IRC-style commands - input = input.replace(/\s+$/, ""); - if (input[0] === "/" && input[1] !== "/") { - const bits = input.match(/^(\S+?)( +((.|\n)*))?$/); - let cmd; - let args; - if (bits) { - cmd = bits[1].substring(1).toLowerCase(); - args = bits[3]; - } else { - cmd = input; - } - if (cmd === "me") return null; - if (aliases[cmd]) { - cmd = aliases[cmd]; - } - if (commands[cmd]) { - return commands[cmd].run(roomId, args); - } else { - return reject(_t("Unrecognised command:") + ' ' + input); - } - } - return null; // not a command - }, +/** + * Process the given text for /commands and perform them. + * @param {string} roomId The room in which the command was performed. + * @param {string} input The raw text input by the user. + * @return {Object|null} 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 processCommandInput(roomId, input) { + // trim any trailing whitespace, as it can confuse the parser for + // IRC-style commands + input = input.replace(/\s+$/, ''); + if (input[0] !== '/' || input[1] === '/') return null; // not a command - getCommandList: function() { - // Return all the commands plus /me and /markdown which aren't handled like normal commands - const cmds = Object.keys(commands).sort().map(function(cmdKey) { - return commands[cmdKey]; - }); - cmds.push(new Command("me", "<action>", function() {})); - cmds.push(new Command("markdown", "<on|off>", function() {})); + const bits = input.match(/^(\S+?)( +((.|\n)*))?$/); + let cmd; + let args; + if (bits) { + cmd = bits[1].substring(1).toLowerCase(); + args = bits[3]; + } else { + cmd = input; + } - return cmds; - }, -}; + if (aliases[cmd]) { + cmd = aliases[cmd]; + } + if (CommandMap[cmd]) { + // if it has no runFn then its an ignored/nop command (autocomplete only) e.g `/me` + if (!CommandMap[cmd].runFn) return null; + + return CommandMap[cmd].run(roomId, args); + } else { + return reject(_t('Unrecognised command:') + ' ' + input); + } +} diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index b162f2f92a..01a40be40c 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -18,101 +18,14 @@ limitations under the License. */ import React from 'react'; -import { _t, _td } from '../languageHandler'; +import {_t} from '../languageHandler'; import AutocompleteProvider from './AutocompleteProvider'; import FuzzyMatcher from './FuzzyMatcher'; import {TextualCompletion} from './Components'; +import {CommandMap} from '../SlashCommands'; import type {SelectionRange} from "./Autocompleter"; -// TODO merge this with the factory mechanics of SlashCommands? -// Warning: Since the description string will be translated in _t(result.description), all these strings below must be in i18n/strings/en_EN.json file -const COMMANDS = [ - { - command: '/me', - args: '<message>', - description: _td('Displays action'), - }, - { - command: '/ban', - args: '<user-id> [reason]', - description: _td('Bans user with given id'), - }, - { - command: '/unban', - args: '<user-id>', - description: _td('Unbans user with given id'), - }, - { - command: '/op', - args: '<user-id> [<power-level>]', - description: _td('Define the power level of a user'), - }, - { - command: '/deop', - args: '<user-id>', - description: _td('Deops user with given id'), - }, - { - command: '/invite', - args: '<user-id>', - description: _td('Invites user with given id to current room'), - }, - { - command: '/join', - args: '<room-alias>', - description: _td('Joins room with given alias'), - }, - { - command: '/part', - args: '[<room-alias>]', - description: _td('Leave room'), - }, - { - command: '/topic', - args: '<topic>', - description: _td('Sets the room topic'), - }, - { - command: '/kick', - args: '<user-id> [reason]', - description: _td('Kicks user with given id'), - }, - { - command: '/nick', - args: '<display-name>', - description: _td('Changes your display nickname'), - }, - { - command: '/ddg', - args: '<query>', - description: _td('Searches DuckDuckGo for results'), - }, - { - command: '/tint', - args: '<color1> [<color2>]', - description: _td('Changes colour scheme of current room'), - }, - { - command: '/verify', - args: '<user-id> <device-id> <device-signing-key>', - description: _td('Verifies a user, device, and pubkey tuple'), - }, - { - command: '/ignore', - args: '<user-id>', - description: _td('Ignores a user, hiding their messages from you'), - }, - { - command: '/unignore', - args: '<user-id>', - description: _td('Stops ignoring a user, showing their messages going forward'), - }, - { - command: '/devtools', - args: '', - description: _td('Opens the Developer Tools dialog'), - }, -]; +const COMMANDS = Object.values(CommandMap); const COMMAND_RE = /(^\/\w*)(?: .*)?/g; @@ -134,11 +47,10 @@ export default class CommandProvider extends AutocompleteProvider { return { // If the command is the same as the one they entered, we don't want to discard their arguments completion: result.command === command[1] ? command[0] : (result.command + ' '), - component: (<TextualCompletion + component: <TextualCompletion title={result.command} subtitle={result.args} - description={_t(result.description)} - />), + description={_t(result.description)} />, range, }; }); diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 57d433e55c..81c4ff2b16 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -28,7 +28,7 @@ import Promise from 'bluebird'; import MatrixClientPeg from '../../../MatrixClientPeg'; import type {MatrixClient} from 'matrix-js-sdk/lib/matrix'; -import SlashCommands from '../../../SlashCommands'; +import {processCommandInput} from '../../../SlashCommands'; import { KeyCode, isOnlyCtrlOrCmdKeyEvent } from '../../../Keyboard'; import Modal from '../../../Modal'; import sdk from '../../../index'; @@ -721,7 +721,7 @@ export default class MessageComposerInput extends React.Component { // Some commands (/join) require pills to be replaced with their text content const commandText = this.removeMDLinks(contentState, ['#']); - const cmd = SlashCommands.processInput(this.props.room.roomId, commandText); + const cmd = processCommandInput(this.props.room.roomId, commandText); if (cmd) { if (!cmd.error) { this.historyManager.save(contentState, this.state.isRichtextEnabled ? 'html' : 'markdown'); From 9107744da73d16037f31c9203a290086e45e5c3d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 19:32:12 +0100 Subject: [PATCH 288/480] simplify arrow func Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index 01a40be40c..0e780bddd3 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -43,17 +43,15 @@ export default class CommandProvider extends AutocompleteProvider { // if the query is just `/` (and the user hit TAB or waits), show them all COMMANDS otherwise FuzzyMatch them const matches = query === '/' ? COMMANDS : this.matcher.match(command[1]); - return matches.map((result) => { - return { - // If the command is the same as the one they entered, we don't want to discard their arguments - completion: result.command === command[1] ? command[0] : (result.command + ' '), - component: <TextualCompletion - title={result.command} - subtitle={result.args} - description={_t(result.description)} />, - range, - }; - }); + return matches.map((result) => ({ + // If the command is the same as the one they entered, we don't want to discard their arguments + completion: result.command === command[1] ? command[0] : (result.command + ' '), + component: <TextualCompletion + title={result.command} + subtitle={result.args} + description={_t(result.description)} />, + range, + })); } getName() { From 85ddc0651b3dc3317c2c95dd804ca26fed2806ad Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 19:31:40 +0100 Subject: [PATCH 289/480] consolidate the two locations commands are defined, as it was a MESS Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.js | 768 +++++++++--------- src/autocomplete/CommandProvider.js | 98 +-- .../views/rooms/MessageComposerInput.js | 4 +- 3 files changed, 413 insertions(+), 457 deletions(-) diff --git a/src/SlashCommands.js b/src/SlashCommands.js index d45e45e84c..3743fbb98c 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -14,28 +14,31 @@ See the License for the specific language governing permissions and limitations under the License. */ -import MatrixClientPeg from "./MatrixClientPeg"; -import dis from "./dispatcher"; -import Tinter from "./Tinter"; + +import React from 'react'; +import MatrixClientPeg from './MatrixClientPeg'; +import dis from './dispatcher'; +import Tinter from './Tinter'; import sdk from './index'; -import { _t } from './languageHandler'; +import {_t, _td} from './languageHandler'; import Modal from './Modal'; -import SettingsStore, {SettingLevel} from "./settings/SettingsStore"; +import SettingsStore, {SettingLevel} from './settings/SettingsStore'; class Command { - constructor(name, paramArgs, runFn) { - this.name = name; - this.paramArgs = paramArgs; + constructor({name, args='', description, runFn}) { + this.command = name; + this.args = args; + this.description = description; this.runFn = runFn; } getCommand() { - return "/" + this.name; + return "/" + this.command; } getCommandWithArgs() { - return this.getCommand() + " " + this.paramArgs; + return this.getCommand() + " " + this.args; } run(roomId, args) { @@ -47,16 +50,12 @@ class Command { } } -function reject(msg) { - return { - error: msg, - }; +function reject(error) { + return {error}; } function success(promise) { - return { - promise: promise, - }; + return {promise}; } /* Disable the "unexpected this" error for these commands - all of the run @@ -65,352 +64,408 @@ function success(promise) { /* eslint-disable babel/no-invalid-this */ -const commands = { - ddg: new Command("ddg", "<query>", function(roomId, args) { - const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); - // TODO Don't explain this away, actually show a search UI here. - Modal.createTrackedDialog('Slash Commands', '/ddg is not a command', ErrorDialog, { - title: _t('/ddg is not a command'), - description: _t('To use it, just wait for autocomplete results to load and tab through them.'), - }); - return success(); +export const CommandMap = { + ddg: new Command({ + name: 'ddg', + args: '<query>', + description: _td('Searches DuckDuckGo for results'), + runFn: function(roomId, args) { + const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); + // TODO Don't explain this away, actually show a search UI here. + Modal.createTrackedDialog('Slash Commands', '/ddg is not a command', ErrorDialog, { + title: _t('/ddg is not a command'), + description: _t('To use it, just wait for autocomplete results to load and tab through them.'), + }); + return success(); + }, }), - // Change your nickname - nick: new Command("nick", "<display_name>", function(roomId, args) { - if (args) { - return success( - MatrixClientPeg.get().setDisplayName(args), - ); - } - return reject(this.getUsage()); - }), - - // Changes the colorscheme of your current room - tint: new Command("tint", "<color1> [<color2>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))( +(#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})))?$/); - if (matches) { - Tinter.tint(matches[1], matches[4]); - const colorScheme = {}; - colorScheme.primary_color = matches[1]; - if (matches[4]) { - colorScheme.secondary_color = matches[4]; - } else { - colorScheme.secondary_color = colorScheme.primary_color; - } - return success( - SettingsStore.setValue("roomColor", roomId, SettingLevel.ROOM_ACCOUNT, colorScheme), - ); + nick: new Command({ + name: 'nick', + args: '<display_name>', + description: _td('Changes your display nickname'), + runFn: function(roomId, args) { + if (args) { + return success(MatrixClientPeg.get().setDisplayName(args)); } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - // Change the room topic - topic: new Command("topic", "<topic>", function(roomId, args) { - if (args) { - return success( - MatrixClientPeg.get().setRoomTopic(roomId, args), - ); - } - return reject(this.getUsage()); - }), - - // Invite a user - invite: new Command("invite", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - return success( - MatrixClientPeg.get().invite(roomId, matches[1]), - ); - } - } - return reject(this.getUsage()); - }), - - // Join a room - join: new Command("join", "#alias:domain", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - let roomAlias = matches[1]; - if (roomAlias[0] !== '#') { - return reject(this.getUsage()); - } - if (!roomAlias.match(/:/)) { - roomAlias += ':' + MatrixClientPeg.get().getDomain(); - } - - dis.dispatch({ - action: 'view_room', - room_alias: roomAlias, - auto_join: true, - }); - - return success(); - } - } - return reject(this.getUsage()); - }), - - part: new Command("part", "[#alias:domain]", function(roomId, args) { - let targetRoomId; - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - let roomAlias = matches[1]; - if (roomAlias[0] !== '#') { - return reject(this.getUsage()); - } - if (!roomAlias.match(/:/)) { - roomAlias += ':' + MatrixClientPeg.get().getDomain(); - } - - // Try to find a room with this alias - const rooms = MatrixClientPeg.get().getRooms(); - for (let i = 0; i < rooms.length; i++) { - const aliasEvents = rooms[i].currentState.getStateEvents( - "m.room.aliases", - ); - for (let j = 0; j < aliasEvents.length; j++) { - const aliases = aliasEvents[j].getContent().aliases || []; - for (let k = 0; k < aliases.length; k++) { - if (aliases[k] === roomAlias) { - targetRoomId = rooms[i].roomId; - break; - } - } - if (targetRoomId) { break; } + tint: new Command({ + name: 'tint', + args: '<color1> [<color2>]', + description: _td('Changes colour scheme of current room'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(#([\da-fA-F]{3}|[\da-fA-F]{6}))( +(#([\da-fA-F]{3}|[\da-fA-F]{6})))?$/); + if (matches) { + Tinter.tint(matches[1], matches[4]); + const colorScheme = {}; + colorScheme.primary_color = matches[1]; + if (matches[4]) { + colorScheme.secondary_color = matches[4]; + } else { + colorScheme.secondary_color = colorScheme.primary_color; } - if (targetRoomId) { break; } - } - if (!targetRoomId) { - return reject(_t("Unrecognised room alias:") + ' ' + roomAlias); + return success( + SettingsStore.setValue('roomColor', roomId, SettingLevel.ROOM_ACCOUNT, colorScheme), + ); } } - } - if (!targetRoomId) targetRoomId = roomId; - return success( - MatrixClientPeg.get().leave(targetRoomId).then( - function() { - dis.dispatch({action: 'view_next_room'}); - }, - ), - ); + return reject(this.getUsage()); + }, }), - // Kick a user from the room with an optional reason - kick: new Command("kick", "<userId> [<reason>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+?)( +(.*))?$/); - if (matches) { - return success( - MatrixClientPeg.get().kick(roomId, matches[1], matches[3]), - ); + topic: new Command({ + name: 'topic', + args: '<topic>', + description: _td('Sets the room topic'), + runFn: function(roomId, args) { + if (args) { + return success(MatrixClientPeg.get().setRoomTopic(roomId, args)); } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, + }), + + invite: new Command({ + name: 'invite', + args: '<user-id>', + description: _td('Invites user with given id to current room'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + return success(MatrixClientPeg.get().invite(roomId, matches[1])); + } + } + return reject(this.getUsage()); + }, + }), + + join: new Command({ + name: 'join', + args: '<room-alias>', + description: _td('Joins room with given alias'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + let roomAlias = matches[1]; + if (roomAlias[0] !== '#') return reject(this.getUsage()); + + if (!roomAlias.includes(':')) { + roomAlias += ':' + MatrixClientPeg.get().getDomain(); + } + + dis.dispatch({ + action: 'view_room', + room_alias: roomAlias, + auto_join: true, + }); + + return success(); + } + } + return reject(this.getUsage()); + }, + }), + + part: new Command({ + name: 'part', + args: '[<room-alias>]', + description: _td('Leave room'), + runFn: function(roomId, args) { + const cli = MatrixClientPeg.get(); + + let targetRoomId; + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + let roomAlias = matches[1]; + if (roomAlias[0] !== '#') return reject(this.getUsage()); + + if (!roomAlias.includes(':')) { + roomAlias += ':' + cli.getDomain(); + } + + // Try to find a room with this alias + const rooms = cli.getRooms(); + for (let i = 0; i < rooms.length; i++) { + const aliasEvents = rooms[i].currentState.getStateEvents('m.room.aliases'); + for (let j = 0; j < aliasEvents.length; j++) { + const aliases = aliasEvents[j].getContent().aliases || []; + for (let k = 0; k < aliases.length; k++) { + if (aliases[k] === roomAlias) { + targetRoomId = rooms[i].roomId; + break; + } + } + if (targetRoomId) break; + } + if (targetRoomId) break; + } + if (!targetRoomId) return reject(_t('Unrecognised room alias:') + ' ' + roomAlias); + } + } + + if (!targetRoomId) targetRoomId = roomId; + return success( + cli.leave(targetRoomId).then(function() { + dis.dispatch({action: 'view_next_room'}); + }), + ); + }, + }), + + kick: new Command({ + name: 'kick', + args: '<user-id> [reason]', + description: _td('Kicks user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+?)( +(.*))?$/); + if (matches) { + return success(MatrixClientPeg.get().kick(roomId, matches[1], matches[3])); + } + } + return reject(this.getUsage()); + }, }), // Ban a user from the room with an optional reason - ban: new Command("ban", "<userId> [<reason>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+?)( +(.*))?$/); - if (matches) { - return success( - MatrixClientPeg.get().ban(roomId, matches[1], matches[3]), - ); + ban: new Command({ + name: 'ban', + args: '<user-id> [reason]', + description: _td('Bans user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+?)( +(.*))?$/); + if (matches) { + return success(MatrixClientPeg.get().ban(roomId, matches[1], matches[3])); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - // Unban a user from the room - unban: new Command("unban", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - // Reset the user membership to "leave" to unban him - return success( - MatrixClientPeg.get().unban(roomId, matches[1]), - ); + // Unban a user from ythe room + unban: new Command({ + name: 'unban', + args: '<user-id>', + description: _td('Unbans user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + // Reset the user membership to "leave" to unban him + return success(MatrixClientPeg.get().unban(roomId, matches[1])); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - ignore: new Command("ignore", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - const userId = matches[1]; - const ignoredUsers = MatrixClientPeg.get().getIgnoredUsers(); - ignoredUsers.push(userId); // de-duped internally in the js-sdk - return success( - MatrixClientPeg.get().setIgnoredUsers(ignoredUsers).then(() => { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog('Slash Commands', 'User ignored', QuestionDialog, { - title: _t("Ignored user"), - description: ( - <div> - <p>{ _t("You are now ignoring %(userId)s", {userId: userId}) }</p> - </div> - ), - hasCancelButton: false, - }); - }), - ); + ignore: new Command({ + name: 'ignore', + args: '<user-id>', + description: _td('Ignores a user, hiding their messages from you'), + runFn: function(roomId, args) { + if (args) { + const cli = MatrixClientPeg.get(); + + const matches = args.match(/^(\S+)$/); + if (matches) { + const userId = matches[1]; + const ignoredUsers = cli.getIgnoredUsers(); + ignoredUsers.push(userId); // de-duped internally in the js-sdk + return success( + cli.setIgnoredUsers(ignoredUsers).then(() => { + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + Modal.createTrackedDialog('Slash Commands', 'User ignored', QuestionDialog, { + title: _t('Ignored user'), + description: <div> + <p>{ _t('You are now ignoring %(userId)s', {userId}) }</p> + </div>, + hasCancelButton: false, + }); + }), + ); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - unignore: new Command("unignore", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - const userId = matches[1]; - const ignoredUsers = MatrixClientPeg.get().getIgnoredUsers(); - const index = ignoredUsers.indexOf(userId); - if (index !== -1) ignoredUsers.splice(index, 1); - return success( - MatrixClientPeg.get().setIgnoredUsers(ignoredUsers).then(() => { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog('Slash Commands', 'User unignored', QuestionDialog, { - title: _t("Unignored user"), - description: ( - <div> - <p>{ _t("You are no longer ignoring %(userId)s", {userId: userId}) }</p> - </div> - ), - hasCancelButton: false, - }); - }), - ); + unignore: new Command({ + name: 'unignore', + args: '<user-id>', + description: _td('Stops ignoring a user, showing their messages going forward'), + runFn: function(roomId, args) { + if (args) { + const cli = MatrixClientPeg.get(); + + const matches = args.match(/^(\S+)$/); + if (matches) { + const userId = matches[1]; + const ignoredUsers = cli.getIgnoredUsers(); + const index = ignoredUsers.indexOf(userId); + if (index !== -1) ignoredUsers.splice(index, 1); + return success( + cli.setIgnoredUsers(ignoredUsers).then(() => { + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + Modal.createTrackedDialog('Slash Commands', 'User unignored', QuestionDialog, { + title: _t('Unignored user'), + description: <div> + <p>{ _t('You are no longer ignoring %(userId)s', {userId}) }</p> + </div>, + hasCancelButton: false, + }); + }), + ); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), // Define the power level of a user - op: new Command("op", "<userId> [<power level>]", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+?)( +(-?\d+))?$/); - let powerLevel = 50; // default power level for op - if (matches) { - const userId = matches[1]; - if (matches.length === 4 && undefined !== matches[3]) { - powerLevel = parseInt(matches[3]); - } - if (!isNaN(powerLevel)) { - const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) { - return reject("Bad room ID: " + roomId); + op: new Command({ + name: 'op', + args: '<user-id> [<power-level>]', + description: _td('Define the power level of a user'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+?)( +(-?\d+))?$/); + let powerLevel = 50; // default power level for op + if (matches) { + const userId = matches[1]; + if (matches.length === 4 && undefined !== matches[3]) { + powerLevel = parseInt(matches[3]); + } + if (!isNaN(powerLevel)) { + const cli = MatrixClientPeg.get(); + const room = cli.getRoom(roomId); + if (!room) return reject('Bad room ID: ' + roomId); + + const powerLevelEvent = room.currentState.getStateEvents('m.room.power_levels', ''); + return success(cli.setPowerLevel(roomId, userId, powerLevel, powerLevelEvent)); } - const powerLevelEvent = room.currentState.getStateEvents( - "m.room.power_levels", "", - ); - return success( - MatrixClientPeg.get().setPowerLevel( - roomId, userId, powerLevel, powerLevelEvent, - ), - ); } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), // Reset the power level of a user - deop: new Command("deop", "<userId>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+)$/); - if (matches) { - const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) { - return reject("Bad room ID: " + roomId); - } + deop: new Command({ + name: 'deop', + args: '<user-id>', + description: _td('Deops user with given id'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+)$/); + if (matches) { + const cli = MatrixClientPeg.get(); + const room = cli.getRoom(roomId); + if (!room) return reject('Bad room ID: ' + roomId); - const powerLevelEvent = room.currentState.getStateEvents( - "m.room.power_levels", "", - ); - return success( - MatrixClientPeg.get().setPowerLevel( - roomId, args, undefined, powerLevelEvent, - ), - ); + const powerLevelEvent = room.currentState.getStateEvents('m.room.power_levels', ''); + return success(cli.setPowerLevel(roomId, args, undefined, powerLevelEvent)); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, }), - // Open developer tools - devtools: new Command("devtools", "", function(roomId) { - const DevtoolsDialog = sdk.getComponent("dialogs.DevtoolsDialog"); - Modal.createDialog(DevtoolsDialog, { roomId }); - return success(); + devtools: new Command({ + name: 'devtools', + description: _td('Opens the Developer Tools dialog'), + runFn: function(roomId) { + const DevtoolsDialog = sdk.getComponent('dialogs.DevtoolsDialog'); + Modal.createDialog(DevtoolsDialog, {roomId}); + return success(); + }, }), // Verify a user, device, and pubkey tuple - verify: new Command("verify", "<userId> <deviceId> <deviceSigningKey>", function(roomId, args) { - if (args) { - const matches = args.match(/^(\S+) +(\S+) +(\S+)$/); - if (matches) { - const userId = matches[1]; - const deviceId = matches[2]; - const fingerprint = matches[3]; + verify: new Command({ + name: 'verify', + args: '<user-id> <device-id> <device-signing-key>', + description: _td('Verifies a user, device, and pubkey tuple'), + runFn: function(roomId, args) { + if (args) { + const matches = args.match(/^(\S+) +(\S+) +(\S+)$/); + if (matches) { + const cli = MatrixClientPeg.get(); - return success( - // Promise.resolve to handle transition from static result to promise; can be removed - // in future - Promise.resolve(MatrixClientPeg.get().getStoredDevice(userId, deviceId)).then((device) => { - if (!device) { - throw new Error(_t(`Unknown (user, device) pair:`) + ` (${userId}, ${deviceId})`); - } + const userId = matches[1]; + const deviceId = matches[2]; + const fingerprint = matches[3]; - if (device.isVerified()) { - if (device.getFingerprint() === fingerprint) { - throw new Error(_t(`Device already verified!`)); - } else { - throw new Error(_t(`WARNING: Device already verified, but keys do NOT MATCH!`)); + return success( + // Promise.resolve to handle transition from static result to promise; can be removed + // in future + Promise.resolve(cli.getStoredDevice(userId, deviceId)).then((device) => { + if (!device) { + throw new Error(_t('Unknown (user, device) pair:') + ` (${userId}, ${deviceId})`); } - } - if (device.getFingerprint() !== fingerprint) { - const fprint = device.getFingerprint(); - throw new Error( - _t('WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device' + - ' %(deviceId)s is "%(fprint)s" which does not match the provided key' + - ' "%(fingerprint)s". This could mean your communications are being intercepted!', - {deviceId: deviceId, fprint: fprint, userId: userId, fingerprint: fingerprint})); - } + if (device.isVerified()) { + if (device.getFingerprint() === fingerprint) { + throw new Error(_t('Device already verified!')); + } else { + throw new Error(_t('WARNING: Device already verified, but keys do NOT MATCH!')); + } + } - return MatrixClientPeg.get().setDeviceVerified(userId, deviceId, true); - }).then(() => { - // Tell the user we verified everything - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - Modal.createTrackedDialog('Slash Commands', 'Verified key', QuestionDialog, { - title: _t("Verified key"), - description: ( - <div> - <p> - { - _t("The signing key you provided matches the signing key you received " + - "from %(userId)s's device %(deviceId)s. Device marked as verified.", - {userId: userId, deviceId: deviceId}) - } - </p> - </div> - ), - hasCancelButton: false, - }); - }), - ); + if (device.getFingerprint() !== fingerprint) { + const fprint = device.getFingerprint(); + throw new Error( + _t('WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device' + + ' %(deviceId)s is "%(fprint)s" which does not match the provided key ' + + '"%(fingerprint)s". This could mean your communications are being intercepted!', + { + fprint, + userId, + deviceId, + fingerprint, + })); + } + + return cli.setDeviceVerified(userId, deviceId, true); + }).then(() => { + // Tell the user we verified everything + const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); + Modal.createTrackedDialog('Slash Commands', 'Verified key', QuestionDialog, { + title: _t('Verified key'), + description: <div> + <p> + { + _t('The signing key you provided matches the signing key you received ' + + 'from %(userId)s\'s device %(deviceId)s. Device marked as verified.', + {userId, deviceId}) + } + </p> + </div>, + hasCancelButton: false, + }); + }), + ); + } } - } - return reject(this.getUsage()); + return reject(this.getUsage()); + }, + }), + + // Command definitions for autocompletion ONLY: + + // /me is special because its not handled by SlashCommands.js and is instead done inside the Composer classes + me: new Command({ + name: 'me', + args: '<message>', + description: _td('Displays action'), }), }; /* eslint-enable babel/no-invalid-this */ @@ -421,50 +476,39 @@ const aliases = { j: "join", }; -module.exports = { - /** - * Process the given text for /commands and perform them. - * @param {string} roomId The room in which the command was performed. - * @param {string} input The raw text input by the user. - * @return {Object|null} 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. - */ - processInput: function(roomId, input) { - // trim any trailing whitespace, as it can confuse the parser for - // IRC-style commands - input = input.replace(/\s+$/, ""); - if (input[0] === "/" && input[1] !== "/") { - const bits = input.match(/^(\S+?)( +((.|\n)*))?$/); - let cmd; - let args; - if (bits) { - cmd = bits[1].substring(1).toLowerCase(); - args = bits[3]; - } else { - cmd = input; - } - if (cmd === "me") return null; - if (aliases[cmd]) { - cmd = aliases[cmd]; - } - if (commands[cmd]) { - return commands[cmd].run(roomId, args); - } else { - return reject(_t("Unrecognised command:") + ' ' + input); - } - } - return null; // not a command - }, +/** + * Process the given text for /commands and perform them. + * @param {string} roomId The room in which the command was performed. + * @param {string} input The raw text input by the user. + * @return {Object|null} 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 processCommandInput(roomId, input) { + // trim any trailing whitespace, as it can confuse the parser for + // IRC-style commands + input = input.replace(/\s+$/, ''); + if (input[0] !== '/' || input[1] === '/') return null; // not a command - getCommandList: function() { - // Return all the commands plus /me and /markdown which aren't handled like normal commands - const cmds = Object.keys(commands).sort().map(function(cmdKey) { - return commands[cmdKey]; - }); - cmds.push(new Command("me", "<action>", function() {})); - cmds.push(new Command("markdown", "<on|off>", function() {})); + const bits = input.match(/^(\S+?)( +((.|\n)*))?$/); + let cmd; + let args; + if (bits) { + cmd = bits[1].substring(1).toLowerCase(); + args = bits[3]; + } else { + cmd = input; + } - return cmds; - }, -}; + if (aliases[cmd]) { + cmd = aliases[cmd]; + } + if (CommandMap[cmd]) { + // if it has no runFn then its an ignored/nop command (autocomplete only) e.g `/me` + if (!CommandMap[cmd].runFn) return null; + + return CommandMap[cmd].run(roomId, args); + } else { + return reject(_t('Unrecognised command:') + ' ' + input); + } +} diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index b162f2f92a..01a40be40c 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -18,101 +18,14 @@ limitations under the License. */ import React from 'react'; -import { _t, _td } from '../languageHandler'; +import {_t} from '../languageHandler'; import AutocompleteProvider from './AutocompleteProvider'; import FuzzyMatcher from './FuzzyMatcher'; import {TextualCompletion} from './Components'; +import {CommandMap} from '../SlashCommands'; import type {SelectionRange} from "./Autocompleter"; -// TODO merge this with the factory mechanics of SlashCommands? -// Warning: Since the description string will be translated in _t(result.description), all these strings below must be in i18n/strings/en_EN.json file -const COMMANDS = [ - { - command: '/me', - args: '<message>', - description: _td('Displays action'), - }, - { - command: '/ban', - args: '<user-id> [reason]', - description: _td('Bans user with given id'), - }, - { - command: '/unban', - args: '<user-id>', - description: _td('Unbans user with given id'), - }, - { - command: '/op', - args: '<user-id> [<power-level>]', - description: _td('Define the power level of a user'), - }, - { - command: '/deop', - args: '<user-id>', - description: _td('Deops user with given id'), - }, - { - command: '/invite', - args: '<user-id>', - description: _td('Invites user with given id to current room'), - }, - { - command: '/join', - args: '<room-alias>', - description: _td('Joins room with given alias'), - }, - { - command: '/part', - args: '[<room-alias>]', - description: _td('Leave room'), - }, - { - command: '/topic', - args: '<topic>', - description: _td('Sets the room topic'), - }, - { - command: '/kick', - args: '<user-id> [reason]', - description: _td('Kicks user with given id'), - }, - { - command: '/nick', - args: '<display-name>', - description: _td('Changes your display nickname'), - }, - { - command: '/ddg', - args: '<query>', - description: _td('Searches DuckDuckGo for results'), - }, - { - command: '/tint', - args: '<color1> [<color2>]', - description: _td('Changes colour scheme of current room'), - }, - { - command: '/verify', - args: '<user-id> <device-id> <device-signing-key>', - description: _td('Verifies a user, device, and pubkey tuple'), - }, - { - command: '/ignore', - args: '<user-id>', - description: _td('Ignores a user, hiding their messages from you'), - }, - { - command: '/unignore', - args: '<user-id>', - description: _td('Stops ignoring a user, showing their messages going forward'), - }, - { - command: '/devtools', - args: '', - description: _td('Opens the Developer Tools dialog'), - }, -]; +const COMMANDS = Object.values(CommandMap); const COMMAND_RE = /(^\/\w*)(?: .*)?/g; @@ -134,11 +47,10 @@ export default class CommandProvider extends AutocompleteProvider { return { // If the command is the same as the one they entered, we don't want to discard their arguments completion: result.command === command[1] ? command[0] : (result.command + ' '), - component: (<TextualCompletion + component: <TextualCompletion title={result.command} subtitle={result.args} - description={_t(result.description)} - />), + description={_t(result.description)} />, range, }; }); diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 97e8780f0f..1987d4f4be 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -28,7 +28,7 @@ import Promise from 'bluebird'; import MatrixClientPeg from '../../../MatrixClientPeg'; import type {MatrixClient} from 'matrix-js-sdk/lib/matrix'; -import SlashCommands from '../../../SlashCommands'; +import {processCommandInput} from '../../../SlashCommands'; import { KeyCode, isOnlyCtrlOrCmdKeyEvent } from '../../../Keyboard'; import Modal from '../../../Modal'; import sdk from '../../../index'; @@ -722,7 +722,7 @@ export default class MessageComposerInput extends React.Component { // Some commands (/join) require pills to be replaced with their text content const commandText = this.removeMDLinks(contentState, ['#']); - const cmd = SlashCommands.processInput(this.props.room.roomId, commandText); + const cmd = processCommandInput(this.props.room.roomId, commandText); if (cmd) { if (!cmd.error) { this.historyManager.save(contentState, this.state.isRichtextEnabled ? 'html' : 'markdown'); From 107802fa29a8e3dce0f7058f42264c8957d0b6f0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 19:32:12 +0100 Subject: [PATCH 290/480] simplify arrow func Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index 01a40be40c..0e780bddd3 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -43,17 +43,15 @@ export default class CommandProvider extends AutocompleteProvider { // if the query is just `/` (and the user hit TAB or waits), show them all COMMANDS otherwise FuzzyMatch them const matches = query === '/' ? COMMANDS : this.matcher.match(command[1]); - return matches.map((result) => { - return { - // If the command is the same as the one they entered, we don't want to discard their arguments - completion: result.command === command[1] ? command[0] : (result.command + ' '), - component: <TextualCompletion - title={result.command} - subtitle={result.args} - description={_t(result.description)} />, - range, - }; - }); + return matches.map((result) => ({ + // If the command is the same as the one they entered, we don't want to discard their arguments + completion: result.command === command[1] ? command[0] : (result.command + ' '), + component: <TextualCompletion + title={result.command} + subtitle={result.args} + description={_t(result.description)} />, + range, + })); } getName() { From 9de6bf4f5a109e62590d3e848c22f9f9189530da Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 17:37:55 +0100 Subject: [PATCH 291/480] once command has a space, strict match instead of fuzzy match Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> (cherry picked from commit a852033) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index 0e780bddd3..ea271e02ff 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -41,8 +41,26 @@ export default class CommandProvider extends AutocompleteProvider { const {command, range} = this.getCurrentCommand(query, selection); if (!command) return []; - // if the query is just `/` (and the user hit TAB or waits), show them all COMMANDS otherwise FuzzyMatch them - const matches = query === '/' ? COMMANDS : this.matcher.match(command[1]); + let matches; + if (command[0] !== command[1]) { + // The input looks like a command with arguments, perform exact match + const match = COMMANDS.find((o) => o.command === command[1]); + if (match) { + matches = [match]; + } + } + + // If we don't yet have matches + if (!matches) { + if (query === '/') { + // If they have just entered `/` show everything + matches = COMMANDS; + } else { + // otherwise fuzzy match against all of the fields + matches = this.matcher.match(command[1]); + } + } + return matches.map((result) => ({ // If the command is the same as the one they entered, we don't want to discard their arguments completion: result.command === command[1] ? command[0] : (result.command + ' '), From 29ea4025d46968e548cf83b5e6e15caaf30dc4cf Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 18 Jun 2018 22:13:20 +0100 Subject: [PATCH 292/480] trigger TagTile context menu on right click Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/TagTile.js | 43 +++++++++++++++--------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/components/views/elements/TagTile.js b/src/components/views/elements/TagTile.js index fb3ddee093..5bea68e814 100644 --- a/src/components/views/elements/TagTile.js +++ b/src/components/views/elements/TagTile.js @@ -1,5 +1,6 @@ /* Copyright 2017 New Vector Ltd. +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -103,14 +104,27 @@ export default React.createClass({ } }, - onContextButtonClick: function(e) { - e.preventDefault(); - e.stopPropagation(); - + _openContextMenu: function(x, y, chevronOffset) { // Hide the (...) immediately this.setState({ hover: false }); const TagTileContextMenu = sdk.getComponent('context_menus.TagTileContextMenu'); + ContextualMenu.createMenu(TagTileContextMenu, { + chevronOffset: chevronOffset, + left: x, + top: y, + tag: this.props.tag, + onFinished: () => { + this.setState({ menuDisplayed: false }); + }, + }); + this.setState({ menuDisplayed: true }); + }, + + onContextButtonClick: function(e) { + e.preventDefault(); + e.stopPropagation(); + const elementRect = e.target.getBoundingClientRect(); // The window X and Y offsets are to adjust position when zoomed in to page @@ -119,17 +133,14 @@ export default React.createClass({ let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset); y = y - (chevronOffset + 8); // where 8 is half the height of the chevron - const self = this; - ContextualMenu.createMenu(TagTileContextMenu, { - chevronOffset: chevronOffset, - left: x, - top: y, - tag: this.props.tag, - onFinished: function() { - self.setState({ menuDisplayed: false }); - }, - }); - this.setState({ menuDisplayed: true }); + this._openContextMenu(x, y, chevronOffset); + }, + + onContextMenu: function(e) { + e.preventDefault(); + + const chevronOffset = 12; + this._openContextMenu(e.clientX, e.clientY - (chevronOffset + 8), chevronOffset); }, onMouseOver: function() { @@ -164,7 +175,7 @@ export default React.createClass({ <div className="mx_TagTile_context_button" onClick={this.onContextButtonClick}> { "\u00B7\u00B7\u00B7" } </div> : <div />; - return <AccessibleButton className={className} onClick={this.onClick}> + return <AccessibleButton className={className} onClick={this.onClick} onContextMenu={this.onContextMenu}> <div className="mx_TagTile_avatar" onMouseOver={this.onMouseOver} onMouseOut={this.onMouseOut}> <BaseAvatar name={name} From baf0d3798371146bfc2275335b6bc90e7b26602a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 07:56:04 +0100 Subject: [PATCH 293/480] un-break having no displayname user settings Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/settings/ChangeDisplayName.js | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/components/views/settings/ChangeDisplayName.js b/src/components/views/settings/ChangeDisplayName.js index a74e223349..238fd9c2c3 100644 --- a/src/components/views/settings/ChangeDisplayName.js +++ b/src/components/views/settings/ChangeDisplayName.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2018 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. @@ -23,21 +24,14 @@ import { _t } from '../../../languageHandler'; module.exports = React.createClass({ displayName: 'ChangeDisplayName', - _getDisplayName: function() { + _getDisplayName: async function() { const cli = MatrixClientPeg.get(); - return cli.getProfileInfo(cli.credentials.userId).then(function(result) { - let displayname = result.displayname; - if (!displayname) { - if (MatrixClientPeg.get().isGuest()) { - displayname = "Guest " + MatrixClientPeg.get().getUserIdLocalpart(); - } else { - displayname = MatrixClientPeg.get().getUserIdLocalpart(); - } - } - return displayname; - }, function(error) { + try { + const res = await cli.getProfileInfo(cli.getUserId()); + return res.displayname; + } catch (e) { throw new Error("Failed to fetch display name"); - }); + } }, _changeDisplayName: function(new_displayname) { From 9fa7cb863567db08bda30bbff6351dd5a7cbc977 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 07:57:28 +0100 Subject: [PATCH 294/480] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/settings/ChangeDisplayName.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/views/settings/ChangeDisplayName.js b/src/components/views/settings/ChangeDisplayName.js index 238fd9c2c3..afe1521f0f 100644 --- a/src/components/views/settings/ChangeDisplayName.js +++ b/src/components/views/settings/ChangeDisplayName.js @@ -15,10 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; -const React = require('react'); -const sdk = require('../../../index'); -const MatrixClientPeg = require("../../../MatrixClientPeg"); +import React from 'react'; +import sdk from '../../../index'; +import MatrixClientPeg from '../../../MatrixClientPeg'; import { _t } from '../../../languageHandler'; module.exports = React.createClass({ @@ -34,10 +33,10 @@ module.exports = React.createClass({ } }, - _changeDisplayName: function(new_displayname) { + _changeDisplayName: function(newDisplayname) { const cli = MatrixClientPeg.get(); - return cli.setDisplayName(new_displayname).catch(function(e) { - throw new Error("Failed to set display name"); + return cli.setDisplayName(newDisplayname).catch(function(e) { + throw new Error("Failed to set display name", e); }); }, From fffb8379d8e2c4c9abefb242624ffd045a25672e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 08:37:11 +0100 Subject: [PATCH 295/480] delint MImageBody, fixes anonymous class and hyphenated style keys which made react cry Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/MImageBody.js | 25 +++++++++------------ 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 1b6bdeb588..e2ff697e55 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -1,6 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2018 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,8 +16,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - import React from 'react'; import PropTypes from 'prop-types'; import { MatrixClient } from 'matrix-js-sdk'; @@ -29,9 +28,7 @@ import Promise from 'bluebird'; import { _t } from '../../../languageHandler'; import SettingsStore from "../../../settings/SettingsStore"; -export default class extends React.Component { - displayName: 'MImageBody' - +export default class MImageBody extends React.Component { static propTypes = { /* the MatrixEvent to show */ mxEvent: PropTypes.object.isRequired, @@ -41,11 +38,11 @@ export default class extends React.Component { /* the maximum image height to use */ maxImageHeight: PropTypes.number, - } + }; static contextTypes = { matrixClient: PropTypes.instanceOf(MatrixClient), - } + }; constructor(props) { super(props); @@ -90,7 +87,7 @@ export default class extends React.Component { } onClick(ev) { - if (ev.button == 0 && !ev.metaKey) { + if (ev.button === 0 && !ev.metaKey) { ev.preventDefault(); const content = this.props.mxEvent.getContent(); const httpUrl = this._getContentUrl(); @@ -177,9 +174,7 @@ export default class extends React.Component { return this.state.decryptedThumbnailUrl; } return this.state.decryptedUrl; - } else if (content.info && - content.info.mimetype == "image/svg+xml" && - content.info.thumbnail_url) { + } else if (content.info && content.info.mimetype === "image/svg+xml" && content.info.thumbnail_url) { // special case to return client-generated thumbnails for SVGs, if any, // given we deliberately don't thumbnail them serverside to prevent // billion lol attacks and similar @@ -299,7 +294,7 @@ export default class extends React.Component { // which has the same width as the timeline // mx_MImageBody_thumbnail resizes img to exactly container size img = <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" - style={{ "max-width": maxWidth + "px" }} + style={{ maxWidth: maxWidth + "px" }} alt={content.body} onError={this.onImageError} onLoad={this.onImageLoad} @@ -308,14 +303,14 @@ export default class extends React.Component { } const thumbnail = ( - <div className="mx_MImageBody_thumbnail_container" style={{ "max-height": maxHeight + "px" }} > + <div className="mx_MImageBody_thumbnail_container" style={{ maxHeight: maxHeight + "px" }} > { /* Calculate aspect ratio, using %padding will size _container correctly */ } - <div style={{ paddingBottom: (100 * infoHeight / infoWidth) + '%' }}></div> + <div style={{ paddingBottom: (100 * infoHeight / infoWidth) + '%' }} /> { showPlaceholder && <div className="mx_MImageBody_thumbnail" style={{ // Constrain width here so that spinner appears central to the loaded thumbnail - "max-width": infoWidth + "px", + maxWidth: infoWidth + "px", }}> <div className="mx_MImageBody_thumbnail_spinner"> { placeholder } From 6200c147a6165dd2543765720b5f19c5d539de68 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 08:41:24 +0100 Subject: [PATCH 296/480] Upload File confirmation modal steals focus, send it back to composer Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomView.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 97e575ff4e..4beafb099c 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -913,6 +913,8 @@ module.exports = React.createClass({ }, uploadFile: async function(file) { + dis.dispatch({action: 'focus_composer'}); + if (MatrixClientPeg.get().isGuest()) { dis.dispatch({action: 'view_set_mxid'}); return; From 72f50a8c61e279829c89ec9264894afd0de8d44d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 11:51:06 +0100 Subject: [PATCH 297/480] rewrite group permalinks in <a hrefs> also Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/HtmlUtils.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js index 7ca404be31..4f66468373 100644 --- a/src/HtmlUtils.js +++ b/src/HtmlUtils.js @@ -216,10 +216,16 @@ const sanitizeHtmlParams = { m = attribs.href.match(linkifyMatrix.MATRIXTO_URL_PATTERN); if (m) { const entity = m[1]; - if (entity[0] === '@') { - attribs.href = '#/user/' + entity; - } else if (entity[0] === '#' || entity[0] === '!') { - attribs.href = '#/room/' + entity; + switch (entity[0]) { + case '@': + attribs.href = '#/user/' + entity; + break; + case '+': + attribs.href = '#/group/' + entity; + break; + case '#': case '!': + attribs.href = '#/room/' + entity; + break; } delete attribs.target; } From b79cd205a06fed509544e4d927aa0e01fe0a26fb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 11:52:48 +0100 Subject: [PATCH 298/480] Support autocompleting Communities Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/Autocompleter.js | 4 +- src/autocomplete/CommunityProvider.js | 122 ++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 src/autocomplete/CommunityProvider.js diff --git a/src/autocomplete/Autocompleter.js b/src/autocomplete/Autocompleter.js index 3d30363d9f..6ad90eaebe 100644 --- a/src/autocomplete/Autocompleter.js +++ b/src/autocomplete/Autocompleter.js @@ -1,6 +1,6 @@ /* Copyright 2016 Aviral Dasgupta -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -19,6 +19,7 @@ limitations under the License. import type {Component} from 'react'; import CommandProvider from './CommandProvider'; +import CommunityProvider from './CommunityProvider'; import DuckDuckGoProvider from './DuckDuckGoProvider'; import RoomProvider from './RoomProvider'; import UserProvider from './UserProvider'; @@ -47,6 +48,7 @@ const PROVIDERS = [ EmojiProvider, NotifProvider, CommandProvider, + CommunityProvider, DuckDuckGoProvider, ]; diff --git a/src/autocomplete/CommunityProvider.js b/src/autocomplete/CommunityProvider.js new file mode 100644 index 0000000000..db4d52fae2 --- /dev/null +++ b/src/autocomplete/CommunityProvider.js @@ -0,0 +1,122 @@ +/* +Copyright 2018 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 React from 'react'; +import { _t } from '../languageHandler'; +import AutocompleteProvider from './AutocompleteProvider'; +import MatrixClientPeg from '../MatrixClientPeg'; +import FuzzyMatcher from './FuzzyMatcher'; +import {PillCompletion} from './Components'; +import sdk from '../index'; +import _sortBy from 'lodash/sortBy'; +import {makeGroupPermalink} from "../matrix-to"; +import type {Completion, SelectionRange} from "./Autocompleter"; +import FlairStore from "../stores/FlairStore"; + +const COMMUNITY_REGEX = /(?=\+)(\S*)/g; + +function score(query, space) { + const index = space.indexOf(query); + if (index === -1) { + return Infinity; + } else { + return index; + } +} + +export default class CommunityProvider extends AutocompleteProvider { + constructor() { + super(COMMUNITY_REGEX); + this.matcher = new FuzzyMatcher([], { + keys: ['groupId', 'name', 'shortDescription'], + }); + } + + async getCompletions(query: string, selection: SelectionRange, force?: boolean = false): Array<Completion> { + const BaseAvatar = sdk.getComponent('views.avatars.BaseAvatar'); + + // Disable autocompletions when composing commands because of various issues + // (see https://github.com/vector-im/riot-web/issues/4762) + if (/^(\/join|\/leave)/.test(query)) { + return []; + } + + const cli = MatrixClientPeg.get(); + let completions = []; + const {command, range} = this.getCurrentCommand(query, selection, force); + if (command) { + const joinedGroups = cli.getGroups().filter(({myMembership}) => myMembership !== 'invite'); + + const groups = (await Promise.all(joinedGroups.map(async ({avatarUrl, groupId, name=''}) => { + try { + return FlairStore.getGroupProfileCached(cli, groupId); + } catch (e) { // if FlairStore failed, rely on js-sdk's store which lacks info + return Promise.resolve({ + name, + groupId, + avatarUrl, + shortDescription: '', // js-sdk doesn't store this + }); + } + }))); + + this.matcher.setObjects(groups); + // this.matcher.setObjects(joinedGroups); + // this.matcher.setObjects(joinedGroups.map(({groupId}) => { + // const groupProfile = GroupStore.getSummary(groupId).profile; + // if (groupProfile) { + // return { + // groupId, + // name: groupProfile.name || '', + // avatarUrl: groupProfile.avatar_url, + // }; + // } + // })).filter(Boolean); + + const matchedString = command[0]; + completions = this.matcher.match(matchedString); + completions = _sortBy(completions, [ + (c) => score(matchedString, c.groupId), + (c) => c.groupId.length, + ]).map(({avatarUrl, groupId, name}) => ({ + completion: groupId, + suffix: ' ', + href: makeGroupPermalink(groupId), + component: ( + <PillCompletion initialComponent={ + <BaseAvatar name={name || groupId} + width={24} height={24} + url={avatarUrl ? cli.mxcUrlToHttp(avatarUrl, 24, 24) : null} /> + } title={name} description={groupId} /> + ), + range, + })) + .filter((completion) => !!completion.completion && completion.completion.length > 0) + .slice(0, 4); + } + return completions; + } + + getName() { + return '💬 ' + _t('Communities'); + } + + renderCompletions(completions: [React.Component]): ?React.Component { + return <div className="mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate"> + { completions } + </div>; + } +} From c1e608f1a83f359f21859a84aae7247ea32b89d1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 11:53:17 +0100 Subject: [PATCH 299/480] show permalinks to communities as Pills Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/elements/_RichText.scss | 5 +++- src/components/views/elements/Pill.js | 37 ++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss index 474a123455..eda9f6a4de 100644 --- a/res/css/views/elements/_RichText.scss +++ b/res/css/views/elements/_RichText.scss @@ -4,6 +4,7 @@ .mx_UserPill, .mx_RoomPill, +.mx_GroupPill, .mx_AtRoomPill { border-radius: 16px; display: inline-block; @@ -13,7 +14,8 @@ } .mx_EventTile_body .mx_UserPill, -.mx_EventTile_body .mx_RoomPill { +.mx_EventTile_body .mx_RoomPill, +.mx_EventTile_body .mx_GroupPill { cursor: pointer; } @@ -43,6 +45,7 @@ .mx_UserPill .mx_BaseAvatar, .mx_RoomPill .mx_BaseAvatar, +.mx_GroupPill .mx_BaseAvatar, .mx_AtRoomPill .mx_BaseAvatar { position: relative; left: -3px; diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index 7e5ad379de..70e1d0659a 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -22,12 +23,13 @@ import PropTypes from 'prop-types'; import MatrixClientPeg from '../../../MatrixClientPeg'; import { MATRIXTO_URL_PATTERN } from '../../../linkify-matrix'; import { getDisplayAliasForRoom } from '../../../Rooms'; +import FlairStore from "../../../stores/FlairStore"; const REGEX_MATRIXTO = new RegExp(MATRIXTO_URL_PATTERN); // For URLs of matrix.to links in the timeline which have been reformatted by // HttpUtils transformTags to relative links. This excludes event URLs (with `[^\/]*`) -const REGEX_LOCAL_MATRIXTO = /^#\/(?:user|room)\/(([\#\!\@\+])[^\/]*)$/; +const REGEX_LOCAL_MATRIXTO = /^#\/(?:user|room|group)\/(([#!@+])[^\/]*)$/; const Pill = React.createClass({ statics: { @@ -45,6 +47,7 @@ const Pill = React.createClass({ }, TYPE_USER_MENTION: 'TYPE_USER_MENTION', TYPE_ROOM_MENTION: 'TYPE_ROOM_MENTION', + TYPE_GROUP_MENTION: 'TYPE_GROUP_MENTION', TYPE_AT_ROOM_MENTION: 'TYPE_AT_ROOM_MENTION', // '@room' mention }, @@ -81,12 +84,14 @@ const Pill = React.createClass({ // The member related to the user pill member: null, + // The group related to the group pill + group: null, // The room related to the room pill room: null, }; }, - componentWillReceiveProps(nextProps) { + async componentWillReceiveProps(nextProps) { let regex = REGEX_MATRIXTO; if (nextProps.inMessage) { regex = REGEX_LOCAL_MATRIXTO; @@ -109,9 +114,11 @@ const Pill = React.createClass({ '@': Pill.TYPE_USER_MENTION, '#': Pill.TYPE_ROOM_MENTION, '!': Pill.TYPE_ROOM_MENTION, + '+': Pill.TYPE_GROUP_MENTION, }[prefix]; let member; + let group; let room; switch (pillType) { case Pill.TYPE_AT_ROOM_MENTION: { @@ -140,8 +147,17 @@ const Pill = React.createClass({ } } break; + case Pill.TYPE_GROUP_MENTION: { + const cli = MatrixClientPeg.get(); + + try { + group = await FlairStore.getGroupProfileCached(cli, resourceId); + } catch (e) { // if FlairStore failed, rely on js-sdk's store which lacks info + group = cli.getGroup(resourceId); + } + } } - this.setState({resourceId, pillType, member, room}); + this.setState({resourceId, pillType, member, group, room}); }, componentWillMount() { @@ -179,6 +195,7 @@ const Pill = React.createClass({ }); }, render: function() { + const BaseAvatar = sdk.getComponent('views.avatars.BaseAvatar'); const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); const RoomAvatar = sdk.getComponent('avatars.RoomAvatar'); @@ -229,6 +246,20 @@ const Pill = React.createClass({ } } break; + case Pill.TYPE_GROUP_MENTION: { + if (this.state.group) { + const {avatarUrl, groupId, name} = this.state.group; + const cli = MatrixClientPeg.get(); + + linkText = groupId; + if (this.props.shouldShowPillAvatar) { + avatar = <BaseAvatar name={name || groupId} width={16} height={16} + url={avatarUrl ? cli.mxcUrlToHttp(avatarUrl, 16, 16) : null} />; + } + pillClass = 'mx_RoomPill' || 'mx_GroupPill'; + } + } + break; } const classes = classNames(pillClass, { From 287745f8c6315c7f5a8183f5e24142e249cb3379 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 12:06:13 +0100 Subject: [PATCH 300/480] delint, remove unused imports and fix flow annotations Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/AutocompleteProvider.js | 14 +++++++------- src/autocomplete/Autocompleter.js | 3 ++- src/autocomplete/CommandProvider.js | 4 ++-- src/autocomplete/DuckDuckGoProvider.js | 5 +++-- src/autocomplete/EmojiProvider.js | 8 ++++---- src/autocomplete/NotifProvider.js | 3 ++- src/autocomplete/RoomProvider.js | 5 +++-- src/autocomplete/UserProvider.js | 8 ++++---- 8 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/autocomplete/AutocompleteProvider.js b/src/autocomplete/AutocompleteProvider.js index c93ae4fb2a..3fdb2998e7 100644 --- a/src/autocomplete/AutocompleteProvider.js +++ b/src/autocomplete/AutocompleteProvider.js @@ -1,7 +1,7 @@ /* Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -36,7 +36,7 @@ export default class AutocompleteProvider { /** * Of the matched commands in the query, returns the first that contains or is contained by the selection, or null. */ - getCurrentCommand(query: string, selection: {start: number, end: number}, force: boolean = false): ?string { + getCurrentCommand(query: string, selection: SelectionRange, force: boolean = false): ?string { let commandRegex = this.commandRegex; if (force && this.shouldForceComplete()) { @@ -51,14 +51,14 @@ export default class AutocompleteProvider { let match; while ((match = commandRegex.exec(query)) != null) { - let matchStart = match.index, - matchEnd = matchStart + match[0].length; - if (selection.start <= matchEnd && selection.end >= matchStart) { + const start = match.index; + const end = start + match[0].length; + if (selection.start <= end && selection.end >= start) { return { command: match, range: { - start: matchStart, - end: matchEnd, + start, + end, }, }; } diff --git a/src/autocomplete/Autocompleter.js b/src/autocomplete/Autocompleter.js index 6ad90eaebe..f5fec4c502 100644 --- a/src/autocomplete/Autocompleter.js +++ b/src/autocomplete/Autocompleter.js @@ -18,6 +18,7 @@ limitations under the License. // @flow import type {Component} from 'react'; +import {Room} from 'matrix-js-sdk'; import CommandProvider from './CommandProvider'; import CommunityProvider from './CommunityProvider'; import DuckDuckGoProvider from './DuckDuckGoProvider'; @@ -56,7 +57,7 @@ const PROVIDERS = [ const PROVIDER_COMPLETION_TIMEOUT = 3000; export default class Autocompleter { - constructor(room) { + constructor(room: Room) { this.room = room; this.providers = PROVIDERS.map((p) => { return new p(room); diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index b162f2f92a..5e96e612c2 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -22,7 +22,7 @@ import { _t, _td } from '../languageHandler'; import AutocompleteProvider from './AutocompleteProvider'; import FuzzyMatcher from './FuzzyMatcher'; import {TextualCompletion} from './Components'; -import type {SelectionRange} from "./Autocompleter"; +import type {Completion, SelectionRange} from "./Autocompleter"; // TODO merge this with the factory mechanics of SlashCommands? // Warning: Since the description string will be translated in _t(result.description), all these strings below must be in i18n/strings/en_EN.json file @@ -124,7 +124,7 @@ export default class CommandProvider extends AutocompleteProvider { }); } - async getCompletions(query: string, selection: SelectionRange, force?: boolean) { + async getCompletions(query: string, selection: SelectionRange, force?: boolean): Array<Completion> { const {command, range} = this.getCurrentCommand(query, selection); if (!command) return []; diff --git a/src/autocomplete/DuckDuckGoProvider.js b/src/autocomplete/DuckDuckGoProvider.js index 68d4915f56..e25ef16428 100644 --- a/src/autocomplete/DuckDuckGoProvider.js +++ b/src/autocomplete/DuckDuckGoProvider.js @@ -1,7 +1,7 @@ /* Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -22,6 +22,7 @@ import AutocompleteProvider from './AutocompleteProvider'; import 'whatwg-fetch'; import {TextualCompletion} from './Components'; +import type {SelectionRange} from "./Autocompleter"; const DDG_REGEX = /\/ddg\s+(.+)$/g; const REFERRER = 'vector'; @@ -36,7 +37,7 @@ export default class DuckDuckGoProvider extends AutocompleteProvider { + `&format=json&no_redirect=1&no_html=1&t=${encodeURIComponent(REFERRER)}`; } - async getCompletions(query: string, selection: {start: number, end: number}) { + async getCompletions(query: string, selection: SelectionRange, force?: boolean = false) { const {command, range} = this.getCurrentCommand(query, selection); if (!query || !command) { return []; diff --git a/src/autocomplete/EmojiProvider.js b/src/autocomplete/EmojiProvider.js index f4e576ea0f..81f6144fd3 100644 --- a/src/autocomplete/EmojiProvider.js +++ b/src/autocomplete/EmojiProvider.js @@ -1,7 +1,7 @@ /* Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -19,11 +19,11 @@ limitations under the License. import React from 'react'; import { _t } from '../languageHandler'; import AutocompleteProvider from './AutocompleteProvider'; -import {emojioneList, shortnameToImage, shortnameToUnicode, asciiRegexp, unicodeRegexp} from 'emojione'; +import {shortnameToUnicode, asciiRegexp, unicodeRegexp} from 'emojione'; import FuzzyMatcher from './FuzzyMatcher'; import sdk from '../index'; import {PillCompletion} from './Components'; -import type {SelectionRange, Completion} from './Autocompleter'; +import type {Completion, SelectionRange} from './Autocompleter'; import _uniq from 'lodash/uniq'; import _sortBy from 'lodash/sortBy'; import SettingsStore from "../settings/SettingsStore"; @@ -95,7 +95,7 @@ export default class EmojiProvider extends AutocompleteProvider { }); } - async getCompletions(query: string, selection: SelectionRange) { + async getCompletions(query: string, selection: SelectionRange, force?: boolean): Array<Completion> { if (SettingsStore.getValue("MessageComposerInput.dontSuggestEmoji")) { return []; // don't give any suggestions if the user doesn't want them } diff --git a/src/autocomplete/NotifProvider.js b/src/autocomplete/NotifProvider.js index b7ac645525..842fb4fb18 100644 --- a/src/autocomplete/NotifProvider.js +++ b/src/autocomplete/NotifProvider.js @@ -20,6 +20,7 @@ import { _t } from '../languageHandler'; import MatrixClientPeg from '../MatrixClientPeg'; import {PillCompletion} from './Components'; import sdk from '../index'; +import type {Completion, SelectionRange} from "./Autocompleter"; const AT_ROOM_REGEX = /@\S*/g; @@ -29,7 +30,7 @@ export default class NotifProvider extends AutocompleteProvider { this.room = room; } - async getCompletions(query: string, selection: {start: number, end: number}, force = false) { + async getCompletions(query: string, selection: SelectionRange, force?:boolean = false): Array<Completion> { const RoomAvatar = sdk.getComponent('views.avatars.RoomAvatar'); const client = MatrixClientPeg.get(); diff --git a/src/autocomplete/RoomProvider.js b/src/autocomplete/RoomProvider.js index 31599703c2..c222ae95d4 100644 --- a/src/autocomplete/RoomProvider.js +++ b/src/autocomplete/RoomProvider.js @@ -1,7 +1,7 @@ /* Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -26,6 +26,7 @@ import {getDisplayAliasForRoom} from '../Rooms'; import sdk from '../index'; import _sortBy from 'lodash/sortBy'; import {makeRoomPermalink} from "../matrix-to"; +import type {Completion, SelectionRange} from "./Autocompleter"; const ROOM_REGEX = /(?=#)(\S*)/g; @@ -46,7 +47,7 @@ export default class RoomProvider extends AutocompleteProvider { }); } - async getCompletions(query: string, selection: {start: number, end: number}, force = false) { + async getCompletions(query: string, selection: SelectionRange, force?: boolean = false): Array<Completion> { const RoomAvatar = sdk.getComponent('views.avatars.RoomAvatar'); // Disable autocompletions when composing commands because of various issues diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index ce8f1020a1..85837d5ebb 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -2,7 +2,7 @@ /* Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -23,12 +23,12 @@ import AutocompleteProvider from './AutocompleteProvider'; import {PillCompletion} from './Components'; import sdk from '../index'; import FuzzyMatcher from './FuzzyMatcher'; -import _pull from 'lodash/pull'; import _sortBy from 'lodash/sortBy'; import MatrixClientPeg from '../MatrixClientPeg'; import type {Room, RoomMember} from 'matrix-js-sdk'; import {makeUserPermalink} from "../matrix-to"; +import type {SelectionRange} from "./Autocompleter"; const USER_REGEX = /@\S*/g; @@ -36,7 +36,7 @@ export default class UserProvider extends AutocompleteProvider { users: Array<RoomMember> = null; room: Room = null; - constructor(room) { + constructor(room: Room) { super(USER_REGEX, { keys: ['name'], }); @@ -87,7 +87,7 @@ export default class UserProvider extends AutocompleteProvider { this.users = null; } - async getCompletions(query: string, selection: {start: number, end: number}, force = false) { + async getCompletions(query: string, selection: SelectionRange, force?: boolean = false) { const MemberAvatar = sdk.getComponent('views.avatars.MemberAvatar'); // Disable autocompletions when composing commands because of various issues From 5cc15b2e0325bdf5f20f580c5666c851055ad29c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 19 Jun 2018 19:11:22 +0100 Subject: [PATCH 301/480] add additional classes which protect the text from overflowing Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/groups/GroupInviteTile.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 25dba130f9..7c471cca2e 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -125,9 +125,7 @@ export default React.createClass({ const av = <BaseAvatar name={groupName} width={24} height={24} url={httpAvatarUrl} />; - const nameClasses = classNames({ - 'mx_RoomTile_name': true, - 'mx_RoomTile_invite': this.props.isInvite, + const nameClasses = classNames('mx_RoomTile_name mx_RoomTile_invite mx_RoomTile_badgeShown', { 'mx_RoomTile_badgeShown': this.state.badgeHover || this.state.menuDisplayed, }); From e67dae704ab7dc2ba1809a7ed5c2d35350ff96e5 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 20 Jun 2018 09:57:11 +0100 Subject: [PATCH 302/480] Take replies out of labs! --- .../views/context_menus/MessageContextMenu.js | 12 +++++------- src/components/views/elements/ReplyThread.js | 2 +- src/components/views/messages/TextualBody.js | 3 +-- src/components/views/rooms/MessageComposerInput.js | 2 +- src/settings/Settings.js | 6 ------ 5 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index bdd267c4ee..59cdb61fd6 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -253,13 +253,11 @@ module.exports = React.createClass({ </div> ); - if (SettingsStore.isFeatureEnabled("feature_rich_quoting")) { - replyButton = ( - <div className="mx_MessageContextMenu_field" onClick={this.onReplyClick}> - { _t('Reply') } - </div> - ); - } + replyButton = ( + <div className="mx_MessageContextMenu_field" onClick={this.onReplyClick}> + { _t('Reply') } + </div> + ); if (this.state.canPin) { pinButton = ( diff --git a/src/components/views/elements/ReplyThread.js b/src/components/views/elements/ReplyThread.js index 6714de81a4..f9f3f4ca97 100644 --- a/src/components/views/elements/ReplyThread.js +++ b/src/components/views/elements/ReplyThread.js @@ -160,7 +160,7 @@ export default class ReplyThread extends React.Component { } static makeThread(parentEv, onWidgetLoad, ref) { - if (!SettingsStore.isFeatureEnabled("feature_rich_quoting") || !ReplyThread.getParentEventId(parentEv)) { + if (!ReplyThread.getParentEventId(parentEv)) { return <div />; } return <ReplyThread parentEv={parentEv} onWidgetLoad={onWidgetLoad} ref={ref} />; diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 60377a47d7..20cf2b69f4 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -423,8 +423,7 @@ module.exports = React.createClass({ const mxEvent = this.props.mxEvent; const content = mxEvent.getContent(); - const stripReply = SettingsStore.isFeatureEnabled("feature_rich_quoting") && - ReplyThread.getParentEventId(mxEvent); + const stripReply = ReplyThread.getParentEventId(mxEvent); let body = HtmlUtils.bodyToHtml(content, this.props.highlights, { disableBigEmoji: SettingsStore.getValue('TextualBody.disableBigEmoji'), // Part of Replies fallback support diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 57d433e55c..c59bee641f 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -1181,7 +1181,7 @@ export default class MessageComposerInput extends React.Component { return ( <div className="mx_MessageComposer_input_wrapper"> <div className="mx_MessageComposer_autocomplete_wrapper"> - { SettingsStore.isFeatureEnabled("feature_rich_quoting") && <ReplyPreview /> } + <ReplyPreview /> <Autocomplete ref={(e) => this.autocomplete = e} room={this.props.room} diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 039bd78d79..40bb2dd57e 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -76,12 +76,6 @@ export const SETTINGS = { // // level is always appended to the end. // supportedLevelsAreOrdered: false, // }, - "feature_rich_quoting": { - isFeature: true, - displayName: _td("Message Replies"), - supportedLevels: LEVELS_FEATURE, - default: false, - }, "feature_pinning": { isFeature: true, displayName: _td("Message Pinning"), From 0e8b4ac2ad472cab7ad2f40a9d5424f285c56023 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 20 Jun 2018 10:01:09 +0100 Subject: [PATCH 303/480] i18n & prunei18n --- src/i18n/strings/bg.json | 5 --- src/i18n/strings/ca.json | 5 --- src/i18n/strings/cs.json | 5 --- src/i18n/strings/da.json | 2 - src/i18n/strings/de_DE.json | 5 --- src/i18n/strings/el.json | 2 - src/i18n/strings/en_EN.json | 73 ++++++++++++++++------------------- src/i18n/strings/en_US.json | 2 - src/i18n/strings/eo.json | 5 --- src/i18n/strings/es.json | 2 - src/i18n/strings/eu.json | 5 --- src/i18n/strings/fi.json | 4 -- src/i18n/strings/fr.json | 5 --- src/i18n/strings/gl.json | 5 --- src/i18n/strings/hu.json | 5 --- src/i18n/strings/it.json | 5 --- src/i18n/strings/ko.json | 2 - src/i18n/strings/lv.json | 5 --- src/i18n/strings/nl.json | 5 --- src/i18n/strings/pl.json | 2 - src/i18n/strings/pt.json | 2 - src/i18n/strings/pt_BR.json | 5 --- src/i18n/strings/ru.json | 5 --- src/i18n/strings/sk.json | 5 --- src/i18n/strings/sq.json | 2 - src/i18n/strings/sr.json | 5 --- src/i18n/strings/sv.json | 5 --- src/i18n/strings/th.json | 1 - src/i18n/strings/tr.json | 2 - src/i18n/strings/zh_Hans.json | 5 --- src/i18n/strings/zh_Hant.json | 5 --- 31 files changed, 34 insertions(+), 157 deletions(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 0b1305f3e8..f3c12edecb 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -136,7 +136,6 @@ "Missing room_id in request": "Липсва room_id в заявката", "Room %(roomId)s not visible": "Стая %(roomId)s не е видима", "Missing user_id in request": "Липсва user_id в заявката", - "Failed to lookup current room": "Неуспешно намиране на текущата стая", "/ddg is not a command": "/ddg не е команда", "To use it, just wait for autocomplete results to load and tab through them.": "За използване, изчакайте зареждането на списъка с предложения и изберете от него.", "Unrecognised room alias:": "Непознат псевдоним на стая:", @@ -206,7 +205,6 @@ "Failed to join room": "Неуспешно присъединяване към стаята", "Message Replies": "Отговори на съобщението", "Message Pinning": "Функция за закачане на съобщения", - "Tag Panel": "Панел с етикети", "Disable Emoji suggestions while typing": "Изключване на предложенията за емотиконите при писане", "Use compact timeline layout": "Използване на компактно оформление за списъка със съобщения", "Hide removed messages": "Скриване на премахнати съобщения", @@ -491,7 +489,6 @@ "Decrypt %(text)s": "Разшифровай %(text)s", "Download %(text)s": "Изтегли %(text)s", "(could not connect media)": "(неуспешно свързване на медийните устройства)", - "Must be viewing a room": "Трябва да извършите това в стая", "Usage": "Употреба", "Remove from community": "Премахни от общността", "Disinvite this user from community?": "Оттегляне на поканата към този потребител от общността?", @@ -520,8 +517,6 @@ "Community %(groupId)s not found": "Общност %(groupId)s не е намерена", "Create a new community": "Създаване на нова общност", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Създайте общност, за да групирате потребители и стаи! Изградете персонализирана начална страница, за да маркирате своето пространство в Matrix Вселената.", - "Join an existing community": "Присъединяване към съществуваща общност", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "За да се присъедините към вече съществуваща общност, трябва да знаете нейния идентификатор; той изглежда нещо подобно на <i>+example:matrix.org</i>.", "Unknown (user, device) pair:": "Непозната двойка (потребител, устройство):", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Подписващият ключ, който сте предоставили, съвпада с подписващия ключ, който сте получили от устройството %(deviceId)s на %(userId)s. Устройството е маркирано като потвърдено.", "Hide avatars in user and room mentions": "Скриване на аватара на потребители и стаи при споменаването им", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index bd8452f0ba..5b3732d725 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -134,10 +134,8 @@ "You are not in this room.": "No heu entrat a aquesta sala.", "You do not have permission to do that in this room.": "No teniu el permís per realitzar aquesta acció en aquesta sala.", "Missing room_id in request": "Falta l'ID de la sala en la vostra sol·licitud", - "Must be viewing a room": "Hauríeu de veure una sala", "Room %(roomId)s not visible": "La sala %(roomId)s no és visible", "Missing user_id in request": "Falta l'ID d'usuari a la vostre sol·licitud", - "Failed to lookup current room": "No s'ha pogut buscar la sala actual", "Usage": "Ús", "/ddg is not a command": "/ddg no és un comandament", "To use it, just wait for autocomplete results to load and tab through them.": "Per utilitzar-lo, simplement espereu que es completin els resultats automàticament i seleccioneu-ne el desitjat.", @@ -213,7 +211,6 @@ "Failed to join room": "No s'ha pogut entrar a la sala", "Message Replies": "Respostes del missatge", "Message Pinning": "Fixació de missatges", - "Tag Panel": "Tauler d'etiquetes", "Disable Emoji suggestions while typing": "Desactiva els suggeriments d'Emoji mentre s'escriu", "Use compact timeline layout": "Utilitza el disseny compacte de la línia de temps", "Hide join/leave messages (invites/kicks/bans unaffected)": "Amaga els missatges d'entrada i sortida (no afecta a les invitacions, expulsions o prohibicions)", @@ -771,8 +768,6 @@ "Error whilst fetching joined communities": "S'ha produït un error en buscar comunitats unides", "Create a new community": "Crea una nova comunitat", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crea una comunitat per agrupar usuaris i sales! Creeu una pàgina d'inici personalitzada per definir el vostre espai a l'univers Matrix.", - "Join an existing community": "Uneix-te a una comunitat existent", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Per unir-se a una comunitat existent, haureu de conèixer l'identificador de la comunitat; això es veurà com <i>+exemple:matrix.org</i>.", "You have no visible notifications": "No teniu cap notificació visible", "Scroll to bottom of page": "Desplaça't fins a la part inferior de la pàgina", "Message not sent due to unknown devices being present": "El missatge no s'ha enviat perquè hi ha dispositius desconeguts presents", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index e3ce9dcf08..b7298f80ab 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -632,9 +632,7 @@ "Show these rooms to non-members on the community page and room list?": "Zobrazovat tyto místnosti na domovské stránce skupiny a v seznamu místností i pro nečleny?", "Restricted": "Omezené", "Missing room_id in request": "V zadání chybí room_id", - "Must be viewing a room": "Musí být zobrazena místnost", "Missing user_id in request": "V zadání chybí user_id", - "Failed to lookup current room": "Nepodařilo se vyhledat aktuální místnost", "(could not connect media)": "(média se nepodařilo spojit)", "%(senderName)s placed a %(callType)s call.": "%(senderName)s uskutečnil %(callType)s hovor.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s zpřístupnil budoucí historii místnosti neznámým (%(visibility)s).", @@ -859,8 +857,6 @@ "Error whilst fetching joined communities": "Při získávání vašich skupin se vyskytla chyba", "Create a new community": "Vytvořit novou skupinu", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Vytvořte skupinu s cílem seskupit uživatele a místnosti! Vytvořte si vlastní domovskou stránku a vymezte tak váš prostor ve světe Matrix.", - "Join an existing community": "Vstoupit do existující skupiny", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Aby jste mohli vstoupit do existující skupiny, musíte znát její identifikátor; Měl by vypadat asi takto <i>+priklad:matrix.org</i>.", "You have no visible notifications": "Nejsou dostupná žádná oznámení", "Connectivity to the server has been lost.": "Spojení se serverem bylo přerušené.", "Sent messages will be stored until your connection has returned.": "Odeslané zprávy zůstanou uložené, dokud se spojení znovu neobnoví.", @@ -918,7 +914,6 @@ "Claimed Ed25519 fingerprint key": "Údajný klíč s otiskem prstu Ed25519", "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.": "Tento proces vás provede importem šifrovacích klíčů, které jste si stáhli z jiného Matrix klienta. Po úspěšném naimportování budete v tomto klientovi moci dešifrovat všechny zprávy, které jste mohli dešifrovat v původním klientovi.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Stažený soubor je chráněn heslem. Soubor můžete naimportovat pouze pokud zadáte odpovídající heslo.", - "Tag Panel": "Připnout panel", "Call Failed": "Hovor selhal", "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "V této místnosti jsou neznámá zařízení: Pokud budete pokračovat bez jejich ověření, někdo může Váš hovor odposlouchávat.", "Review Devices": "Ověřit zařízení", diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 18c30f29bc..e90de5edfc 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -193,10 +193,8 @@ "You are not in this room.": "Du er ikke i dette rum.", "You do not have permission to do that in this room.": "Du har ikke tilladelse til at gøre dét i dette rum.", "Missing room_id in request": "Mangler room_id i forespørgsel", - "Must be viewing a room": "Du skal være i gang med at se på rummet", "Room %(roomId)s not visible": "rum %(roomId)s ikke synligt", "Missing user_id in request": "Manglende user_id i forespørgsel", - "Failed to lookup current room": "Kunne ikke slå nuværende rum op", "Usage": "Brug", "/ddg is not a command": "/ddg er ikke en kommando", "To use it, just wait for autocomplete results to load and tab through them.": "For at bruge det skal du bare vente på autocomplete resultaterne indlæser og tab'e igennem dem.", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ba31308e3a..6e1fff98c0 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -249,7 +249,6 @@ "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".", "/ddg is not a command": "/ddg ist kein Kommando", "%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.", - "Failed to lookup current room": "Fehler beim Nachschlagen des Raums", "Failed to send request.": "Anfrage konnte nicht gesendet werden.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s hat %(targetName)s eingeladen.", @@ -264,7 +263,6 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).", "Missing room_id in request": "Fehlende room_id in Anfrage", "Missing user_id in request": "Fehlende user_id in Anfrage", - "Must be viewing a room": "Muss einen Raum ansehen", "(not supported by this browser)": "(wird von diesem Browser nicht unterstützt)", "%(senderName)s placed a %(callType)s call.": "%(senderName)s startete einen %(callType)s-Anruf.", "Power level must be positive integer.": "Berechtigungslevel muss eine positive ganze Zahl sein.", @@ -784,8 +782,6 @@ "Failed to load %(groupId)s": "'%(groupId)s' konnte nicht geladen werden", "Error whilst fetching joined communities": "Fehler beim Laden beigetretener Communities", "Create a new community": "Neue Community erstellen", - "Join an existing community": "Einer bestehenden Community beitreten", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Um einer bereits bestehenden Community beitreten zu können, musst dir deren Community-ID bekannt sein. Diese sieht z. B. aus wie <i>+example:matrix.org</i>.", "Your Communities": "Deine Communities", "You're not currently a member of any communities.": "Du gehörst aktuell keiner Community an.", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Erstelle eine Community, um Benutzer und Räume miteinander zu verbinden! Erstelle zusätzlich eine eigene Homepage, um deinen individuellen Bereich im Matrix-Universum zu gestalten.", @@ -950,7 +946,6 @@ "Your homeserver's URL": "Die URL deines Homeservers", "Your identity server's URL": "Die URL deines Identitätsservers", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", - "Tag Panel": "Beschriftungsfeld", "Message Replies": "Antworten auf Nachrichten", "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 not be empty.": "Community-IDs können nicht leer sein.", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index b3fecf86a2..74ff66ee13 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -424,7 +424,6 @@ "Failed to ban user": "Δεν ήταν δυνατό ο αποκλεισμός του χρήστη", "Failed to change power level": "Δεν ήταν δυνατή η αλλαγή του επιπέδου δύναμης", "Failed to fetch avatar URL": "Δεν ήταν δυνατή η ανάκτηση της διεύθυνσης εικόνας", - "Failed to lookup current room": "Δεν ήταν δυνατή η εύρεση του τρέχοντος δωματίου", "Failed to unban": "Δεν ήταν δυνατή η άρση του αποκλεισμού", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s από %(fromPowerLevel)s σε %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Έχει απενεργοποιηθεί η πρόσβαση στους επισκέπτες σε αυτόν τον διακομιστή.", @@ -447,7 +446,6 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο άγνωστο (%(visibility)s).", "Missing user_id in request": "Λείπει το user_id στο αίτημα", "Mobile phone number (optional)": "Αριθμός κινητού τηλεφώνου (προαιρετικό)", - "Must be viewing a room": "Πρέπει να βλέπετε ένα δωμάτιο", "Never send encrypted messages to unverified devices from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές από αυτή τη συσκευή", "Never send encrypted messages to unverified devices in this room from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές, σε αυτό το δωμάτιο, από αυτή τη συσκευή", "not set": "δεν έχει οριστεί", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 41f67ad9d9..e96fd3b887 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,10 +42,6 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -85,7 +81,6 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", - "Unnamed Room": "Unnamed Room", "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", @@ -116,10 +111,8 @@ "You are not in this room.": "You are not in this room.", "You do not have permission to do that in this room.": "You do not have permission to do that in this room.", "Missing room_id in request": "Missing room_id in request", - "Must be viewing a room": "Must be viewing a room", "Room %(roomId)s not visible": "Room %(roomId)s not visible", "Missing user_id in request": "Missing user_id in request", - "Failed to lookup current room": "Failed to lookup current room", "Usage": "Usage", "/ddg is not a command": "/ddg is not a command", "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", @@ -184,13 +177,17 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", + "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", "Failed to join room": "Failed to join room", "Message Replies": "Message Replies", "Message Pinning": "Message Pinning", - "Tag Panel": "Tag Panel", "Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing", "Use compact timeline layout": "Use compact timeline layout", "Hide removed messages": "Hide removed messages", @@ -297,29 +294,6 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -419,11 +393,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -557,6 +531,29 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -876,6 +873,10 @@ "Public Chat": "Public Chat", "Custom": "Custom", "Alias (optional)": "Alias (optional)", + "Reject invitation": "Reject invitation", + "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", + "Unable to reject invite": "Unable to reject invite", + "Reject": "Reject", "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", "Resend": "Resend", "Cancel Sending": "Cancel Sending", @@ -895,7 +896,6 @@ "Mentions only": "Mentions only", "Leave": "Leave", "Forget": "Forget", - "Reject": "Reject", "Low Priority": "Low Priority", "Direct Chat": "Direct Chat", "View Community": "View Community", @@ -930,7 +930,6 @@ "Failed to upload image": "Failed to upload image", "Failed to update community": "Failed to update community", "Unable to accept invite": "Unable to accept invite", - "Unable to reject invite": "Unable to reject invite", "Unable to join community": "Unable to join community", "Leave Community": "Leave Community", "Leave %(groupName)s?": "Leave %(groupName)s?", @@ -956,8 +955,6 @@ "Failed to load %(groupId)s": "Failed to load %(groupId)s", "Couldn't load home page": "Couldn't load home page", "Login": "Login", - "Reject invitation": "Reject invitation", - "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", "Failed to reject invitation": "Failed to reject invitation", "This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.", "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", @@ -978,8 +975,6 @@ "Error whilst fetching joined communities": "Error whilst fetching joined communities", "Create a new community": "Create a new community", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.", - "Join an existing community": "Join an existing community", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.", "You have no visible notifications": "You have no visible notifications", "Members": "Members", "%(count)s Members|other": "%(count)s Members", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index dcd7366a55..6f0708f0c2 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -135,7 +135,6 @@ "Failed to kick": "Failed to kick", "Failed to leave room": "Failed to leave room", "Failed to load timeline position": "Failed to load timeline position", - "Failed to lookup current room": "Failed to lookup current room", "Failed to mute user": "Failed to mute user", "Failed to reject invite": "Failed to reject invite", "Failed to reject invitation": "Failed to reject invitation", @@ -227,7 +226,6 @@ "Mobile phone number": "Mobile phone number", "Mobile phone number (optional)": "Mobile phone number (optional)", "Moderator": "Moderator", - "Must be viewing a room": "Must be viewing a room", "Mute": "Mute", "Name": "Name", "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 5982871d8f..abcbcd636a 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -90,10 +90,8 @@ "You are not in this room.": "Vi ne estas en tiu ĉi ĉambro.", "You do not have permission to do that in this room.": "Vi ne havas permeson fari tion en tiu ĉi ĉambro.", "Missing room_id in request": "En peto mankas «room_id»", - "Must be viewing a room": "Necesas vidi ĉambron", "Room %(roomId)s not visible": "Ĉambro %(roomId)s ne videblas", "Missing user_id in request": "En peto mankas «user_id»", - "Failed to lookup current room": "Malsukcesis trovi nunan ĉambron", "Usage": "Uzo", "/ddg is not a command": "/ddg ne estas komando", "To use it, just wait for autocomplete results to load and tab through them.": "Por uzi ĝin, atendu aperon de sugestaj rezultoj, kaj tabu tra ili.", @@ -165,7 +163,6 @@ "Authentication check failed: incorrect password?": "Aŭtentiga kontrolo malsukcesis: ĉu pro malĝusta pasvorto?", "Failed to join room": "Malsukcesis aliĝi al ĉambro", "Message Pinning": "Fikso de mesaĝoj", - "Tag Panel": "Etikeda panelo", "Disable Emoji suggestions while typing": "Malŝalti mienetajn sugestojn dum tajpado", "Use compact timeline layout": "Uzi densan okazordan aranĝon", "Hide removed messages": "Kaŝi forigitajn mesaĝojn", @@ -746,8 +743,6 @@ "Error whilst fetching joined communities": "Okazis eraro dum venigado de viaj komunumoj", "Create a new community": "Krei novan komunumon", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Kreu komunumon por kunigi uzantojn kaj ĉambrojn! Fari propran hejmpaĝon por montri vian spacon en la universo de Matrix.", - "Join an existing community": "Aliĝi al jama komunumo", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Por aliĝi al jama komunumo, vi devos scii ĝian komunuman identigilon; ĝi aspektas proksimume tiel ĉi: <i>+ekzemplo:matrix.org</i>.", "You have no visible notifications": "Neniuj videblaj sciigoj", "Scroll to bottom of page": "Rulumi al susbo de la paĝo", "Message not sent due to unknown devices being present": "Mesaĝoj ne sendiĝis pro ĉeesto de nekonataj aparatoj", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index e0e3c91bcd..5434c570f7 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -108,7 +108,6 @@ "Failed to kick": "Falló al expulsar", "Failed to leave room": "Falló al dejar la sala", "Failed to load timeline position": "Falló al cargar el historico", - "Failed to lookup current room": "Falló al buscar la actual sala", "Failed to mute user": "Falló al silenciar el usuario", "Failed to reject invite": "Falló al rechazar invitación", "Failed to reject invitation": "Falló al rechazar la invitación", @@ -313,7 +312,6 @@ "Mobile phone number": "Número de teléfono móvil", "Mobile phone number (optional)": "Número de teléfono móvil (opcional)", "Moderator": "Moderador", - "Must be viewing a room": "Debe estar viendo una sala", "Mute": "Silenciar", "%(serverName)s Matrix ID": "%(serverName)s ID de Matrix", "Name": "Nombre", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index f5367ba4f3..9526e87285 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -140,7 +140,6 @@ "Identity Server is": "Identitate zerbitzaria:", "Mobile phone number (optional)": "Mugikor zenbakia (aukerazkoa)", "Moderator": "Moderatzailea", - "Must be viewing a room": "Gela bat ikusten egon behar da", "Account": "Kontua", "Access Token:": "Sarbide tokena:", "Active call (%(roomName)s)": "Dei aktiboa (%(roomName)s)", @@ -243,7 +242,6 @@ "Failed to kick": "Huts egin du kanporatzean", "Failed to leave room": "Huts egin du gelatik ateratzean", "Failed to load timeline position": "Huts egin du denbora-lerroko puntua kargatzean", - "Failed to lookup current room": "Huts egin du uneko gela bilatzean", "Failed to mute user": "Huts egin du erabiltzailea mututzean", "Failed to reject invite": "Huts egin du gonbidapena baztertzean", "Failed to reject invitation": "Huts egin du gonbidapena baztertzean", @@ -722,7 +720,6 @@ "%(names)s and %(count)s others are typing|one": "%(names)s eta beste bat idazten ari dira", "Send": "Bidali", "Message Pinning": "Mezuak finkatzea", - "Tag Panel": "Etiketen panela", "Hide avatar changes": "Ezkutatu abatar aldaketak", "Hide display name changes": "Ezkutatu pantaila izenen aldaketak", "Disable big emoji in chat": "Desgaitu emoji handiak txatean", @@ -807,7 +804,6 @@ "Old cryptography data detected": "Kriptografia datu zaharrak atzeman dira", "Your Communities": "Zure komunitateak", "Create a new community": "Sortu komunitate berria", - "Join an existing community": "Elkartu badagoen komunitate batetara", "Warning": "Abisua", "Please note you are logging into the %(hs)s server, not matrix.org.": "Kontuan izan %(hs)s zerbitzarira elkartu zarela, ez matrix.org.", "Sign in to get started": "Hasi saioa hasteko", @@ -926,7 +922,6 @@ "Custom of %(powerLevel)s": "%(powerLevel)s pertsonalizatua", "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.": "Riot bertsio zahar batek datuak antzeman dira. Honek bertsio zaharrean muturretik muturrerako zifratzea ez funtzionatzea eragingo du. Azkenaldian bertsio zaharrean bidali edo jasotako zifratutako mezuak agian ezin izango dira deszifratu bertsio honetan. Honek ere Bertsio honekin egindako mezu trukeak huts egitea ekar dezake. Arazoak badituzu, amaitu saioa eta hasi berriro saioa. Mezuen historiala gordetzeko, esportatu eta berriro inportatu zure gakoak.", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Sortu komunitate bat erabiltzaileak eta gelak biltzeko! Sortu zure hasiera orria eta markatu zure espazioa Matrix unibertsoan.", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Bdagoen komunitate batera elkartzeko, komunitatearen identifikatzailea jakin behar duzu; honen antza izango du <i>+adibidea:matrix.org</i>.", "There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Ez dago beste inor hemen! <inviteText>Beste batzuk gonbidatu</inviteText> nahi dituzu edo <nowarnText>gela hutsik dagoela abisatzeari utzi</nowarnText>?", "Light theme": "Itxura argia", "Dark theme": "Itxura iluna", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index ebcee3b6c6..d39091b619 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -450,7 +450,6 @@ "End-to-end encryption is in beta and may not be reliable": "Päästä päähän salaus on vielä testausvaiheessa ja saattaa toimia epävarmasti", "Error: Problem communicating with the given homeserver.": "Virhe: Ongelma yhteydenpidossa kotipalvelimeen.", "Existing Call": "Käynnissä oleva puhelu", - "Failed to lookup current room": "Nykyisen huoneen löytäminen epäonnistui", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Liity käyttäen <voiceText>ääntä</voiceText> tai <videoText>videota</videoText>.", "%(targetName)s joined the room.": "%(targetName)s liittyi huoneeseen.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s poisti käyttäjän %(targetName)s huoneesta.", @@ -458,7 +457,6 @@ "Publish this room to the public in %(domain)s's room directory?": "Julkaise tämä huone domainin %(domain)s huoneluettelossa?", "Missing room_id in request": "room_id puuttuu kyselystä", "Missing user_id in request": "user_id puuttuu kyselystä", - "Must be viewing a room": "Pakko olla huoneessa", "Never send encrypted messages to unverified devices from this device": "Älä koskaa lähetä salattuja viestejä varmentamattomiin laitteisiin tältä laitteelta", "Never send encrypted messages to unverified devices in this room from this device": "Älä koskaa lähetä salattuja viestejä varmentamattomiin laitteisiin tässä huoneessa tältä laitteelta", "New address (e.g. #foo:%(localDomain)s)": "Uusi osoite (esim. #foo:%(localDomain)s)", @@ -789,7 +787,6 @@ "You're not currently a member of any communities.": "Et ole minkään yhteisön jäsen tällä hetkellä.", "Error whilst fetching joined communities": "Virhe ladatessa listaa yhteistöistä joihin olet liittynyt", "Create a new community": "Luo uusi yhteisö", - "Join an existing community": "Liity olemassaolevaan yhteisöön", "Light theme": "Vaalea ulkoasu", "Dark theme": "Tumma ulkoasu", "Status.im theme": "Status.im ulkoasu", @@ -823,7 +820,6 @@ "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s pienoisohjelman lisännyt %(senderName)s", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s pienoisohjelman poistanut %(senderName)s", "Send": "Lähetä", - "Tag Panel": "Tagit", "Delete %(count)s devices|other": "Poista %(count)s laitetta", "Delete %(count)s devices|one": "Poista laite", "Select devices": "Valitse laitteet", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index c54975b54d..9e6115b853 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -105,7 +105,6 @@ "Failed to kick": "Échec de l'exclusion", "Failed to leave room": "Échec du départ du salon", "Failed to load timeline position": "Échec du chargement de la position dans l'historique", - "Failed to lookup current room": "Échec de la recherche du salon actuel", "Failed to mute user": "Échec de la mise en sourdine de l'utilisateur", "Failed to reject invite": "Échec du rejet de l'invitation", "Failed to reject invitation": "Échec du rejet de l'invitation", @@ -182,7 +181,6 @@ "Missing user_id in request": "Absence du user_id dans la requête", "Mobile phone number": "Numéro de téléphone mobile", "Moderator": "Modérateur", - "Must be viewing a room": "Doit être en train de visualiser un salon", "%(serverName)s Matrix ID": "%(serverName)s identifiant Matrix", "Name": "Nom", "Never send encrypted messages to unverified devices from this device": "Ne jamais envoyer de message chiffré aux appareils non vérifiés depuis cet appareil", @@ -863,8 +861,6 @@ "Error whilst fetching joined communities": "Erreur lors de l'obtention des communautés rejointes", "Create a new community": "Créer une nouvelle communauté", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Créez une communauté pour grouper des utilisateurs et des salons ! Construisez une page d'accueil personnalisée pour distinguer votre espace dans l'univers Matrix.", - "Join an existing community": "Rejoindre une communauté existante", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Pour rejoindre une communauté existante, vous devrez connaître son identifiant. Cela ressemblera à <i>+exemple:matrix.org</i>.", "Disable Emoji suggestions while typing": "Désactiver les suggestions d'emojis lors de la saisie", "Disable big emoji in chat": "Désactiver les gros emojis dans les discussions", "Mirror local video feed": "Refléter le flux vidéo local", @@ -918,7 +914,6 @@ "Flair will appear if enabled in room settings": "Les badges n'apparaîtront que s'ils sont activés dans les paramètres de chaque salon", "Flair will not appear": "Les badges n'apparaîtront pas", "Display your community flair in rooms configured to show it.": "Sélectionnez les badges dans les paramètres de chaque salon pour les afficher.", - "Tag Panel": "Panneau des étiquettes", "Addresses": "Adresses", "expand": "développer", "collapse": "réduire", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index aaf84f717d..52feb86b30 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -93,7 +93,6 @@ "You are not in this room.": "Vostede non está en esta sala.", "You do not have permission to do that in this room.": "Non ten permiso para facer eso en esta sala.", "Missing room_id in request": "Falta o room_id na petición", - "Must be viewing a room": "Debería estar vendo unha sala", "Room %(roomId)s not visible": "A sala %(roomId)s non é visible", "Missing user_id in request": "Falata o user_id na petición", "Usage": "Uso", @@ -169,7 +168,6 @@ "Authentication check failed: incorrect password?": "Fallou a comprobación de autenticación: contrasinal incorrecto?", "Failed to join room": "Non se puido unir a sala", "Message Pinning": "Fixando mensaxe", - "Tag Panel": "Panel de etiquetas", "Disable Emoji suggestions while typing": "Deshabilitar a suxestión de Emoji mentras escribe", "Use compact timeline layout": "Utilizar a disposición compacta da liña temporal", "Hide removed messages": "Ocultar mensaxes eliminadas", @@ -752,8 +750,6 @@ "Error whilst fetching joined communities": "Fallo mentras se obtiñas as comunidades unidas", "Create a new community": "Crear unha nova comunidade", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crear unha comunidade para agrupar usuarias e salas! Poña unha páxina de inicio personalizada para destacar o seu lugar no universo Matrix.", - "Join an existing community": "Unirse a unha comunidade existente", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Para unirse a unha comunidade existente deberá coñecer o identificador de esa comunidade; terá un aspecto como <i>+exemplo:matrix.org</i>.", "You have no visible notifications": "Non ten notificacións visibles", "Scroll to bottom of page": "Desplácese ate o final da páxina", "Message not sent due to unknown devices being present": "Non se enviou a mensaxe porque hai dispositivos non coñecidos", @@ -959,7 +955,6 @@ "Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo", "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", "Failed to add tag %(tagName)s to room": "Fallo ao engadir a etiqueta %(tagName)s a sala", - "Failed to lookup current room": "Fallo ao bloquear a sala actual", "Disable Community Filter Panel": "Deshabilitar o panel de filtro de comunidades", "Your key share request has been sent - please check your other devices for key share requests.": "Enviouse a solicitude de compartir chave - por favor comprobe as peticións de compartir chaves nos seus outros dispositivos.", "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "As peticións de compartir chaves envíanse de xeito automático aos seus outros dispositivos. Si rexeita o obvia estas peticións nos outros dispositivos, pulse aquí para solicitar novamente as chaves para esta sesión.", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 64d97ece1f..425f03b180 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -168,7 +168,6 @@ "Failed to kick": "Kirúgás nem sikerült", "Failed to leave room": "A szobát nem sikerült elhagyni", "Failed to load timeline position": "Az idővonal pozíciót nem sikerült betölteni", - "Failed to lookup current room": "Az aktuális szoba felkeresése sikertelen", "Failed to mute user": "A felhasználót nem sikerült hallgatásra bírni", "Failed to reject invite": "A meghívót nem sikerült elutasítani", "Failed to reject invitation": "A meghívót nem sikerült elutasítani", @@ -255,7 +254,6 @@ "Mobile phone number": "Mobil telefonszám", "Mobile phone number (optional)": "Mobill telefonszám (opcionális)", "Moderator": "Moderátor", - "Must be viewing a room": "Meg kell nézni a szobát", "%(serverName)s Matrix ID": "%(serverName)s Matrix azonosítóm", "Name": "Név", "Never send encrypted messages to unverified devices from this device": "Soha ne küldj titkosított üzenetet ellenőrizetlen eszközre erről az eszközről", @@ -782,8 +780,6 @@ "This Home server does not support communities": "Ez a saját szerver nem támogatja a közösségeket", "Error whilst fetching joined communities": "Hiba a csatlakozott közösségek betöltésénél", "Create a new community": "Új közösség létrehozása", - "Join an existing community": "Meglévő közösséghez csatlakozás", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Ahhoz hogy csatlakozni tudj egy meglévő közösséghez ismerned kell a közösségi azonosítót ami például így nézhet ki: <i>+pelda:matrix.org</i>.", "example": "példa", "Failed to load %(groupId)s": "Nem sikerült betölteni: %(groupId)s", "Your Communities": "Közösségeid", @@ -918,7 +914,6 @@ "Something went wrong when trying to get your communities.": "Valami nem sikerült a közösségeid elérésénél.", "Display your community flair in rooms configured to show it.": "Közösségi jelvényeid megjelenítése azokban a szobákban ahol ez engedélyezett.", "This homeserver doesn't offer any login flows which are supported by this client.": "Ez a saját szerver egyetlen bejelentkezési metódust sem támogat amit ez a kliens ismer.", - "Tag Panel": "Címke panel", "Addresses": "Címek", "collapse": "becsuk", "expand": "kinyit", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 4728ee9106..6a7fa39965 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -160,10 +160,8 @@ "You are not in this room.": "Non sei in questa stanza.", "You do not have permission to do that in this room.": "Non hai l'autorizzazione per farlo in questa stanza.", "Missing room_id in request": "Manca l'id_stanza nella richiesta", - "Must be viewing a room": "Devi vedere una stanza", "Room %(roomId)s not visible": "Stanza %(roomId)s non visibile", "Missing user_id in request": "Manca l'id_utente nella richiesta", - "Failed to lookup current room": "Impossibile cercare la stanza attuale", "Usage": "Utilizzo", "/ddg is not a command": "/ddg non è un comando", "To use it, just wait for autocomplete results to load and tab through them.": "Per usarlo, attendi l'autocompletamento dei risultati e selezionali con tab.", @@ -231,7 +229,6 @@ "Not a valid Riot keyfile": "Non è una chiave di Riot valida", "Authentication check failed: incorrect password?": "Controllo di autenticazione fallito: password sbagliata?", "Failed to join room": "Accesso alla stanza fallito", - "Tag Panel": "Pannello etichette", "Disable Emoji suggestions while typing": "Disattiva i suggerimenti delle emoji durante la digitazione", "Use compact timeline layout": "Usa impaginazione cronologia compatta", "Hide join/leave messages (invites/kicks/bans unaffected)": "Nascondi i messaggi di entrata/uscita (inviti/kick/ban esclusi)", @@ -794,8 +791,6 @@ "Error whilst fetching joined communities": "Errore nella rilevazione delle comunità a cui ti sei unito", "Create a new community": "Crea una nuova comunità", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crea una comunità per raggruppare utenti e stanze! Crea una pagina iniziale personalizzata per stabilire il tuo spazio nell'universo di Matrix.", - "Join an existing community": "Unisciti ad una comunità esistente", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Per unirti ad una comunità esistente devi conoscere il suo identificativo; è qualcosa del tipo <i>+esempio:matrix.org</i>.", "You have no visible notifications": "Non hai alcuna notifica visibile", "Scroll to bottom of page": "Scorri in fondo alla pagina", "Message not sent due to unknown devices being present": "Messaggio non inviato data la presenza di dispositivi sconosciuti", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index f0b6e81ba8..23b7efd97d 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -169,7 +169,6 @@ "Failed to kick": "내쫓지 못했어요", "Failed to leave room": "방을 떠나지 못했어요", "Failed to load timeline position": "타임라인 위치를 불러오지 못했어요", - "Failed to lookup current room": "현재 방을 찾지 못했어요", "Failed to mute user": "사용자의 알림을 끄지 못했어요", "Failed to reject invite": "초대를 거절하지 못했어요", "Failed to reject invitation": "초대를 거절하지 못했어요", @@ -257,7 +256,6 @@ "Mobile phone number": "휴대 전화번호", "Mobile phone number (optional)": "휴대 전화번호 (선택)", "Moderator": "조정자", - "Must be viewing a room": "방을 둘러봐야만 해요", "Name": "이름", "Never send encrypted messages to unverified devices from this device": "이 장치에서 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요", "Never send encrypted messages to unverified devices in this room from this device": "이 장치에서 이 방의 인증받지 않은 장치로 암호화한 메시지를 보내지 마세요", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 91a7de7624..a7458a525f 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -153,7 +153,6 @@ "Failed to kick": "Neizdevās izspert/padzīt (kick)", "Failed to leave room": "Neizdevās pamest istabu", "Failed to load timeline position": "Neizdevās ielādēt laikpaziņojumu pozīciju", - "Failed to lookup current room": "Neizdevās uziet pašreizējo istabu", "Failed to mute user": "Neizdevās apklusināt lietotāju", "Failed to reject invite": "Neizdevās noraidīt uzaicinājumu", "Failed to reject invitation": "Neizdevās noraidīt uzaicinājumu", @@ -244,7 +243,6 @@ "Mobile phone number": "Mobilā telefona numurs", "Mobile phone number (optional)": "Mobilā telefona numurs (nav obligāts)", "Moderator": "Moderators", - "Must be viewing a room": "Jāapskata istaba", "Mute": "Noklusināt (izslēgt skaņu)", "%(serverName)s Matrix ID": "%(serverName)s Matrix Id", "Name": "Vārds", @@ -721,7 +719,6 @@ "%(names)s and %(count)s others are typing|one": "%(names)s un vēl kāds raksta", "Message Replies": "Atbildes uz ziņām", "Message Pinning": "Ziņu piekabināšana", - "Tag Panel": "Birku panelis", "Disable Emoji suggestions while typing": "Atspējot Emoji ieteikumus teksta rakstīšanas laikā", "Hide avatar changes": "Slēpt avatara izmaiņas", "Hide display name changes": "Slēpt attēlojamā/redzamā vārda izmaiņas", @@ -972,8 +969,6 @@ "Did you know: you can use communities to filter your Riot.im experience!": "Vai zināji: Tu vari izmantot kopienas, lai filtrētu (atlasītu) savu Riot.im pieredzi!", "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.": "Lai uzstādītu filtru, uzvelc kopienas avataru uz filtru paneļa ekrāna kreisajā malā. Lai redzētu tikai istabas un cilvēkus, kas saistīti ar šo kopienu, Tu vari klikšķināt uz avatara filtru panelī jebkurā brīdī.", "Create a new community": "Izveidot jaunu kopienu", - "Join an existing community": "Pievienoties esošai kopienai", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Lai pievienotos esošai kopienai Tev jāzina tā ID; tas izskatīties piemēram šādi <i>+paraugs:matrix.org</i>.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "Tagad<resendText>visas atkārtoti sūtīt</resendText> vai <cancelText>visas atcelt</cancelText>. Tu vari atzīmēt arī individuālas ziņas, kuras atkārtoti sūtīt vai atcelt.", "Clear filter": "Attīrīt filtru", "Debug Logs Submission": "Iesniegt atutošanas logfailus", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index d85982a3fc..90be5ee923 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -101,7 +101,6 @@ "OK": "OK", "Failed to change password. Is your password correct?": "Wachtwoord wijzigen mislukt. Is uw wachtwoord juist?", "Moderator": "Moderator", - "Must be viewing a room": "Moet een ruimte weergeven", "%(serverName)s Matrix ID": "%(serverName)s Matrix-ID", "Name": "Naam", "New password": "Nieuw wachtwoord", @@ -238,7 +237,6 @@ "Failed to join room": "Niet gelukt om tot de ruimte toe te treden", "Failed to leave room": "Niet gelukt om de ruimte te verlaten", "Failed to load timeline position": "Niet gelukt om de tijdlijnpositie te laden", - "Failed to lookup current room": "Niet gelukt om de huidige ruimte op te zoeken", "Failed to mute user": "Niet gelukt om de gebruiker te dempen", "Failed to reject invite": "Niet gelukt om de uitnodiging te weigeren", "Failed to reject invitation": "Niet gelukt om de uitnodiging te weigeren", @@ -708,7 +706,6 @@ "Send": "Verstuur", "Message Pinning": "Boodschap vastpinnen", "Message Replies": "Antwoorden op bericht", - "Tag Panel": "Label Paneel", "Disable Emoji suggestions while typing": "Emoji suggesties tijdens het typen uitzetten", "Hide avatar changes": "Avatar veranderingen verbergen", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", @@ -927,8 +924,6 @@ "Error whilst fetching joined communities": "Er is een fout opgetreden tijdens het ophalen van de gemeenschappen waar je lid van bent", "Create a new community": "Maak een nieuwe gemeenschap aan", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Maak een gemeenschap aan om gebruikers en ruimtes samen te groeperen! Bouw een aangepaste homepagina om je eigen plek in het Matrix universum te maken.", - "Join an existing community": "Treed tot een bestaande gemeenschap toe", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Je moet het gemeenschaps-ID weten om tot de gemeenschap toe te treden; dit zal er uitzien zoals <i>+voorbeeld:matrix.org</i>.", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Toon apparaten</showDevicesText>, <sendAnywayText>Toch versturen</sendAnywayText> of <cancelText>annuleren</cancelText>.", "%(count)s of your messages have not been sent.|one": "Je bericht was niet verstuurd.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "Nu alles <resendText>opnieuw versturen</resendText> of <cancelText>annuleren</cancelText>. Je kan ook individuele berichten selecteren om opnieuw te versturen of te annuleren.", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index d0b71cdb8d..367516675f 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -232,7 +232,6 @@ "Failed to kick": "Nie udało się wykopać użytkownika", "Failed to leave room": "Nie udało się opuścić pokoju", "Failed to load timeline position": "Nie udało się wczytać pozycji osi czasu", - "Failed to lookup current room": "Nie udało się wyszukać aktualnego pokoju", "Failed to mute user": "Nie udało się wyciszyć użytkownika", "Failed to reject invite": "Nie udało się odrzucić zaproszenia", "Failed to reject invitation": "Nie udało się odrzucić zaproszenia", @@ -434,7 +433,6 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Podany klucz podpisu odpowiada kluczowi podpisania otrzymanemu z urządzenia %(userId)s %(deviceId)s. Urządzenie oznaczone jako zweryfikowane.", "This email address is already in use": "Podany adres e-mail jest już w użyciu", "This email address was not found": "Podany adres e-mail nie został znaleziony", - "Must be viewing a room": "Musi być w trakcie wyświetlania pokoju", "The email address linked to your account must be entered.": "Musisz wpisać adres e-mail połączony z twoim kontem.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Rozmiar pliku '%(fileName)s' przekracza możliwy limit do przesłania na serwer domowy", "The file '%(fileName)s' failed to upload": "Przesyłanie pliku '%(fileName)s' nie powiodło się", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index d19eae40d4..7cc80cfc78 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -216,7 +216,6 @@ "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", - "Failed to lookup current room": "Não foi possível buscar na sala atual", "Failed to send email": "Falha ao enviar email", "Failed to send request.": "Não foi possível mandar requisição.", "Failed to set up conference call": "Não foi possível montar a chamada de conferência", @@ -235,7 +234,6 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", "Missing room_id in request": "Faltou o id da sala na requisição", "Missing user_id in request": "Faltou o id de usuário na requisição", - "Must be viewing a room": "Tem que estar visualizando uma sala", "(not supported by this browser)": "(não é compatível com este navegador)", "%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.", "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index b786dc7182..700c7edecc 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -216,7 +216,6 @@ "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", - "Failed to lookup current room": "Não foi possível buscar na sala atual", "Failed to send email": "Não foi possível enviar email", "Failed to send request.": "Não foi possível mandar requisição.", "Failed to set up conference call": "Não foi possível montar a chamada de conferência", @@ -235,7 +234,6 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", "Missing room_id in request": "Faltou o id da sala na requisição", "Missing user_id in request": "Faltou o id de usuário na requisição", - "Must be viewing a room": "Tem que estar visualizando uma sala", "(not supported by this browser)": "(não é compatível com este navegador)", "%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.", "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", @@ -685,7 +683,6 @@ "Send": "Enviar", "Message Replies": "Respostas", "Message Pinning": "Fixar mensagem", - "Tag Panel": "Painel de tags", "Disable Emoji suggestions while typing": "Desativar sugestões de emojis enquanto estiver escrevendo", "Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensagens de entrada e de saída (não afeta convites, expulsões e banimentos)", "Hide avatar changes": "Ocultar alterações da imagem de perfil", @@ -932,8 +929,6 @@ "Error whilst fetching joined communities": "Erro baixando comunidades das quais você faz parte", "Create a new community": "Criar nova comunidade", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crie uma comunidade para agrupar em um mesmo local pessoas e salas! Monte uma página inicial personalizada para dar uma identidade ao seu espaço no universo Matrix.", - "Join an existing community": "Entrar numa comunidade existente", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Para entrar em uma comunidade, você terá que conhecer o seu ID; um ID de comunidade normalmente tem este formato: <i>+exemplo:matrix.org</i>.", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Exibir dispositivos</showDevicesText>, <sendAnywayText>enviar assim mesmo</sendAnywayText> ou <cancelText>cancelar</cancelText>.", "%(count)s of your messages have not been sent.|one": "Sua mensagem não foi enviada.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Reenviar todas</resendText> ou <cancelText>cancelar todas</cancelText> agora. Você também pode selecionar mensagens individualmente a serem reenviadas ou canceladas.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 2ef28d03c6..48824c7394 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -155,7 +155,6 @@ "Drop here to tag %(section)s": "Перетащите сюда, чтобы пометить как %(section)s", "%(senderName)s ended the call.": "%(senderName)s завершил(а) звонок.", "Existing Call": "Текущий вызов", - "Failed to lookup current room": "Не удалось найти текущую комнату", "Failed to send request.": "Не удалось отправить запрос.", "Failed to set up conference call": "Не удалось сделать конференц-звонок", "Failed to verify email address: make sure you clicked the link in the email": "Не удалось проверить email: убедитесь, что вы перешли по ссылке в письме", @@ -174,7 +173,6 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s сделал(а) историю комнаты видимой в неизвестном режиме (%(visibility)s).", "Missing room_id in request": "Отсутствует room_id в запросе", "Missing user_id in request": "Отсутствует user_id в запросе", - "Must be viewing a room": "Вы должны просматривать комнату", "(not supported by this browser)": "(не поддерживается этим браузером)", "Connectivity to the server has been lost.": "Связь с сервером потеряна.", "Sent messages will be stored until your connection has returned.": "Отправленные сообщения будут сохранены, пока соединение не восстановится.", @@ -787,8 +785,6 @@ "Error whilst fetching joined communities": "Ошибка при загрузке сообществ", "Create a new community": "Создать новое сообщество", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Создайте сообщество для объединения пользователей и комнат! Создайте собственную домашнюю страницу, чтобы выделить свое пространство во вселенной Matrix.", - "Join an existing community": "Присоединиться к существующему сообществу", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Чтобы присоединиться к существующему сообществу, вам нужно знать его ID; это будет выглядеть примерно так<i>+primer:matrix.org</i>.", "Something went wrong whilst creating your community": "При создании сообщества что-то пошло не так", "%(names)s and %(count)s others are typing|other": "%(names)s и еще %(count)s печатают", "And %(count)s more...|other": "Еще %(count)s…", @@ -908,7 +904,6 @@ "Unknown for %(duration)s": "Неизвестно %(duration)s", "There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Здесь никого нет! Хотите <inviteText>пригласить кого-нибудь</inviteText> или <nowarnText>выключить предупреждение о пустой комнате</nowarnText>?", "Something went wrong when trying to get your communities.": "Что-то пошло не так при попытке получить список ваших сообществ.", - "Tag Panel": "Панель тегов", "Delete %(count)s devices|other": "Удалить (%(count)s)", "Delete %(count)s devices|one": "Удалить", "Select devices": "Выбрать", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 5036699932..4988ac262b 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -84,10 +84,8 @@ "You are not in this room.": "Nenachádzate sa v tejto miestnosti.", "You do not have permission to do that in this room.": "V tejto miestnosti nemáte oprávnenie na vykonanie takejto akcie.", "Missing room_id in request": "V požiadavke chýba room_id", - "Must be viewing a room": "Musí byť zobrazená miestnosť", "Room %(roomId)s not visible": "Miestnosť %(roomId)s nie je viditeľná", "Missing user_id in request": "V požiadavke chýba user_id", - "Failed to lookup current room": "Nepodarilo sa vyhľadať aktuálnu miestnosť", "Usage": "Použitie", "/ddg is not a command": "/ddg nie je žiaden príkaz", "To use it, just wait for autocomplete results to load and tab through them.": "Ak to chcete použiť, len počkajte na načítanie výsledkov automatického dopĺňania a cyklicky prechádzajte stláčaním klávesu tab..", @@ -691,8 +689,6 @@ "Error whilst fetching joined communities": "Pri získavaní vašich komunít sa vyskytla chyba", "Create a new community": "Vytvoriť novú komunitu", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Vytvorte si komunitu s cieľom zoskupiť miestnosti a používateľov! Zostavte si vlastnú domovskú stránku a vymedzte tak svoj priestor vo svete Matrix.", - "Join an existing community": "Vstúpiť do existujúcej komunity", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Aby ste mohli vstúpiť do existujúcej komunity, musíte poznať jej identifikátor; Mal by vizerať nejako takto <i>+priklad:matrix.org</i>.", "You have no visible notifications": "Nie sú k dispozícii žiadne oznámenia", "Scroll to bottom of page": "Posunúť na spodok stránky", "Connectivity to the server has been lost.": "Spojenie so serverom bolo prerušené.", @@ -907,7 +903,6 @@ "Call": "Hovor", "Answer": "Prijať", "Send": "Odoslať", - "Tag Panel": "Panel so značkami", "Delete %(count)s devices|other": "Vymazať %(count)s zariadení", "Delete %(count)s devices|one": "Vymazať zariadenie", "Select devices": "Vybrať zariadenia", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 66f6f032b7..680c63e458 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -106,9 +106,7 @@ "Power level must be positive integer.": "Niveli fuqie duhet të jetë numër i plotë pozitiv.", "You are not in this room.": "Ti nuk je në këtë dhomë.", "You do not have permission to do that in this room.": "Nuk ke leje të bësh këtë në këtë dhomë.", - "Must be viewing a room": "Duhet të shikohet një dhomë", "Room %(roomId)s not visible": "Dhoma %(roomId)s e padukshme", - "Failed to lookup current room": "Dhoma aktuale nuk mundi të kërkohej", "Usage": "Përdorimi", "/ddg is not a command": "/ddg s'është komandë", "To use it, just wait for autocomplete results to load and tab through them.": "Për të përdorur, thjesht prit derisa të mbushën rezultatat vetëplotësuese dhe pastaj shfletoji.", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index b8689454d4..86f1faade6 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -85,7 +85,6 @@ "You are not in this room.": "Нисте у овој соби.", "You do not have permission to do that in this room.": "Немате овлашћење да урадите то у овој соби.", "Missing room_id in request": "Недостаје room_id у захтеву", - "Must be viewing a room": "Морате гледати собу", "Room %(roomId)s not visible": "Соба %(roomId)s није видљива", "Missing user_id in request": "Недостаје user_id у захтеву", "Call Failed": "Позивање неуспешно", @@ -97,7 +96,6 @@ "Answer": "Одговори", "Call Timeout": "Прекорачено време позивања", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", - "Failed to lookup current room": "Неуспех при потраживању тренутне собе", "Usage": "Коришћење", "/ddg is not a command": "/ddg није наредба", "To use it, just wait for autocomplete results to load and tab through them.": "Да бисте је користили, само сачекајте да се исходи самодовршавања учитају и табом прођите кроз њих.", @@ -172,7 +170,6 @@ "Failed to join room": "Нисам успео да уђем у собу", "Message Replies": "Одговори", "Message Pinning": "Закачене поруке", - "Tag Panel": "Означи површ", "Disable Emoji suggestions while typing": "Онемогући предлагање емоџија приликом куцања", "Use compact timeline layout": "Користи збијени распоред временске линије", "Hide removed messages": "Сакриј уклоњене поруке", @@ -778,8 +775,6 @@ "Error whilst fetching joined communities": "Грешка приликом добављања списка са приступљеним заједницама", "Create a new community": "Направи нову заједницу", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Направите заједницу да бисте спојили кориснике и собе! Направите прилагођену почетну страницу да бисте означили ваш кутак у Матрикс универзуму.", - "Join an existing community": "Приступи већ постојећој заједници", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "Да бисте приступили већ постојећој заједници, морате знати њен идентификатор заједнице. Ово изгледа нешто као <i>+primer:matrix.org</i>.", "You have no visible notifications": "Немате видљивих обавештења", "Scroll to bottom of page": "Превуци на дно странице", "Message not sent due to unknown devices being present": "Порука се неће послати због присутности непознатих уређаја", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 1ad48b27a3..2d81d0768b 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -128,7 +128,6 @@ "Failed to kick": "Det gick inte att kicka", "Failed to leave room": "Det gick inte att lämna rummet", "Failed to load timeline position": "Det gick inte att hämta positionen på tidslinjen", - "Failed to lookup current room": "Det gick inte att hämta det nuvarande rummet", "Failed to mute user": "Det gick inte att dämpa användaren", "Failed to reject invite": "Det gick inte att avböja inbjudan", "Failed to reject invitation": "Det gick inte att avböja inbjudan", @@ -240,7 +239,6 @@ "Mobile phone number": "Telefonnummer", "Mobile phone number (optional)": "Telefonnummer (valfri)", "Moderator": "Moderator", - "Must be viewing a room": "Du måste ha ett öppet rum", "Mute": "Dämpa", "%(serverName)s Matrix ID": "%(serverName)s Matrix-ID", "Name": "Namn", @@ -1066,8 +1064,6 @@ "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.": "För att skapa ett filter, dra en community-avatar till filterpanelen längst till vänster på skärmen. Du kan när som helst klicka på en avatar i filterpanelen för att bara se rum och personer som är associerade med den communityn.", "Create a new community": "Skapa en ny community", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Skapa en community för att gruppera användare och rum! Bygg en anpassad hemsida för att markera er plats i Matrix-universumet.", - "Join an existing community": "Gå med i en befintlig community", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "För att gå med i en befintlig gemenskap behöver du ha community-ID; det ser ut som något i stil med <i>+exempel:matrix.org</i>.", "Invite to this community": "Bjud in till denna community", "Something went wrong when trying to get your communities.": "Något gick fel vid hämtning av dina communityn.", "You're not currently a member of any communities.": "Du är för närvarande inte medlem i någon community.", @@ -1180,7 +1176,6 @@ "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.": "Den exporterade filen kommer att låta någon som kan läsa den att dekryptera alla krypterade meddelanden som du kan se, så du bör vara noga med att hålla den säker. För att hjälpa till med detta, bör du ange en lösenfras nedan, som kommer att användas för att kryptera exporterad data. Det kommer bara vara möjligt att importera data genom att använda samma lösenfras.", "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.": "Denna process möjliggör import av krypteringsnycklar som tidigare exporterats från en annan Matrix-klient. Du kommer då kunna dekryptera alla meddelanden som den andra klienten kunde dekryptera.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Den exporterade filen kommer vara skyddad med en lösenfras. Du måste ange lösenfrasen här, för att dekryptera filen.", - "Tag Panel": "Tagg-panel", "Flair": "Emblem", "Showing flair for these communities:": "Visar emblem för dessa communityn:", "This room is not showing flair for any communities": "Detta rum visar inte emblem för några communityn", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 606c60e95a..3fe7bf8f98 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -132,7 +132,6 @@ "Failed to join room": "การเข้าร่วมห้องล้มเหลว", "Failed to kick": "การเตะล้มเหลว", "Failed to leave room": "การออกจากห้องล้มเหลว", - "Failed to lookup current room": "การหาห้องปัจจุบันล้มเหลว", "Failed to reject invite": "การปฏิเสธคำเชิญล้มเหลว", "Failed to reject invitation": "การปฏิเสธคำเชิญล้มเหลว", "Failed to save settings": "การบันทึกการตั้งค่าล้มเหลว", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 1a8035a1db..04f78dc1ee 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -153,7 +153,6 @@ "Failed to kick": "Atma(Kick) işlemi başarısız oldu", "Failed to leave room": "Odadan ayrılma başarısız oldu", "Failed to load timeline position": "Zaman çizelgesi konumu yüklenemedi", - "Failed to lookup current room": "Geçerli odayı aramak başarısız oldu", "Failed to mute user": "Kullanıcıyı sessize almak başarısız oldu", "Failed to reject invite": "Daveti reddetme başarısız oldu", "Failed to reject invitation": "Davetiyeyi reddetme başarısız oldu", @@ -241,7 +240,6 @@ "Mobile phone number": "Cep telefonu numarası", "Mobile phone number (optional)": "Cep telefonu numarası (isteğe bağlı)", "Moderator": "Moderatör", - "Must be viewing a room": "Bir oda görüntülemeli olmalı", "Mute": "Sessiz", "Name": "İsim", "Never send encrypted messages to unverified devices from this device": "Bu cihazdan doğrulanmamış cihazlara asla şifrelenmiş mesajlar göndermeyin", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 0fbd0a4ef3..28a1a35ef1 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -42,7 +42,6 @@ "Failed to kick": "移除失败", "Failed to leave room": "无法退出聊天室", "Failed to load timeline position": "无法加载时间轴位置", - "Failed to lookup current room": "找不到当前聊天室", "Failed to mute user": "禁言用户失败", "Failed to reject invite": "拒绝邀请失败", "Failed to reject invitation": "拒绝邀请失败", @@ -934,7 +933,6 @@ "Create a new community": "创建新社区", "Error whilst fetching joined communities": "获取已加入社区列表时出现错误", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "创建社区,将用户与聊天室整合在一起!搭建自定义社区主页以在 Matrix 宇宙之中标记出您的私人空间。", - "Join an existing community": "加入已有的社区", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>显示未信任的设备</showDevicesText> 、 <sendAnywayText>不经信任直接发送</sendAnywayText> 或 <cancelText>取消发送</cancelText>。", "%(count)s of your messages have not been sent.|one": "您的消息尚未发送。", "Uploading %(filename)s and %(count)s others|other": "正在上传 %(filename)s 与其他 %(count)s 个文件", @@ -961,7 +959,6 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "尝试加载此房间的时间线的特定时间点,但是无法找到。", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "现在 <resendText>重新发送消息</resendText> 或 <cancelText>取消发送</cancelText> 。", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "現在 <resendText>重新发送消息</resendText> 或 <cancelText>取消发送</cancelText> 。你也可以单独选择消息以重新发送或取消。", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "要加入已有的社区,你需要知道它的社区链接,比如 <i>+example:matrix.org</i>。", "Visibility in Room List": "是否在聊天室目录中可见", "Something went wrong when trying to get your communities.": "获取你加入的社区时发生错误。", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "删除小部件后,此聊天室中的所有用户的这个小部件都会被删除。你确定要删除这个小部件吗?", @@ -1120,14 +1117,12 @@ "There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "这里没有其他人了!你是想 <inviteText>邀请用户</inviteText> 还是 <nowarnText>不再提示</nowarnText>?", "You need to be able to invite users to do that.": "你需要有邀请用户的权限才能进行此操作。", "Missing roomId.": "找不到此聊天室 ID 所对应的聊天室。", - "Tag Panel": "标签面板", "You have been banned from %(roomName)s by %(userName)s.": "您已被 %(userName)s 从聊天室 %(roomName)s 中封禁。", "You have been banned from this room by %(userName)s.": "您已被 %(userName)s 从此聊天室中封禁。", "Every page you use in the app": "您在 Riot 中使用的每一个页面", "e.g. <CurrentPageURL>": "例如:<CurrentPageURL>", "Your User Agent": "您的 User Agent", "Your device resolution": "您设备的分辨率", - "Must be viewing a room": "必须是在查看一个聊天室时", "Always show encryption icons": "总是显示加密标志", "At this time it is not possible to reply with a file so this will be sent without being a reply.": "目前无法以文件作为回复的内容,所以此文件将不作为回复,独立发送。", "Unable to reply": "无法回复", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index ff7650b36f..4250e87c3b 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -78,7 +78,6 @@ "Failed to kick": "踢人失敗", "Failed to leave room": "無法離開聊天室", "Failed to load timeline position": "無法加載時間軸位置", - "Failed to lookup current room": "找不到當前聊天室", "Failed to mute user": "禁言用戶失敗", "Failed to reject invite": "拒絕邀請失敗", "Failed to reject invitation": "拒絕邀請失敗", @@ -336,7 +335,6 @@ "Mobile phone number": "行動電話號碼", "Mobile phone number (optional)": "行動電話號碼(選擇性)", "Moderator": "仲裁者", - "Must be viewing a room": "必須檢視房間", "Name": "名稱", "Never send encrypted messages to unverified devices from this device": "從不自此裝置傳送加密的訊息到未驗證的裝置", "Never send encrypted messages to unverified devices in this room from this device": "從不在此房間中從此裝置上傳送未加密的訊息到未驗證的裝置", @@ -704,7 +702,6 @@ "Send": "傳送", "Message Replies": "訊息回覆", "Message Pinning": "訊息釘選", - "Tag Panel": "標籤面板", "Disable Emoji suggestions while typing": "在輸入時停用繪文字建議", "Hide avatar changes": "隱藏大頭貼變更", "Hide display name changes": "隱藏顯示名稱變更", @@ -925,8 +922,6 @@ "Error whilst fetching joined communities": "擷取已加入的社群時發生錯誤", "Create a new community": "建立新社群", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "建立社群以將使用者與聊天室湊成一組!建立自訂的首頁以在 Matrix 宇宙中標出您的空間。", - "Join an existing community": "加入既有的社群", - "To join an existing community you'll have to know its community identifier; this will look something like <i>+example:matrix.org</i>.": "要加入既有的社群,您必須知道它的社群標記符號;其看起來像是 <i>+example:matrix.org</i>.", "%(count)s of your messages have not been sent.|one": "您的訊息尚未傳送。", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "現在<resendText>重新傳送全部</resendText>或<cancelText>取消全部</cancelText>。您也可以選取單一訊息以重新傳送或取消。", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "現在<resendText>重新傳送訊息</resendText>或<cancelText>取消訊息</cancelText>。", From 0011f23125d9e807c92c997babb46e351b2f2ae8 Mon Sep 17 00:00:00 2001 From: Miguel Branco <mgl.branco@gmail.com> Date: Mon, 18 Jun 2018 21:04:42 +0000 Subject: [PATCH 304/480] Translated using Weblate (Galician) Currently translated at 100.0% (1203 of 1203 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 572da43dcf..091b7350fb 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -959,7 +959,7 @@ "Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo", "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", "Failed to add tag %(tagName)s to room": "Fallo ao engadir a etiqueta %(tagName)s a sala", - "Failed to lookup current room": "Fallo ao bloquear a sala actual", + "Failed to lookup current room": "Non se deu anovado a actual sala", "Disable Community Filter Panel": "Desactivar o panel de filtro de comunidades", "Your key share request has been sent - please check your other devices for key share requests.": "Enviouse a solicitude de compartir chave - por favor comprobe as peticións de compartir chaves nos seus outros dispositivos.", "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "As peticións de compartir chaves envíanse de xeito automático aos seus outros dispositivos. Se rexeita o obvia estas peticións nos outros dispositivos, pulse aquí para solicitar novamente as chaves para esta sesión.", @@ -968,13 +968,13 @@ "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "<requestLink>Volver a pedir chaves de cifrado</requestLink> desde os outros dispositivos.", "%(user)s is a %(userRole)s": "%(user)s é %(userRole)s", "Flair": "Aura", - "Showing flair for these communities:": "Mostrar o aura para estas comunidades:", - "Flair will appear if enabled in room settings": "O Aura aparecerá si está activado nas preferencias da sala", - "Flair will not appear": "O Aura non aparecerá", - "Display your community flair in rooms configured to show it.": "Mostrar o aura da súa comunidade en salas configuradas para mostralo.", + "Showing flair for these communities:": "Mostrar a aura para estas comunidades:", + "Flair will appear if enabled in room settings": "A aura aparecerá se está activada nas preferencias da sala", + "Flair will not appear": "A aura non aparecerá", + "Display your community flair in rooms configured to show it.": "Mostrar a aura da súa comunidade nas salas configuradas para que a mostren.", "Did you know: you can use communities to filter your Riot.im experience!": "Sabía que pode utilizar as comunidades para mellorar a súa experiencia con Riot.im!", "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.": "Para establecer un filtro, arrastre un avatar da comunidade sobre o panel de filtros na parte esquerda da pantalla. Pode pulsar nun avatar no panel de filtrado en calquera momento para ver só salas e xente asociada a esa comunidade.", - "Deops user with given id": "Degradar usuaria co id dado", + "Deops user with given id": "Degradar o usuario con esa ID", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Visto por %(displayName)s(%(userName)s en %(dateTime)s", "Code": "Código", "Unable to join community": "Non se puido unir a comunidade", From e5a509bb91eb9d0638eab95bf8e8fed7a1a1e78f Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 20 Jun 2018 10:04:03 +0100 Subject: [PATCH 305/480] i18n & prunei18n --- src/i18n/strings/bg.json | 1 - src/i18n/strings/ca.json | 1 - src/i18n/strings/de_DE.json | 1 - src/i18n/strings/en_EN.json | 1 - src/i18n/strings/eu.json | 1 - src/i18n/strings/fr.json | 1 - src/i18n/strings/gl.json | 1 - src/i18n/strings/hu.json | 1 - src/i18n/strings/lv.json | 1 - src/i18n/strings/nl.json | 1 - src/i18n/strings/pt_BR.json | 1 - src/i18n/strings/ru.json | 1 - src/i18n/strings/sk.json | 1 - src/i18n/strings/sr.json | 1 - src/i18n/strings/sv.json | 1 - src/i18n/strings/zh_Hans.json | 1 - src/i18n/strings/zh_Hant.json | 1 - 17 files changed, 17 deletions(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index f3c12edecb..357b007a6f 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -203,7 +203,6 @@ "Not a valid Riot keyfile": "Невалиден файл с ключ за Riot", "Authentication check failed: incorrect password?": "Неуспешна автентикация: неправилна парола?", "Failed to join room": "Неуспешно присъединяване към стаята", - "Message Replies": "Отговори на съобщението", "Message Pinning": "Функция за закачане на съобщения", "Disable Emoji suggestions while typing": "Изключване на предложенията за емотиконите при писане", "Use compact timeline layout": "Използване на компактно оформление за списъка със съобщения", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 5b3732d725..98d51e99ac 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -209,7 +209,6 @@ "Not a valid Riot keyfile": "El fitxer no és un fitxer de claus de Riot valid", "Authentication check failed: incorrect password?": "Ha fallat l'autenticació: heu introduït correctament la contrasenya?", "Failed to join room": "No s'ha pogut entrar a la sala", - "Message Replies": "Respostes del missatge", "Message Pinning": "Fixació de missatges", "Disable Emoji suggestions while typing": "Desactiva els suggeriments d'Emoji mentre s'escriu", "Use compact timeline layout": "Utilitza el disseny compacte de la línia de temps", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6e1fff98c0..0df2e84897 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -946,7 +946,6 @@ "Your homeserver's URL": "Die URL deines Homeservers", "Your identity server's URL": "Die URL deines Identitätsservers", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", - "Message Replies": "Antworten auf Nachrichten", "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 not be empty.": "Community-IDs können nicht leer sein.", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Geräte anzeigen</showDevicesText>, <sendAnywayText>trotzdem senden</sendAnywayText> oder <cancelText>abbrechen</cancelText>.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index e96fd3b887..6d39586c0a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -186,7 +186,6 @@ "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", "Failed to join room": "Failed to join room", - "Message Replies": "Message Replies", "Message Pinning": "Message Pinning", "Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing", "Use compact timeline layout": "Use compact timeline layout", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 9526e87285..7c13228264 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -932,7 +932,6 @@ "%(count)s of your messages have not been sent.|one": "Zure mezua ez da bidali.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Birbidali guztiak</resendText> edo <cancelText>baztertu guztiak</cancelText> orain. Mezuak banaka birbidali edo baztertu ditzakezu ere.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Birbidali mezua</resendText> edo <cancelText>baztertu mezua</cancelText> orain.", - "Message Replies": "Mezuei erantzunak", "Send an encrypted reply…": "Bidali zifratutako erantzun bat…", "Send a reply (unencrypted)…": "Bidali erantzun bat (zifratu gabea)…", "Send an encrypted message…": "Bidali zifratutako mezu bat…", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 9e6115b853..cb5bc86515 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -932,7 +932,6 @@ "%(count)s of your messages have not been sent.|one": "Votre message n'a pas été envoyé.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Tout renvoyer</resendText> ou <cancelText>tout annuler</cancelText> maintenant. Vous pouvez aussi choisir des messages individuels à renvoyer ou annuler.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Renvoyer le message</resendText> ou <cancelText>annuler le message</cancelText> maintenant.", - "Message Replies": "Réponses", "Send an encrypted reply…": "Envoyer une réponse chiffrée…", "Send a reply (unencrypted)…": "Envoyer une réponse (non chiffrée)…", "Send an encrypted message…": "Envoyer un message chiffré…", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 52feb86b30..ec2643712a 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -232,7 +232,6 @@ "Disable Notifications": "Deshabilitar notificacións", "Enable Notifications": "Habilitar notificacións", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", - "Message Replies": "Respostas a mensaxe", "Mirror local video feed": "Copiar fonte de vídeo local", "Cannot add any more widgets": "Non pode engadir máis widgets", "The maximum permitted number of widgets have already been added to this room.": "Xa se engadeu o número máximo de widgets a esta sala.", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 425f03b180..4bbfe52d75 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -932,7 +932,6 @@ "%(count)s of your messages have not been sent.|one": "Az üzeneted nem lett elküldve.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Újraküldöd mind</resendText> vagy <cancelText>elveted mind</cancelText>. Az üzeneteket egyenként is elküldheted vagy elvetheted.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Üzenet újraküldése</resendText> vagy <cancelText>üzenet elvetése</cancelText> most.", - "Message Replies": "Üzenet válaszok", "Send an encrypted reply…": "Titkosított válasz küldése…", "Send a reply (unencrypted)…": "Válasz küldése (titkosítatlanul)…", "Send an encrypted message…": "Titkosított üzenet küldése…", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index a7458a525f..0c6bcb0977 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -717,7 +717,6 @@ "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s vidžets, kuru mainīja %(senderName)s", "%(names)s and %(count)s others are typing|other": "%(names)s un %(count)s citi raksta", "%(names)s and %(count)s others are typing|one": "%(names)s un vēl kāds raksta", - "Message Replies": "Atbildes uz ziņām", "Message Pinning": "Ziņu piekabināšana", "Disable Emoji suggestions while typing": "Atspējot Emoji ieteikumus teksta rakstīšanas laikā", "Hide avatar changes": "Slēpt avatara izmaiņas", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 90be5ee923..ea97531832 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -705,7 +705,6 @@ "%(names)s and %(count)s others are typing|one": "%(names)s en iemand anders is aan het typen", "Send": "Verstuur", "Message Pinning": "Boodschap vastpinnen", - "Message Replies": "Antwoorden op bericht", "Disable Emoji suggestions while typing": "Emoji suggesties tijdens het typen uitzetten", "Hide avatar changes": "Avatar veranderingen verbergen", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 700c7edecc..c583e795cb 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -681,7 +681,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras pessoas estão escrevendo", "%(names)s and %(count)s others are typing|one": "%(names)s e uma outra pessoa estão escrevendo", "Send": "Enviar", - "Message Replies": "Respostas", "Message Pinning": "Fixar mensagem", "Disable Emoji suggestions while typing": "Desativar sugestões de emojis enquanto estiver escrevendo", "Hide join/leave messages (invites/kicks/bans unaffected)": "Ocultar mensagens de entrada e de saída (não afeta convites, expulsões e banimentos)", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 48824c7394..a82e5be64e 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -932,7 +932,6 @@ "%(count)s of your messages have not been sent.|one": "Ваше сообщение не было отправлено.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Отправить все</resendText> или <cancelText>отменить все</cancelText> сейчас. Можно также выбрать отдельные сообщения для отправки или отмены.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|one": "<resendText>Отправить</resendText> или <cancelText>отменить</cancelText> сообщение сейчас.", - "Message Replies": "Сообщения-ответы", "Send an encrypted reply…": "Отправить зашифрованный ответ…", "Send a reply (unencrypted)…": "Отправить ответ (нешифрованный)…", "Send an encrypted message…": "Отправить зашифрованное сообщение…", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 4988ac262b..b1f3f4260d 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -929,7 +929,6 @@ "Flair will not appear": "Príslušnosť ku komunite nebude zobrazená", "Display your community flair in rooms configured to show it.": "Zobrazovať vašu príslušnosť ku komunite v miestnostiach, ktoré sú nastavené na zobrazovanie tejto príslušnosti.", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", - "Message Replies": "Odpovede na správy", "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.": "Túto zmenu nebudete môcť vrátiť späť pretože znižujete vašu vlastnú úroveň moci. Ak ste jediný poverený používateľ v miestnosti, nebudete môcť znovu získať úroveň, akú máte teraz.", "Send an encrypted reply…": "Odoslať šifrovanú odpoveď…", "Send a reply (unencrypted)…": "Odoslať odpoveď (nešifrovanú)…", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 86f1faade6..c9f6653e26 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -168,7 +168,6 @@ "Not a valid Riot keyfile": "Није исправана Riot кључ-датотека", "Authentication check failed: incorrect password?": "Провера идентитета није успела: нетачна лозинка?", "Failed to join room": "Нисам успео да уђем у собу", - "Message Replies": "Одговори", "Message Pinning": "Закачене поруке", "Disable Emoji suggestions while typing": "Онемогући предлагање емоџија приликом куцања", "Use compact timeline layout": "Користи збијени распоред временске линије", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 2d81d0768b..0fb01a4cc6 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1019,7 +1019,6 @@ "Add rooms to the community": "Lägg till rum i communityn", "Add to community": "Lägg till i community", "Failed to invite users to community": "Det gick inte att bjuda in användare till communityn", - "Message Replies": "Meddelandesvar", "Mirror local video feed": "Spegelvänd lokal video", "Disable Community Filter Panel": "Inaktivera community-filterpanel", "Community Invites": "Community-inbjudningar", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 28a1a35ef1..56d5c1e4dc 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -741,7 +741,6 @@ "Add rooms to the community": "添加聊天室到社区", "Add to community": "添加到社区", "Failed to invite users to community": "邀请用户到社区失败", - "Message Replies": "消息回复", "Disable Peer-to-Peer for 1:1 calls": "在一对一通话中禁用 P2P 对等网络", "Enable inline URL previews by default": "默认启用网址预览", "Disinvite this user?": "取消邀请此用户?", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 4250e87c3b..e14268cfa1 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -700,7 +700,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s 與其他 %(count)s 個人正在輸入", "%(names)s and %(count)s others are typing|one": "%(names)s 與另一個人正在輸入", "Send": "傳送", - "Message Replies": "訊息回覆", "Message Pinning": "訊息釘選", "Disable Emoji suggestions while typing": "在輸入時停用繪文字建議", "Hide avatar changes": "隱藏大頭貼變更", From f5b12bd66ab5df55b20c81140b66fddbd3415884 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 20 Jun 2018 17:09:49 +0100 Subject: [PATCH 306/480] slash got consumed in the consolidation Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/SlashCommands.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SlashCommands.js b/src/SlashCommands.js index 3743fbb98c..211a68e7b0 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -27,14 +27,14 @@ import SettingsStore, {SettingLevel} from './settings/SettingsStore'; class Command { constructor({name, args='', description, runFn}) { - this.command = name; + this.command = '/' + name; this.args = args; this.description = description; this.runFn = runFn; } getCommand() { - return "/" + this.command; + return this.command; } getCommandWithArgs() { From 7d9d17145c125db962a0eff3bbcd4a065c5b403e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 20 Jun 2018 17:21:06 +0100 Subject: [PATCH 307/480] change so that if someone enters invalid command with args we strict match Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index ea271e02ff..4b24e98605 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -41,17 +41,14 @@ export default class CommandProvider extends AutocompleteProvider { const {command, range} = this.getCurrentCommand(query, selection); if (!command) return []; - let matches; + let matches = []; if (command[0] !== command[1]) { // The input looks like a command with arguments, perform exact match const match = COMMANDS.find((o) => o.command === command[1]); if (match) { matches = [match]; } - } - - // If we don't yet have matches - if (!matches) { + } else { if (query === '/') { // If they have just entered `/` show everything matches = COMMANDS; From 884fa3b9139a078310ed9a6162ad06c7306c8b2d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 20 Jun 2018 17:25:23 +0100 Subject: [PATCH 308/480] use existing command hashmap over linear array search Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommandProvider.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/autocomplete/CommandProvider.js b/src/autocomplete/CommandProvider.js index 4b24e98605..891ef97d65 100644 --- a/src/autocomplete/CommandProvider.js +++ b/src/autocomplete/CommandProvider.js @@ -44,9 +44,9 @@ export default class CommandProvider extends AutocompleteProvider { let matches = []; if (command[0] !== command[1]) { // The input looks like a command with arguments, perform exact match - const match = COMMANDS.find((o) => o.command === command[1]); - if (match) { - matches = [match]; + const name = command[1].substr(1); // strip leading `/` + if (CommandMap[name]) { + matches = [CommandMap[name]]; } } else { if (query === '/') { From 7cd8a5a2b230ac78c12cc40bddab10dcf9fce59f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 20 Jun 2018 18:01:37 +0100 Subject: [PATCH 309/480] allow chaining right click contextmenus Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/ContextualMenu.js | 26 +++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index 91ec312f43..e5b3bd0b71 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -64,7 +64,9 @@ export default class ContextualMenu extends React.Component { // The component to render as the context menu elementClass: PropTypes.element.isRequired, // on resize callback - windowResize: PropTypes.func + windowResize: PropTypes.func, + // method to close menu + closeMenu: PropTypes.func, }; constructor() { @@ -73,6 +75,7 @@ export default class ContextualMenu extends React.Component { contextMenuRect: null, }; + this.onContextMenu = this.onContextMenu.bind(this); this.collectContextMenuRect = this.collectContextMenuRect.bind(this); } @@ -85,6 +88,25 @@ export default class ContextualMenu extends React.Component { }); } + onContextMenu(e) { + if (this.props.closeMenu) { + this.props.closeMenu(); + } + e.preventDefault(); + const x = e.clientX; + const y = e.clientY; + + setImmediate(() => { + const clickEvent = document.createEvent('MouseEvents'); + clickEvent.initMouseEvent( + 'contextmenu', true, true, window, 0, + 0, 0, x, y, false, false, + false, false, 0, null, + ); + document.elementFromPoint(x, y).dispatchEvent(clickEvent); + }); + } + render() { const position = {}; let chevronFace = null; @@ -195,7 +217,7 @@ export default class ContextualMenu extends React.Component { { chevron } <ElementClass {...props} onFinished={props.closeMenu} onResize={props.windowResize} /> </div> - { props.hasBackground && <div className="mx_ContextualMenu_background" onClick={props.closeMenu} /> } + { props.hasBackground && <div className="mx_ContextualMenu_background" onClick={props.closeMenu} onContextMenu={this.onContextMenu} /> } <style>{ chevronCSS }</style> </div>; } From 4508da56661a4e8bd80122ee1539bfddaf228449 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 20 Jun 2018 18:03:15 +0100 Subject: [PATCH 310/480] only override contextmenu if closeMenu is provided Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/ContextualMenu.js | 27 +++++++++++---------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index e5b3bd0b71..8b88cae479 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -91,20 +91,21 @@ export default class ContextualMenu extends React.Component { onContextMenu(e) { if (this.props.closeMenu) { this.props.closeMenu(); - } - e.preventDefault(); - const x = e.clientX; - const y = e.clientY; - setImmediate(() => { - const clickEvent = document.createEvent('MouseEvents'); - clickEvent.initMouseEvent( - 'contextmenu', true, true, window, 0, - 0, 0, x, y, false, false, - false, false, 0, null, - ); - document.elementFromPoint(x, y).dispatchEvent(clickEvent); - }); + e.preventDefault(); + const x = e.clientX; + const y = e.clientY; + + setImmediate(() => { + const clickEvent = document.createEvent('MouseEvents'); + clickEvent.initMouseEvent( + 'contextmenu', true, true, window, 0, + 0, 0, x, y, false, false, + false, false, 0, null, + ); + document.elementFromPoint(x, y).dispatchEvent(clickEvent); + }); + } } render() { From 28ef65c4aaec6e8678251feb9e85f2cf45852c3e Mon Sep 17 00:00:00 2001 From: Marek Lach <graweeld@gmail.com> Date: Wed, 20 Jun 2018 13:21:24 +0000 Subject: [PATCH 311/480] Translated using Weblate (Slovak) Currently translated at 100.0% (1197 of 1197 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index b1f3f4260d..bc4e749d42 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1180,5 +1180,20 @@ "Terms and Conditions": "Zmluvné podmienky", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Ak chcete aj naďalej používať domovský server %(homeserverDomain)s, mali by ste si prečítať a odsúhlasiť naše zmluvné podmienky.", "Review terms and conditions": "Prečítať zmluvné podmienky", - "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť" + "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť", + "Encrypting": "Enkriptovanie", + "Encrypted, not sent": "Zakódované, ale neposlané", + "Share Link to User": "Pošli link užívateľovi", + "Share room": "Zdieľaj miestnosť", + "Share Room": "Zdieľaj miestnosť", + "Link to most recent message": "Link na najnovšiu správu", + "Share User": "Zdieľaj užívateľa", + "Share Community": "Zdieľaj komunitu", + "Link to selected message": "Link na vybranú správu", + "COPY": "Kopíruj", + "Share Message": "Zdieľaj správu", + "No Audio Outputs detected": "Neboli rozpoznané žiadne zvukové výstupy", + "Audio Output": "Zvukový výstup", + "Try the app first": "Najskôr aplikáciu vyskúšaj", + "Share Room Message": "Správa o zdieľaní miestnosti" } From bce87829b6c348b8da266dd741dc211eae436588 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 00:33:24 +0100 Subject: [PATCH 312/480] hide already chosen results from AddressPickerDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/AddressPickerDialog.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/views/dialogs/AddressPickerDialog.js b/src/components/views/dialogs/AddressPickerDialog.js index 0d0b7456b5..935eecf5f1 100644 --- a/src/components/views/dialogs/AddressPickerDialog.js +++ b/src/components/views/dialogs/AddressPickerDialog.js @@ -1,6 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -510,6 +510,10 @@ module.exports = React.createClass({ const AddressSelector = sdk.getComponent("elements.AddressSelector"); this.scrollElement = null; + // Use set to avoid O(n*m) operation + const selectedAddresses = new Set(this.state.userList.map(({address}) => address)); + const queryList = this.state.queryList.filter(({address}) => !selectedAddresses.has(address)); + const query = []; // create the invite list if (this.state.userList.length > 0) { @@ -561,16 +565,12 @@ module.exports = React.createClass({ </div>; } else if (this.state.searchError) { error = <div className="mx_ChatInviteDialog_error">{ this.state.searchError }</div>; - } else if ( - this.state.query.length > 0 && - this.state.queryList.length === 0 && - !this.state.busy - ) { + } else if (this.state.query.length > 0 && queryList.length === 0 && !this.state.busy) { error = <div className="mx_ChatInviteDialog_error">{ _t("No results") }</div>; } else { addressSelector = ( <AddressSelector ref={(ref) => {this.addressSelector = ref;}} - addressList={this.state.queryList} + addressList={queryList} showAddress={this.props.pickerType === 'user'} onSelected={this.onSelected} truncateAt={TRUNCATE_QUERY_LIST} From 4040e3f5cf287c253c27c860d0c277f734985ec1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 00:37:37 +0100 Subject: [PATCH 313/480] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/AddressPickerDialog.js | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/components/views/dialogs/AddressPickerDialog.js b/src/components/views/dialogs/AddressPickerDialog.js index 935eecf5f1..0105fb8ca9 100644 --- a/src/components/views/dialogs/AddressPickerDialog.js +++ b/src/components/views/dialogs/AddressPickerDialog.js @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import { _t } from '../../../languageHandler'; +import { _t, _td } from '../../../languageHandler'; import sdk from '../../../index'; import MatrixClientPeg from '../../../MatrixClientPeg'; import Promise from 'bluebird'; @@ -27,6 +27,13 @@ import GroupStore from '../../../stores/GroupStore'; const TRUNCATE_QUERY_LIST = 40; const QUERY_USER_DIRECTORY_DEBOUNCE_MS = 200; +const addressTypeName = { + 'mx-user-id': _td("Matrix ID"), + 'mx-room-id': _td("Matrix Room ID"), + 'email': _td("email address"), +}; + + module.exports = React.createClass({ displayName: "AddressPickerDialog", @@ -129,7 +136,7 @@ module.exports = React.createClass({ } else if (e.keyCode === 13) { // enter e.stopPropagation(); e.preventDefault(); - if (this.refs.textinput.value == '') { + if (this.refs.textinput.value === '') { // if there's nothing in the input box, submit the form this.onButtonClick(); } else { @@ -148,7 +155,7 @@ module.exports = React.createClass({ clearTimeout(this.queryChangedDebouncer); } // Only do search if there is something to search - if (query.length > 0 && query != '@' && query.length >= 2) { + if (query.length > 0 && query !== '@' && query.length >= 2) { this.queryChangedDebouncer = setTimeout(() => { if (this.props.pickerType === 'user') { if (this.props.groupId) { @@ -419,7 +426,7 @@ module.exports = React.createClass({ isKnown: false, }); if (this._cancelThreepidLookup) this._cancelThreepidLookup(); - if (addrType == 'email') { + if (addrType === 'email') { this._lookupThreepid(addrType, query).done(); } } @@ -442,14 +449,14 @@ module.exports = React.createClass({ if (!this.props.validAddressTypes.includes(addrType)) { this.setState({ error: true }); return null; - } else if (addrType == 'mx-user-id') { + } else if (addrType === 'mx-user-id') { const user = MatrixClientPeg.get().getUser(addrObj.address); if (user) { addrObj.displayName = user.displayName; addrObj.avatarMxc = user.avatarUrl; addrObj.isKnown = true; } - } else if (addrType == 'mx-room-id') { + } else if (addrType === 'mx-room-id') { const room = MatrixClientPeg.get().getRoom(addrObj.address); if (room) { addrObj.displayName = room.name; @@ -547,21 +554,13 @@ module.exports = React.createClass({ let error; let addressSelector; if (this.state.error) { - let tryUsing = ''; - const validTypeDescriptions = this.props.validAddressTypes.map((t) => { - return { - 'mx-user-id': _t("Matrix ID"), - 'mx-room-id': _t("Matrix Room ID"), - 'email': _t("email address"), - }[t]; - }); - tryUsing = _t("Try using one of the following valid address types: %(validTypesList)s.", { - validTypesList: validTypeDescriptions.join(", "), - }); + const validTypeDescriptions = this.props.validAddressTypes.map((t) => _t(addressTypeName[t])); error = <div className="mx_ChatInviteDialog_error"> { _t("You have entered an invalid address.") } <br /> - { tryUsing } + { _t("Try using one of the following valid address types: %(validTypesList)s.", { + validTypesList: validTypeDescriptions.join(", "), + }) } </div>; } else if (this.state.searchError) { error = <div className="mx_ChatInviteDialog_error">{ this.state.searchError }</div>; From fd252ded601d96130bef8b86265e1d63ef21ab16 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 00:47:21 +0100 Subject: [PATCH 314/480] take into account the addressType also Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/AddressPickerDialog.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/AddressPickerDialog.js b/src/components/views/dialogs/AddressPickerDialog.js index 0105fb8ca9..a87ffbb518 100644 --- a/src/components/views/dialogs/AddressPickerDialog.js +++ b/src/components/views/dialogs/AddressPickerDialog.js @@ -517,9 +517,16 @@ module.exports = React.createClass({ const AddressSelector = sdk.getComponent("elements.AddressSelector"); this.scrollElement = null; - // Use set to avoid O(n*m) operation - const selectedAddresses = new Set(this.state.userList.map(({address}) => address)); - const queryList = this.state.queryList.filter(({address}) => !selectedAddresses.has(address)); + // map addressType => set of addresses to avoid O(n*m) operation + const selectedAddresses = {}; + this.state.userList.forEach(({address, addressType}) => { + if (!selectedAddresses[addressType]) selectedAddresses[addressType] = new Set(); + selectedAddresses[addressType].add(address); + }); + + const queryList = this.state.queryList.filter(({address, addressType}) => { + return !selectedAddresses[addressType] || !selectedAddresses[addressType].has(address); + }); const query = []; // create the invite list From b18c95cdb57ca11068c755dc4493489d02383a62 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 21 Jun 2018 10:03:35 +0100 Subject: [PATCH 315/480] js-sdk rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33aa428d4b..c7cdfffb31 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "linkifyjs": "^2.1.3", "lodash": "^4.13.1", "lolex": "2.3.2", - "matrix-js-sdk": "0.10.4", + "matrix-js-sdk": "0.10.5-rc.1", "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", From f3d54a49b65bc220a76357d84b281afbda976ccb Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 21 Jun 2018 10:06:52 +0100 Subject: [PATCH 316/480] Prepare changelog for v0.12.8-rc.1 --- CHANGELOG.md | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b97251604..2120e18a31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,99 @@ +Changes in [0.12.8-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.8-rc.1) (2018-06-21) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.7...v0.12.8-rc.1) + + * Update from Weblate. + [\#1997](https://github.com/matrix-org/matrix-react-sdk/pull/1997) + * refactor, consolidate and improve SlashCommands + [\#1988](https://github.com/matrix-org/matrix-react-sdk/pull/1988) + * Take replies out of labs! + [\#1996](https://github.com/matrix-org/matrix-react-sdk/pull/1996) + * re-merge reset PR + [\#1987](https://github.com/matrix-org/matrix-react-sdk/pull/1987) + * once command has a space, strict match instead of fuzzy match + [\#1985](https://github.com/matrix-org/matrix-react-sdk/pull/1985) + * Fix matrix.to URL RegExp + [\#1986](https://github.com/matrix-org/matrix-react-sdk/pull/1986) + * Fix blank sticker picker + [\#1984](https://github.com/matrix-org/matrix-react-sdk/pull/1984) + * fix e2ee file/media stuff + [\#1972](https://github.com/matrix-org/matrix-react-sdk/pull/1972) + * right click for room tile context menu + [\#1978](https://github.com/matrix-org/matrix-react-sdk/pull/1978) + * only show m.room.message in FilePanel + [\#1983](https://github.com/matrix-org/matrix-react-sdk/pull/1983) + * improve command provider + [\#1981](https://github.com/matrix-org/matrix-react-sdk/pull/1981) + * affix copyButton so that it doesn't get scrolled horizontally + [\#1980](https://github.com/matrix-org/matrix-react-sdk/pull/1980) + * split continuation if there is a gap in conversation + [\#1979](https://github.com/matrix-org/matrix-react-sdk/pull/1979) + * fix a bunch of instances of react console spam + [\#1973](https://github.com/matrix-org/matrix-react-sdk/pull/1973) + * Track decryption success/failure rate with piwik + [\#1949](https://github.com/matrix-org/matrix-react-sdk/pull/1949) + * route matrix.to/#/+... links internally (not just group ids) + [\#1975](https://github.com/matrix-org/matrix-react-sdk/pull/1975) + * implement `hitting enter after Ctrl-K should switch to the first result` + [\#1976](https://github.com/matrix-org/matrix-react-sdk/pull/1976) + * Remove tag panel feature flag + [\#1970](https://github.com/matrix-org/matrix-react-sdk/pull/1970) + * QuestionDialog pass hasCancelButton to DialogButtons + [\#1968](https://github.com/matrix-org/matrix-react-sdk/pull/1968) + * check type before msgtype in the case of `m.sticker` with msgtype + [\#1965](https://github.com/matrix-org/matrix-react-sdk/pull/1965) + * apply roomlist searchFilter to aliases if it begins with a `#` + [\#1957](https://github.com/matrix-org/matrix-react-sdk/pull/1957) + * Share Dialog + [\#1948](https://github.com/matrix-org/matrix-react-sdk/pull/1948) + * make RoomTooltip generic and add ContextMenu&Tooltip to GroupInviteTile + [\#1950](https://github.com/matrix-org/matrix-react-sdk/pull/1950) + * Fix widgets re-appearing after being deleted + [\#1958](https://github.com/matrix-org/matrix-react-sdk/pull/1958) + * Fix crash on unspecified thumbnail info, and handle gracefully + [\#1967](https://github.com/matrix-org/matrix-react-sdk/pull/1967) + * fix styling of clearButton when its not there + [\#1964](https://github.com/matrix-org/matrix-react-sdk/pull/1964) + * Implement slightly magical CSS soln. to thumbnail sizing + [\#1912](https://github.com/matrix-org/matrix-react-sdk/pull/1912) + * Select audio output for WebRTC + [\#1932](https://github.com/matrix-org/matrix-react-sdk/pull/1932) + * move css rule to be more generic; remove overriden rule + [\#1962](https://github.com/matrix-org/matrix-react-sdk/pull/1962) + * improve tag panel accessibility and remove a no-op dispatch + [\#1960](https://github.com/matrix-org/matrix-react-sdk/pull/1960) + * Revert "Fix exception when opening dev tools" + [\#1963](https://github.com/matrix-org/matrix-react-sdk/pull/1963) + * fix message appears unencrypted while encrypting and not_sent + [\#1959](https://github.com/matrix-org/matrix-react-sdk/pull/1959) + * Fix exception when opening dev tools + [\#1961](https://github.com/matrix-org/matrix-react-sdk/pull/1961) + * show redacted stickers like other redacted messages + [\#1956](https://github.com/matrix-org/matrix-react-sdk/pull/1956) + * add mx_filterFlipColor to mx_MemberInfo_cancel img + [\#1951](https://github.com/matrix-org/matrix-react-sdk/pull/1951) + * don't set the displayname on registration as Synapse now does it + [\#1953](https://github.com/matrix-org/matrix-react-sdk/pull/1953) + * allow CreateRoom to scale properly horizontally + [\#1955](https://github.com/matrix-org/matrix-react-sdk/pull/1955) + * Keep context menus that extend downwards vertically on screen + [\#1952](https://github.com/matrix-org/matrix-react-sdk/pull/1952) + * re-run checkIfAlone if a member change occurred in the active room + [\#1947](https://github.com/matrix-org/matrix-react-sdk/pull/1947) + * Persist pinned message open-ness between room switches + [\#1935](https://github.com/matrix-org/matrix-react-sdk/pull/1935) + * Pinned message cosmetic improvements + [\#1933](https://github.com/matrix-org/matrix-react-sdk/pull/1933) + * Update sinon to 5.0.7 + [\#1916](https://github.com/matrix-org/matrix-react-sdk/pull/1916) + * re-run checkIfAlone if a member change occurred in the active room + [\#1946](https://github.com/matrix-org/matrix-react-sdk/pull/1946) + * Replace "Login as guest" with "Try the app first" on login page + [\#1937](https://github.com/matrix-org/matrix-react-sdk/pull/1937) + * kill stream when using gUM for permission to device labels to turn off + camera + [\#1931](https://github.com/matrix-org/matrix-react-sdk/pull/1931) + Changes in [0.12.7](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.7) (2018-06-12) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.7-rc.1...v0.12.7) From 2b8bc8a80045af99dc3fb22cba825711427b7af1 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Thu, 21 Jun 2018 10:06:53 +0100 Subject: [PATCH 317/480] v0.12.8-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c7cdfffb31..7da47f27c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.7", + "version": "0.12.8-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From d4e3301dd99cb40ef7b64cdb9b5be7d209f94109 Mon Sep 17 00:00:00 2001 From: Marek Lach <graweeld@gmail.com> Date: Wed, 20 Jun 2018 17:21:38 +0000 Subject: [PATCH 318/480] Translated using Weblate (Czech) Currently translated at 90.2% (1080 of 1197 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index b7298f80ab..52eabf0edc 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1076,5 +1076,7 @@ "Collapse panel": "Sbalit panel", "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!": "Vzhled a chování aplikace může být ve vašem aktuální prohlížeči nesprávné a některé nebo všechny funkce mohou být chybné. Chcete-li i přes to pokračovat, nebudeme vám bránit, ale se všemi problémy, na které narazíte, si musíte poradit sami!", "Checking for an update...": "Kontrola aktualizací...", - "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena" + "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena", + "The platform you're on": "Platforma na které jsi", + "The version of Riot.im": "Verze Riot.im" } From cb6c41ae6652a850ed9235b8cec366cfdde61fc8 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Thu, 21 Jun 2018 09:49:59 +0000 Subject: [PATCH 319/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1197 of 1197 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 5ec9a93bc5..90bfc3c94a 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1181,5 +1181,19 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "За да продължите да ползвате %(homeserverDomain)s е необходимо да прегледате и да се съгласите с правилата и условията за ползване.", "Review terms and conditions": "Прегледай правилата и условията", "Failed to indicate account erasure": "Неуспешно указване на желанието за изтриване на акаунта", - "Try the app first": "Първо пробвайте приложението" + "Try the app first": "Първо пробвайте приложението", + "Encrypting": "Шифроване", + "Encrypted, not sent": "Шифровано, неизпратено", + "Share Link to User": "Сподели връзка с потребител", + "Share room": "Сподели стая", + "Share Room": "Споделяне на стая", + "Link to most recent message": "Създай връзка към най-новото съобщение", + "Share User": "Споделяне на потребител", + "Share Community": "Споделяне на общност", + "Share Room Message": "Споделяне на съобщение от стая", + "Link to selected message": "Създай връзка към избраното съобщение", + "COPY": "КОПИРАЙ", + "Share Message": "Сподели съобщението", + "No Audio Outputs detected": "Не са открити аудио изходи", + "Audio Output": "Аудио изходи" } From 2428eb12af651db687a5afed4804dcd258a9df3d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 11:37:06 +0100 Subject: [PATCH 320/480] delint ChatCreateOrReuseDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/ChatCreateOrReuseDialog.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/views/dialogs/ChatCreateOrReuseDialog.js b/src/components/views/dialogs/ChatCreateOrReuseDialog.js index 9228e59280..b7cf0f5a6e 100644 --- a/src/components/views/dialogs/ChatCreateOrReuseDialog.js +++ b/src/components/views/dialogs/ChatCreateOrReuseDialog.js @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -28,6 +29,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { constructor(props) { super(props); + this.onFinished = this.onFinished.bind(this); this.onRoomTileClick = this.onRoomTileClick.bind(this); this.state = { @@ -53,10 +55,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { const room = client.getRoom(roomId); if (room) { const me = room.getMember(client.credentials.userId); - const highlight = ( - room.getUnreadNotificationCount('highlight') > 0 || - me.membership == "invite" - ); + const highlight = room.getUnreadNotificationCount('highlight') > 0 || me.membership === "invite"; tiles.push( <RoomTile key={room.roomId} room={room} transparent={true} @@ -64,7 +63,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { selected={false} unread={Unread.doesRoomHaveUnreadMessages(room)} highlight={highlight} - isInvite={me.membership == "invite"} + isInvite={me.membership === "invite"} onClick={this.onRoomTileClick} />, ); @@ -110,6 +109,10 @@ export default class ChatCreateOrReuseDialog extends React.Component { this.props.onExistingRoomSelected(roomId); } + onFinished() { + this.props.onFinished(false); + } + render() { let title = ''; let content = null; @@ -177,7 +180,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return ( <BaseDialog className='mx_ChatCreateOrReuseDialog' - onFinished={this.props.onFinished.bind(false)} + onFinished={this.onFinished} title={title} contentId='mx_Dialog_content' > From 073796507937c72bb56efcec7ab8fc032b1bd0a9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 12:13:27 +0100 Subject: [PATCH 321/480] s/userList/selectedList/ & s/queryList/suggestedList/ Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/AddressPickerDialog.js | 81 +++++++++---------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/components/views/dialogs/AddressPickerDialog.js b/src/components/views/dialogs/AddressPickerDialog.js index a87ffbb518..2dabe317dd 100644 --- a/src/components/views/dialogs/AddressPickerDialog.js +++ b/src/components/views/dialogs/AddressPickerDialog.js @@ -73,7 +73,7 @@ module.exports = React.createClass({ // List of UserAddressType objects representing // the list of addresses we're going to invite - userList: [], + selectedList: [], // Whether a search is ongoing busy: false, @@ -83,10 +83,9 @@ module.exports = React.createClass({ serverSupportsUserDirectory: true, // The query being searched for query: "", - // List of UserAddressType objects representing - // the set of auto-completion results for the current search - // query. - queryList: [], + // List of UserAddressType objects representing the set of + // auto-completion results for the current search query. + suggestedList: [], }; }, @@ -98,14 +97,14 @@ module.exports = React.createClass({ }, onButtonClick: function() { - let userList = this.state.userList.slice(); + let selectedList = this.state.selectedList.slice(); // Check the text input field to see if user has an unconverted address - // If there is and it's valid add it to the local userList + // If there is and it's valid add it to the local selectedList if (this.refs.textinput.value !== '') { - userList = this._addInputToList(); - if (userList === null) return; + selectedList = this._addInputToList(); + if (selectedList === null) return; } - this.props.onFinished(true, userList); + this.props.onFinished(true, selectedList); }, onCancel: function() { @@ -125,14 +124,14 @@ module.exports = React.createClass({ e.stopPropagation(); e.preventDefault(); if (this.addressSelector) this.addressSelector.moveSelectionDown(); - } else if (this.state.queryList.length > 0 && (e.keyCode === 188 || e.keyCode === 13 || e.keyCode === 9)) { // comma or enter or tab + } else if (this.state.suggestedList.length > 0 && (e.keyCode === 188 || e.keyCode === 13 || e.keyCode === 9)) { // comma or enter or tab e.stopPropagation(); e.preventDefault(); if (this.addressSelector) this.addressSelector.chooseSelection(); - } else if (this.refs.textinput.value.length === 0 && this.state.userList.length && e.keyCode === 8) { // backspace + } else if (this.refs.textinput.value.length === 0 && this.state.selectedList.length && e.keyCode === 8) { // backspace e.stopPropagation(); e.preventDefault(); - this.onDismissed(this.state.userList.length - 1)(); + this.onDismissed(this.state.selectedList.length - 1)(); } else if (e.keyCode === 13) { // enter e.stopPropagation(); e.preventDefault(); @@ -177,7 +176,7 @@ module.exports = React.createClass({ }, QUERY_USER_DIRECTORY_DEBOUNCE_MS); } else { this.setState({ - queryList: [], + suggestedList: [], query: "", searchError: null, }); @@ -186,11 +185,11 @@ module.exports = React.createClass({ onDismissed: function(index) { return () => { - const userList = this.state.userList.slice(); - userList.splice(index, 1); + const selectedList = this.state.selectedList.slice(); + selectedList.splice(index, 1); this.setState({ - userList: userList, - queryList: [], + selectedList, + suggestedList: [], query: "", }); if (this._cancelThreepidLookup) this._cancelThreepidLookup(); @@ -204,11 +203,11 @@ module.exports = React.createClass({ }, onSelected: function(index) { - const userList = this.state.userList.slice(); - userList.push(this.state.queryList[index]); + const selectedList = this.state.selectedList.slice(); + selectedList.push(this.state.suggestedList[index]); this.setState({ - userList: userList, - queryList: [], + selectedList, + suggestedList: [], query: "", }); if (this._cancelThreepidLookup) this._cancelThreepidLookup(); @@ -386,10 +385,10 @@ module.exports = React.createClass({ }, _processResults: function(results, query) { - const queryList = []; + const suggestedList = []; results.forEach((result) => { if (result.room_id) { - queryList.push({ + suggestedList.push({ addressType: 'mx-room-id', address: result.room_id, displayName: result.name, @@ -406,7 +405,7 @@ module.exports = React.createClass({ // Return objects, structure of which is defined // by UserAddressType - queryList.push({ + suggestedList.push({ addressType: 'mx-user-id', address: result.user_id, displayName: result.display_name, @@ -420,7 +419,7 @@ module.exports = React.createClass({ // a perfectly valid address if there are close matches. const addrType = getAddressType(query); if (this.props.validAddressTypes.includes(addrType)) { - queryList.unshift({ + suggestedList.unshift({ addressType: addrType, address: query, isKnown: false, @@ -431,7 +430,7 @@ module.exports = React.createClass({ } } this.setState({ - queryList, + suggestedList, error: false, }, () => { if (this.addressSelector) this.addressSelector.moveSelectionTop(); @@ -465,15 +464,15 @@ module.exports = React.createClass({ } } - const userList = this.state.userList.slice(); - userList.push(addrObj); + const selectedList = this.state.selectedList.slice(); + selectedList.push(addrObj); this.setState({ - userList: userList, - queryList: [], + selectedList, + suggestedList: [], query: "", }); if (this._cancelThreepidLookup) this._cancelThreepidLookup(); - return userList; + return selectedList; }, _lookupThreepid: function(medium, address) { @@ -499,7 +498,7 @@ module.exports = React.createClass({ if (res === null) return null; if (cancelled) return null; this.setState({ - queryList: [{ + suggestedList: [{ // a UserAddressType addressType: medium, address: address, @@ -519,24 +518,24 @@ module.exports = React.createClass({ // map addressType => set of addresses to avoid O(n*m) operation const selectedAddresses = {}; - this.state.userList.forEach(({address, addressType}) => { + this.state.selectedList.forEach(({address, addressType}) => { if (!selectedAddresses[addressType]) selectedAddresses[addressType] = new Set(); selectedAddresses[addressType].add(address); }); - const queryList = this.state.queryList.filter(({address, addressType}) => { + const filteredSuggestedList = this.state.suggestedList.filter(({address, addressType}) => { return !selectedAddresses[addressType] || !selectedAddresses[addressType].has(address); }); const query = []; // create the invite list - if (this.state.userList.length > 0) { + if (this.state.selectedList.length > 0) { const AddressTile = sdk.getComponent("elements.AddressTile"); - for (let i = 0; i < this.state.userList.length; i++) { + for (let i = 0; i < this.state.selectedList.length; i++) { query.push( <AddressTile key={i} - address={this.state.userList[i]} + address={this.state.selectedList[i]} canDismiss={true} onDismissed={this.onDismissed(i)} showAddress={this.props.pickerType === 'user'} />, @@ -546,7 +545,7 @@ module.exports = React.createClass({ // Add the query at the end query.push( - <textarea key={this.state.userList.length} + <textarea key={this.state.selectedList.length} rows="1" id="textinput" ref="textinput" @@ -571,12 +570,12 @@ module.exports = React.createClass({ </div>; } else if (this.state.searchError) { error = <div className="mx_ChatInviteDialog_error">{ this.state.searchError }</div>; - } else if (this.state.query.length > 0 && queryList.length === 0 && !this.state.busy) { + } else if (this.state.query.length > 0 && filteredSuggestedList.length === 0 && !this.state.busy) { error = <div className="mx_ChatInviteDialog_error">{ _t("No results") }</div>; } else { addressSelector = ( <AddressSelector ref={(ref) => {this.addressSelector = ref;}} - addressList={queryList} + addressList={filteredSuggestedList} showAddress={this.props.pickerType === 'user'} onSelected={this.onSelected} truncateAt={TRUNCATE_QUERY_LIST} From be612998bde2886c3b542219cc4ff1c25bf80151 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 12:14:16 +0100 Subject: [PATCH 322/480] invert boolean operation for readability and add comment Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/AddressPickerDialog.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/AddressPickerDialog.js b/src/components/views/dialogs/AddressPickerDialog.js index 2dabe317dd..abc52f7b1d 100644 --- a/src/components/views/dialogs/AddressPickerDialog.js +++ b/src/components/views/dialogs/AddressPickerDialog.js @@ -523,8 +523,9 @@ module.exports = React.createClass({ selectedAddresses[addressType].add(address); }); + // Filter out any addresses in the above already selected addresses (matching both type and address) const filteredSuggestedList = this.state.suggestedList.filter(({address, addressType}) => { - return !selectedAddresses[addressType] || !selectedAddresses[addressType].has(address); + return !(selectedAddresses[addressType] && selectedAddresses[addressType].has(address)); }); const query = []; From 58be44ad9edb31bc05244f301c4f2e4ff7e34dd2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 13:51:39 +0100 Subject: [PATCH 323/480] factor out conditional LanguageSelector as functional component and reuse in Login, ForgotPassword and Registration views Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../structures/login/ForgotPassword.js | 4 +- .../structures/login/LanguageSelector.js | 38 +++++++++++++++++++ src/components/structures/login/Login.js | 25 ++---------- .../structures/login/Registration.js | 3 ++ 4 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 src/components/structures/login/LanguageSelector.js diff --git a/src/components/structures/login/ForgotPassword.js b/src/components/structures/login/ForgotPassword.js index ca50b9db6e..cf054a4e6e 100644 --- a/src/components/structures/login/ForgotPassword.js +++ b/src/components/structures/login/ForgotPassword.js @@ -1,6 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 New Vector Ltd +Copyright 2017, 2018 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. @@ -26,6 +26,7 @@ import MatrixClientPeg from "../../../MatrixClientPeg"; import SdkConfig from "../../../SdkConfig"; import PasswordReset from "../../../PasswordReset"; +import makeLanguageSelector from "./LanguageSelector"; module.exports = React.createClass({ displayName: 'ForgotPassword', @@ -233,6 +234,7 @@ module.exports = React.createClass({ <a className="mx_Login_create" onClick={this.props.onRegisterClick} href="#"> { _t('Create an account') } </a> + { makeLanguageSelector() } <LoginFooter /> </div> </div> diff --git a/src/components/structures/login/LanguageSelector.js b/src/components/structures/login/LanguageSelector.js new file mode 100644 index 0000000000..1e576bdbb8 --- /dev/null +++ b/src/components/structures/login/LanguageSelector.js @@ -0,0 +1,38 @@ +/* +Copyright 2018 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 SdkConfig from "../../../SdkConfig"; +import {getCurrentLanguage} from "../../../languageHandler"; +import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; +import PlatformPeg from "../../../PlatformPeg"; +import sdk from '../../../index'; +import React from 'react'; + +function onChange(newLang) { + if (getCurrentLanguage() !== newLang) { + SettingsStore.setValue("language", null, SettingLevel.DEVICE, newLang); + PlatformPeg.get().reload(); + } +} + +export default function makeLanguageSelector() { + if (SdkConfig.get()['disable_login_language_selector']) return <div />; + + const LanguageDropdown = sdk.getComponent('views.elements.LanguageDropdown'); + return <div className="mx_Login_language_div"> + <LanguageDropdown onOptionChange={onChange} className="mx_Login_language" value={getCurrentLanguage()} /> + </div>; +} diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index 1332f52f97..60e4e51f04 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -1,6 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -20,12 +21,11 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; -import * as languageHandler from '../../../languageHandler'; import sdk from '../../../index'; import Login from '../../../Login'; -import PlatformPeg from '../../../PlatformPeg'; import SdkConfig from '../../../SdkConfig'; -import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; +import SettingsStore from "../../../settings/SettingsStore"; +import makeLanguageSelector from "./LanguageSelector"; // For validating phone numbers without country codes const PHONE_NUMBER_REGEX = /^[0-9\(\)\-\s]*$/; @@ -370,23 +370,6 @@ module.exports = React.createClass({ ); }, - _onLanguageChange: function(newLang) { - if (languageHandler.getCurrentLanguage() !== newLang) { - SettingsStore.setValue("language", null, SettingLevel.DEVICE, newLang); - PlatformPeg.get().reload(); - } - }, - - _renderLanguageSetting: function() { - const LanguageDropdown = sdk.getComponent('views.elements.LanguageDropdown'); - return <div className="mx_Login_language_div"> - <LanguageDropdown onOptionChange={this._onLanguageChange} - className="mx_Login_language" - value={languageHandler.getCurrentLanguage()} - /> - </div>; - }, - render: function() { const Loader = sdk.getComponent("elements.Spinner"); const LoginPage = sdk.getComponent("login.LoginPage"); @@ -461,7 +444,7 @@ module.exports = React.createClass({ </a> { loginAsGuestJsx } { returnToAppJsx } - { !SdkConfig.get().disable_login_language_selector ? this._renderLanguageSetting() : '' } + { makeLanguageSelector() } <LoginFooter /> </div> </div> diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index 62a3ee4f68..377cffc576 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -1,6 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -29,6 +30,7 @@ import RtsClient from '../../../RtsClient'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; import SettingsStore from "../../../settings/SettingsStore"; +import makeLanguageSelector from "./LanguageSelector"; const MIN_PASSWORD_LENGTH = 6; @@ -432,6 +434,7 @@ module.exports = React.createClass({ { signIn } { errorText } { returnToAppJsx } + { makeLanguageSelector() } <LoginFooter /> </div> </LoginPage> From f32da97a3abef96808c9c9e60b76559456fad874 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 14:04:08 +0100 Subject: [PATCH 324/480] delint and run generate-eslint-error-ignore-file Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .eslintignore.errorfiles | 12 ++--- .../structures/login/ForgotPassword.js | 14 +++--- src/components/structures/login/Login.js | 50 +++++++++---------- .../structures/login/Registration.js | 34 +++++-------- 4 files changed, 49 insertions(+), 61 deletions(-) diff --git a/.eslintignore.errorfiles b/.eslintignore.errorfiles index 42818244b3..3886b3f728 100644 --- a/.eslintignore.errorfiles +++ b/.eslintignore.errorfiles @@ -13,8 +13,6 @@ src/components/structures/HomePage.js src/components/structures/LeftPanel.js src/components/structures/LoggedInView.js src/components/structures/login/ForgotPassword.js -src/components/structures/login/Login.js -src/components/structures/login/Registration.js src/components/structures/LoginBox.js src/components/structures/MessagePanel.js src/components/structures/NotificationPanel.js @@ -26,12 +24,11 @@ src/components/structures/ScrollPanel.js src/components/structures/SearchBox.js src/components/structures/TimelinePanel.js src/components/structures/UploadBar.js +src/components/structures/UserSettings.js src/components/structures/ViewSource.js src/components/views/avatars/BaseAvatar.js -src/components/views/avatars/GroupAvatar.js src/components/views/avatars/MemberAvatar.js src/components/views/create_room/RoomAlias.js -src/components/views/dialogs/BugReportDialog.js src/components/views/dialogs/ChangelogDialog.js src/components/views/dialogs/ChatCreateOrReuseDialog.js src/components/views/dialogs/DeactivateAccountDialog.js @@ -47,6 +44,7 @@ src/components/views/elements/InlineSpinner.js src/components/views/elements/MemberEventListSummary.js src/components/views/elements/Spinner.js src/components/views/elements/TintableSvg.js +src/components/views/elements/UserInfo.js src/components/views/elements/UserSelector.js src/components/views/globals/MatrixToolbar.js src/components/views/globals/NewVersionBar.js @@ -65,7 +63,6 @@ src/components/views/room_settings/UrlPreviewSettings.js src/components/views/rooms/Autocomplete.js src/components/views/rooms/AuxPanel.js src/components/views/rooms/EntityTile.js -src/components/views/rooms/EventTile.js src/components/views/rooms/LinkPreviewWidget.js src/components/views/rooms/MemberDeviceInfo.js src/components/views/rooms/MemberInfo.js @@ -73,12 +70,11 @@ src/components/views/rooms/MemberList.js src/components/views/rooms/MemberTile.js src/components/views/rooms/MessageComposer.js src/components/views/rooms/MessageComposerInput.js +src/components/views/rooms/PinnedEventTile.js src/components/views/rooms/RoomDropTarget.js src/components/views/rooms/RoomList.js src/components/views/rooms/RoomPreviewBar.js src/components/views/rooms/RoomSettings.js -src/components/views/rooms/RoomTile.js -src/components/views/rooms/RoomTooltip.js src/components/views/rooms/SearchableEntityList.js src/components/views/rooms/SearchBar.js src/components/views/rooms/SearchResultTile.js @@ -92,6 +88,7 @@ src/components/views/settings/DevicesPanel.js src/components/views/settings/IntegrationsManager.js src/components/views/settings/Notifications.js src/ContentMessages.js +src/GroupAddressPicker.js src/HtmlUtils.js src/ImageUtils.js src/languageHandler.js @@ -135,6 +132,7 @@ test/components/structures/TimelinePanel-test.js test/components/views/dialogs/InteractiveAuthDialog-test.js test/components/views/login/RegistrationForm-test.js test/components/views/rooms/MessageComposerInput-test.js +test/components/views/rooms/RoomSettings-test.js test/mock-clock.js test/notifications/ContentRules-test.js test/notifications/PushRuleVectorState-test.js diff --git a/src/components/structures/login/ForgotPassword.js b/src/components/structures/login/ForgotPassword.js index cf054a4e6e..bbee4c3207 100644 --- a/src/components/structures/login/ForgotPassword.js +++ b/src/components/structures/login/ForgotPassword.js @@ -15,8 +15,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - import React from 'react'; import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; @@ -46,6 +44,8 @@ module.exports = React.createClass({ enteredHomeserverUrl: this.props.customHsUrl || this.props.defaultHsUrl, enteredIdentityServerUrl: this.props.customIsUrl || this.props.defaultIsUrl, progress: null, + password: null, + password2: null, }; }, @@ -104,7 +104,7 @@ module.exports = React.createClass({ </div>, button: _t('Continue'), extraButtons: [ - <button className="mx_Dialog_primary" + <button key="export_keys" className="mx_Dialog_primary" onClick={this._onExportE2eKeysClicked}> { _t('Export E2E room keys') } </button>, @@ -170,7 +170,8 @@ module.exports = React.createClass({ } else if (this.state.progress === "sent_email") { resetPasswordJsx = ( <div className="mx_Login_prompt"> - { _t("An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.", { emailAddress: this.state.email }) } + { _t("An email has been sent to %(emailAddress)s. Once you've followed the link it contains, " + + "click below.", { emailAddress: this.state.email }) } <br /> <input className="mx_Login_submit" type="button" onClick={this.onVerify} value={_t('I have verified my email address')} /> @@ -180,14 +181,15 @@ module.exports = React.createClass({ resetPasswordJsx = ( <div className="mx_Login_prompt"> <p>{ _t('Your password has been reset') }.</p> - <p>{ _t('You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device') }.</p> + <p>{ _t('You have been logged out of all devices and will no longer receive push notifications. ' + + 'To re-enable notifications, sign in again on each device') }.</p> <input className="mx_Login_submit" type="button" onClick={this.props.onComplete} value={_t('Return to login screen')} /> </div> ); } else { let serverConfigSection; - if (!SdkConfig.get().disable_custom_urls) { + if (!SdkConfig.get()['disable_custom_urls']) { serverConfigSection = ( <ServerConfig ref="serverConfig" withToggleButton={true} diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index 60e4e51f04..c4a5b8ba57 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -28,7 +28,7 @@ import SettingsStore from "../../../settings/SettingsStore"; import makeLanguageSelector from "./LanguageSelector"; // For validating phone numbers without country codes -const PHONE_NUMBER_REGEX = /^[0-9\(\)\-\s]*$/; +const PHONE_NUMBER_REGEX = /^[0-9()\-\s]*$/; /** * A wire component which glues together login UI components and Login logic @@ -113,10 +113,10 @@ module.exports = React.createClass({ // Some error strings only apply for logging in const usingEmail = username.indexOf("@") > 0; - if (error.httpStatus == 400 && usingEmail) { + if (error.httpStatus === 400 && usingEmail) { errorText = _t('This Home Server does not support login using email address.'); } else if (error.httpStatus === 401 || error.httpStatus === 403) { - if (SdkConfig.get().disable_custom_urls) { + if (SdkConfig.get()['disable_custom_urls']) { errorText = ( <div> <div>{ _t('Incorrect username and/or password.') }</div> @@ -143,7 +143,7 @@ module.exports = React.createClass({ // but the login API gives a 403 https://matrix.org/jira/browse/SYN-744 // mentions this (although the bug is for UI auth which is not this) // We treat both as an incorrect password - loginIncorrect: error.httpStatus === 401 || error.httpStatus == 403, + loginIncorrect: error.httpStatus === 401 || error.httpStatus === 403, }); }).finally(() => { if (this._unmounted) { @@ -231,7 +231,7 @@ module.exports = React.createClass({ hsUrl = hsUrl || this.state.enteredHomeserverUrl; isUrl = isUrl || this.state.enteredIdentityServerUrl; - const fallbackHsUrl = hsUrl == this.props.defaultHsUrl ? this.props.fallbackHsUrl : null; + const fallbackHsUrl = hsUrl === this.props.defaultHsUrl ? this.props.fallbackHsUrl : null; const loginLogic = new Login(hsUrl, isUrl, fallbackHsUrl, { defaultDeviceDisplayName: this.props.defaultDeviceDisplayName, @@ -310,19 +310,27 @@ module.exports = React.createClass({ !this.state.enteredHomeserverUrl.startsWith("http")) ) { errorText = <span> - { - _t("Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. " + - "Either use HTTPS or <a>enable unsafe scripts</a>.", - {}, - { 'a': (sub) => { return <a href="https://www.google.com/search?&q=enable%20unsafe%20scripts">{ sub }</a>; } }, + { _t("Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. " + + "Either use HTTPS or <a>enable unsafe scripts</a>.", {}, + { + 'a': (sub) => { + return <a href="https://www.google.com/search?&q=enable%20unsafe%20scripts"> + { sub } + </a>; + }, + }, ) } </span>; } else { errorText = <span> - { - _t("Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.", - {}, - { 'a': (sub) => { return <a href={this.state.enteredHomeserverUrl}>{ sub }</a>; } }, + { _t("Can't connect to homeserver - please check your connectivity, ensure your " + + "<a>homeserver's SSL certificate</a> is trusted, and that a browser extension " + + "is not blocking requests.", {}, + { + 'a': (sub) => { + return <a href={this.state.enteredHomeserverUrl}>{ sub }</a>; + }, + }, ) } </span>; } @@ -386,21 +394,10 @@ module.exports = React.createClass({ </a>; } - let returnToAppJsx; - /* - // with the advent of ILAG I don't think we need this any more - if (this.props.onCancelClick) { - returnToAppJsx = - <a className="mx_Login_create" onClick={this.props.onCancelClick} href="#"> - { _t('Return to app') } - </a>; - } - */ - let serverConfig; let header; - if (!SdkConfig.get().disable_custom_urls) { + if (!SdkConfig.get()['disable_custom_urls']) { serverConfig = <ServerConfig ref="serverConfig" withToggleButton={true} customHsUrl={this.props.customHsUrl} @@ -443,7 +440,6 @@ module.exports = React.createClass({ { _t('Create an account') } </a> { loginAsGuestJsx } - { returnToAppJsx } { makeLanguageSelector() } <LoginFooter /> </div> diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index 377cffc576..409234e2ed 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -23,7 +23,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import sdk from '../../../index'; -import ServerConfig from '../../views/login/ServerConfig'; import MatrixClientPeg from '../../../MatrixClientPeg'; import RegistrationForm from '../../views/login/RegistrationForm'; import RtsClient from '../../../RtsClient'; @@ -64,6 +63,12 @@ module.exports = React.createClass({ onLoginClick: PropTypes.func.isRequired, onCancelClick: PropTypes.func, onServerConfigChange: PropTypes.func.isRequired, + + rtsClient: PropTypes.shape({ + getTeamsConfig: PropTypes.func.isRequired, + trackReferral: PropTypes.func.isRequired, + getTeam: PropTypes.func.isRequired, + }), }, getInitialState: function() { @@ -135,7 +140,7 @@ module.exports = React.createClass({ newState.isUrl = config.isUrl; } this.props.onServerConfigChange(config); - this.setState(newState, function() { + this.setState(newState, () => { this._replaceClient(); }); }, @@ -161,11 +166,11 @@ module.exports = React.createClass({ let msg = response.message || response.toString(); // can we give a better error message? if (response.required_stages && response.required_stages.indexOf('m.login.msisdn') > -1) { - let msisdn_available = false; + let msisdnAvailable = false; for (const flow of response.available_flows) { - msisdn_available |= flow.stages.indexOf('m.login.msisdn') > -1; + msisdnAvailable |= flow.stages.indexOf('m.login.msisdn') > -1; } - if (!msisdn_available) { + if (!msisdnAvailable) { msg = _t('This server does not support authentication with a phone number.'); } } @@ -244,7 +249,7 @@ module.exports = React.createClass({ return matrixClient.getPushers().then((resp)=>{ const pushers = resp.pushers; for (let i = 0; i < pushers.length; ++i) { - if (pushers[i].kind == 'email') { + if (pushers[i].kind === 'email') { const emailPusher = pushers[i]; emailPusher.data = { brand: this.props.brand }; matrixClient.setPusher(emailPusher).done(() => { @@ -269,7 +274,7 @@ module.exports = React.createClass({ errMsg = _t('Passwords don\'t match.'); break; case "RegistrationForm.ERR_PASSWORD_LENGTH": - errMsg = _t('Password too short (min %(MIN_PASSWORD_LENGTH)s).', {MIN_PASSWORD_LENGTH: MIN_PASSWORD_LENGTH}); + errMsg = _t('Password too short (min %(MIN_PASSWORD_LENGTH)s).', {MIN_PASSWORD_LENGTH}); break; case "RegistrationForm.ERR_EMAIL_INVALID": errMsg = _t('This doesn\'t look like a valid email address.'); @@ -355,7 +360,7 @@ module.exports = React.createClass({ registerBody = <Spinner />; } else { let serverConfigSection; - if (!SdkConfig.get().disable_custom_urls) { + if (!SdkConfig.get()['disable_custom_urls']) { serverConfigSection = ( <ServerConfig ref="serverConfig" withToggleButton={true} @@ -387,18 +392,6 @@ module.exports = React.createClass({ ); } - let returnToAppJsx; - /* - // with the advent of ILAG I don't think we need this any more - if (this.props.onCancelClick) { - returnToAppJsx = ( - <a className="mx_Login_create" onClick={this.props.onCancelClick} href="#"> - { _t('Return to app') } - </a> - ); - } - */ - let header; let errorText; // FIXME: remove hardcoded Status team tweaks at some point @@ -433,7 +426,6 @@ module.exports = React.createClass({ { registerBody } { signIn } { errorText } - { returnToAppJsx } { makeLanguageSelector() } <LoginFooter /> </div> From ca2937cd65e72a062ea3a803fe881092b7f8ef2b Mon Sep 17 00:00:00 2001 From: random <dictionary@tutamail.com> Date: Thu, 21 Jun 2018 15:38:16 +0000 Subject: [PATCH 325/480] Translated using Weblate (Italian) Currently translated at 100.0% (1197 of 1197 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 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d3f93acec5..ced3ba4db6 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1181,5 +1181,20 @@ "Replying": "Rispondere", "Popout widget": "Oggetto a comparsa", "Failed to indicate account erasure": "Impossibile indicare la cancellazione dell'account", - "Bulk Options": "Opzioni applicate in massa" + "Bulk Options": "Opzioni applicate in massa", + "Encrypting": "Cifratura...", + "Encrypted, not sent": "Cifrato, non inviato", + "Share Link to User": "Condividi link con utente", + "Share room": "Condividi stanza", + "Share Room": "Condividi stanza", + "Link to most recent message": "Link al messaggio più recente", + "Share User": "Condividi utente", + "Share Community": "Condividi comunità", + "Share Room Message": "Condividi messaggio stanza", + "Link to selected message": "Link al messaggio selezionato", + "COPY": "COPIA", + "Share Message": "Condividi messaggio", + "No Audio Outputs detected": "Nessuna uscita audio rilevata", + "Audio Output": "Uscita audio", + "Try the app first": "Prova prima l'app" } From 9d68c9e1a1d248011e3a1ad4276527dd3514a53f Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 22 Jun 2018 11:24:30 +0100 Subject: [PATCH 326/480] Logging & comment fix --- src/CallHandler.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index 55a05798af..a65d82fe85 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -429,6 +429,7 @@ function _startCallApp(roomId, type) { const widgetSessionId = Math.random().toString(36).substring(2); const confId = room.roomId.replace(/[^A-Za-z0-9]/g, '') + widgetSessionId; // NB. we can't just encodeURICompoent all of these because the $ signs need to be there + // (but currently the only thing that needs encoding is the confId) const queryString = [ 'confId='+encodeURIComponent(confId), 'isAudioConf='+(type === 'voice' ? 'true' : 'false'), @@ -460,7 +461,7 @@ function _startCallApp(roomId, type) { 'im.vector.modular.widgets', jitsiEvent, widgetId, - ).then(() => console.log('Sent state'), (e) => console.error(e)); + ).then(() => console.log('Sent jitsi widget state event'), (e) => console.error(e)); } // FIXME: Nasty way of making sure we only register From 9ee78de7e5ac0875a263e1a81fda61ede27cac15 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 12:05:46 +0100 Subject: [PATCH 327/480] pr iteration, don't assume js-sdk stores group stuff other than groupId Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/HtmlUtils.js | 3 ++- src/autocomplete/CommunityProvider.js | 24 ++++++------------------ 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js index 4f66468373..57be007209 100644 --- a/src/HtmlUtils.js +++ b/src/HtmlUtils.js @@ -223,7 +223,8 @@ const sanitizeHtmlParams = { case '+': attribs.href = '#/group/' + entity; break; - case '#': case '!': + case '#': + case '!': attribs.href = '#/room/' + entity; break; } diff --git a/src/autocomplete/CommunityProvider.js b/src/autocomplete/CommunityProvider.js index db4d52fae2..6b5438e8c8 100644 --- a/src/autocomplete/CommunityProvider.js +++ b/src/autocomplete/CommunityProvider.js @@ -58,33 +58,22 @@ export default class CommunityProvider extends AutocompleteProvider { let completions = []; const {command, range} = this.getCurrentCommand(query, selection, force); if (command) { - const joinedGroups = cli.getGroups().filter(({myMembership}) => myMembership !== 'invite'); + const joinedGroups = cli.getGroups().filter(({myMembership}) => myMembership === 'join'); - const groups = (await Promise.all(joinedGroups.map(async ({avatarUrl, groupId, name=''}) => { + const groups = (await Promise.all(joinedGroups.map(async ({groupId}) => { try { return FlairStore.getGroupProfileCached(cli, groupId); - } catch (e) { // if FlairStore failed, rely on js-sdk's store which lacks info + } catch (e) { // if FlairStore failed, fall back to just groupId return Promise.resolve({ - name, + name: '', groupId, - avatarUrl, - shortDescription: '', // js-sdk doesn't store this + avatarUrl: '', + shortDescription: '', }); } }))); this.matcher.setObjects(groups); - // this.matcher.setObjects(joinedGroups); - // this.matcher.setObjects(joinedGroups.map(({groupId}) => { - // const groupProfile = GroupStore.getSummary(groupId).profile; - // if (groupProfile) { - // return { - // groupId, - // name: groupProfile.name || '', - // avatarUrl: groupProfile.avatar_url, - // }; - // } - // })).filter(Boolean); const matchedString = command[0]; completions = this.matcher.match(matchedString); @@ -104,7 +93,6 @@ export default class CommunityProvider extends AutocompleteProvider { ), range, })) - .filter((completion) => !!completion.completion && completion.completion.length > 0) .slice(0, 4); } return completions; From d92d95c37d7d032520e7377c5e9f99e5481f6562 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 12:11:16 +0100 Subject: [PATCH 328/480] don't fall back to getGroups as it gets it no additional data Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/Pill.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index 70e1d0659a..b860f7bf72 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -152,8 +152,12 @@ const Pill = React.createClass({ try { group = await FlairStore.getGroupProfileCached(cli, resourceId); - } catch (e) { // if FlairStore failed, rely on js-sdk's store which lacks info - group = cli.getGroup(resourceId); + } catch (e) { // if FlairStore failed, fall back to just groupId + group = { + groupId: resourceId, + avatarUrl: null, + name: null, + }; } } } From f236b319cccb1804cbdd267d6afbb8a9fdf0f122 Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Fri, 15 Jun 2018 13:36:36 +0000 Subject: [PATCH 329/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1198 of 1198 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 ebf329b45b..1b8b32af4d 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1195,5 +1195,6 @@ "Share Room Message": "分享聊天室訊息", "Link to selected message": "連結到選定的訊息", "COPY": "複製", - "Share Message": "分享訊息" + "Share Message": "分享訊息", + "Jitsi Conference Calling": "Jitsi 會議通話" } From 32ab9972300983b691401374be47e24b1ca3ba36 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 14:36:29 +0100 Subject: [PATCH 330/480] properly style Group Pill Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/elements/_RichText.scss | 12 +++++++++++- res/themes/light/css/_base.scss | 1 + src/components/views/elements/Pill.js | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss index eda9f6a4de..e21fc184ba 100644 --- a/res/css/views/elements/_RichText.scss +++ b/res/css/views/elements/_RichText.scss @@ -37,12 +37,22 @@ /* More specific to override `.markdown-body a` color */ .mx_EventTile_content .markdown-body a.mx_RoomPill, -.mx_RoomPill { +.mx_EventTile_content .markdown-body a.mx_GroupPill, +.mx_RoomPill, +.mx_GroupPill { color: $accent-fg-color; background-color: $rte-room-pill-color; padding-right: 5px; } +/* More specific to override `.markdown-body a` color */ +.mx_EventTile_content .markdown-body a.mx_GroupPill, +.mx_GroupPill { + color: $accent-fg-color; + background-color: $rte-group-pill-color; + padding-right: 5px; +} + .mx_UserPill .mx_BaseAvatar, .mx_RoomPill .mx_BaseAvatar, .mx_GroupPill .mx_BaseAvatar, diff --git a/res/themes/light/css/_base.scss b/res/themes/light/css/_base.scss index 5d5f5d7c90..55c761e8d9 100644 --- a/res/themes/light/css/_base.scss +++ b/res/themes/light/css/_base.scss @@ -97,6 +97,7 @@ $voip-accept-color: #80f480; $rte-bg-color: #e9e9e9; $rte-code-bg-color: rgba(0, 0, 0, 0.04); $rte-room-pill-color: #aaa; +$rte-group-pill-color: #aaa; // ******************** diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index b860f7bf72..e14d6c37c9 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -260,7 +260,7 @@ const Pill = React.createClass({ avatar = <BaseAvatar name={name || groupId} width={16} height={16} url={avatarUrl ? cli.mxcUrlToHttp(avatarUrl, 16, 16) : null} />; } - pillClass = 'mx_RoomPill' || 'mx_GroupPill'; + pillClass = 'mx_GroupPill'; } } break; From 548a06cad2a77fbe33ad71b502be52c86fa59beb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 14:47:57 +0100 Subject: [PATCH 331/480] use JSX and import via sdk rather than directly Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/login/ForgotPassword.js | 5 +++-- src/components/structures/login/LanguageSelector.js | 2 +- src/components/structures/login/Login.js | 5 +++-- src/components/structures/login/Registration.js | 5 +++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/structures/login/ForgotPassword.js b/src/components/structures/login/ForgotPassword.js index bbee4c3207..7e0cd5da8e 100644 --- a/src/components/structures/login/ForgotPassword.js +++ b/src/components/structures/login/ForgotPassword.js @@ -24,7 +24,6 @@ import MatrixClientPeg from "../../../MatrixClientPeg"; import SdkConfig from "../../../SdkConfig"; import PasswordReset from "../../../PasswordReset"; -import makeLanguageSelector from "./LanguageSelector"; module.exports = React.createClass({ displayName: 'ForgotPassword', @@ -202,6 +201,8 @@ module.exports = React.createClass({ ); } + const LanguageSelector = sdk.getComponent('structures.login.LanguageSelector'); + resetPasswordJsx = ( <div> <div className="mx_Login_prompt"> @@ -236,7 +237,7 @@ module.exports = React.createClass({ <a className="mx_Login_create" onClick={this.props.onRegisterClick} href="#"> { _t('Create an account') } </a> - { makeLanguageSelector() } + <LanguageSelector /> <LoginFooter /> </div> </div> diff --git a/src/components/structures/login/LanguageSelector.js b/src/components/structures/login/LanguageSelector.js index 1e576bdbb8..965d8334d9 100644 --- a/src/components/structures/login/LanguageSelector.js +++ b/src/components/structures/login/LanguageSelector.js @@ -28,7 +28,7 @@ function onChange(newLang) { } } -export default function makeLanguageSelector() { +export default function LanguageSelector() { if (SdkConfig.get()['disable_login_language_selector']) return <div />; const LanguageDropdown = sdk.getComponent('views.elements.LanguageDropdown'); diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index c4a5b8ba57..bc04434bb2 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -25,7 +25,6 @@ import sdk from '../../../index'; import Login from '../../../Login'; import SdkConfig from '../../../SdkConfig'; import SettingsStore from "../../../settings/SettingsStore"; -import makeLanguageSelector from "./LanguageSelector"; // For validating phone numbers without country codes const PHONE_NUMBER_REGEX = /^[0-9()\-\s]*$/; @@ -427,6 +426,8 @@ module.exports = React.createClass({ ); } + const LanguageSelector = sdk.getComponent('structures.login.LanguageSelector'); + return ( <LoginPage> <div className="mx_Login_box"> @@ -440,7 +441,7 @@ module.exports = React.createClass({ { _t('Create an account') } </a> { loginAsGuestJsx } - { makeLanguageSelector() } + <LanguageSelector /> <LoginFooter /> </div> </div> diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index 409234e2ed..462063406f 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -29,7 +29,6 @@ import RtsClient from '../../../RtsClient'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; import SettingsStore from "../../../settings/SettingsStore"; -import makeLanguageSelector from "./LanguageSelector"; const MIN_PASSWORD_LENGTH = 6; @@ -413,6 +412,8 @@ module.exports = React.createClass({ ); } + const LanguageSelector = sdk.getComponent('structures.login.LanguageSelector'); + return ( <LoginPage> <div className="mx_Login_box"> @@ -426,7 +427,7 @@ module.exports = React.createClass({ { registerBody } { signIn } { errorText } - { makeLanguageSelector() } + <LanguageSelector /> <LoginFooter /> </div> </LoginPage> From f94ecf9ff5ca38ce82b65403f6c759347d45d41f Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 22 Jun 2018 18:08:57 +0100 Subject: [PATCH 332/480] Prepare changelog for v0.12.8-rc.2 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2120e18a31..6c497dc363 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +Changes in [0.12.8-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.8-rc.2) (2018-06-22) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.8-rc.1...v0.12.8-rc.2) + + * slash got consumed in the consolidation + [\#1998](https://github.com/matrix-org/matrix-react-sdk/pull/1998) + Changes in [0.12.8-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.8-rc.1) (2018-06-21) =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.7...v0.12.8-rc.1) From 64fc7d38409386468f34f415159208b4ef5d03f0 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 22 Jun 2018 18:08:57 +0100 Subject: [PATCH 333/480] v0.12.8-rc.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7da47f27c3..091158c035 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.8-rc.1", + "version": "0.12.8-rc.2", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 891070d001cd6570f6156b33d8d294704fb0995f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 01:16:01 +0100 Subject: [PATCH 334/480] update UrlPreview settings to be more privacy-aware in e2ee rooms Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomView.js | 24 +++++- .../views/room_settings/UrlPreviewSettings.js | 74 ++++++++++++------- 2 files changed, 68 insertions(+), 30 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 97e575ff4e..c465eff44b 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -618,10 +618,26 @@ module.exports = React.createClass({ } }, - _updatePreviewUrlVisibility: function(room) { - this.setState({ - showUrlPreview: SettingsStore.getValue("urlPreviewsEnabled", room.roomId), - }); + _updatePreviewUrlVisibility: function({roomId}) { + const levels = [ + SettingLevel.ROOM_DEVICE, + SettingLevel.ROOM_ACCOUNT, + ]; + let showUrlPreview; + if (MatrixClientPeg.get().isRoomEncrypted(roomId)) { + for (const level of levels) { + const value = SettingsStore.getValueAt(level, "urlPreviewsEnabled", roomId, true, true); + if (value === Boolean(value)) { // if is Boolean + showUrlPreview = value; + break; + } + } + + showUrlPreview = showUrlPreview || false; + } else { + showUrlPreview = SettingsStore.getValue("urlPreviewsEnabled", roomId); + } + this.setState({showUrlPreview}); }, onRoom: function(room) { diff --git a/src/components/views/room_settings/UrlPreviewSettings.js b/src/components/views/room_settings/UrlPreviewSettings.js index ed58d610aa..749167c0a5 100644 --- a/src/components/views/room_settings/UrlPreviewSettings.js +++ b/src/components/views/room_settings/UrlPreviewSettings.js @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Travis Ralston +Copyright 2018 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. @@ -15,6 +16,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import {MatrixClient} from "matrix-js-sdk"; const React = require('react'); import PropTypes from 'prop-types'; const sdk = require("../../../index"); @@ -29,6 +31,10 @@ module.exports = React.createClass({ room: PropTypes.object, }, + contextTypes: { + matrixClient: PropTypes.instanceOf(MatrixClient).isRequired, + }, + saveSettings: function() { const promises = []; if (this.refs.urlPreviewsRoom) promises.push(this.refs.urlPreviewsRoom.save()); @@ -39,36 +45,52 @@ module.exports = React.createClass({ render: function() { const SettingsFlag = sdk.getComponent("elements.SettingsFlag"); const roomId = this.props.room.roomId; + const isEncrypted = this.context.matrixClient.isRoomEncrypted(roomId); let previewsForAccount = null; - if (SettingsStore.getValueAt(SettingLevel.ACCOUNT, "urlPreviewsEnabled")) { - previewsForAccount = ( - _t("You have <a>enabled</a> URL previews by default.", {}, { 'a': (sub)=><a href="#/settings">{ sub }</a> }) - ); - } else { - previewsForAccount = ( - _t("You have <a>disabled</a> URL previews by default.", {}, { 'a': (sub)=><a href="#/settings">{ sub }</a> }) - ); - } - let previewsForRoom = null; - if (SettingsStore.canSetValue("urlPreviewsEnabled", roomId, "room")) { - previewsForRoom = ( - <label> - <SettingsFlag name="urlPreviewsEnabled" - level={SettingLevel.ROOM} - roomId={this.props.room.roomId} - isExplicit={true} - manualSave={true} - ref="urlPreviewsRoom" /> - </label> - ); - } else { - let str = _td("URL previews are enabled by default for participants in this room."); - if (!SettingsStore.getValueAt(SettingLevel.ROOM, "urlPreviewsEnabled", roomId, /*explicit=*/true)) { - str = _td("URL previews are disabled by default for participants in this room."); + + + if (!isEncrypted) { + // Only show account setting state and room state setting state in non-e2ee rooms where they apply + const accountEnabled = SettingsStore.getValueAt(SettingLevel.ACCOUNT, "urlPreviewsEnabled"); + if (accountEnabled) { + previewsForAccount = ( + _t("You have <a>enabled</a> URL previews by default.", {}, { + 'a': (sub)=><a href="#/settings">{ sub }</a>, + }) + ); + } else if (accountEnabled) { + previewsForAccount = ( + _t("You have <a>disabled</a> URL previews by default.", {}, { + 'a': (sub)=><a href="#/settings">{ sub }</a>, + }) + ); } - previewsForRoom = (<label>{ _t(str) }</label>); + + if (SettingsStore.canSetValue("urlPreviewsEnabled", roomId, "room")) { + previewsForRoom = ( + <label> + <SettingsFlag name="urlPreviewsEnabled" + level={SettingLevel.ROOM} + roomId={this.props.room.roomId} + isExplicit={true} + manualSave={true} + ref="urlPreviewsRoom" /> + </label> + ); + } else { + let str = _td("URL previews are enabled by default for participants in this room."); + if (!SettingsStore.getValueAt(SettingLevel.ROOM, "urlPreviewsEnabled", roomId, /*explicit=*/true)) { + str = _td("URL previews are disabled by default for participants in this room."); + } + previewsForRoom = (<label>{ _t(str) }</label>); + } + } else { + previewsForAccount = ( + _t("URL Previews default to off in End-to-End Encrypted rooms to protect your privacy. " + + "They are requested through your homeserver which could infer links which are otherwise encrypted") + ); } const previewsForRoomAccount = ( From a45dc837b4f7649c42cb5a8db42c3492a9496981 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 01:16:37 +0100 Subject: [PATCH 335/480] add copyright Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomView.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index c465eff44b..cf7d3f61e8 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -1,6 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd +Copyright 2018 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. From ed1f801254a85f2782b080740f516a9d675c49ac Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 01:18:21 +0100 Subject: [PATCH 336/480] add comment Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomView.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index cf7d3f61e8..e2de91c035 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -625,6 +625,7 @@ module.exports = React.createClass({ SettingLevel.ROOM_ACCOUNT, ]; let showUrlPreview; + // in e2ee rooms only care about room-device and room-account, so that user has to explicitly enable previews if (MatrixClientPeg.get().isRoomEncrypted(roomId)) { for (const level of levels) { const value = SettingsStore.getValueAt(level, "urlPreviewsEnabled", roomId, true, true); From ed4b82f8fc4ed8a2017f4d03998faf4eb570822d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jun 2018 01:40:16 +0100 Subject: [PATCH 337/480] update wording and style it like text (text cursor) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/room_settings/UrlPreviewSettings.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/views/room_settings/UrlPreviewSettings.js b/src/components/views/room_settings/UrlPreviewSettings.js index 749167c0a5..6d3c6317d9 100644 --- a/src/components/views/room_settings/UrlPreviewSettings.js +++ b/src/components/views/room_settings/UrlPreviewSettings.js @@ -88,8 +88,9 @@ module.exports = React.createClass({ } } else { previewsForAccount = ( - _t("URL Previews default to off in End-to-End Encrypted rooms to protect your privacy. " + - "They are requested through your homeserver which could infer links which are otherwise encrypted") + _t("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.") ); } @@ -105,8 +106,13 @@ module.exports = React.createClass({ return ( <div className="mx_RoomSettings_toggles"> <h3>{ _t("URL Previews") }</h3> - - <label>{ previewsForAccount }</label> + <div> + { _t('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.') } + </div> + <div> + { previewsForAccount } + </div> { previewsForRoom } <label>{ previewsForRoomAccount }</label> </div> From acbc84a69c3374319d33fa6551597d36d8049aa9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 18:44:54 +0100 Subject: [PATCH 338/480] switch to another settings key for e2e url previews to protect on change Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomView.js | 25 ++++--------------- .../views/room_settings/UrlPreviewSettings.js | 9 +++---- src/settings/Settings.js | 7 ++++++ 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index e2de91c035..af994d298f 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -620,26 +620,11 @@ module.exports = React.createClass({ }, _updatePreviewUrlVisibility: function({roomId}) { - const levels = [ - SettingLevel.ROOM_DEVICE, - SettingLevel.ROOM_ACCOUNT, - ]; - let showUrlPreview; - // in e2ee rooms only care about room-device and room-account, so that user has to explicitly enable previews - if (MatrixClientPeg.get().isRoomEncrypted(roomId)) { - for (const level of levels) { - const value = SettingsStore.getValueAt(level, "urlPreviewsEnabled", roomId, true, true); - if (value === Boolean(value)) { // if is Boolean - showUrlPreview = value; - break; - } - } - - showUrlPreview = showUrlPreview || false; - } else { - showUrlPreview = SettingsStore.getValue("urlPreviewsEnabled", roomId); - } - this.setState({showUrlPreview}); + // URL Previews in E2EE rooms can be a privacy leak so use a different setting which is per-room explicit + const key = MatrixClientPeg.get().isRoomEncrypted(roomId) ? 'urlPreviewsEnabled_e2ee' : 'urlPreviewsEnabled'; + this.setState({ + showUrlPreview: SettingsStore.getValue(key, roomId), + }); }, onRoom: function(room) { diff --git a/src/components/views/room_settings/UrlPreviewSettings.js b/src/components/views/room_settings/UrlPreviewSettings.js index 6d3c6317d9..fe2a2bacf4 100644 --- a/src/components/views/room_settings/UrlPreviewSettings.js +++ b/src/components/views/room_settings/UrlPreviewSettings.js @@ -50,7 +50,6 @@ module.exports = React.createClass({ let previewsForAccount = null; let previewsForRoom = null; - if (!isEncrypted) { // Only show account setting state and room state setting state in non-e2ee rooms where they apply const accountEnabled = SettingsStore.getValueAt(SettingLevel.ACCOUNT, "urlPreviewsEnabled"); @@ -73,7 +72,7 @@ module.exports = React.createClass({ <label> <SettingsFlag name="urlPreviewsEnabled" level={SettingLevel.ROOM} - roomId={this.props.room.roomId} + roomId={roomId} isExplicit={true} manualSave={true} ref="urlPreviewsRoom" /> @@ -94,10 +93,10 @@ module.exports = React.createClass({ ); } - const previewsForRoomAccount = ( - <SettingsFlag name="urlPreviewsEnabled" + const previewsForRoomAccount = ( // in an e2ee room we use a special key to enforce per-room opt-in + <SettingsFlag name={isEncrypted ? 'urlPreviewsEnabled_e2ee' : 'urlPreviewsEnabled'} level={SettingLevel.ROOM_ACCOUNT} - roomId={this.props.room.roomId} + roomId={roomId} manualSave={true} ref="urlPreviewsSelf" /> diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 40bb2dd57e..f9d258c6b8 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -238,6 +238,13 @@ export const SETTINGS = { }, default: true, }, + "urlPreviewsEnabled_e2ee": { + supportedLevels: ['room-device', 'room-account'], + displayName: { + "room-account": _td("Enable URL previews for this room (only affects you)"), + }, + default: false, + }, "roomColor": { supportedLevels: LEVELS_ROOM_SETTINGS_WITH_ROOM, displayName: _td("Room Colour"), From d4f9fec7073401f2f4cf60d6493911ceae32f81f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 18:48:48 +0100 Subject: [PATCH 339/480] run gen-i18n and prune-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/el.json | 1 - src/i18n/strings/en_EN.json | 96 +++++++++++++++++++------------------ src/i18n/strings/gl.json | 1 - src/i18n/strings/it.json | 1 - 4 files changed, 49 insertions(+), 50 deletions(-) diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index f6264ce8b0..c4514f629b 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -810,7 +810,6 @@ "%(widgetName)s widget removed by %(senderName)s": "Το widget %(widgetName)s αφαιρέθηκε από τον/την %(senderName)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 και άλλος ένας πληκτρολογούν", - "Message Replies": "Απαντήσεις", "Message Pinning": "Καρφίτσωμα Μηνυμάτων", "Hide avatar changes": "Απόκρυψη αλλαγών εικονιδίων χρηστών", "Hide display name changes": "Απόκρυψη αλλαγών εμφανιζόμενων ονομάτων", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 6d39586c0a..722596d978 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,6 +42,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -81,6 +85,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -114,19 +119,36 @@ "Room %(roomId)s not visible": "Room %(roomId)s not visible", "Missing user_id in request": "Missing user_id in request", "Usage": "Usage", + "Searches DuckDuckGo for results": "Searches DuckDuckGo for results", "/ddg is not a command": "/ddg is not a command", "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", + "Changes your display nickname": "Changes your display nickname", + "Changes colour scheme of current room": "Changes colour scheme of current room", + "Sets the room topic": "Sets the room topic", + "Invites user with given id to current room": "Invites user with given id to current room", + "Joins room with given alias": "Joins room with given alias", + "Leave room": "Leave room", "Unrecognised room alias:": "Unrecognised room alias:", + "Kicks user with given id": "Kicks user with given id", + "Bans user with given id": "Bans user with given id", + "Unbans user with given id": "Unbans user with given id", + "Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you", "Ignored user": "Ignored user", "You are now ignoring %(userId)s": "You are now ignoring %(userId)s", + "Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward", "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", + "Deops user with given id": "Deops user with given id", + "Opens the Developer Tools dialog": "Opens the Developer Tools dialog", + "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", "Unknown (user, device) pair:": "Unknown (user, device) pair:", "Device already verified!": "Device already verified!", "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!", "Verified key": "Verified key", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.", + "Displays action": "Displays action", "Unrecognised command:": "Unrecognised command:", "Reason": "Reason", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", @@ -177,11 +199,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -293,6 +310,31 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "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.", + "URL Previews": "URL Previews", + "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.", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -392,11 +434,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -497,7 +539,6 @@ "Muted Users": "Muted Users", "Banned users": "Banned users", "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers", - "Leave room": "Leave room", "Favourite": "Favourite", "Tagged as: ": "Tagged as: ", "To link to a room it must have <a>an address</a>.": "To link to a room it must have <a>an address</a>.", @@ -530,29 +571,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -1142,22 +1160,6 @@ "You need to enter a user name.": "You need to enter a user name.", "An unknown error occurred.": "An unknown error occurred.", "I already have an account": "I already have an account", - "Displays action": "Displays action", - "Bans user with given id": "Bans user with given id", - "Unbans user with given id": "Unbans user with given id", - "Define the power level of a user": "Define the power level of a user", - "Deops user with given id": "Deops user with given id", - "Invites user with given id to current room": "Invites user with given id to current room", - "Joins room with given alias": "Joins room with given alias", - "Sets the room topic": "Sets the room topic", - "Kicks user with given id": "Kicks user with given id", - "Changes your display nickname": "Changes your display nickname", - "Searches DuckDuckGo for results": "Searches DuckDuckGo for results", - "Changes colour scheme of current room": "Changes colour scheme of current room", - "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", - "Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you", - "Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward", - "Opens the Developer Tools dialog": "Opens the Developer Tools dialog", "Commands": "Commands", "Results from DuckDuckGo": "Results from DuckDuckGo", "Emoji": "Emoji", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 1080e66a26..57d8301df6 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -168,7 +168,6 @@ "Authentication check failed: incorrect password?": "Fallou a comprobación de autenticación: contrasinal incorrecto?", "Failed to join room": "Non se puido unir a sala", "Message Pinning": "Fixando mensaxe", - "Tag Panel": "Panel de etiquetas", "Disable Emoji suggestions while typing": "Desactivar a suxestión de Emoji mentres escribe", "Use compact timeline layout": "Utilizar a disposición compacta da liña temporal", "Hide removed messages": "Ocultar mensaxes eliminadas", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d3f93acec5..0957bc156d 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1175,7 +1175,6 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Per continuare a usare l'homeserver %(homeserverDomain)s devi leggere e accettare i nostri termini e condizioni.", "Review terms and conditions": "Leggi i termini e condizioni", "Muted Users": "Utenti silenziati", - "Message Replies": "Risposte", "Message Pinning": "Messaggi appuntati", "Mirror local video feed": "Feed video dai ripetitori locali", "Replying": "Rispondere", From d1600bdacf78ca5643c89dd37ce119066a095f06 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 19:17:31 +0100 Subject: [PATCH 340/480] fix event type which room-account settings were read from Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/settings/handlers/RoomAccountSettingsHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings/handlers/RoomAccountSettingsHandler.js b/src/settings/handlers/RoomAccountSettingsHandler.js index 74dbf9eed0..d0dadc2de7 100644 --- a/src/settings/handlers/RoomAccountSettingsHandler.js +++ b/src/settings/handlers/RoomAccountSettingsHandler.js @@ -74,7 +74,7 @@ export default class RoomAccountSettingsHandler extends SettingsHandler { return cli !== undefined && cli !== null; } - _getSettings(roomId, eventType = "im.vector.settings") { + _getSettings(roomId, eventType = "im.vector.web.settings") { const room = MatrixClientPeg.get().getRoom(roomId); if (!room) return null; From b7396c8ef00e9524b7d465dcd037c054f31353c9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 19:17:55 +0100 Subject: [PATCH 341/480] trigger urlPreviews state update on {,room}AccountData changes of settings Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomView.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index af994d298f..c6dcc556be 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -648,19 +648,23 @@ module.exports = React.createClass({ }, onAccountData: function(event) { - if (event.getType() === "org.matrix.preview_urls" && this.state.room) { + const type = event.getType(); + if ((type === "org.matrix.preview_urls" || type === "im.vector.web.settings") && this.state.room) { + // non-e2ee url previews are stored in legacy event type `org.matrix.room.preview_urls` this._updatePreviewUrlVisibility(this.state.room); } }, onRoomAccountData: function(event, room) { if (room.roomId == this.state.roomId) { - if (event.getType() === "org.matrix.room.color_scheme") { + const type = event.getType(); + if (type === "org.matrix.room.color_scheme") { const color_scheme = event.getContent(); // XXX: we should validate the event console.log("Tinter.tint from onRoomAccountData"); Tinter.tint(color_scheme.primary_color, color_scheme.secondary_color); - } else if (event.getType() === "org.matrix.room.preview_urls") { + } else if (type === "org.matrix.room.preview_urls" || type === "im.vector.web.settings") { + // non-e2ee url previews are stored in legacy event type `org.matrix.room.preview_urls` this._updatePreviewUrlVisibility(room); } } From b23f84e1f53aacf0cc719857862f9dedfcdc8a2f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 22 Jun 2018 19:23:39 +0100 Subject: [PATCH 342/480] add XXX comment Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/ContextualMenu.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index 8b88cae479..adc8dfd11c 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -96,6 +96,8 @@ export default class ContextualMenu extends React.Component { const x = e.clientX; const y = e.clientY; + // XXX: This isn't pretty but the only way to allow opening a different context menu on right click whilst + // a context menu and its click-guard are up without completely rewriting how the context menus work. setImmediate(() => { const clickEvent = document.createEvent('MouseEvents'); clickEvent.initMouseEvent( From aff2cc9065cad00b14a266bd59d927c7a1342f78 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 01:21:42 +0100 Subject: [PATCH 343/480] EventTile:notif apply EmojiText to room name Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/EventTile.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index aa2f28024e..537545c904 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -621,13 +621,14 @@ module.exports = withMatrixClient(React.createClass({ switch (this.props.tileShape) { case 'notif': { + const EmojiText = sdk.getComponent('elements.EmojiText'); const room = this.props.matrixClient.getRoom(this.props.mxEvent.getRoomId()); return ( <div className={classes}> <div className="mx_EventTile_roomName"> - <a href={permalink} onClick={this.onPermalinkClicked}> + <EmojiText element="a" href={permalink} onClick={this.onPermalinkClicked}> { room ? room.name : '' } - </a> + </EmojiText> </div> <div className="mx_EventTile_senderDetails"> { avatar } From 807d72f2d9150ac7f0aa40d0f252a1e9f2352121 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 01:22:38 +0100 Subject: [PATCH 344/480] nullguard SenderProfile,broke when NotifPanel had evs from forgotten rooms Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/SenderProfile.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/views/messages/SenderProfile.js b/src/components/views/messages/SenderProfile.js index 5ca2fc6ed8..a91bed8a73 100644 --- a/src/components/views/messages/SenderProfile.js +++ b/src/components/views/messages/SenderProfile.js @@ -72,14 +72,12 @@ export default React.createClass({ _updateRelatedGroups() { if (this.unmounted) return; - const relatedGroupsEvent = this.context.matrixClient - .getRoom(this.props.mxEvent.getRoomId()) - .currentState - .getStateEvents('m.room.related_groups', ''); + const room = this.context.matrixClient.getRoom(this.props.mxEvent.getRoomId()) + if (!room) return; + + const relatedGroupsEvent = room.currentState.getStateEvents('m.room.related_groups', ''); this.setState({ - relatedGroups: relatedGroupsEvent ? - relatedGroupsEvent.getContent().groups || [] - : [], + relatedGroups: relatedGroupsEvent ? relatedGroupsEvent.getContent().groups || [] : [], }); }, From f7a0ad3aa086478d81fc6395cffe3c3b3940aefb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 01:29:38 +0100 Subject: [PATCH 345/480] delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/SenderProfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/SenderProfile.js b/src/components/views/messages/SenderProfile.js index a91bed8a73..70c9c711fc 100644 --- a/src/components/views/messages/SenderProfile.js +++ b/src/components/views/messages/SenderProfile.js @@ -72,7 +72,7 @@ export default React.createClass({ _updateRelatedGroups() { if (this.unmounted) return; - const room = this.context.matrixClient.getRoom(this.props.mxEvent.getRoomId()) + const room = this.context.matrixClient.getRoom(this.props.mxEvent.getRoomId()); if (!room) return; const relatedGroupsEvent = room.currentState.getStateEvents('m.room.related_groups', ''); From ce04c745e51017281fa9daf40138ae5420a37a14 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 01:56:04 +0100 Subject: [PATCH 346/480] strip diacritics for user autocomplete Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/UserProvider.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index 85837d5ebb..92b27cd095 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -3,6 +3,7 @@ Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd Copyright 2017, 2018 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32,6 +33,10 @@ import type {SelectionRange} from "./Autocompleter"; const USER_REGEX = /@\S*/g; +function stripDiacritics(str: string): string { + return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); +} + export default class UserProvider extends AutocompleteProvider { users: Array<RoomMember> = null; room: Room = null; @@ -107,7 +112,7 @@ export default class UserProvider extends AutocompleteProvider { const fullMatch = command[0]; // Don't search if the query is a single "@" if (fullMatch && fullMatch !== '@') { - completions = this.matcher.match(fullMatch).map((user) => { + completions = this.matcher.match(stripDiacritics(fullMatch)).map((user) => { const displayName = (user.name || user.userId || '').replace(' (IRC)', ''); // FIXME when groups are done return { // Length of completion should equal length of text in decorator. draft-js @@ -141,8 +146,15 @@ export default class UserProvider extends AutocompleteProvider { } const currentUserId = MatrixClientPeg.get().credentials.userId; - this.users = this.room.getJoinedMembers().filter((member) => { - if (member.userId !== currentUserId) return true; + + this.users = []; + this.room.getJoinedMembers().forEach(({userId, name, ...rest}) => { + if (userId === currentUserId) return; // skip self + this.users.push({ + userId, + name: stripDiacritics(name), + ...rest, + }); }); this.users = _sortBy(this.users, (member) => From 104e8d9cbac47cead2ad46ccfbc0743f34700eaa Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 02:00:36 +0100 Subject: [PATCH 347/480] delint and add flow annotations to make my editor happy Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/UserProvider.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index 92b27cd095..9fc59e578d 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -27,9 +27,9 @@ import FuzzyMatcher from './FuzzyMatcher'; import _sortBy from 'lodash/sortBy'; import MatrixClientPeg from '../MatrixClientPeg'; -import type {Room, RoomMember} from 'matrix-js-sdk'; +import type {MatrixEvent, Room, RoomMember, RoomState} from 'matrix-js-sdk'; import {makeUserPermalink} from "../matrix-to"; -import type {SelectionRange} from "./Autocompleter"; +import type {Completion, SelectionRange} from "./Autocompleter"; const USER_REGEX = /@\S*/g; @@ -49,7 +49,7 @@ export default class UserProvider extends AutocompleteProvider { this.matcher = new FuzzyMatcher([], { keys: ['name', 'userId'], shouldMatchPrefix: true, - shouldMatchWordsOnly: false + shouldMatchWordsOnly: false, }); this._onRoomTimelineBound = this._onRoomTimeline.bind(this); @@ -66,7 +66,7 @@ export default class UserProvider extends AutocompleteProvider { } } - _onRoomTimeline(ev, room, toStartOfTimeline, removed, data) { + _onRoomTimeline(ev: MatrixEvent, room: Room, toStartOfTimeline: boolean, removed: boolean, data: Object) { if (!room) return; if (removed) return; if (room.roomId !== this.room.roomId) return; @@ -82,7 +82,7 @@ export default class UserProvider extends AutocompleteProvider { this.onUserSpoke(ev.sender); } - _onRoomStateMember(ev, state, member) { + _onRoomStateMember(ev: MatrixEvent, state: RoomState, member: RoomMember) { // ignore members in other rooms if (member.roomId !== this.room.roomId) { return; @@ -92,7 +92,7 @@ export default class UserProvider extends AutocompleteProvider { this.users = null; } - async getCompletions(query: string, selection: SelectionRange, force?: boolean = false) { + async getCompletions(query: string, selection: SelectionRange, force?: boolean = false): Array<Completion> { const MemberAvatar = sdk.getComponent('views.avatars.MemberAvatar'); // Disable autocompletions when composing commands because of various issues @@ -133,7 +133,7 @@ export default class UserProvider extends AutocompleteProvider { return completions; } - getName() { + getName(): string { return '👥 ' + _t('Users'); } From 54bccd20160356ef96ce17c8ce1f946399582124 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 02:10:31 +0100 Subject: [PATCH 348/480] make Accent Insensitive match more generic and apply to rooms too Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/Autocompleter.js | 4 ++++ src/autocomplete/RoomProvider.js | 4 +++- src/autocomplete/UserProvider.js | 5 +---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/autocomplete/Autocompleter.js b/src/autocomplete/Autocompleter.js index f5fec4c502..b8988e889f 100644 --- a/src/autocomplete/Autocompleter.js +++ b/src/autocomplete/Autocompleter.js @@ -43,6 +43,10 @@ export type Completion = { href: ?string, }; +export function stripDiacritics(str: string): string { + return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); +} + const PROVIDERS = [ UserProvider, RoomProvider, diff --git a/src/autocomplete/RoomProvider.js b/src/autocomplete/RoomProvider.js index c222ae95d4..e4cc9567a0 100644 --- a/src/autocomplete/RoomProvider.js +++ b/src/autocomplete/RoomProvider.js @@ -2,6 +2,7 @@ Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd Copyright 2017, 2018 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -27,6 +28,7 @@ import sdk from '../index'; import _sortBy from 'lodash/sortBy'; import {makeRoomPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; +import {stripDiacritics} from "./Autocompleter"; const ROOM_REGEX = /(?=#)(\S*)/g; @@ -71,7 +73,7 @@ export default class RoomProvider extends AutocompleteProvider { }; })); const matchedString = command[0]; - completions = this.matcher.match(matchedString); + completions = this.matcher.match(stripDiacritics(matchedString)); completions = _sortBy(completions, [ (c) => score(matchedString, c.displayedAlias), (c) => c.displayedAlias.length, diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index 9fc59e578d..c98304fff8 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -30,13 +30,10 @@ import MatrixClientPeg from '../MatrixClientPeg'; import type {MatrixEvent, Room, RoomMember, RoomState} from 'matrix-js-sdk'; import {makeUserPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; +import {stripDiacritics} from "./Autocompleter"; const USER_REGEX = /@\S*/g; -function stripDiacritics(str: string): string { - return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); -} - export default class UserProvider extends AutocompleteProvider { users: Array<RoomMember> = null; room: Room = null; From 7cdc91856be44c6d5be92c6ccbe72c6e0259751a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 02:12:01 +0100 Subject: [PATCH 349/480] retain pre-stripped text so it can be used for rendering Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/RoomProvider.js | 3 ++- src/autocomplete/UserProvider.js | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/autocomplete/RoomProvider.js b/src/autocomplete/RoomProvider.js index e4cc9567a0..a72cc3fce2 100644 --- a/src/autocomplete/RoomProvider.js +++ b/src/autocomplete/RoomProvider.js @@ -45,7 +45,7 @@ export default class RoomProvider extends AutocompleteProvider { constructor() { super(ROOM_REGEX); this.matcher = new FuzzyMatcher([], { - keys: ['displayedAlias', 'name'], + keys: ['displayedAlias', '_name'], }); } @@ -69,6 +69,7 @@ export default class RoomProvider extends AutocompleteProvider { return { room: room, name: room.name, + _name: stripDiacritics(room.name), displayedAlias: getDisplayAliasForRoom(room), }; })); diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index c98304fff8..42fcb5899b 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -40,11 +40,11 @@ export default class UserProvider extends AutocompleteProvider { constructor(room: Room) { super(USER_REGEX, { - keys: ['name'], + keys: ['_name'], }); this.room = room; this.matcher = new FuzzyMatcher([], { - keys: ['name', 'userId'], + keys: ['_name', 'userId'], shouldMatchPrefix: true, shouldMatchWordsOnly: false, }); @@ -149,7 +149,8 @@ export default class UserProvider extends AutocompleteProvider { if (userId === currentUserId) return; // skip self this.users.push({ userId, - name: stripDiacritics(name), + name, + _name: stripDiacritics(name), ...rest, }); }); From 6a84a7ab323f26e4ab5ee2ba99ced6558b43efdd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 02:20:41 +0100 Subject: [PATCH 350/480] apply stripDiacritics to QueryMatcher instead of individually Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/Autocompleter.js | 4 ---- src/autocomplete/QueryMatcher.js | 16 +++++++++++----- src/autocomplete/RoomProvider.js | 7 ++----- src/autocomplete/UserProvider.js | 23 +++++------------------ 4 files changed, 18 insertions(+), 32 deletions(-) diff --git a/src/autocomplete/Autocompleter.js b/src/autocomplete/Autocompleter.js index b8988e889f..f5fec4c502 100644 --- a/src/autocomplete/Autocompleter.js +++ b/src/autocomplete/Autocompleter.js @@ -43,10 +43,6 @@ export type Completion = { href: ?string, }; -export function stripDiacritics(str: string): string { - return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); -} - const PROVIDERS = [ UserProvider, RoomProvider, diff --git a/src/autocomplete/QueryMatcher.js b/src/autocomplete/QueryMatcher.js index 762b285685..9d4d4d0598 100644 --- a/src/autocomplete/QueryMatcher.js +++ b/src/autocomplete/QueryMatcher.js @@ -1,6 +1,7 @@ //@flow /* Copyright 2017 Aviral Dasgupta +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -27,6 +28,10 @@ class KeyMap { priorityMap = new Map(); } +function stripDiacritics(str: string): string { + return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); +} + export default class QueryMatcher { /** * @param {object[]} objects the objects to perform a match on @@ -46,10 +51,11 @@ export default class QueryMatcher { objects.forEach((object, i) => { const keyValues = _at(object, keys); for (const keyValue of keyValues) { - if (!map.hasOwnProperty(keyValue)) { - map[keyValue] = []; + const key = stripDiacritics(keyValue).toLowerCase(); + if (!map.hasOwnProperty(key)) { + map[key] = []; } - map[keyValue].push(object); + map[key].push(object); } keyMap.priorityMap.set(object, i); }); @@ -82,7 +88,7 @@ export default class QueryMatcher { } match(query: String): Array<Object> { - query = query.toLowerCase(); + query = stripDiacritics(query).toLowerCase(); if (this.options.shouldMatchWordsOnly) { query = query.replace(/[^\w]/g, ''); } @@ -91,7 +97,7 @@ export default class QueryMatcher { } const results = []; this.keyMap.keys.forEach((key) => { - let resultKey = key.toLowerCase(); + let resultKey = key; if (this.options.shouldMatchWordsOnly) { resultKey = resultKey.replace(/[^\w]/g, ''); } diff --git a/src/autocomplete/RoomProvider.js b/src/autocomplete/RoomProvider.js index a72cc3fce2..c222ae95d4 100644 --- a/src/autocomplete/RoomProvider.js +++ b/src/autocomplete/RoomProvider.js @@ -2,7 +2,6 @@ Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd Copyright 2017, 2018 New Vector Ltd -Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -28,7 +27,6 @@ import sdk from '../index'; import _sortBy from 'lodash/sortBy'; import {makeRoomPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; -import {stripDiacritics} from "./Autocompleter"; const ROOM_REGEX = /(?=#)(\S*)/g; @@ -45,7 +43,7 @@ export default class RoomProvider extends AutocompleteProvider { constructor() { super(ROOM_REGEX); this.matcher = new FuzzyMatcher([], { - keys: ['displayedAlias', '_name'], + keys: ['displayedAlias', 'name'], }); } @@ -69,12 +67,11 @@ export default class RoomProvider extends AutocompleteProvider { return { room: room, name: room.name, - _name: stripDiacritics(room.name), displayedAlias: getDisplayAliasForRoom(room), }; })); const matchedString = command[0]; - completions = this.matcher.match(stripDiacritics(matchedString)); + completions = this.matcher.match(matchedString); completions = _sortBy(completions, [ (c) => score(matchedString, c.displayedAlias), (c) => c.displayedAlias.length, diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index 42fcb5899b..9c2fb58084 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -30,7 +30,6 @@ import MatrixClientPeg from '../MatrixClientPeg'; import type {MatrixEvent, Room, RoomMember, RoomState} from 'matrix-js-sdk'; import {makeUserPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; -import {stripDiacritics} from "./Autocompleter"; const USER_REGEX = /@\S*/g; @@ -40,11 +39,11 @@ export default class UserProvider extends AutocompleteProvider { constructor(room: Room) { super(USER_REGEX, { - keys: ['_name'], + keys: ['name'], }); this.room = room; this.matcher = new FuzzyMatcher([], { - keys: ['_name', 'userId'], + keys: ['name', 'userId'], shouldMatchPrefix: true, shouldMatchWordsOnly: false, }); @@ -109,7 +108,7 @@ export default class UserProvider extends AutocompleteProvider { const fullMatch = command[0]; // Don't search if the query is a single "@" if (fullMatch && fullMatch !== '@') { - completions = this.matcher.match(stripDiacritics(fullMatch)).map((user) => { + completions = this.matcher.match(fullMatch).map((user) => { const displayName = (user.name || user.userId || '').replace(' (IRC)', ''); // FIXME when groups are done return { // Length of completion should equal length of text in decorator. draft-js @@ -143,21 +142,9 @@ export default class UserProvider extends AutocompleteProvider { } const currentUserId = MatrixClientPeg.get().credentials.userId; + this.users = this.room.getJoinedMembers().filter(({userId}) => userId !== currentUserId); - this.users = []; - this.room.getJoinedMembers().forEach(({userId, name, ...rest}) => { - if (userId === currentUserId) return; // skip self - this.users.push({ - userId, - name, - _name: stripDiacritics(name), - ...rest, - }); - }); - - this.users = _sortBy(this.users, (member) => - 1E20 - lastSpoken[member.userId] || 1E20, - ); + this.users = _sortBy(this.users, (member) => 1E20 - lastSpoken[member.userId] || 1E20); this.matcher.setObjects(this.users); } From 917c655a9f8ded002ac0f65432c425b8ade7094f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Fri, 15 Jun 2018 16:09:24 +0000 Subject: [PATCH 351/480] Translated using Weblate (French) Currently translated at 100.0% (1198 of 1198 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 8843ad89ca..1aec3ca8ec 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1195,5 +1195,6 @@ "Share Room Message": "Partager le message du salon", "Link to selected message": "Lien vers le message sélectionné", "COPY": "COPIER", - "Share Message": "Partager le message" + "Share Message": "Partager le message", + "Jitsi Conference Calling": "Appel en téléconférence Jitsi" } From eccc17fc69f589d39c8944dd7bc72da64fd64485 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Sun, 17 Jun 2018 08:34:45 +0000 Subject: [PATCH 352/480] Translated using Weblate (Basque) Currently translated at 100.0% (1198 of 1198 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 1abaec65c7..9abb39cdb2 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1195,5 +1195,6 @@ "COPY": "KOPIATU", "Share Message": "Partekatu mezua", "No Audio Outputs detected": "Ez da audio irteerarik antzeman", - "Audio Output": "Audio irteera" + "Audio Output": "Audio irteera", + "Jitsi Conference Calling": "Jitsi konferentzia deia" } From 346a3353de71b210f16a185041d82ea911ada47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=BE=20=D0=9C=2E=20=D0=9A=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=9B?= <marko.m.kostic@gmail.com> Date: Sat, 23 Jun 2018 09:04:00 +0000 Subject: [PATCH 353/480] Translated using Weblate (Serbian) Currently translated at 100.0% (1198 of 1198 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sr/ --- src/i18n/strings/sr.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 6d217d5349..ec46986d09 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -1177,5 +1177,24 @@ "Terms and Conditions": "Услови коришћења", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Да бисте наставили са коришћењем Кућног сервера %(homeserverDomain)s морате погледати и пристати на наше услове коришћења.", "Review terms and conditions": "Погледај услове коришћења", - "Try the app first": "Пробајте прво апликацију" + "Try the app first": "Пробајте прво апликацију", + "Jitsi Conference Calling": "Jitsi конференцијско позивање", + "Encrypting": "Шифрујем", + "Encrypted, not sent": "Шифровано, непослато", + "Share Link to User": "Подели везу са корисником", + "Share room": "Подели собу", + "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. <b>This action is irreversible.</b>": "Ово ће учинити ваш налог трајно неупотребљивим. Нећете моћи да се пријавите и нико се неће моћи поново регистровати са истим корисничким ИБ-јем. Ово ће учинити да ваш налог напусти све собе у којима учествује и уклониће појединости вашег налога са идентитетског сервера. <b>Ова радња се не може опозвати.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Деактивирањем вашег налога се <b>ваше поруке неће заборавити.</b> Ако желите да заборавимо ваше поруке, штиклирајте кућицу испод.", + "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 (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Заборавите све моје поруке које сам послао када се мој налог деактивира (<b>Упозорење:</b> овим ће будући корисници видети непотпуне разговоре)", + "Share Room": "Подели собу", + "Link to most recent message": "Веза ка најновијој поруци", + "Share User": "Подели корисника", + "Share Community": "Подели заједницу", + "Share Room Message": "Подели поруку у соби", + "Link to selected message": "Веза ка изабраној поруци", + "COPY": "КОПИРАЈ", + "Share Message": "Подели поруку", + "No Audio Outputs detected": "Нема уочених аудио излаза", + "Audio Output": "Излаз звука" } From ec12b6dce0473825507ae6a97782956ee8e59b66 Mon Sep 17 00:00:00 2001 From: Miguel Branco <mgl.branco@gmail.com> Date: Mon, 18 Jun 2018 21:04:42 +0000 Subject: [PATCH 354/480] Translated using Weblate (Galician) Currently translated at 100.0% (1198 of 1198 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 1080e66a26..2e774207e2 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1196,5 +1196,6 @@ "Review terms and conditions": "Revise os termos e condicións", "No Audio Outputs detected": "Non se detectou unha saída de audio", "Audio Output": "Saída de audio", - "Try the app first": "Probe a aplicación primeiro" + "Try the app first": "Probe a aplicación primeiro", + "Jitsi Conference Calling": "Chamada para conferencia con Jitsi" } From eb80022991ef793253c34e25600948d91b26ea47 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 16:40:27 +0100 Subject: [PATCH 355/480] focus composer after interacting with e2ee statusbar/udd Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomStatusBar.js | 3 +++ src/cryptodevices.js | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 8034923158..36f4719abb 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -25,6 +25,7 @@ import MatrixClientPeg from '../../MatrixClientPeg'; import MemberAvatar from '../views/avatars/MemberAvatar'; import Resend from '../../Resend'; import * as cryptodevices from '../../cryptodevices'; +import dis from '../../dispatcher'; const STATUS_BAR_HIDDEN = 0; const STATUS_BAR_EXPANDED = 1; @@ -157,10 +158,12 @@ module.exports = React.createClass({ _onResendAllClick: function() { Resend.resendUnsentEvents(this.props.room); + dis.dispatch({action: 'focus_composer'}); }, _onCancelAllClick: function() { Resend.cancelUnsentEvents(this.props.room); + dis.dispatch({action: 'focus_composer'}); }, _onShowDevicesClick: function() { diff --git a/src/cryptodevices.js b/src/cryptodevices.js index c0b7e3da6e..d11aa47cda 100644 --- a/src/cryptodevices.js +++ b/src/cryptodevices.js @@ -16,6 +16,7 @@ limitations under the License. import Resend from './Resend'; import sdk from './index'; +import dis from './dispatcher'; import Modal from './Modal'; import { _t } from './languageHandler'; @@ -65,6 +66,10 @@ export function getUnknownDevicesForRoom(matrixClient, room) { }); } +function focusComposer() { + dis.dispatch({action: 'focus_composer'}); +} + /** * Show the UnknownDeviceDialog for a given room. The dialog will inform the user * that messages they sent to this room have not been sent due to unknown devices @@ -86,6 +91,7 @@ export function showUnknownDeviceDialogForMessages(matrixClient, room) { sendAnywayLabel: _t("Send anyway"), sendLabel: _t("Send"), onSend: onSendClicked, + onFinished: focusComposer, }, 'mx_Dialog_unknownDevice'); }); } From e1ba6949d0d6ce9474ab559828a407120d16e7f1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 16:40:53 +0100 Subject: [PATCH 356/480] expand composer input focus region and apply cursor:text to it Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/rooms/_MessageComposer.scss | 1 + src/components/views/rooms/MessageComposerInput.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index 0a708a8edc..f1de103d3b 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -70,6 +70,7 @@ limitations under the License. flex: 1; display: flex; flex-direction: column; + cursor: text; } .mx_MessageComposer_input { diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 8477176cc2..90a14d72fc 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -157,6 +157,7 @@ export default class MessageComposerInput extends React.Component { this.setDisplayedCompletion = this.setDisplayedCompletion.bind(this); this.onMarkdownToggleClicked = this.onMarkdownToggleClicked.bind(this); this.onTextPasted = this.onTextPasted.bind(this); + this.focusComposer = this.focusComposer.bind(this); const isRichtextEnabled = SettingsStore.getValue('MessageComposerInput.isRichTextEnabled'); @@ -270,13 +271,12 @@ export default class MessageComposerInput extends React.Component { } onAction = (payload) => { - const editor = this.refs.editor; let contentState = this.state.editorState.getCurrentContent(); switch (payload.action) { case 'reply_to_event': case 'focus_composer': - editor.focus(); + this.focusComposer(); break; case 'insert_mention': { // Pretend that we've autocompleted this user because keeping two code @@ -319,7 +319,7 @@ export default class MessageComposerInput extends React.Component { let editorState = EditorState.push(this.state.editorState, contentState, 'insert-characters'); editorState = EditorState.moveSelectionToEnd(editorState); this.onEditorContentChanged(editorState); - editor.focus(); + this.focusComposer(); } } break; @@ -1155,6 +1155,10 @@ export default class MessageComposerInput extends React.Component { this.handleKeyCommand('toggle-mode'); }; + focusComposer() { + this.refs.editor.focus(); + } + render() { const activeEditorState = this.state.originalEditorState || this.state.editorState; @@ -1179,7 +1183,7 @@ export default class MessageComposerInput extends React.Component { activeEditorState.getCurrentContent().getBlocksAsArray()); return ( - <div className="mx_MessageComposer_input_wrapper"> + <div className="mx_MessageComposer_input_wrapper" onClick={this.focusComposer}> <div className="mx_MessageComposer_autocomplete_wrapper"> <ReplyPreview /> <Autocomplete From 15e75ca7b34fc428073bdc6b8c58ac00b8017200 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 17:12:00 +0100 Subject: [PATCH 357/480] generate local errors for blank fields during login Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/login/Login.js | 8 ++++ src/components/views/login/PasswordLogin.js | 51 +++++++++++++++++---- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index bc04434bb2..43264e7003 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -93,6 +93,13 @@ module.exports = React.createClass({ this._unmounted = true; }, + onPasswordLoginError: function(errorText) { + this.setState({ + errorText, + loginIncorrect: Boolean(errorText), + }); + }, + onPasswordLogin: function(username, phoneCountry, phoneNumber, password) { this.setState({ busy: true, @@ -357,6 +364,7 @@ module.exports = React.createClass({ return ( <PasswordLogin onSubmit={this.onPasswordLogin} + onError={this.onPasswordLoginError} initialUsername={this.state.username} initialPhoneCountry={this.state.phoneCountry} initialPhoneNumber={this.state.phoneNumber} diff --git a/src/components/views/login/PasswordLogin.js b/src/components/views/login/PasswordLogin.js index 71dfbe2c36..c30cb9d72a 100644 --- a/src/components/views/login/PasswordLogin.js +++ b/src/components/views/login/PasswordLogin.js @@ -28,6 +28,7 @@ import SdkConfig from '../../../SdkConfig'; */ class PasswordLogin extends React.Component { static defaultProps = { + onError: function() {}, onUsernameChanged: function() {}, onPasswordChanged: function() {}, onPhoneCountryChanged: function() {}, @@ -70,19 +71,48 @@ class PasswordLogin extends React.Component { onSubmitForm(ev) { ev.preventDefault(); - if (this.state.loginType === PasswordLogin.LOGIN_FIELD_PHONE) { - this.props.onSubmit( - '', // XXX: Synapse breaks if you send null here: - this.state.phoneCountry, - this.state.phoneNumber, - this.state.password, - ); + + let username = ''; // XXX: Synapse breaks if you send null here: + let phoneCountry = null; + let phoneNumber = null; + let error; + + switch (this.state.loginType) { + case PasswordLogin.LOGIN_FIELD_EMAIL: + username = this.state.username; + if (!username) { + error = _t('The email field must not be blank.'); + } + break; + case PasswordLogin.LOGIN_FIELD_MXID: + username = this.state.username; + if (!username) { + error = _t('The user name field must not be blank.'); + } + break; + case PasswordLogin.LOGIN_FIELD_PHONE: + phoneCountry = this.state.phoneCountry; + phoneNumber = this.state.phoneNumber; + if (!phoneNumber) { + error = _t('The phone number field must not be blank.'); + } + break; + } + + if (error) { + this.props.onError(error); return; } + + if (!this.state.password) { + this.props.onError(_t('The password field must not be blank.')); + return; + } + this.props.onSubmit( - this.state.username, - null, - null, + username, + phoneCountry, + phoneNumber, this.state.password, ); } @@ -258,6 +288,7 @@ PasswordLogin.LOGIN_FIELD_PHONE = "login_field_phone"; PasswordLogin.propTypes = { onSubmit: PropTypes.func.isRequired, // fn(username, password) + onError: PropTypes.func, onForgotPasswordClick: PropTypes.func, // fn() initialUsername: PropTypes.string, initialPhoneCountry: PropTypes.string, From 4a5fbf2c84705de650daa22e8b78c4d490ae59c2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 17:13:40 +0100 Subject: [PATCH 358/480] clear error on login type change Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/login/PasswordLogin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/login/PasswordLogin.js b/src/components/views/login/PasswordLogin.js index c30cb9d72a..16bd339825 100644 --- a/src/components/views/login/PasswordLogin.js +++ b/src/components/views/login/PasswordLogin.js @@ -123,6 +123,7 @@ class PasswordLogin extends React.Component { } onLoginTypeChange(loginType) { + this.props.onError(null); // send a null error to clear any error messages this.setState({ loginType: loginType, username: "", // Reset because email and username use the same state From 61def4a973359b5ffce2d2f92e6006000c2f70f1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 17:26:16 +0100 Subject: [PATCH 359/480] highlight top field if blank otherwise the password field. remove unused refs Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/login/PasswordLogin.js | 27 +++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/views/login/PasswordLogin.js b/src/components/views/login/PasswordLogin.js index 16bd339825..a0e5ab0ddb 100644 --- a/src/components/views/login/PasswordLogin.js +++ b/src/components/views/login/PasswordLogin.js @@ -57,15 +57,17 @@ class PasswordLogin extends React.Component { this.onPhoneCountryChanged = this.onPhoneCountryChanged.bind(this); this.onPhoneNumberChanged = this.onPhoneNumberChanged.bind(this); this.onPasswordChanged = this.onPasswordChanged.bind(this); + this.isLoginEmpty = this.isLoginEmpty.bind(this); } componentWillMount() { this._passwordField = null; + this._loginField = null; } componentWillReceiveProps(nextProps) { if (!this.props.loginIncorrect && nextProps.loginIncorrect) { - field_input_incorrect(this._passwordField); + field_input_incorrect(this.isLoginEmpty() ? this._loginField : this._passwordField); } } @@ -157,8 +159,10 @@ class PasswordLogin extends React.Component { switch (loginType) { case PasswordLogin.LOGIN_FIELD_EMAIL: classes.mx_Login_email = true; + classes.error = this.props.loginIncorrect && !this.state.username; return <input className={classNames(classes)} + ref={(e) => {this._loginField = e;}} key="email_input" type="text" name="username" // make it a little easier for browser's remember-password @@ -170,8 +174,10 @@ class PasswordLogin extends React.Component { />; case PasswordLogin.LOGIN_FIELD_MXID: classes.mx_Login_username = true; + classes.error = this.props.loginIncorrect && !this.state.username; return <input className={classNames(classes)} + ref={(e) => {this._loginField = e;}} key="username_input" type="text" name="username" // make it a little easier for browser's remember-password @@ -184,14 +190,14 @@ class PasswordLogin extends React.Component { autoFocus disabled={disabled} />; - case PasswordLogin.LOGIN_FIELD_PHONE: + case PasswordLogin.LOGIN_FIELD_PHONE: { const CountryDropdown = sdk.getComponent('views.login.CountryDropdown'); classes.mx_Login_phoneNumberField = true; classes.mx_Login_field_has_prefix = true; + classes.error = this.props.loginIncorrect && !this.state.phoneNumber; return <div className="mx_Login_phoneSection"> <CountryDropdown className="mx_Login_phoneCountry mx_Login_field_prefix" - ref="phone_country" onOptionChange={this.onPhoneCountryChanged} value={this.state.phoneCountry} isSmall={true} @@ -200,7 +206,7 @@ class PasswordLogin extends React.Component { /> <input className={classNames(classes)} - ref="phoneNumber" + ref={(e) => {this._loginField = e;}} key="phone_input" type="text" name="phoneNumber" @@ -211,6 +217,17 @@ class PasswordLogin extends React.Component { disabled={disabled} /> </div>; + } + } + } + + isLoginEmpty() { + switch (this.state.loginType) { + case PasswordLogin.LOGIN_FIELD_EMAIL: + case PasswordLogin.LOGIN_FIELD_MXID: + return !this.state.username; + case PasswordLogin.LOGIN_FIELD_PHONE: + return !this.state.phoneCountry || !this.state.phoneNumber; } } @@ -238,7 +255,7 @@ class PasswordLogin extends React.Component { const pwFieldClass = classNames({ mx_Login_field: true, mx_Login_field_disabled: matrixIdText === '', - error: this.props.loginIncorrect, + error: this.props.loginIncorrect && !this.isLoginEmpty(), // only error password if error isn't top field }); const Dropdown = sdk.getComponent('elements.Dropdown'); From 8251de4e35af64b3fcb41b62d031e47fdb59d605 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 17:26:44 +0100 Subject: [PATCH 360/480] run gen-i18n and prune-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/el.json | 1 - src/i18n/strings/en_EN.json | 64 ++++++++++++++++++++----------------- src/i18n/strings/gl.json | 1 - src/i18n/strings/it.json | 1 - 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index f6264ce8b0..c4514f629b 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -810,7 +810,6 @@ "%(widgetName)s widget removed by %(senderName)s": "Το widget %(widgetName)s αφαιρέθηκε από τον/την %(senderName)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 και άλλος ένας πληκτρολογούν", - "Message Replies": "Απαντήσεις", "Message Pinning": "Καρφίτσωμα Μηνυμάτων", "Hide avatar changes": "Απόκρυψη αλλαγών εικονιδίων χρηστών", "Hide display name changes": "Απόκρυψη αλλαγών εμφανιζόμενων ονομάτων", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index da47140c96..21dfc87ad2 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,6 +42,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -81,6 +85,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -194,11 +199,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -311,6 +311,29 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -410,11 +433,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -547,29 +570,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -614,6 +614,10 @@ "Code": "Code", "Start authentication": "Start authentication", "powered by Matrix": "powered by Matrix", + "The email field must not be blank.": "The email field must not be blank.", + "The user name field must not be blank.": "The user name field must not be blank.", + "The phone number field must not be blank.": "The phone number field must not be blank.", + "The password field must not be blank.": "The password field must not be blank.", "Username on %(hs)s": "Username on %(hs)s", "User name": "User name", "Mobile phone number": "Mobile phone number", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 1080e66a26..57d8301df6 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -168,7 +168,6 @@ "Authentication check failed: incorrect password?": "Fallou a comprobación de autenticación: contrasinal incorrecto?", "Failed to join room": "Non se puido unir a sala", "Message Pinning": "Fixando mensaxe", - "Tag Panel": "Panel de etiquetas", "Disable Emoji suggestions while typing": "Desactivar a suxestión de Emoji mentres escribe", "Use compact timeline layout": "Utilizar a disposición compacta da liña temporal", "Hide removed messages": "Ocultar mensaxes eliminadas", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d3f93acec5..0957bc156d 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1175,7 +1175,6 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Per continuare a usare l'homeserver %(homeserverDomain)s devi leggere e accettare i nostri termini e condizioni.", "Review terms and conditions": "Leggi i termini e condizioni", "Muted Users": "Utenti silenziati", - "Message Replies": "Risposte", "Message Pinning": "Messaggi appuntati", "Mirror local video feed": "Feed video dai ripetitori locali", "Replying": "Rispondere", From 6e0db5bfb6bb04f19b4aeb15943118433dfc3db4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 17:41:50 +0100 Subject: [PATCH 361/480] use enum constants for EventStatus and correct isSent check Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/context_menus/MessageContextMenu.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index 59cdb61fd6..4802244c74 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -15,10 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - import React from 'react'; import PropTypes from 'prop-types'; +import {EventStatus} from 'matrix-js-sdk'; import MatrixClientPeg from '../../../MatrixClientPeg'; import dis from '../../../dispatcher'; @@ -220,7 +219,10 @@ module.exports = React.createClass({ let replyButton; let collapseReplyThread; - if (eventStatus === 'not_sent') { + // status is SENT before remote-echo, null after + const isSent = !eventStatus || eventStatus === EventStatus.SENT; + + if (eventStatus === EventStatus.NOT_SENT) { resendButton = ( <div className="mx_MessageContextMenu_field" onClick={this.onResendClick}> { _t('Resend') } @@ -228,7 +230,7 @@ module.exports = React.createClass({ ); } - if (!eventStatus && this.state.canRedact) { + if (isSent && this.state.canRedact) { redactButton = ( <div className="mx_MessageContextMenu_field" onClick={this.onRedactClick}> { _t('Remove') } @@ -236,7 +238,7 @@ module.exports = React.createClass({ ); } - if (eventStatus === "queued" || eventStatus === "not_sent") { + if (eventStatus === EventStatus.QUEUED || eventStatus === EventStatus.NOT_SENT) { cancelButton = ( <div className="mx_MessageContextMenu_field" onClick={this.onCancelSendClick}> { _t('Cancel Sending') } @@ -244,7 +246,7 @@ module.exports = React.createClass({ ); } - if (!eventStatus && this.props.mxEvent.getType() === 'm.room.message') { + if (isSent && this.props.mxEvent.getType() === 'm.room.message') { const content = this.props.mxEvent.getContent(); if (content.msgtype && content.msgtype !== 'm.bad.encrypted' && content.hasOwnProperty('body')) { forwardButton = ( From 7b1ac9b75434e1acd222f4e3de3b1a3c9d2538a2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 19:28:42 +0100 Subject: [PATCH 362/480] upgrade minimum version of linkifyjs for more TLD support Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33aa428d4b..74f97bad9c 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "glob": "^5.0.14", "highlight.js": "^9.0.0", "isomorphic-fetch": "^2.2.1", - "linkifyjs": "^2.1.3", + "linkifyjs": "^2.1.6", "lodash": "^4.13.1", "lolex": "2.3.2", "matrix-js-sdk": "0.10.4", From 2d11d6dcc03b75ee117a57beb05cc18887419e39 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 19:28:48 +0100 Subject: [PATCH 363/480] accept repeated TLDs Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/linkify-matrix.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index d72319948a..e36450b07f 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -70,6 +70,8 @@ function matrixLinkify(linkify) { S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_HASH_NAME_COLON_DOMAIN); S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_ROOMALIAS); + S_ROOMALIAS.on(TT.DOT, S_HASH_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) + const USERID = function(value) { MultiToken.call(this, value); @@ -111,6 +113,8 @@ function matrixLinkify(linkify) { S_AT_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_AT_NAME_COLON_DOMAIN); S_AT_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_USERID); + S_USERID.on(TT.DOT, S_AT_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) + const GROUPID = function(value) { MultiToken.call(this, value); @@ -151,6 +155,8 @@ function matrixLinkify(linkify) { S_PLUS_NAME_COLON_DOMAIN.on(TT.DOT, S_PLUS_NAME_COLON_DOMAIN_DOT); S_PLUS_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_PLUS_NAME_COLON_DOMAIN); S_PLUS_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_GROUPID); + + S_GROUPID.on(TT.DOT, S_PLUS_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) } // stubs, overwritten in MatrixChat's componentDidMount From 1d2945036f29650208547a26f7134b242073c0f8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 23 Jun 2018 19:42:03 +0100 Subject: [PATCH 364/480] allow TLD to come anywhere in the domain, because `com` isn't JUST a TLD Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/linkify-matrix.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index e36450b07f..132695b9de 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -66,6 +66,7 @@ function matrixLinkify(linkify) { S_HASH_NAME_COLON.on(TT.DOMAIN, S_HASH_NAME_COLON_DOMAIN); S_HASH_NAME_COLON.on(TT.LOCALHOST, S_ROOMALIAS); // accept #foo:localhost + S_HASH_NAME_COLON.on(TT.TLD, S_ROOMALIAS); // accept #foo:com (mostly for (TLD|DOMAIN)+ mixing) S_HASH_NAME_COLON_DOMAIN.on(TT.DOT, S_HASH_NAME_COLON_DOMAIN_DOT); S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_HASH_NAME_COLON_DOMAIN); S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_ROOMALIAS); @@ -109,6 +110,7 @@ function matrixLinkify(linkify) { S_AT_NAME_COLON.on(TT.DOMAIN, S_AT_NAME_COLON_DOMAIN); S_AT_NAME_COLON.on(TT.LOCALHOST, S_USERID); // accept @foo:localhost + S_AT_NAME_COLON.on(TT.TLD, S_USERID); // accept @foo:com (mostly for (TLD|DOMAIN)+ mixing) S_AT_NAME_COLON_DOMAIN.on(TT.DOT, S_AT_NAME_COLON_DOMAIN_DOT); S_AT_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_AT_NAME_COLON_DOMAIN); S_AT_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_USERID); @@ -152,6 +154,7 @@ function matrixLinkify(linkify) { S_PLUS_NAME_COLON.on(TT.DOMAIN, S_PLUS_NAME_COLON_DOMAIN); S_PLUS_NAME_COLON.on(TT.LOCALHOST, S_GROUPID); // accept +foo:localhost + S_PLUS_NAME_COLON.on(TT.TLD, S_GROUPID); // accept +foo:com (mostly for (TLD|DOMAIN)+ mixing) S_PLUS_NAME_COLON_DOMAIN.on(TT.DOT, S_PLUS_NAME_COLON_DOMAIN_DOT); S_PLUS_NAME_COLON_DOMAIN_DOT.on(TT.DOMAIN, S_PLUS_NAME_COLON_DOMAIN); S_PLUS_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_GROUPID); From fcda7f4d40337bc05f4a7dc73bcd929b66ca78d9 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Thu, 21 Jun 2018 09:50:06 +0000 Subject: [PATCH 365/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1198 of 1198 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 90bfc3c94a..56025bb00c 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1195,5 +1195,6 @@ "COPY": "КОПИРАЙ", "Share Message": "Сподели съобщението", "No Audio Outputs detected": "Не са открити аудио изходи", - "Audio Output": "Аудио изходи" + "Audio Output": "Аудио изходи", + "Jitsi Conference Calling": "Jitsi конферентни разговори" } From f21f7eff4592a149536f3fbd00c22fd198d1832c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 25 Jun 2018 09:32:51 +0100 Subject: [PATCH 366/480] add word boundary to Community,Room,User provider regexps to stop the autocompleter firing mid-word and remove any unused capture groups Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/autocomplete/CommunityProvider.js | 3 ++- src/autocomplete/RoomProvider.js | 3 ++- src/autocomplete/UserProvider.js | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/autocomplete/CommunityProvider.js b/src/autocomplete/CommunityProvider.js index 6b5438e8c8..6bcf1a02fd 100644 --- a/src/autocomplete/CommunityProvider.js +++ b/src/autocomplete/CommunityProvider.js @@ -1,5 +1,6 @@ /* Copyright 2018 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +27,7 @@ import {makeGroupPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; import FlairStore from "../stores/FlairStore"; -const COMMUNITY_REGEX = /(?=\+)(\S*)/g; +const COMMUNITY_REGEX = /\B\+\S*/g; function score(query, space) { const index = space.indexOf(query); diff --git a/src/autocomplete/RoomProvider.js b/src/autocomplete/RoomProvider.js index c222ae95d4..4e41a4221a 100644 --- a/src/autocomplete/RoomProvider.js +++ b/src/autocomplete/RoomProvider.js @@ -2,6 +2,7 @@ Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd Copyright 2017, 2018 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -28,7 +29,7 @@ import _sortBy from 'lodash/sortBy'; import {makeRoomPermalink} from "../matrix-to"; import type {Completion, SelectionRange} from "./Autocompleter"; -const ROOM_REGEX = /(?=#)(\S*)/g; +const ROOM_REGEX = /\B#\S*/g; function score(query, space) { const index = space.indexOf(query); diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index 85837d5ebb..97cbae2e63 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -3,6 +3,7 @@ Copyright 2016 Aviral Dasgupta Copyright 2017 Vector Creations Ltd Copyright 2017, 2018 New Vector Ltd +Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -30,7 +31,7 @@ import type {Room, RoomMember} from 'matrix-js-sdk'; import {makeUserPermalink} from "../matrix-to"; import type {SelectionRange} from "./Autocompleter"; -const USER_REGEX = /@\S*/g; +const USER_REGEX = /\B@\S*/g; export default class UserProvider extends AutocompleteProvider { users: Array<RoomMember> = null; From a17455545297948f6bc9a54569d6fca9b94d9cda Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 25 Jun 2018 09:41:28 +0100 Subject: [PATCH 367/480] hide RoomSubList if has 0 tiles and either searchFilter or emptyContent Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 33ff17caa4..025c2b2e08 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -1,6 +1,7 @@ /* -Copyright 2017 Vector Creations Ltd Copyright 2015, 2016 OpenMarket Ltd +Copyright 2017 Vector Creations Ltd +Copyright 2018 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. @@ -349,8 +350,14 @@ var RoomSubList = React.createClass({ var label = this.props.collapsed ? null : this.props.label; let content; - if (this.state.sortedList.length === 0 && !this.props.searchFilter && this.props.extraTiles.length === 0) { - content = this.props.emptyContent; + if (this.state.sortedList.length === 0 && this.props.extraTiles.length === 0) { + // if no search filter is applied and there is a placeholder defined then show it, otherwise show nothing + if (!this.props.searchFilter && this.props.emptyContent) { + content = this.props.emptyContent; + } else { + // don't show an empty sublist + return null; + } } else { content = this.makeRoomTiles(); content.push(...this.props.extraTiles); From e1f82f41204b789026e99775348c643982b578e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Kozio=C5=82?= <translate.riot.im@www.koziolek.biz> Date: Sun, 24 Jun 2018 17:03:11 +0000 Subject: [PATCH 368/480] Translated using Weblate (Polish) Currently translated at 93.8% (1124 of 1198 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 | 179 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 173 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 0088028aed..1fffff1b87 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -752,9 +752,9 @@ "Unnamed room": "Pokój bez nazwy", "Guests can join": "Goście mogą dołączyć", "Remove avatar": "Usuń awatar", - "Drop here to favourite": "Upuść to aby dodać do ulubionych", - "Drop here to restore": "Upuść tu aby przywrócić", - "Drop here to demote": "Upuść tu aby zdegradować", + "Drop here to favourite": "Upuść tutaj aby dodać do ulubionych", + "Drop here to restore": "Upuść tutaj aby przywrócić", + "Drop here to demote": "Upuść tutaj aby zdegradować", "You have been kicked from this room by %(userName)s.": "Zostałeś usunięty z tego pokoju przez %(userName)s.", "You have been banned from this room by %(userName)s.": "Zostałeś zbanowany z tego pokoju przez %(userName)s.", "You are trying to access a room.": "Próbujesz uzyskać dostęp do pokoju.", @@ -937,8 +937,8 @@ "An email has been sent to %(emailAddress)s": "Email został wysłany do %(emailAddress)s", "A text message has been sent to %(msisdn)s": "Wysłano wiadomość tekstową do %(msisdn)s", "Code": "Kod", - "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Pomóż nam ulepszyć Riot.im wysyłając <UsageDataLink>anonimowe dane analityczne</ UsageDataLink>. Spowoduje to użycie pliku cookie (zobacz naszą <PolicyLink>Politykę plików cookie</ PolicyLink>).", - "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Pomóż nam ulepszyć Riot.im wysyłając <UsageDataLink>anonimowe dane analityczne</ UsageDataLink>. Spowoduje to użycie pliku cookie.", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Pomóż nam ulepszyć Riot.im wysyłając <UsageDataLink>anonimowe dane analityczne</UsageDataLink>. Spowoduje to użycie pliku cookie (zobacz naszą <PolicyLink>Politykę plików cookie</PolicyLink>).", + "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Pomóż nam ulepszyć Riot.im wysyłając <UsageDataLink>anonimowe dane analityczne</UsageDataLink>. Spowoduje to użycie pliku cookie.", "Yes, I want to help!": "Tak, chcę pomóc!", "Warning: This widget might use cookies.": "Uwaga: Ten widżet może używać ciasteczek.", "Delete Widget": "Usuń widżet", @@ -955,5 +955,172 @@ "Advanced options": "Opcje zaawansowane", "To continue, please enter your password:": "Aby kontynuować, proszę wprowadzić swoje hasło:", "password": "hasło", - "Refresh": "Odśwież" + "Refresh": "Odśwież", + "Which officially provided instance you are using, if any": "Jakiej oficjalnej instancji używasz, jeżeli w ogóle", + "Every page you use in the app": "Każda strona, której używasz w aplikacji", + "e.g. <CurrentPageURL>": "np. <CurrentPageURL>", + "Your User Agent": "Identyfikator Twojej przeglądarki", + "Your device resolution": "Twoja rozdzielczość ekranu", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Dane identyfikujące, takie jak: pokój, identyfikator użytkownika lub grupy, są usuwane przed wysłaniem na serwer.", + "Who would you like to add to this community?": "Kogo chcesz dodać do tej społeczności?", + "Missing roomId.": "Brak identyfikatora pokoju (roomId).", + "Ignores a user, hiding their messages from you": "Ignoruje użytkownika ukrywając jego wiadomości przed Tobą", + "Stops ignoring a user, showing their messages going forward": "Przestaje ignorować użytkownika, zaczynaj pokazywać jego wiadomości od tego momentu", + "Opens the Developer Tools dialog": "Otwiera narzędzia deweloperskie", + "Encrypting": "Szyfrowanie", + "Encrypted, not sent": "Zaszyfrowane, nie wysłane", + "Disinvite this user?": "Anulować zaproszenie tego użytkownika?", + "Unignore": "Przestań ignorować", + "Jump to read receipt": "Przeskocz do potwierdzenia odczytu", + "Share Link to User": "Udostępnij link do użytkownika", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "W tej chwili nie można odpowiedzieć plikiem, więc zostanie wysłany nie będąc odpowiedzią.", + "Unable to reply": "Nie udało się odpowiedzieć", + "At this time it is not possible to reply with an emote.": "W tej chwili nie można odpowiedzieć emotikoną.", + "Replying": "Odpowiadanie", + "Share room": "Udostępnij pokój", + "Drop here to tag direct chat": "Upuść tutaj aby oznaczyć jako rozmowę bezpośrednią", + "Community Invites": "Zaproszenia do społeczności", + "To change the room's history visibility, you must be a": "Aby zmienić widoczność historii pokoju, musisz być", + "To change the permissions in the room, you must be a": "Aby zmienić uprawnienia pokoju, musisz być", + "To change the topic, you must be a": "Aby zmienić temat, musisz być", + "To modify widgets in the room, you must be a": "Aby modyfikować widżety w tym pokoju, musisz być", + "Banned by %(displayName)s": "Zbanowany przez %(displayName)s", + "To send messages, you must be a": "Aby wysyłać wiadomości, musisz być", + "To invite users into the room, you must be a": "Aby zapraszać użytkowników do pokoju, musisz być", + "To configure the room, you must be a": "Aby konfigurować pokój, musisz być", + "To kick users, you must be a": "Aby wyrzucać użytkowników, musisz być", + "To ban users, you must be a": "Aby blokować użytkowników, musisz być", + "To remove other users' messages, you must be a": "Aby usuwać wiadomości innych użytkowników, musisz być", + "To notify everyone in the room, you must be a": "Aby powiadamiać wszystkich w pokoju, musisz być", + "Muted Users": "Wyciszeni użytkownicy", + "To send events of type <eventType/>, you must be a": "Aby wysyłać zdarzenia typu <eventType/>, musisz być", + "Addresses": "Adresy", + "Invalid community ID": "Błędne ID społeczności", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' nie jest poprawnym ID społeczności", + "New community ID (e.g. +foo:%(localDomain)s)": "Nowe ID społeczności (np. +bla:%(localDomain)s)", + "URL previews are enabled by default for participants in this room.": "Podglądy linków są domyślnie włączone dla uczestników tego pokoju.", + "URL previews are disabled by default for participants in this room.": "Podglądy linków są domyślnie wyłączone dla uczestników tego pokoju.", + "Username on %(hs)s": "Nazwa użytkownika na %(hs)s", + "Remove from community": "Usuń ze społeczności", + "Disinvite this user from community?": "Anulować zaproszenie tego użytkownika ze społeczności?", + "Remove this user from community?": "Usunąć tego użytkownika ze społeczności?", + "Failed to withdraw invitation": "Nie udało się wycofać zaproszenia", + "Failed to remove user from community": "Nie udało się usunąć użytkownika ze społeczności", + "Filter community members": "Filtruj członków społeczności", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Czy na pewno chcesz usunąć '%(roomName)s' z %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "Usunięcie pokoju ze społeczności spowoduje także jego usunięcie ze strony społeczności.", + "Failed to remove room from community": "Nie udało się usunąć pokoju ze społeczności", + "Failed to remove '%(roomName)s' from %(groupId)s": "Nie udało się usunąć '%(roomName)s' z %(groupId)s", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Widoczność '%(roomName)s' w %(groupId)s nie może być zaktualizowana.", + "Visibility in Room List": "Widoczność na liście pokojów", + "Visible to everyone": "Widoczny dla wszystkich", + "Only visible to community members": "Widoczny tylko dla członków społeczności", + "Filter community rooms": "Filtruj pokoje społeczności", + "Something went wrong when trying to get your communities.": "Coś poszło nie tak podczas pobierania Twoich społeczności.", + "You're not currently a member of any communities.": "Nie jesteś obecnie członkiem żadnej społeczności.", + "Minimize apps": "Zminimalizuj aplikacje", + "Reload widget": "Przeładuj widżet", + "Picture": "Zdjęcie", + "Matrix Room ID": "ID pokoju Matrix", + "You have entered an invalid address.": "Podałeś nieprawidłowy adres.", + "Try using one of the following valid address types: %(validTypesList)s.": "Spróbuj użyć jednego z następujących poprawnych typów adresów: %(validTypesList)s.", + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Błędy Riot śledzone są na GitHubie: <a>utwórz nowe zgłoszenie</a>.", + "Community IDs cannot not be empty.": "ID społeczności nie może być puste.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "ID społeczności może zawierać tylko znaki a-z, 0-9 lub '=_-./'", + "Something went wrong whilst creating your community": "Coś poszło nie tak podczas tworzenia Twojej społeczności", + "Create Community": "Utwórz społeczność", + "Community Name": "Nazwa społeczności", + "Community ID": "ID społeczności", + "Block users on other matrix homeservers from joining this room": "Blokuj użytkowników z innych serwerów Matrix przed dołączaniem do tego pokoju", + "This setting cannot be changed later!": "Tego ustawienia nie można zmienić później!", + "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. <b>This action is irreversible.</b>": "To sprawi, że Twoje konto stanie się na stałe niezdatne do użytku. Nie będziesz mógł się zalogować i nikt nie będzie mógł ponownie zarejestrować tego samego identyfikatora użytkownika. Spowoduje to, że Twoje konto opuści wszystkie pokoje, w których uczestniczy, i usunie dane Twojego konta z serwera tożsamości. <b>Ta czynność jest nieodwracalna.</b>", + "Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "Dezaktywacja konta <b>domyślnie nie powoduje, że skasowania wysłanych wiadomości.</b> Jeśli chcesz, abyśmy zapomnieli o Twoich wiadomościach, zaznacz pole poniżej.", + "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.": "Widoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapomnienie wiadomości oznacza, że wysłane wiadomości nie będą udostępniane żadnym nowym lub niezarejestrowanym użytkownikom, ale zarejestrowani użytkownicy, którzy już mają dostęp do tych wiadomości, nadal będą mieli dostęp do ich kopii.", + "Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Proszę zapomnieć o wszystkich wiadomościach, które wysłałem, gdy moje konto jest wyłączone (<b>Ostrzeżenie:</b> spowoduje to, że przyszli użytkownicy zobaczą niepełny obraz rozmów)", + "Log out and remove encryption keys?": "Wylogować i usunąć klucze szyfrujące?", + "Clear Storage and Sign Out": "Wyczyść pamięć i wyloguj się", + "Send Logs": "Wyślij dzienniki", + "We encountered an error trying to restore your previous session.": "Napotkaliśmy błąd podczas przywracania poprzedniej sesji.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Wyczyszczenie pamięci przeglądarki może rozwiązać problem, ale wyloguje Cię i spowoduje, że jakakolwiek zaszyfrowana historia czatu stanie się nieczytelna.", + "Share Room": "Udostępnij pokój", + "Link to most recent message": "Link do najnowszej wiadomości", + "Share User": "Udostępnij użytkownika", + "Share Community": "Udostępnij Społeczność", + "Share Room Message": "Udostępnij wiadomość w pokoju", + "Link to selected message": "Link do zaznaczonej wiadomości", + "COPY": "KOPIUJ", + "Unable to reject invite": "Nie udało się odrzucić zaproszenia", + "Share Message": "Udostępnij wiadomość", + "Collapse Reply Thread": "Zwiń wątek odpowiedzi", + "<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>Strona HTML dla Twojej Społeczności</h1>\n<p>\n Skorzystaj z długiego opisu aby wprowadzić nowych członków do Społeczności lub rozpowszechnić ważne <a href=\"blabla\">linki</a>.\n</p>\n<p>\n Możesz nawet używać tagów 'img'.\n</p>\n", + "Add rooms to the community summary": "Dodaj pokoje do podsumowania Społeczności", + "Which rooms would you like to add to this summary?": "Które pokoje chcesz dodać do tego podsumowania?", + "Add to summary": "Dodaj do podsumowania", + "Failed to add the following rooms to the summary of %(groupId)s:": "Nie udało się dodać następujących pokojów do podsumowania %(groupId)s:", + "Add a Room": "Dodaj pokój", + "Failed to remove the room from the summary of %(groupId)s": "Nie udało się usunąć pokoju z podsumowania %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "Pokój '%(roomName)s' nie mógł być usunięty z podsumowania.", + "Add users to the community summary": "Dodaj użytkowników do podsumowania Społeczności", + "Who would you like to add to this summary?": "Kogo chcesz dodać do tego podsumowania?", + "Failed to add the following users to the summary of %(groupId)s:": "Nie udało się dodać następujących użytkowników do podsumowania %(groupId)s:", + "Add a User": "Dodaj użytkownika", + "Failed to remove a user from the summary of %(groupId)s": "Nie udało się usunąć użytkownika z podsumowania %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "Użytkownik '%(displayName)s' nie mógł być usunięty z podsumowania.", + "Failed to update community": "Nie udało się zaktualizować Społeczności", + "Unable to accept invite": "Nie udało się zaakceptować zaproszenia", + "Unable to join community": "Nie udało się dołączyć do Społeczności", + "Leave Community": "Opuść Społeczność", + "Leave %(groupName)s?": "Opuścić %(groupName)s?", + "Unable to leave community": "Nie udało się opuścić Społeczności", + "Community Settings": "Ustawienia Społeczności", + "Changes made to your community <bold1>name</bold1> and <bold2>avatar</bold2> might not be seen by other users for up to 30 minutes.": "Zmiany <bold1>nazwy</bold1> oraz <bold2>awataru</bold2> Twojej Społeczności mogą nie być widoczne przez innych użytkowników nawet przez 30 minut.", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Te pokoje są wyświetlane członkom społeczności na stronie społeczności. Członkowie społeczności mogą dołączyć do pokoi, klikając je.", + "%(inviter)s has invited you to join this community": "%(inviter)s zaprosił Cię do przyłączenia się do tej Społeczności", + "Join this community": "Dołącz do tej Społeczności", + "Leave this community": "Opuść tę Społeczność", + "You are an administrator of this community": "Jesteś administratorem tej Społeczności", + "You are a member of this community": "Jesteś członkiem tej społeczności", + "Who can join this community?": "Kto może dołączyć do tej Społeczności?", + "Everyone": "Każdy", + "Your community hasn't got a Long Description, a HTML page to show to community members.<br />Click here to open settings and give it one!": "Twoja Społeczność nie ma długiego opisu, strony HTML, która będzie wyświetlana członkom społeczności.<br />Kliknij tutaj, aby otworzyć ustawienia i nadać jej jakąś!", + "Long Description (HTML)": "Długi opis (HTML)", + "Description": "Opis", + "Community %(groupId)s not found": "Społeczność %(groupId)s nie znaleziona", + "This Home server does not support communities": "Ten serwer domowy nie wspiera Społeczności", + "Failed to load %(groupId)s": "Nie udało się załadować %(groupId)s", + "This room is not public. You will not be able to rejoin without an invite.": "Ten pokój nie jest publiczny. Nie będziesz w stanie do niego dołączyć bez zaproszenia.", + "Can't leave Server Notices room": "Nie można opuścić pokoju powiadomień serwera", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ten pokój jest używany do ważnych wiadomości z serwera domowego, więc nie możesz go opuścić.", + "Terms and Conditions": "Warunki użytkowania", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Aby kontynuować używanie serwera domowego %(homeserverDomain)s musisz przejrzeć i zaakceptować nasze warunki użytkowania.", + "Review terms and conditions": "Przejrzyj warunki użytkowania", + "Old cryptography data detected": "Wykryto stare dane kryptograficzne", + "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.": "Dane ze starszej wersji Riot zostały wykryte. Spowoduje to błędne działanie kryptografii typu end-to-end w starszej wersji. Wiadomości szyfrowane end-to-end wymieniane ostatnio podczas korzystania ze starszej wersji mogą być niemożliwe do odszyfrowywane w tej wersji. Może to również spowodować niepowodzenie wiadomości wymienianych z tą wersją. Jeśli wystąpią problemy, wyloguj się i zaloguj ponownie. Aby zachować historię wiadomości, wyeksportuj i ponownie zaimportuj klucze.", + "Your Communities": "Twoje Społeczności", + "Did you know: you can use communities to filter your Riot.im experience!": "Czy wiesz, że: możesz używać Społeczności do filtrowania swoich doświadczeń z Riot.im!", + "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.": "Aby ustawić filtr, przeciągnij awatar Społeczności do panelu filtra po lewej stronie ekranu. Możesz kliknąć awatar w panelu filtra w dowolnym momencie, aby zobaczyć tylko pokoje i osoby powiązane z tą społecznością.", + "Error whilst fetching joined communities": "Błąd podczas pobierania dołączonych społeczności", + "Create a new community": "Utwórz nową Społeczność", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Utwórz Społeczność, aby grupować użytkowników i pokoje! Zbuduj niestandardową stronę główną, aby zaznaczyć swoją przestrzeń we wszechświecie Matrix.", + "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Pokaż urządzenia</showDevicesText>, <sendAnywayText>wyślij mimo to</sendAnywayText> lub <cancelText>anuluj</cancelText>.", + "%(count)s of your messages have not been sent.|one": "Twoja wiadomość nie została wysłana.", + "There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Nikogo tu nie ma! Czy chcesz <inviteText>zaprosić inne osoby</inviteText> lub <nowarnText>przestać ostrzegać o pustym pokoju</nowarnText>?", + "Clear filter": "Wyczyść filtr", + "Light theme": "Jasny motyw", + "Dark theme": "Ciemny motyw", + "Status.im theme": "Motyw Status.im", + "Ignored Users": "Ignorowani użytkownicy", + "Debug Logs Submission": "Wysyłanie dzienników błędów", + "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.": "Jeśli zgłosiłeś błąd za pośrednictwem GitHuba, dzienniki błędów mogą nam pomóc wyśledzić problem. Dzienniki błędów zawierają dane o użytkowaniu aplikacji, w tym nazwę użytkownika, identyfikatory lub aliasy odwiedzonych pomieszczeń lub grup oraz nazwy użytkowników innych użytkowników. Nie zawierają wiadomości.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Prywatność jest dla nas ważna, dlatego nie gromadzimy żadnych danych osobowych ani danych identyfikujących w naszych analizach.", + "Learn more about how we use analytics.": "Dowiedz się więcej co analizujemy.", + "No Audio Outputs detected": "Nie wykryto wyjść audio", + "Audio Output": "Wyjście audio", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "E-mail został wysłany na adres %(emailAddress)s. Gdy otworzysz link, który zawiera, kliknij poniżej.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Zauważ proszę, że logujesz się na serwer %(hs)s, nie matrix.org.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Ten serwer domowy nie oferuje żadnych trybów logowania wspieranych przez Twojego klienta.", + "Try the app first": "Najpierw wypróbuj aplikację", + "Sign in to get started": "Zaloguj się, aby rozpocząć", + "Notify the whole room": "Powiadom cały pokój", + "Room Notification": "Powiadomienia pokoju" } From 0ccca7972e5b6b20873672e84568ab607dff3f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=BE=20=D0=9C=2E=20=D0=9A=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=9B?= <marko.m.kostic@gmail.com> Date: Sat, 23 Jun 2018 09:04:50 +0000 Subject: [PATCH 369/480] Translated using Weblate (Serbian) Currently translated at 100.0% (1198 of 1198 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sr/ --- src/i18n/strings/sr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index ec46986d09..c32b4ac202 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -1195,6 +1195,6 @@ "Link to selected message": "Веза ка изабраној поруци", "COPY": "КОПИРАЈ", "Share Message": "Подели поруку", - "No Audio Outputs detected": "Нема уочених аудио излаза", + "No Audio Outputs detected": "Нема уочених излаза звука", "Audio Output": "Излаз звука" } From 06f55b51b877d88bb49efe87f7dda0d405cfac2a Mon Sep 17 00:00:00 2001 From: strix aluco <strixaluco@rocketmail.com> Date: Sun, 24 Jun 2018 07:44:28 +0000 Subject: [PATCH 370/480] Translated using Weblate (Ukrainian) Currently translated at 27.5% (330 of 1198 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 52 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 5e7cc75f8a..b36642691c 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -279,5 +279,55 @@ "Your User Agent": "Ваш користувацький агент", "Your device resolution": "Роздільність вашого пристрою", "Analytics": "Аналітика", - "The information being sent to us to help make Riot.im better includes:": "Надсилана інформація, що допомагає нам покращити Riot.im, вміщує:" + "The information being sent to us to help make Riot.im better includes:": "Надсилана інформація, що допомагає нам покращити Riot.im, вміщує:", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Введіть пароль для захисту експортованого файлу. Щоб розшифрувати файл потрібно буде ввести цей пароль.", + "Call Failed": "Виклик не вдався", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "У цій кімнаті є невідомі пристрої: якщо ви продовжите без їхньої перевірки, зважайте на те, що вас можна буде прослуховувати.", + "Review Devices": "Перевірити пристрої", + "Call Anyway": "Подзвонити все одно", + "Answer Anyway": "Відповісти все одно", + "Call": "Подзвонити", + "Answer": "Відповісти", + "The remote side failed to pick up": "На ваш дзвінок не змогли відповісти", + "Unable to capture screen": "Не вдалось захопити екран", + "Existing Call": "Наявний виклик", + "You are already in a call.": "Ви вже розмовляєте.", + "VoIP is unsupported": "VoIP не підтримується", + "You cannot place VoIP calls in this browser.": "Цей оглядач не підтримує VoIP дзвінки.", + "You cannot place a call with yourself.": "Ви не можете подзвонити самим собі.", + "Conference calls are not supported in encrypted rooms": "Режим конференції не підтримується у зашифрованих кімнатах", + "Conference calls are not supported in this client": "Режим конференції не підтримується у цьому клієнті", + "Warning!": "Увага!", + "Conference calling is in development and may not be reliable.": "Режим конференції ще знаходиться в стані розробки та може бути ненадійним.", + "Failed to set up conference call": "Не вдалось встановити конференцію", + "Conference call failed.": "Конференц-виклик зазнав невдачі.", + "The file '%(fileName)s' failed to upload": "Не вдалось відвантажити файл '%(fileName)s'", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Файл '%(fileName)s' перевищує максимальні розміри, дозволені на цьому сервері", + "Upload Failed": "Помилка відвантаження", + "Sun": "Нд", + "Mon": "Пн", + "Tue": "Вт", + "Wed": "Ср", + "Thu": "Чт", + "Fri": "Пт", + "Sat": "Сб", + "Jan": "Січ", + "Feb": "Лют", + "Mar": "Бер", + "Apr": "Квіт", + "May": "Трав", + "Jun": "Чер", + "Jul": "Лип", + "Aug": "Сер", + "Sep": "Вер", + "Oct": "Жов", + "Nov": "Лис", + "Dec": "Гру", + "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", + "Who would you like to add to this community?": "Кого ви хочете додати до цієї спільноти?" } From fabdf22aad42a0e3491e6cd4272fc057d41e221c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 25 Jun 2018 09:51:23 +0100 Subject: [PATCH 371/480] delint RoomSubList and generate eslintignore file Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .eslintignore.errorfiles | 5 - src/components/structures/RoomSubList.js | 166 +++++++++++------------ 2 files changed, 79 insertions(+), 92 deletions(-) diff --git a/.eslintignore.errorfiles b/.eslintignore.errorfiles index c6f25c2480..430546d281 100644 --- a/.eslintignore.errorfiles +++ b/.eslintignore.errorfiles @@ -2,7 +2,6 @@ src/autocomplete/AutocompleteProvider.js src/autocomplete/Autocompleter.js -src/autocomplete/EmojiProvider.js src/autocomplete/UserProvider.js src/component-index.js src/components/structures/BottomLeftMenu.js @@ -17,7 +16,6 @@ src/components/structures/MessagePanel.js src/components/structures/NotificationPanel.js src/components/structures/RoomDirectory.js src/components/structures/RoomStatusBar.js -src/components/structures/RoomSubList.js src/components/structures/RoomView.js src/components/structures/ScrollPanel.js src/components/structures/SearchBox.js @@ -29,7 +27,6 @@ src/components/views/avatars/BaseAvatar.js src/components/views/avatars/MemberAvatar.js src/components/views/create_room/RoomAlias.js src/components/views/dialogs/ChangelogDialog.js -src/components/views/dialogs/ChatCreateOrReuseDialog.js src/components/views/dialogs/DeactivateAccountDialog.js src/components/views/dialogs/SetPasswordDialog.js src/components/views/dialogs/UnknownDeviceDialog.js @@ -37,7 +34,6 @@ src/components/views/directory/NetworkDropdown.js src/components/views/elements/AddressSelector.js src/components/views/elements/DeviceVerifyButtons.js src/components/views/elements/DirectorySearchBox.js -src/components/views/elements/EditableText.js src/components/views/elements/ImageView.js src/components/views/elements/InlineSpinner.js src/components/views/elements/MemberEventListSummary.js @@ -81,7 +77,6 @@ src/components/views/rooms/TopUnreadMessagesBar.js src/components/views/rooms/UserTile.js src/components/views/settings/AddPhoneNumber.js src/components/views/settings/ChangeAvatar.js -src/components/views/settings/ChangeDisplayName.js src/components/views/settings/ChangePassword.js src/components/views/settings/DevicesPanel.js src/components/views/settings/IntegrationsManager.js diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 025c2b2e08..0b6f7eaa45 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -16,30 +16,24 @@ See the License for the specific language governing permissions and limitations under the License. */ -'use strict'; - -var React = require('react'); -var ReactDOM = require('react-dom'); -var classNames = require('classnames'); -var sdk = require('../../index'); +import React from 'react'; +import classNames from 'classnames'; +import sdk from '../../index'; import { Droppable } from 'react-beautiful-dnd'; import { _t } from '../../languageHandler'; -var dis = require('../../dispatcher'); -var Unread = require('../../Unread'); -var MatrixClientPeg = require('../../MatrixClientPeg'); -var RoomNotifs = require('../../RoomNotifs'); -var FormattingUtils = require('../../utils/FormattingUtils'); -var AccessibleButton = require('../../components/views/elements/AccessibleButton'); -import Modal from '../../Modal'; +import dis from '../../dispatcher'; +import Unread from '../../Unread'; +import * as RoomNotifs from '../../RoomNotifs'; +import * as FormattingUtils from '../../utils/FormattingUtils'; import { KeyCode } from '../../Keyboard'; // turn this on for drop & drag console debugging galore -var debug = false; +const debug = false; const TRUNCATE_AT = 10; -var RoomSubList = React.createClass({ +const RoomSubList = React.createClass({ displayName: 'RoomSubList', debug: debug, @@ -78,8 +72,10 @@ var RoomSubList = React.createClass({ getDefaultProps: function() { return { - onHeaderClick: function() {}, // NOP - onShowMoreRooms: function() {}, // NOP + onHeaderClick: function() { + }, // NOP + onShowMoreRooms: function() { + }, // NOP extraTiles: [], isInvite: false, }; @@ -116,7 +112,7 @@ var RoomSubList = React.createClass({ // The header is collapsable if it is hidden or not stuck // The dataset elements are added in the RoomList _initAndPositionStickyHeaders method isCollapsableOnClick: function() { - var stuck = this.refs.header.dataset.stuck; + const stuck = this.refs.header.dataset.stuck; if (this.state.hidden || stuck === undefined || stuck === "none") { return true; } else { @@ -142,12 +138,12 @@ var RoomSubList = React.createClass({ onClick: function(ev) { if (this.isCollapsableOnClick()) { // The header isCollapsable, so the click is to be interpreted as collapse and truncation logic - var isHidden = !this.state.hidden; - this.setState({ hidden : isHidden }); + const isHidden = !this.state.hidden; + this.setState({hidden: isHidden}); if (isHidden) { // as good a way as any to reset the truncate state - this.setState({ truncateAt : TRUNCATE_AT }); + this.setState({truncateAt: TRUNCATE_AT}); } this.props.onShowMoreRooms(); @@ -162,7 +158,7 @@ var RoomSubList = React.createClass({ dis.dispatch({ action: 'view_room', room_id: roomId, - clear_search: (ev && (ev.keyCode == KeyCode.ENTER || ev.keyCode == KeyCode.SPACE)), + clear_search: (ev && (ev.keyCode === KeyCode.ENTER || ev.keyCode === KeyCode.SPACE)), }); }, @@ -172,17 +168,17 @@ var RoomSubList = React.createClass({ }, _shouldShowMentionBadge: function(roomNotifState) { - return roomNotifState != RoomNotifs.MUTE; + return roomNotifState !== RoomNotifs.MUTE; }, /** * Total up all the notification counts from the rooms * - * @param {Number} If supplied will only total notifications for rooms outside the truncation number + * @param {Number} truncateAt If supplied will only total notifications for rooms outside the truncation number * @returns {Array} The array takes the form [total, highlight] where highlight is a bool */ roomNotificationCount: function(truncateAt) { - var self = this; + const self = this; if (this.props.isInvite) { return [0, true]; @@ -190,9 +186,9 @@ var RoomSubList = React.createClass({ return this.props.list.reduce(function(result, room, index) { if (truncateAt === undefined || index >= truncateAt) { - var roomNotifState = RoomNotifs.getRoomNotifsState(room.roomId); - var highlight = room.getUnreadNotificationCount('highlight') > 0; - var notificationCount = room.getUnreadNotificationCount(); + const roomNotifState = RoomNotifs.getRoomNotifsState(room.roomId); + const highlight = room.getUnreadNotificationCount('highlight') > 0; + const notificationCount = room.getUnreadNotificationCount(); const notifBadges = notificationCount > 0 && self._shouldShowNotifBadge(roomNotifState); const mentionBadges = highlight && self._shouldShowMentionBadge(roomNotifState); @@ -242,29 +238,27 @@ var RoomSubList = React.createClass({ }, _getHeaderJsx: function() { - var TintableSvg = sdk.getComponent("elements.TintableSvg"); + const subListNotifications = this.roomNotificationCount(); + const subListNotifCount = subListNotifications[0]; + const subListNotifHighlight = subListNotifications[1]; - var subListNotifications = this.roomNotificationCount(); - var subListNotifCount = subListNotifications[0]; - var subListNotifHighlight = subListNotifications[1]; + const totalTiles = this.props.list.length + (this.props.extraTiles || []).length; + const roomCount = totalTiles > 0 ? totalTiles : ''; - var totalTiles = this.props.list.length + (this.props.extraTiles || []).length; - var roomCount = totalTiles > 0 ? totalTiles : ''; - - var chevronClasses = classNames({ + const chevronClasses = classNames({ 'mx_RoomSubList_chevron': true, 'mx_RoomSubList_chevronRight': this.state.hidden, 'mx_RoomSubList_chevronDown': !this.state.hidden, }); - var badgeClasses = classNames({ + const badgeClasses = classNames({ 'mx_RoomSubList_badge': true, 'mx_RoomSubList_badgeHighlight': subListNotifHighlight, }); - var badge; + let badge; if (subListNotifCount > 0) { - badge = <div className={badgeClasses}>{ FormattingUtils.formatCount(subListNotifCount) }</div>; + badge = <div className={badgeClasses}>{FormattingUtils.formatCount(subListNotifCount)}</div>; } else if (this.props.isInvite) { // no notifications but highlight anyway because this is an invite badge badge = <div className={badgeClasses}>!</div>; @@ -272,7 +266,7 @@ var RoomSubList = React.createClass({ // When collapsed, allow a long hover on the header to show user // the full tag name and room count - var title; + let title; if (this.props.collapsed) { title = this.props.label; if (roomCount !== '') { @@ -280,63 +274,66 @@ var RoomSubList = React.createClass({ } } - var incomingCall; + let incomingCall; if (this.props.incomingCall) { - var self = this; + const self = this; // Check if the incoming call is for this section - var incomingCallRoom = this.props.list.filter(function(room) { + const incomingCallRoom = this.props.list.filter(function(room) { return self.props.incomingCall.roomId === room.roomId; }); if (incomingCallRoom.length === 1) { - var IncomingCallBox = sdk.getComponent("voip.IncomingCallBox"); - incomingCall = <IncomingCallBox className="mx_RoomSubList_incomingCall" incomingCall={ this.props.incomingCall }/>; + const IncomingCallBox = sdk.getComponent("voip.IncomingCallBox"); + incomingCall = + <IncomingCallBox className="mx_RoomSubList_incomingCall" incomingCall={this.props.incomingCall} />; } } - var tabindex = this.props.searchFilter === "" ? "0" : "-1"; + const tabindex = this.props.searchFilter === "" ? "0" : "-1"; + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); return ( - <div className="mx_RoomSubList_labelContainer" title={ title } ref="header"> - <AccessibleButton onClick={ this.onClick } className="mx_RoomSubList_label" tabIndex={tabindex}> - { this.props.collapsed ? '' : this.props.label } - <div className="mx_RoomSubList_roomCount">{ roomCount }</div> - <div className={chevronClasses}></div> - { badge } - { incomingCall } + <div className="mx_RoomSubList_labelContainer" title={title} ref="header"> + <AccessibleButton onClick={this.onClick} className="mx_RoomSubList_label" tabIndex={tabindex}> + {this.props.collapsed ? '' : this.props.label} + <div className="mx_RoomSubList_roomCount">{roomCount}</div> + <div className={chevronClasses} /> + {badge} + {incomingCall} </AccessibleButton> </div> ); }, _createOverflowTile: function(overflowCount, totalCount) { - var content = <div className="mx_RoomSubList_chevronDown"></div>; + let content = <div className="mx_RoomSubList_chevronDown" />; - var overflowNotifications = this.roomNotificationCount(TRUNCATE_AT); - var overflowNotifCount = overflowNotifications[0]; - var overflowNotifHighlight = overflowNotifications[1]; + const overflowNotifications = this.roomNotificationCount(TRUNCATE_AT); + const overflowNotifCount = overflowNotifications[0]; + const overflowNotifHighlight = overflowNotifications[1]; if (overflowNotifCount && !this.props.collapsed) { content = FormattingUtils.formatCount(overflowNotifCount); } - var badgeClasses = classNames({ + const badgeClasses = classNames({ 'mx_RoomSubList_moreBadge': true, 'mx_RoomSubList_moreBadgeNotify': overflowNotifCount && !this.props.collapsed, 'mx_RoomSubList_moreBadgeHighlight': overflowNotifHighlight && !this.props.collapsed, }); + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); return ( <AccessibleButton className="mx_RoomSubList_ellipsis" onClick={this._showFullMemberList}> - <div className="mx_RoomSubList_line"></div> - <div className="mx_RoomSubList_more">{ _t("more") }</div> - <div className={ badgeClasses }>{ content }</div> + <div className="mx_RoomSubList_line" /> + <div className="mx_RoomSubList_more">{_t("more")}</div> + <div className={badgeClasses}>{content}</div> </AccessibleButton> ); }, _showFullMemberList: function() { this.setState({ - truncateAt: -1 + truncateAt: -1, }); this.props.onShowMoreRooms(); @@ -344,10 +341,7 @@ var RoomSubList = React.createClass({ }, render: function() { - var connectDropTarget = this.props.connectDropTarget; - var TruncatedList = sdk.getComponent('elements.TruncatedList'); - - var label = this.props.collapsed ? null : this.props.label; + const TruncatedList = sdk.getComponent('elements.TruncatedList'); let content; if (this.state.sortedList.length === 0 && this.props.extraTiles.length === 0) { @@ -364,23 +358,22 @@ var RoomSubList = React.createClass({ } if (this.state.sortedList.length > 0 || this.props.extraTiles.length > 0 || this.props.editable) { - var subList; - var classes = "mx_RoomSubList"; + let subList; + const classes = "mx_RoomSubList"; if (!this.state.hidden) { - subList = <TruncatedList className={ classes } truncateAt={this.state.truncateAt} - createOverflowElement={this._createOverflowTile} > - { content } - </TruncatedList>; - } - else { - subList = <TruncatedList className={ classes }> - </TruncatedList>; + subList = <TruncatedList className={classes} truncateAt={this.state.truncateAt} + createOverflowElement={this._createOverflowTile}> + {content} + </TruncatedList>; + } else { + subList = <TruncatedList className={classes}> + </TruncatedList>; } const subListContent = <div> - { this._getHeaderJsx() } - { subList } + {this._getHeaderJsx()} + {subList} </div>; return this.props.editable ? @@ -388,23 +381,22 @@ var RoomSubList = React.createClass({ droppableId={"room-sub-list-droppable_" + this.props.tagName} type="draggable-RoomTile" > - { (provided, snapshot) => ( + {(provided, snapshot) => ( <div ref={provided.innerRef}> - { subListContent } + {subListContent} </div> - ) } + )} </Droppable> : subListContent; - } - else { - var Loader = sdk.getComponent("elements.Spinner"); + } else { + const Loader = sdk.getComponent("elements.Spinner"); return ( <div className="mx_RoomSubList"> - { this.props.alwaysShowHeader ? this._getHeaderJsx() : undefined } - { (this.props.showSpinner && !this.state.hidden) ? <Loader /> : undefined } + {this.props.alwaysShowHeader ? this._getHeaderJsx() : undefined} + {(this.props.showSpinner && !this.state.hidden) ? <Loader /> : undefined} </div> ); } - } + }, }); module.exports = RoomSubList; From 6addfdbcbb3d3be5a8c6ab1f5f43a962214b5d75 Mon Sep 17 00:00:00 2001 From: Kenneth Larsson <kenneth.larsson@cgi.com> Date: Mon, 25 Jun 2018 10:10:59 +0000 Subject: [PATCH 372/480] Translated using Weblate (Swedish) Currently translated at 100.0% (1198 of 1198 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 | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 0e26125c30..92c4163fbf 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1180,5 +1180,21 @@ "This room is not showing flair for any communities": "Detta rum visar inte emblem för några communityn", "Flair will appear if enabled in room settings": "Emblem kommer visas om det är aktiverat i rumsinställningarna", "Flair will not appear": "Emblem kommer inte att visas", - "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det." + "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det.", + "Jitsi Conference Calling": "Jitsi konferenssamtal", + "Encrypting": "Krypterar", + "Encrypted, not sent": "Krypterat, inte skickat", + "Share Link to User": "Dela länk till användare", + "Share room": "Dela rum", + "Share Room": "Dela rum", + "Link to most recent message": "Länk till senaste meddelandet", + "Share User": "Dela användare", + "Share Community": "Dela community", + "Share Room Message": "Dela rumsmeddelande", + "Link to selected message": "Länk till valt meddelande", + "COPY": "KOPIERA", + "Share Message": "Dela meddelande", + "No Audio Outputs detected": "Inga ljudutgångar hittades", + "Audio Output": "Ljudutgång", + "Try the app first": "Testa appen först" } From f941587d015314928c8dada329da89df33929798 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Mon, 25 Jun 2018 10:55:24 +0000 Subject: [PATCH 373/480] Translated using Weblate (Basque) Currently translated at 100.0% (1200 of 1200 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 9abb39cdb2..d445453f20 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1196,5 +1196,7 @@ "Share Message": "Partekatu mezua", "No Audio Outputs detected": "Ez da audio irteerarik antzeman", "Audio Output": "Audio irteera", - "Jitsi Conference Calling": "Jitsi konferentzia deia" + "Jitsi Conference Calling": "Jitsi konferentzia deia", + "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.": "Zifratutako gelatan, honetan esaterako, URL-en aurrebistak lehenetsita desgaituta daude zure hasiera-zerbitzariak gela honetan ikusten dituzun estekei buruzko informaziorik jaso ez dezan, hasiera-zerbitzarian sortzen baitira aurrebistak.", + "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.": "Norbaitek mezu batean URL bat jartzen duenean, URL aurrebista bat erakutsi daiteke estekaren informazio gehiago erakusteko, adibidez webgunearen izenburua, deskripzioa eta irudi bat." } From 24a48daad8f808a9a41ccc37ca376337cccc89e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Mon, 25 Jun 2018 11:46:55 +0000 Subject: [PATCH 374/480] Translated using Weblate (French) Currently translated at 100.0% (1200 of 1200 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, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 1aec3ca8ec..be61f4fd7d 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1196,5 +1196,7 @@ "Link to selected message": "Lien vers le message sélectionné", "COPY": "COPIER", "Share Message": "Partager le message", - "Jitsi Conference Calling": "Appel en téléconférence Jitsi" + "Jitsi Conference Calling": "Appel en téléconférence Jitsi", + "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.": "Dans les salons chiffrés, comme celui-ci, l'aperçu des liens est désactivé par défaut pour s'assurer que le serveur d'accueil (où sont générés les aperçus) ne puisse pas collecter d'informations sur les liens qui apparaissent dans ce salon.", + "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.": "Quand quelqu'un met un lien dans son message, un aperçu du lien peut être affiché afin de fournir plus d'informations sur ce lien comme le titre, la description et une image du site." } From 5c8eeff08ae2f831d11555c25c906c1b8e8a5628 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Mon, 25 Jun 2018 15:30:04 +0100 Subject: [PATCH 375/480] Refactor widgets code Split logic out of setWidget & re-use it when we add jitsi widgets. Also fix the detection of existing jitsi widgets and make that use getRoomWidgets() too. Add error message when a jitsi call is already in process. --- src/CallHandler.js | 34 ++++++++++--------- src/ScalarMessaging.js | 45 ++----------------------- src/WidgetUtils.js | 64 +++++++++++++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 66 +++++++++++++++++++------------------ 4 files changed, 119 insertions(+), 90 deletions(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index a65d82fe85..f431589fb2 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -61,6 +61,8 @@ import Matrix from 'matrix-js-sdk'; import dis from './dispatcher'; import { showUnknownDeviceDialogForCalls } from './cryptodevices'; import SettingsStore from "./settings/SettingsStore"; +import WidgetUtils from './WidgetUtils'; +import { getRoomWidgets } from './utils/widgets'; global.mxCalls = { //room_id: MatrixCall @@ -412,15 +414,20 @@ function _startCallApp(roomId, type) { return; } - const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); - const currentJitsiWidgets = appsStateEvents.filter((ev) => { - ev.getContent().type == 'jitsi'; + const currentJitsiWidgets = getRoomWidgets(room).filter((ev) => { + return ev.getContent().type == 'jitsi'; }); if (currentJitsiWidgets.length > 0) { console.warn( "Refusing to start conference call widget in " + roomId + " a conference call widget is already present", ); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + + Modal.createTrackedDialog('Already have Jitsi Widget', '', ErrorDialog, { + title: _t('Call in Progress'), + description: _t('A call is already in progress!'), + }); return; } @@ -443,25 +450,22 @@ function _startCallApp(roomId, type) { queryString ); - const jitsiEvent = { - type: 'jitsi', - url: widgetUrl, - data: { - widgetSessionId: widgetSessionId, - }, + const widgetData = { + widgetSessionId: widgetSessionId, }; + const widgetId = ( 'jitsi_' + MatrixClientPeg.get().credentials.userId + '_' + Date.now() ); - MatrixClientPeg.get().sendStateEvent( - roomId, - 'im.vector.modular.widgets', - jitsiEvent, - widgetId, - ).then(() => console.log('Sent jitsi widget state event'), (e) => console.error(e)); + + WidgetUtils.setRoomWidget(widgetId, 'jitsi', widgetUrl, 'Jitsi', widgetData, roomId).then(() => { + console.log('Jitsi widget added'); + }).catch((e) => { + console.error(e); + }); } // FIXME: Nasty way of making sure we only register diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index f80162e635..5aae25229a 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -297,12 +297,6 @@ function setWidget(event, roomId) { const widgetData = event.data.data; // optional const userWidget = event.data.userWidget; - const client = MatrixClientPeg.get(); - if (!client) { - sendError(event, _t('You need to be logged in.')); - return; - } - // both adding/removing widgets need these checks if (!widgetId || widgetUrl === undefined) { sendError(event, _t("Unable to create widget."), new Error("Missing required widget fields.")); @@ -337,34 +331,7 @@ function setWidget(event, roomId) { }; if (userWidget) { - const client = MatrixClientPeg.get(); - const userWidgets = Widgets.getUserWidgets(); - - // Delete existing widget with ID - try { - delete userWidgets[widgetId]; - } catch (e) { - console.error(`$widgetId is non-configurable`); - } - - // Add new widget / update - if (widgetUrl !== null) { - userWidgets[widgetId] = { - content: content, - sender: client.getUserId(), - state_key: widgetId, - type: 'm.widget', - id: widgetId, - }; - } - - // This starts listening for when the echo comes back from the server - // since the widget won't appear added until this happens. If we don't - // wait for this, the action will complete but if the user is fast enough, - // the widget still won't actually be there. - client.setAccountData('m.widgets', userWidgets).then(() => { - return WidgetUtils.waitForUserWidget(widgetId, widgetUrl !== null); - }).then(() => { + WidgetUtils.setUserWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData).then(() => { sendResponse(event, { success: true, }); @@ -377,15 +344,7 @@ function setWidget(event, roomId) { if (!roomId) { sendError(event, _t('Missing roomId.'), null); } - - if (widgetUrl === null) { // widget is being deleted - content = {}; - } - // TODO - Room widgets need to be moved to 'm.widget' state events - // https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing - client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).then(() => { - return WidgetUtils.waitForRoomWidget(widgetId, roomId, widgetUrl !== null); - }).then(() => { + WidgetUtils.setRoomWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData, roomId).then(() => { sendResponse(event, { success: true, }); diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 2e2dcf30cd..453038d953 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -17,6 +17,8 @@ limitations under the License. import MatrixClientPeg from './MatrixClientPeg'; import SdkConfig from "./SdkConfig"; +import Widgets from './utils/widgets'; +import dis from './dispatcher'; import * as url from "url"; export default class WidgetUtils { @@ -190,4 +192,66 @@ export default class WidgetUtils { MatrixClientPeg.get().on('RoomState.events', onRoomStateEvents); }); } + + static setUserWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData) { + const content = { + type: widgetType, + url: widgetUrl, + name: widgetName, + data: widgetData, + }; + + const client = MatrixClientPeg.get(); + const userWidgets = Widgets.getUserWidgets(); + + // Delete existing widget with ID + try { + delete userWidgets[widgetId]; + } catch (e) { + console.error(`$widgetId is non-configurable`); + } + + // Add new widget / update + if (widgetUrl !== null) { + userWidgets[widgetId] = { + content: content, + sender: client.getUserId(), + state_key: widgetId, + type: 'm.widget', + id: widgetId, + }; + } + + // This starts listening for when the echo comes back from the server + // since the widget won't appear added until this happens. If we don't + // wait for this, the action will complete but if the user is fast enough, + // the widget still won't actually be there. + return client.setAccountData('m.widgets', userWidgets).then(() => { + return WidgetUtils.waitForUserWidget(widgetId, widgetUrl !== null); + }).then(() => { + dis.dispatch({ action: "user_widget_updated" }); + }); + } + + static setRoomWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData, roomId) { + let content; + + if (widgetUrl === null) { // widget is being deleted + content = {}; + } else { + content = { + type: widgetType, + url: widgetUrl, + name: widgetName, + data: widgetData, + }; + } + + 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 + return client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).then(() => { + return WidgetUtils.waitForRoomWidget(widgetId, roomId, widgetUrl !== null); + }); + } } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d35555af6f..9da6bab5fa 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -39,13 +39,11 @@ "Conference calling is in development and may not be reliable.": "Conference calling is in development and may not be reliable.", "Failed to set up conference call": "Failed to set up conference call", "Conference call failed.": "Conference call failed.", + "Call in Progress": "Call in Progress", + "A call is already in progress!": "A call is already in progress!", "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -85,7 +83,6 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", - "Unnamed Room": "Unnamed Room", "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", @@ -199,6 +196,11 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", + "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -311,31 +313,6 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "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.", - "URL Previews": "URL Previews", - "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.", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -435,11 +412,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -572,6 +549,31 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "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.", + "URL Previews": "URL Previews", + "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.", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", From f7dfba417ca7d173ba7e77ad5335792472eaeacf Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@googlemail.com> Date: Mon, 25 Jun 2018 16:31:43 +0100 Subject: [PATCH 376/480] Revert "affix copyButton so that it doesn't get scrolled horizontally" --- res/css/views/rooms/_EventTile.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 525855f3ed..80d2cd3418 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -392,7 +392,6 @@ limitations under the License. overflow-x: overlay; overflow-y: visible; max-height: 30vh; - position: static; } .mx_EventTile_content .markdown-body code { @@ -407,7 +406,7 @@ limitations under the License. visibility: hidden; cursor: pointer; top: 6px; - right: 36px; + right: 6px; width: 19px; height: 19px; background-image: url($copy-button-url); From e292ee942fa3cbddb3fb43b6d9af3dcb06f79d34 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Mon, 25 Jun 2018 16:37:45 +0100 Subject: [PATCH 377/480] Fix RoomSubList headers by re-commiting 1faecfd The original got reverted in ebfafb36 somehow. --- src/components/views/rooms/RoomList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 167603ecfb..422bad1afc 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -611,7 +611,7 @@ module.exports = React.createClass({ const self = this; return ( <GeminiScrollbarWrapper className="mx_RoomList_scrollbar" - autoshow={true} onScroll={self._whenScrolling} wrappedRef={this._collectGemini}> + autoshow={true} onScroll={self._whenScrolling} onResize={self._whenScrolling} wrappedRef={this._collectGemini}> <div className="mx_RoomList"> <RoomSubList list={[]} extraTiles={this._makeGroupInviteTiles(self.props.searchFilter)} From 95728e73bb8421a6c8b62e0750bd767973b52deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Mon, 25 Jun 2018 16:12:17 +0000 Subject: [PATCH 378/480] Translated using Weblate (French) Currently translated at 100.0% (1204 of 1204 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index be61f4fd7d..0e0980c0cc 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1198,5 +1198,9 @@ "Share Message": "Partager le message", "Jitsi Conference Calling": "Appel en téléconférence Jitsi", "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.": "Dans les salons chiffrés, comme celui-ci, l'aperçu des liens est désactivé par défaut pour s'assurer que le serveur d'accueil (où sont générés les aperçus) ne puisse pas collecter d'informations sur les liens qui apparaissent dans ce salon.", - "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.": "Quand quelqu'un met un lien dans son message, un aperçu du lien peut être affiché afin de fournir plus d'informations sur ce lien comme le titre, la description et une image du site." + "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.": "Quand quelqu'un met un lien dans son message, un aperçu du lien peut être affiché afin de fournir plus d'informations sur ce lien comme le titre, la description et une image du site.", + "The email field must not be blank.": "Le champ de l'adresse e-mail ne doit pas être vide.", + "The user name field must not be blank.": "Le champ du nom d'utilisateur ne doit pas être vide.", + "The phone number field must not be blank.": "Le champ du numéro de téléphone ne doit pas être vide.", + "The password field must not be blank.": "Le champ du mot de passe ne doit pas être vide." } From c23bb392033e7030dab591e50d505ccd06e6fb98 Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Mon, 25 Jun 2018 17:43:08 +0000 Subject: [PATCH 379/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1204 of 1204 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 2aea205a15..04ee69b04a 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1195,5 +1195,12 @@ "Share Room Message": "Szoba üzenet megosztás", "Link to selected message": "Hivatkozás a kijelölt üzenetre", "COPY": "Másol", - "Share Message": "Üzenet megosztása" + "Share Message": "Üzenet megosztása", + "Jitsi Conference Calling": "Jitsi konferencia hívás", + "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.": "Az olyan titkosított szobákban, mint ez is, az URL előnézet alapértelmezetten ki van kapcsolva, hogy biztosított legyen, hogy a matrix szerver (ahol az előnézet készül) ne tudjon információt gyűjteni arról, hogy milyen linkeket látsz ebben a szobában.", + "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.": "Ha valaki URL linket helyez az üzenetébe, lehetőség van egy előnézet megjelenítésére amivel további információt kaphatunk a linkről, mint cím, leírás és a weboldal képe.", + "The email field must not be blank.": "Az e-mail mező nem lehet üres.", + "The user name field must not be blank.": "A felhasználói név mező nem lehet üres.", + "The phone number field must not be blank.": "A telefonszám mező nem lehet üres.", + "The password field must not be blank.": "A jelszó mező nem lehet üres." } From f88d26d71c35581f810ae62ec528eebcdece1775 Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Tue, 26 Jun 2018 00:19:54 +0000 Subject: [PATCH 380/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1204 of 1204 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 1b8b32af4d..2235621f07 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1196,5 +1196,11 @@ "Link to selected message": "連結到選定的訊息", "COPY": "複製", "Share Message": "分享訊息", - "Jitsi Conference Calling": "Jitsi 會議通話" + "Jitsi Conference Calling": "Jitsi 會議通話", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "在加密的聊天室中(這個就是),URL 預覽會預設停用以確保您的家伺服器(預覽生成的地方)無法在這個聊天室中收集關於您看到的連結的資訊。", + "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "當某人在他們的訊息中放置 URL 時,URL 預覽可以顯示如標題、描述與網頁上的圖片等等來給您更多關於該連結的資訊。", + "The email field must not be blank.": "電子郵件欄不能留空。", + "The user name field must not be blank.": "使用者名稱欄不能留空。", + "The phone number field must not be blank.": "電話號碼欄不能留空。", + "The password field must not be blank.": "密碼欄不能留空。" } From e2edf78abbd5a20a3105f250f1e52e24d0b9049f Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Tue, 26 Jun 2018 04:44:03 +0000 Subject: [PATCH 381/480] Translated using Weblate (Basque) Currently translated at 100.0% (1204 of 1204 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index d445453f20..e23a7493fd 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1198,5 +1198,9 @@ "Audio Output": "Audio irteera", "Jitsi Conference Calling": "Jitsi konferentzia deia", "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.": "Zifratutako gelatan, honetan esaterako, URL-en aurrebistak lehenetsita desgaituta daude zure hasiera-zerbitzariak gela honetan ikusten dituzun estekei buruzko informaziorik jaso ez dezan, hasiera-zerbitzarian sortzen baitira aurrebistak.", - "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.": "Norbaitek mezu batean URL bat jartzen duenean, URL aurrebista bat erakutsi daiteke estekaren informazio gehiago erakusteko, adibidez webgunearen izenburua, deskripzioa eta irudi bat." + "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.": "Norbaitek mezu batean URL bat jartzen duenean, URL aurrebista bat erakutsi daiteke estekaren informazio gehiago erakusteko, adibidez webgunearen izenburua, deskripzioa eta irudi bat.", + "The email field must not be blank.": "E-mail eremua ezin da hutsik laga.", + "The user name field must not be blank.": "Erabiltzaile-izen eremua ezin da hutsik laga.", + "The phone number field must not be blank.": "Telefono zenbakia eremua ezin da hutsik laga.", + "The password field must not be blank.": "Pasahitza eremua ezin da hutsik laga." } From 9b50daa7486ac95b700c579fd973b048b6838f47 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 07:46:33 +0100 Subject: [PATCH 382/480] give Historical an emptyContent to make it look more consistent and also to unbreak it since now !emptyContent get hidden Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 8 +++++++- src/components/views/rooms/RoomList.js | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 0b6f7eaa45..bd09241ce0 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -389,10 +389,16 @@ const RoomSubList = React.createClass({ </Droppable> : subListContent; } else { const Loader = sdk.getComponent("elements.Spinner"); + if (this.props.showSpinner && !this.state.hidden) { + content = <Loader />; + } else if (this.state.hidden) { + content = undefined; + } // else show content calculated above + return ( <div className="mx_RoomSubList"> {this.props.alwaysShowHeader ? this._getHeaderJsx() : undefined} - {(this.props.showSpinner && !this.state.hidden) ? <Loader /> : undefined} + { content } </div> ); } diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 167603ecfb..896c09fe4e 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -705,6 +705,13 @@ module.exports = React.createClass({ onShowMoreRooms={self.onShowMoreRooms} /> <RoomSubList list={self.state.lists['im.vector.fake.archived']} + emptyContent={self.props.collapsed ? null : + <div className="mx_RoomList_emptySubListTip_container"> + <div className="mx_RoomList_emptySubListTip"> + { _t('You have no historical rooms') } + </div> + </div> + } label={_t('Historical')} editable={false} order="recent" @@ -712,7 +719,7 @@ module.exports = React.createClass({ alwaysShowHeader={true} startAsHidden={true} showSpinner={self.state.isLoadingLeftRooms} - onHeaderClick= {self.onArchivedHeaderClick} + onHeaderClick={self.onArchivedHeaderClick} incomingCall={self.state.incomingCall} searchFilter={self.props.searchFilter} onShowMoreRooms={self.onShowMoreRooms} /> From cdf71012221141d8afa94abe4241b615dc54373d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 07:46:48 +0100 Subject: [PATCH 383/480] run gen-i18n and prune-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/el.json | 1 - src/i18n/strings/en_EN.json | 61 +++++++++++++++++++------------------ src/i18n/strings/gl.json | 1 - src/i18n/strings/it.json | 1 - 4 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index f6264ce8b0..c4514f629b 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -810,7 +810,6 @@ "%(widgetName)s widget removed by %(senderName)s": "Το widget %(widgetName)s αφαιρέθηκε από τον/την %(senderName)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 και άλλος ένας πληκτρολογούν", - "Message Replies": "Απαντήσεις", "Message Pinning": "Καρφίτσωμα Μηνυμάτων", "Hide avatar changes": "Απόκρυψη αλλαγών εικονιδίων χρηστών", "Hide display name changes": "Απόκρυψη αλλαγών εμφανιζόμενων ονομάτων", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index da47140c96..16785dc33d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,6 +42,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -81,6 +85,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -194,11 +199,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -311,6 +311,29 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -410,11 +433,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -459,6 +482,7 @@ "People": "People", "Rooms": "Rooms", "Low priority": "Low priority", + "You have no historical rooms": "You have no historical rooms", "Historical": "Historical", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Unable to ascertain that the address this invite was sent to matches one associated with your account.", "This invitation was sent to an email address which is not associated with this account:": "This invitation was sent to an email address which is not associated with this account:", @@ -547,29 +571,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 1080e66a26..57d8301df6 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -168,7 +168,6 @@ "Authentication check failed: incorrect password?": "Fallou a comprobación de autenticación: contrasinal incorrecto?", "Failed to join room": "Non se puido unir a sala", "Message Pinning": "Fixando mensaxe", - "Tag Panel": "Panel de etiquetas", "Disable Emoji suggestions while typing": "Desactivar a suxestión de Emoji mentres escribe", "Use compact timeline layout": "Utilizar a disposición compacta da liña temporal", "Hide removed messages": "Ocultar mensaxes eliminadas", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d3f93acec5..0957bc156d 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1175,7 +1175,6 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Per continuare a usare l'homeserver %(homeserverDomain)s devi leggere e accettare i nostri termini e condizioni.", "Review terms and conditions": "Leggi i termini e condizioni", "Muted Users": "Utenti silenziati", - "Message Replies": "Risposte", "Message Pinning": "Messaggi appuntati", "Mirror local video feed": "Feed video dai ripetitori locali", "Replying": "Rispondere", From abd37d141e371a53d9a0c85f03a8e18de17ddb5d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 07:54:38 +0100 Subject: [PATCH 384/480] clear up if statement to make it more readable Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index bd09241ce0..b02fc7902a 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -389,16 +389,14 @@ const RoomSubList = React.createClass({ </Droppable> : subListContent; } else { const Loader = sdk.getComponent("elements.Spinner"); - if (this.props.showSpinner && !this.state.hidden) { + if (this.props.showSpinner) { content = <Loader />; - } else if (this.state.hidden) { - content = undefined; - } // else show content calculated above + } return ( <div className="mx_RoomSubList"> {this.props.alwaysShowHeader ? this._getHeaderJsx() : undefined} - { content } + { this.state.hidden ? undefined : content } </div> ); } From 069080e7edefba251892e7f854b38578107ec5ce Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 09:41:20 +0100 Subject: [PATCH 385/480] lint --- src/ScalarMessaging.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 5aae25229a..9d0e274c7b 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -323,13 +323,6 @@ function setWidget(event, roomId) { } } - let content = { - type: widgetType, - url: widgetUrl, - name: widgetName, - data: widgetData, - }; - if (userWidget) { WidgetUtils.setUserWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData).then(() => { sendResponse(event, { From 0f2c47937cb305831e54429e5d3b713a884a64cb Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 11:52:21 +0100 Subject: [PATCH 386/480] Merge the two different widget utils files --- src/CallHandler.js | 3 +- src/ScalarMessaging.js | 3 +- src/WidgetUtils.js | 82 ++++++++++++++++++- src/components/views/rooms/Stickerpicker.js | 6 +- src/utils/widgets.js | 90 --------------------- 5 files changed, 85 insertions(+), 99 deletions(-) delete mode 100644 src/utils/widgets.js diff --git a/src/CallHandler.js b/src/CallHandler.js index f431589fb2..852827f6fe 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -62,7 +62,6 @@ import dis from './dispatcher'; import { showUnknownDeviceDialogForCalls } from './cryptodevices'; import SettingsStore from "./settings/SettingsStore"; import WidgetUtils from './WidgetUtils'; -import { getRoomWidgets } from './utils/widgets'; global.mxCalls = { //room_id: MatrixCall @@ -414,7 +413,7 @@ function _startCallApp(roomId, type) { return; } - const currentJitsiWidgets = getRoomWidgets(room).filter((ev) => { + const currentJitsiWidgets = WidgetUtils.getRoomWidgets(room).filter((ev) => { return ev.getContent().type == 'jitsi'; }); if (currentJitsiWidgets.length > 0) { diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 9d0e274c7b..24c69194f5 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -236,7 +236,6 @@ import SdkConfig from './SdkConfig'; import MatrixClientPeg from './MatrixClientPeg'; import { MatrixEvent } from 'matrix-js-sdk'; import dis from './dispatcher'; -import Widgets from './utils/widgets'; import WidgetUtils from './WidgetUtils'; import RoomViewStore from './stores/RoomViewStore'; import { _t } from './languageHandler'; @@ -375,7 +374,7 @@ function getWidgets(event, roomId) { } // Add user widgets (not linked to a specific room) - const userWidgets = Widgets.getUserWidgetsArray(); + const userWidgets = WidgetUtils.getUserWidgetsArray(); widgetStateEvents = widgetStateEvents.concat(userWidgets); sendResponse(event, widgetStateEvents); diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 453038d953..f54419f5e2 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -17,7 +17,6 @@ limitations under the License. import MatrixClientPeg from './MatrixClientPeg'; import SdkConfig from "./SdkConfig"; -import Widgets from './utils/widgets'; import dis from './dispatcher'; import * as url from "url"; @@ -202,7 +201,7 @@ export default class WidgetUtils { }; const client = MatrixClientPeg.get(); - const userWidgets = Widgets.getUserWidgets(); + const userWidgets = WidgetUtils.getUserWidgets(); // Delete existing widget with ID try { @@ -254,4 +253,83 @@ export default class WidgetUtils { return WidgetUtils.waitForRoomWidget(widgetId, roomId, widgetUrl !== null); }); } + + /** + * Get all widgets (user and room) for the current user + * @param {object} room The room to get widgets for + * @return {[object]} Array containing current / active room and user widget state events + */ + static getWidgets(room) { + const widgets = getRoomWidgets(room); + widgets.concat(getUserWidgetsArray()); + return widgets; + } + + /** + * Get room specific widgets + * @param {object} room The room to get widgets force + * @return {[object]} Array containing current / active room widgets + */ + static getRoomWidgets(room) { + const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); + if (!appsStateEvents) { + return []; + } + + return appsStateEvents.filter((ev) => { + return ev.getContent().type && ev.getContent().url; + }); + } + + /** + * Get user specific widgets (not linked to a specific room) + * @return {object} Event content object containing current / active user widgets + */ + static getUserWidgets() { + const client = MatrixClientPeg.get(); + if (!client) { + throw new Error('User not logged in'); + } + const userWidgets = client.getAccountData('m.widgets'); + let userWidgetContent = {}; + if (userWidgets && userWidgets.getContent()) { + userWidgetContent = userWidgets.getContent(); + } + return userWidgetContent; + } + + /** + * Get user specific widgets (not linked to a specific room) as an array + * @return {[object]} Array containing current / active user widgets + */ + static getUserWidgetsArray() { + return Object.values(WidgetUtils.getUserWidgets()); + } + + /** + * Get active stickerpicker widgets (stickerpickers are user widgets by nature) + * @return {[object]} Array containing current / active stickerpicker widgets + */ + static getStickerpickerWidgets() { + const widgets = WidgetUtils.getUserWidgetsArray(); + return widgets.filter((widget) => widget.content && widget.content.type === "m.stickerpicker"); + } + + /** + * Remove all stickerpicker widgets (stickerpickers are user widgets by nature) + * @return {Promise} Resolves on account data updated + */ + static removeStickerpickerWidgets() { + const client = MatrixClientPeg.get(); + if (!client) { + throw new Error('User not logged in'); + } + const userWidgets = client.getAccountData('m.widgets').getContent() || {}; + Object.entries(userWidgets).forEach(([key, widget]) => { + if (widget.content && widget.content.type === 'm.stickerpicker') { + delete userWidgets[key]; + } + }); + return client.setAccountData('m.widgets', userWidgets); + } } diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index 6152809c1a..992e5b7c53 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -15,7 +15,6 @@ limitations under the License. */ import React from 'react'; import { _t } from '../../../languageHandler'; -import Widgets from '../../../utils/widgets'; import AppTile from '../elements/AppTile'; import MatrixClientPeg from '../../../MatrixClientPeg'; import Modal from '../../../Modal'; @@ -24,6 +23,7 @@ import SdkConfig from '../../../SdkConfig'; import ScalarAuthClient from '../../../ScalarAuthClient'; import dis from '../../../dispatcher'; import AccessibleButton from '../elements/AccessibleButton'; +import WidgetUtils from '../../../WidgetUtils'; const widgetType = 'm.stickerpicker'; @@ -67,7 +67,7 @@ export default class Stickerpicker extends React.Component { } this.setState({showStickers: false}); - Widgets.removeStickerpickerWidgets().then(() => { + WidgetUtils.removeStickerpickerWidgets().then(() => { this.forceUpdate(); }).catch((e) => { console.error('Failed to remove sticker picker widget', e); @@ -119,7 +119,7 @@ export default class Stickerpicker extends React.Component { } _updateWidget() { - const stickerpickerWidget = Widgets.getStickerpickerWidgets()[0]; + const stickerpickerWidget = WidgetUtils.getStickerpickerWidgets()[0]; this.setState({ stickerpickerWidget, widgetId: stickerpickerWidget ? stickerpickerWidget.id : null, diff --git a/src/utils/widgets.js b/src/utils/widgets.js deleted file mode 100644 index 338df184e2..0000000000 --- a/src/utils/widgets.js +++ /dev/null @@ -1,90 +0,0 @@ -import MatrixClientPeg from '../MatrixClientPeg'; - -/** - * Get all widgets (user and room) for the current user - * @param {object} room The room to get widgets for - * @return {[object]} Array containing current / active room and user widget state events - */ -function getWidgets(room) { - const widgets = getRoomWidgets(room); - widgets.concat(getUserWidgetsArray()); - return widgets; -} - -/** - * Get room specific widgets - * @param {object} room The room to get widgets force - * @return {[object]} Array containing current / active room widgets - */ -function getRoomWidgets(room) { - const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); - if (!appsStateEvents) { - return []; - } - - return appsStateEvents.filter((ev) => { - return ev.getContent().type && ev.getContent().url; - }); -} - -/** - * Get user specific widgets (not linked to a specific room) - * @return {object} Event content object containing current / active user widgets - */ -function getUserWidgets() { - const client = MatrixClientPeg.get(); - if (!client) { - throw new Error('User not logged in'); - } - const userWidgets = client.getAccountData('m.widgets'); - let userWidgetContent = {}; - if (userWidgets && userWidgets.getContent()) { - userWidgetContent = userWidgets.getContent(); - } - return userWidgetContent; -} - -/** - * Get user specific widgets (not linked to a specific room) as an array - * @return {[object]} Array containing current / active user widgets - */ -function getUserWidgetsArray() { - return Object.values(getUserWidgets()); -} - -/** - * Get active stickerpicker widgets (stickerpickers are user widgets by nature) - * @return {[object]} Array containing current / active stickerpicker widgets - */ -function getStickerpickerWidgets() { - const widgets = getUserWidgetsArray(); - return widgets.filter((widget) => widget.content && widget.content.type === "m.stickerpicker"); -} - -/** - * Remove all stickerpicker widgets (stickerpickers are user widgets by nature) - * @return {Promise} Resolves on account data updated - */ -function removeStickerpickerWidgets() { - const client = MatrixClientPeg.get(); - if (!client) { - throw new Error('User not logged in'); - } - const userWidgets = client.getAccountData('m.widgets').getContent() || {}; - Object.entries(userWidgets).forEach(([key, widget]) => { - if (widget.content && widget.content.type === 'm.stickerpicker') { - delete userWidgets[key]; - } - }); - return client.setAccountData('m.widgets', userWidgets); -} - - -export default { - getWidgets, - getRoomWidgets, - getUserWidgets, - getUserWidgetsArray, - getStickerpickerWidgets, - removeStickerpickerWidgets, -}; From 6cf11a15e62d8864a351fc1bc76fd5b4e8f4b75c Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 11:59:16 +0100 Subject: [PATCH 387/480] Move WidgetUtils to utils dir --- src/CallHandler.js | 2 +- src/ScalarMessaging.js | 2 +- src/components/views/elements/AppPermission.js | 2 +- src/components/views/elements/AppTile.js | 2 +- src/components/views/rooms/AppsDrawer.js | 2 +- src/components/views/rooms/Stickerpicker.js | 2 +- src/{ => utils}/WidgetUtils.js | 6 +++--- 7 files changed, 9 insertions(+), 9 deletions(-) rename src/{ => utils}/WidgetUtils.js (99%) diff --git a/src/CallHandler.js b/src/CallHandler.js index 852827f6fe..05aa9d974f 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -61,7 +61,7 @@ import Matrix from 'matrix-js-sdk'; import dis from './dispatcher'; import { showUnknownDeviceDialogForCalls } from './cryptodevices'; import SettingsStore from "./settings/SettingsStore"; -import WidgetUtils from './WidgetUtils'; +import WidgetUtils from './utils/WidgetUtils'; global.mxCalls = { //room_id: MatrixCall diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 24c69194f5..fb5ea9f76d 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -236,7 +236,7 @@ import SdkConfig from './SdkConfig'; import MatrixClientPeg from './MatrixClientPeg'; import { MatrixEvent } from 'matrix-js-sdk'; import dis from './dispatcher'; -import WidgetUtils from './WidgetUtils'; +import WidgetUtils from './utils/WidgetUtils'; import RoomViewStore from './stores/RoomViewStore'; import { _t } from './languageHandler'; diff --git a/src/components/views/elements/AppPermission.js b/src/components/views/elements/AppPermission.js index 231ed52364..6b4536b620 100644 --- a/src/components/views/elements/AppPermission.js +++ b/src/components/views/elements/AppPermission.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import url from 'url'; import { _t } from '../../../languageHandler'; -import WidgetUtils from "../../../WidgetUtils"; +import WidgetUtils from "../../../utils/WidgetUtils"; export default class AppPermission extends React.Component { constructor(props) { diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 70b5bd651e..61d5a0f1ac 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -31,7 +31,7 @@ import sdk from '../../../index'; import AppPermission from './AppPermission'; import AppWarning from './AppWarning'; import MessageSpinner from './MessageSpinner'; -import WidgetUtils from '../../../WidgetUtils'; +import WidgetUtils from '../../../utils/WidgetUtils'; import dis from '../../../dispatcher'; const ALLOWED_APP_URL_SCHEMES = ['https:', 'http:']; diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index f0b7eaa1d7..ecf9859d2b 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -27,7 +27,7 @@ import SdkConfig from '../../../SdkConfig'; import ScalarAuthClient from '../../../ScalarAuthClient'; import ScalarMessaging from '../../../ScalarMessaging'; import { _t } from '../../../languageHandler'; -import WidgetUtils from '../../../WidgetUtils'; +import WidgetUtils from '../../../utils/WidgetUtils'; import SettingsStore from "../../../settings/SettingsStore"; // The maximum number of widgets that can be added in a room diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index 992e5b7c53..4cb7c59ce6 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -23,7 +23,7 @@ import SdkConfig from '../../../SdkConfig'; import ScalarAuthClient from '../../../ScalarAuthClient'; import dis from '../../../dispatcher'; import AccessibleButton from '../elements/AccessibleButton'; -import WidgetUtils from '../../../WidgetUtils'; +import WidgetUtils from '../../../utils/WidgetUtils'; const widgetType = 'm.stickerpicker'; diff --git a/src/WidgetUtils.js b/src/utils/WidgetUtils.js similarity index 99% rename from src/WidgetUtils.js rename to src/utils/WidgetUtils.js index f54419f5e2..933609b302 100644 --- a/src/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -15,9 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import MatrixClientPeg from './MatrixClientPeg'; -import SdkConfig from "./SdkConfig"; -import dis from './dispatcher'; +import MatrixClientPeg from '../MatrixClientPeg'; +import SdkConfig from "../SdkConfig"; +import dis from '../dispatcher'; import * as url from "url"; export default class WidgetUtils { From ca8a4a0c3f137520718e6dd645700abd8e3f0fc6 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 12:08:33 +0100 Subject: [PATCH 388/480] Remove unused function --- src/utils/WidgetUtils.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js index 933609b302..b9cc2bae13 100644 --- a/src/utils/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -254,17 +254,6 @@ export default class WidgetUtils { }); } - /** - * Get all widgets (user and room) for the current user - * @param {object} room The room to get widgets for - * @return {[object]} Array containing current / active room and user widget state events - */ - static getWidgets(room) { - const widgets = getRoomWidgets(room); - widgets.concat(getUserWidgetsArray()); - return widgets; - } - /** * Get room specific widgets * @param {object} room The room to get widgets force From b6f3b2f594abfde62870f78cb1ad058ee5f8cc41 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 12:28:59 +0100 Subject: [PATCH 389/480] More code re-use --- src/ScalarMessaging.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index fb5ea9f76d..41224c266f 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -360,17 +360,9 @@ function getWidgets(event, roomId) { sendError(event, _t('This room is not recognised.')); return; } - // TODO - Room widgets need to be moved to 'm.widget' state events - // https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing - const stateEvents = room.currentState.getStateEvents("im.vector.modular.widgets"); - // Only return widgets which have required fields - if (room) { - stateEvents.forEach((ev) => { - if (ev.getContent().type && ev.getContent().url) { - widgetStateEvents.push(ev.event); // return the raw event - } - }); - } + // XXX: This gets the raw event object (I think because we can't + // send the MatrixEvent over postMessage?) + widgetStateEvents = WidgetUtils.getRoomWidgets(room).map((ev) => ev.event); } // Add user widgets (not linked to a specific room) From 0a6450507eb70ea80e856a26183e02e6503da4bc Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 15:21:22 +0100 Subject: [PATCH 390/480] Bits of PR feedback --- src/CallHandler.js | 6 ++---- src/utils/WidgetUtils.js | 16 ++++++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index 05aa9d974f..b470585f36 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -414,7 +414,7 @@ function _startCallApp(roomId, type) { } const currentJitsiWidgets = WidgetUtils.getRoomWidgets(room).filter((ev) => { - return ev.getContent().type == 'jitsi'; + return ev.getContent().type === 'jitsi'; }); if (currentJitsiWidgets.length > 0) { console.warn( @@ -449,9 +449,7 @@ function _startCallApp(roomId, type) { queryString ); - const widgetData = { - widgetSessionId: widgetSessionId, - }; + const widgetData = { widgetSessionId }; const widgetId = ( 'jitsi_' + diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js index b9cc2bae13..724fd490a4 100644 --- a/src/utils/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -210,8 +210,10 @@ export default class WidgetUtils { console.error(`$widgetId is non-configurable`); } + const addingWidget = widgetUrl !== null; + // Add new widget / update - if (widgetUrl !== null) { + if (addingWidget) { userWidgets[widgetId] = { content: content, sender: client.getUserId(), @@ -226,7 +228,7 @@ export default class WidgetUtils { // wait for this, the action will complete but if the user is fast enough, // the widget still won't actually be there. return client.setAccountData('m.widgets', userWidgets).then(() => { - return WidgetUtils.waitForUserWidget(widgetId, widgetUrl !== null); + return WidgetUtils.waitForUserWidget(widgetId, addingWidget); }).then(() => { dis.dispatch({ action: "user_widget_updated" }); }); @@ -235,22 +237,24 @@ export default class WidgetUtils { static setRoomWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData, roomId) { let content; - if (widgetUrl === null) { // widget is being deleted - content = {}; - } else { + const addingWidget = widgetUrl !== null; + + if (addingWidget) { content = { type: widgetType, url: widgetUrl, name: widgetName, data: widgetData, }; + } else { + 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 return client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).then(() => { - return WidgetUtils.waitForRoomWidget(widgetId, roomId, widgetUrl !== null); + return WidgetUtils.waitForRoomWidget(widgetId, roomId, addingWidget); }); } From c971b685ad8c982d65e3a6a63015660839bb07f2 Mon Sep 17 00:00:00 2001 From: Krombel <krombel@krombel.de> Date: Tue, 26 Jun 2018 14:35:43 +0000 Subject: [PATCH 391/480] Translated using Weblate (German) Currently translated at 100.0% (1204 of 1204 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9b1c5acb8d..1570c5c285 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1195,5 +1195,12 @@ "Share Message": "Teile Nachricht", "No Audio Outputs detected": "Keine Ton-Ausgabe erkannt", "Audio Output": "Ton-Ausgabe", - "Try the app first": "App erst ausprobieren" + "Try the app first": "App erst ausprobieren", + "Jitsi Conference Calling": "Jitsi-Konferenz Anruf", + "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 verschlüsselten Räumen, wie diesem, ist die Link-Vorschau standardmäßig deaktiviert damit dein Heimserver (auf dem die Vorschau erzeugt wird) keine Informationen über Links in diesem Raum bekommt.", + "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.": "Wenn jemand eine Nachricht mit einem Link schickt, kann die Link-Vorschau mehr Informationen, wie Titel, Beschreibung und Bild der Webseite, über den Link anzeigen.", + "The email field must not be blank.": "Das E-Mail-Feld darf nicht leer sein.", + "The user name field must not be blank.": "Das Benutzername-Feld darf nicht leer sein.", + "The phone number field must not be blank.": "Das Telefonnummern-Feld darf nicht leer sein.", + "The password field must not be blank.": "Das Passwort-Feld darf nicht leer sein." } From 4a39297e65efc3effc329dc6a64f21b0cbc9ec2c Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 15:41:43 +0100 Subject: [PATCH 392/480] PR feedback --- src/utils/WidgetUtils.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js index 724fd490a4..69a840ce55 100644 --- a/src/utils/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -284,11 +284,10 @@ export default class WidgetUtils { throw new Error('User not logged in'); } const userWidgets = client.getAccountData('m.widgets'); - let userWidgetContent = {}; if (userWidgets && userWidgets.getContent()) { - userWidgetContent = userWidgets.getContent(); + return userWidgets.getContent(); } - return userWidgetContent; + return {}; } /** From cb89406d3e25cce745e60155703717a38110ac69 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 15:42:29 +0100 Subject: [PATCH 393/480] Indent --- src/utils/WidgetUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js index 69a840ce55..924500b97d 100644 --- a/src/utils/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -295,7 +295,7 @@ export default class WidgetUtils { * @return {[object]} Array containing current / active user widgets */ static getUserWidgetsArray() { - return Object.values(WidgetUtils.getUserWidgets()); + return Object.values(WidgetUtils.getUserWidgets()); } /** From 9539a749e544d40bb816580ceaa3e1ee7e74e323 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 16:03:58 +0100 Subject: [PATCH 394/480] More refactoring --- src/components/structures/RoomView.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 8f03199a62..98d700e0a0 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -46,6 +46,7 @@ import { KeyCode, isOnlyCtrlOrCmdKeyEvent } from '../../Keyboard'; import RoomViewStore from '../../stores/RoomViewStore'; import RoomScrollStateStore from '../../stores/RoomScrollStateStore'; import SettingsStore, {SettingLevel} from "../../settings/SettingsStore"; +import WidgetUtils from '../../utils/WidgetUtils'; const DEBUG = false; let debuglog = function() {}; @@ -318,14 +319,7 @@ module.exports = React.createClass({ return false; } - const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); - // any valid widget = show apps - for (let i = 0; i < appsStateEvents.length; i++) { - if (appsStateEvents[i].getContent().type && appsStateEvents[i].getContent().url) { - return true; - } - } - return false; + return WidgetUtils.getRoomWidgets(room).length > 0; }, componentDidMount: function() { From a88297d7a6eeadaecab0abf15a059c6255cf17d5 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 16:27:17 +0100 Subject: [PATCH 395/480] More code reuse --- src/components/views/elements/AppTile.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 61d5a0f1ac..ea303a96b2 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -319,14 +319,15 @@ export default class AppTile extends React.Component { return; } this.setState({deleting: true}); - MatrixClientPeg.get().sendStateEvent( - this.props.room.roomId, - 'im.vector.modular.widgets', - {}, // empty content + + WidgetUtils.setRoomWidget( this.props.id, - ).then(() => { - return WidgetUtils.waitForRoomWidget(this.props.id, this.props.room.roomId, false); - }).catch((e) => { + null, + null, + null, + null, + this.props.room.roomId, + ).catch((e) => { console.error('Failed to delete widget', e); }).finally(() => { this.setState({deleting: false}); From c780cd05a8b918cc91926a697faf374eaa55da7b Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 16:33:28 +0100 Subject: [PATCH 396/480] Change argument order of setRoomWidget So when deleting a widget we can just omit the ones we don't need --- src/CallHandler.js | 2 +- src/ScalarMessaging.js | 2 +- src/components/views/elements/AppTile.js | 6 +----- src/utils/WidgetUtils.js | 6 +++--- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index b470585f36..7403483e36 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -458,7 +458,7 @@ function _startCallApp(roomId, type) { Date.now() ); - WidgetUtils.setRoomWidget(widgetId, 'jitsi', widgetUrl, 'Jitsi', widgetData, roomId).then(() => { + WidgetUtils.setRoomWidget(roomId, widgetId, 'jitsi', widgetUrl, 'Jitsi', widgetData).then(() => { console.log('Jitsi widget added'); }).catch((e) => { console.error(e); diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 41224c266f..3325044b84 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -336,7 +336,7 @@ function setWidget(event, roomId) { if (!roomId) { sendError(event, _t('Missing roomId.'), null); } - WidgetUtils.setRoomWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData, roomId).then(() => { + WidgetUtils.setRoomWidget(roomId, widgetId, widgetType, widgetUrl, widgetName, widgetData).then(() => { sendResponse(event, { success: true, }); diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index ea303a96b2..7b69057e3e 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -321,12 +321,8 @@ export default class AppTile extends React.Component { this.setState({deleting: true}); WidgetUtils.setRoomWidget( - this.props.id, - null, - null, - null, - null, this.props.room.roomId, + this.props.id, ).catch((e) => { console.error('Failed to delete widget', e); }).finally(() => { diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js index 924500b97d..ab5b5b0130 100644 --- a/src/utils/WidgetUtils.js +++ b/src/utils/WidgetUtils.js @@ -210,7 +210,7 @@ export default class WidgetUtils { console.error(`$widgetId is non-configurable`); } - const addingWidget = widgetUrl !== null; + const addingWidget = Boolean(widgetUrl); // Add new widget / update if (addingWidget) { @@ -234,10 +234,10 @@ export default class WidgetUtils { }); } - static setRoomWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData, roomId) { + static setRoomWidget(roomId, widgetId, widgetType, widgetUrl, widgetName, widgetData) { let content; - const addingWidget = widgetUrl !== null; + const addingWidget = Boolean(widgetUrl); if (addingWidget) { content = { From 0ee8d18f5aff89a8dabb4c1ca5a2ae1cf6ce179e Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 26 Jun 2018 16:41:44 +0100 Subject: [PATCH 397/480] More code de-duping --- src/components/views/rooms/AppsDrawer.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index ecf9859d2b..04e47f0f9f 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -163,14 +163,7 @@ module.exports = React.createClass({ }, _getApps: function() { - const appsStateEvents = this.props.room.currentState.getStateEvents('im.vector.modular.widgets'); - if (!appsStateEvents) { - return []; - } - - return appsStateEvents.filter((ev) => { - return ev.getContent().type && ev.getContent().url; - }).map((ev) => { + return WidgetUtils.getRoomWidgets(this.props.room).map((ev) => { return this._initAppConfig(ev.getStateKey(), ev.getContent(), ev.sender); }); }, From 4fb4589ebd443e876c45756159cba0a113798053 Mon Sep 17 00:00:00 2001 From: Marek Lach <graweeld@gmail.com> Date: Tue, 26 Jun 2018 12:14:37 +0000 Subject: [PATCH 398/480] Translated using Weblate (Slovak) Currently translated at 99.7% (1201 of 1204 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index bc4e749d42..a9ef860add 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1195,5 +1195,9 @@ "No Audio Outputs detected": "Neboli rozpoznané žiadne zvukové výstupy", "Audio Output": "Zvukový výstup", "Try the app first": "Najskôr aplikáciu vyskúšaj", - "Share Room Message": "Správa o zdieľaní miestnosti" + "Share Room Message": "Správa o zdieľaní miestnosti", + "The email field must not be blank.": "Položka emailu nemôže byť prázdna.", + "The user name field must not be blank.": "Položka užívateľovej prezývky nemôže byť prázdna.", + "The phone number field must not be blank.": "Telefonné číslo nemôže ostať nevyplnené.", + "The password field must not be blank.": "Položka s heslom nemôže ostať nevyplnená." } From 67f803bc5f7ac78b526dfe7fb1f4bdcc7553cf86 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 16:59:49 +0100 Subject: [PATCH 399/480] don't fire share dialog when clicking timestamp of event, it was tripping people up and broke search permalinks Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/EventTile.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index aa2f28024e..bae3ac8fa7 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -439,17 +439,6 @@ module.exports = withMatrixClient(React.createClass({ }); }, - onPermalinkShareClicked: function(e) { - // These permalinks are like above, can be opened in new tab/window to matrix.to - // but otherwise fire the ShareDialog as it makes little sense to click permalink - // whilst it is in the current room - e.preventDefault(); - const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); - Modal.createTrackedDialog('share room event dialog', '', ShareDialog, { - target: this.props.mxEvent, - }); - }, - _renderE2EPadlock: function() { const ev = this.props.mxEvent; const props = {onClick: this.onCryptoClicked}; @@ -680,7 +669,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender } <div className="mx_EventTile_reply"> - <a href={permalink} onClick={this.onPermalinkShareClicked}> + <a href={permalink} onClick={this.onPermalinkClicked}> { timestamp } </a> { this._renderE2EPadlock() } @@ -707,7 +696,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender } <div className="mx_EventTile_line"> - <a href={permalink} onClick={this.onPermalinkShareClicked}> + <a href={permalink} onClick={this.onPermalinkClicked}> { timestamp } </a> { this._renderE2EPadlock() } From b1b140d7aaae140f1f805a1d0b530883f97b6ccd Mon Sep 17 00:00:00 2001 From: Marek Lach <graweeld@gmail.com> Date: Tue, 26 Jun 2018 12:19:40 +0000 Subject: [PATCH 400/480] Translated using Weblate (Czech) Currently translated at 89.8% (1082 of 1204 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 52eabf0edc..9ac753e285 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1078,5 +1078,7 @@ "Checking for an update...": "Kontrola aktualizací...", "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena", "The platform you're on": "Platforma na které jsi", - "The version of Riot.im": "Verze Riot.im" + "The version of Riot.im": "Verze Riot.im", + "Whether or not you're logged in (we don't record your user name)": "Jestli jsi, nebo nejsi přihlášen (tvou přezdívku neukládáme)", + "Your language of choice": "Tvá jazyková volba" } From e1afe2a4696bfa144d97e09bbc5f9e1960f50554 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Mon, 25 Jun 2018 17:15:53 +0000 Subject: [PATCH 401/480] Translated using Weblate (Russian) Currently translated at 99.6% (1200 of 1204 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index ae889c5677..0ec001a138 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1191,5 +1191,12 @@ "Share User": "Поделиться пользователем", "Share Community": "Поделиться сообществом", "Link to selected message": "Ссылка на выбранное сообщение", - "COPY": "КОПИРОВАТЬ" + "COPY": "КОПИРОВАТЬ", + "Jitsi Conference Calling": "Конференц-связь Jitsi", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "В зашифрованных комнатах, подобных этой, предварительный просмотр URL-адресов отключен по умолчанию, чтобы гарантировать, что ваш сервер (где создаются предварительные просмотры) не может собирать информацию о ссылках, которые вы видите в этой комнате.", + "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Когда кто-то вставляет URL-адрес в свое сообщение, может быть отображен предварительный просмотр URL-адреса, чтобы предоставить дополнительную информацию об этой ссылке, такую как название, описание и изображение с веб-сайта.", + "The email field must not be blank.": "Поле email не должно быть пустым.", + "The user name field must not be blank.": "Поле имени пользователя не должно быть пустым.", + "The phone number field must not be blank.": "Поле номера телефона не должно быть пустым.", + "The password field must not be blank.": "Поле пароля не должно быть пустым." } From cef624d6bec8e6bb172d79f017fa5cc576ea7986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Tue, 26 Jun 2018 15:52:27 +0000 Subject: [PATCH 402/480] Translated using Weblate (Slovak) Currently translated at 99.8% (1202 of 1204 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index a9ef860add..73a57754f0 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1199,5 +1199,6 @@ "The email field must not be blank.": "Položka emailu nemôže byť prázdna.", "The user name field must not be blank.": "Položka užívateľovej prezývky nemôže byť prázdna.", "The phone number field must not be blank.": "Telefonné číslo nemôže ostať nevyplnené.", - "The password field must not be blank.": "Položka s heslom nemôže ostať nevyplnená." + "The password field must not be blank.": "Položka s heslom nemôže ostať nevyplnená.", + "Jitsi Conference Calling": "Konferenčné hovory Jitsi" } From 19e948155c8957094430d4af9c10dcbc93502c4e Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Tue, 26 Jun 2018 17:06:12 +0100 Subject: [PATCH 403/480] Redact pathnames with origin `file://` --- src/Analytics.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Analytics.js b/src/Analytics.js index 8ffce7077f..41eaca0f63 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -39,9 +39,16 @@ function getRedactedHash(hash) { return hash.replace(hashRegex, "#/$1"); } -// Return the current origin and hash separated with a `/`. This does not include query parameters. +// Return the current origin, path and hash separated with a `/`. This does +// not include query parameters. function getRedactedUrl() { const { origin, pathname, hash } = window.location; + + // Redact paths which could contain unexpected PII + if (origin.startsWith('file://')) { + pathname = "/<redacted>/"; + } + return origin + pathname + getRedactedHash(hash); } From a548c836473d7f1b9787f66f598bdba545953568 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 17:07:39 +0100 Subject: [PATCH 404/480] when the user switches room, close room settings this is especially annoying if they choose Leave Room which indirectly switches room Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/stores/RoomViewStore.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index 923c073065..35cfe69086 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -147,6 +147,8 @@ class RoomViewStore extends Store { joining: payload.joining || false, // Reset replyingToEvent because we don't want cross-room because bad UX replyingToEvent: null, + // pull the user out of Room Settings + isEditingSettings: false, }; if (this._state.forwardingEvent) { From d91730d930ea12fe7efe454a2d8c65a4bd34c737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Tue, 26 Jun 2018 16:12:22 +0000 Subject: [PATCH 405/480] Translated using Weblate (Slovak) Currently translated at 99.7% (1203 of 1206 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 73a57754f0..bd705e7063 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1200,5 +1200,6 @@ "The user name field must not be blank.": "Položka užívateľovej prezývky nemôže byť prázdna.", "The phone number field must not be blank.": "Telefonné číslo nemôže ostať nevyplnené.", "The password field must not be blank.": "Položka s heslom nemôže ostať nevyplnená.", - "Jitsi Conference Calling": "Konferenčné hovory Jitsi" + "Jitsi Conference Calling": "Konferenčné hovory Jitsi", + "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.": "Náhľady URL adries sú v šifrovaných miestnostiach ako je táto predvolene zakázané, aby ste si mohli byť istí, že obsah odkazov z vašej konverzácii nebude zaznamenaný na vašom domovskom serveri počas ich generovania." } From fc593d7359f64ddb64dc060c8781e3d0761cc066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Tue, 26 Jun 2018 16:38:22 +0000 Subject: [PATCH 406/480] Translated using Weblate (Slovak) Currently translated at 99.8% (1204 of 1206 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 47 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index bd705e7063..ec5dce1139 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -60,7 +60,7 @@ "Riot was not given permission to send notifications - please try again": "Aplikácii Riot neboli udelené oprávnenia potrebné pre posielanie oznámení - prosím, skúste to znovu", "Unable to enable Notifications": "Nie je možné povoliť oznámenia", "This email address was not found": "Túto emailovú adresu sa nepodarilo nájsť", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Zdá sa, že vaša emailová adresa nie je priradená k žiadnemu Matrix ID na tomto domovskom servery.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Zdá sa, že vaša emailová adresa nie je priradená k žiadnemu Matrix ID na tomto domovskom serveri.", "Default": "Predvolené", "Moderator": "Moderátor", "Admin": "Správca", @@ -118,7 +118,7 @@ "%(targetName)s rejected the invitation.": "%(targetName)s odmietol pozvanie.", "%(targetName)s left the room.": "%(targetName)s opustil miestnosť.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s povolil vstup %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s vykopol %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s vykázal %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s stiahol pozvanie %(targetName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmenil tému na \"%(topic)s\".", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s odstránil názov miestnosti.", @@ -219,10 +219,10 @@ "Unverified": "Neoverené", "device id: ": "ID zariadenia: ", "Disinvite": "Stiahnuť pozvanie", - "Kick": "Vykopnúť", + "Kick": "Vykázať", "Disinvite this user?": "Stiahnuť pozvanie tohoto používateľa?", - "Kick this user?": "Vykopnúť tohoto používateľa?", - "Failed to kick": "Nepodarilo sa vykopnúť", + "Kick this user?": "Vykázať tohoto používateľa?", + "Failed to kick": "Nepodarilo sa vykázať", "Unban": "Povoliť vstup", "Ban": "Zakázať vstup", "Unban this user?": "Povoliť vstúpiť tomuto používateľovi?", @@ -326,8 +326,8 @@ "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Chcete <acceptText>prijať</acceptText> alebo <declineText>odmietnuť</declineText> toto pozvanie?", "Reason: %(reasonText)s": "Dôvod: %(reasonText)s", "Rejoin": "Vstúpiť znovu", - "You have been kicked from %(roomName)s by %(userName)s.": "Používateľ %(userName)s vás vykopol z miestnosti %(roomName)s.", - "You have been kicked from this room by %(userName)s.": "Používateľ %(userName)s vás vykopol z tejto miestnosti.", + "You have been kicked from %(roomName)s by %(userName)s.": "Používateľ %(userName)s vás vykázal z miestnosti %(roomName)s.", + "You have been kicked from this room by %(userName)s.": "Používateľ %(userName)s vás vykázal z tejto miestnosti.", "You have been banned from %(roomName)s by %(userName)s.": "Používateľ %(userName)s vám zakázal vstúpiť do miestnosti %(roomName)s.", "You have been banned from this room by %(userName)s.": "Používateľ %(userName)s vám zakázal vstúpiť do tejto miestnosti.", "This room": "Táto miestnosť", @@ -364,7 +364,7 @@ "Privileged Users": "Poverení používatelia", "No users have specific privileges in this room": "Žiadny používatelia nemajú v tejto miestnosti pridelené konkrétne poverenia", "Banned users": "Používatelia, ktorým bol zakázaný vstup", - "This room is not accessible by remote Matrix servers": "Táto miestnosť nie je prístupná cez vzdialené Matrix servery", + "This room is not accessible by remote Matrix servers": "Táto miestnosť nie je prístupná zo vzdialených Matrix serverov", "Leave room": "Opustiť miestnosť", "Favourite": "Obľúbená", "Tagged as: ": "Označená ako: ", @@ -375,7 +375,7 @@ "Only people who have been invited": "Len pozvaní ľudia", "Anyone who knows the room's link, apart from guests": "Ktokoľvek, kto pozná odkaz do miestnosti (okrem hostí)", "Anyone who knows the room's link, including guests": "Ktokoľvek, kto pozná odkaz do miestnosti (vrátane hostí)", - "Publish this room to the public in %(domain)s's room directory?": "Uverejniť túto miestnosť v adresáry miestností na servery %(domain)s?", + "Publish this room to the public in %(domain)s's room directory?": "Uverejniť túto miestnosť v adresári miestností na serveri %(domain)s?", "Who can read history?": "Kto môže čítať históriu?", "Anyone": "Ktokoľvek", "Members only (since the point in time of selecting this option)": "Len členovia (odkedy je aktívna táto voľba)", @@ -387,7 +387,7 @@ "To send messages, you must be a": "Aby ste mohli posielať správy, musíte byť", "To invite users into the room, you must be a": "Aby ste mohli pozývať používateľov do miestnosti, musíte byť", "To configure the room, you must be a": "Aby ste mohli nastavovať miestnosť, musíte byť", - "To kick users, you must be a": "Aby ste mohli vykopávať používateľov, musíte byť", + "To kick users, you must be a": "Aby ste mohli vykazovať používateľov, musíte byť", "To ban users, you must be a": "Aby ste používateľom mohli zakazovať vstup, musíte byť", "To remove other users' messages, you must be a": "Aby ste mohli odstraňovať správy, ktoré poslali iní používatelia, musíte byť", "To send events of type <eventType/>, you must be a": "Aby ste mohli posielať udalosti typu <eventType/>, musíte byť", @@ -437,7 +437,7 @@ "Sign in with CAS": "Prihlásiť sa s použitím CAS", "Custom Server Options": "Vlastné možnosti servera", "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Vlastné nastavenia servera môžete použiť na pripojenie k iným serverom Matrix a to zadaním URL adresy domovského servera.", - "This allows you to use this app with an existing Matrix account on a different home server.": "Umožní vám to použiť túto aplikáciu s už existujúcim Matrix účtom na akomkoľvek domovskom servery.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Umožní vám to použiť túto aplikáciu s už existujúcim Matrix účtom na akomkoľvek domovskom serveri.", "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Môžete tiež zadať vlastnú adresu servera totožností, čo však za štandardných okolností znemožní interakcie medzi používateľmi založené emailovou adresou.", "Dismiss": "Zamietnuť", "To continue, please enter your password.": "Aby ste mohli pokračovať, prosím zadajte svoje heslo.", @@ -452,7 +452,7 @@ "User name": "Meno používateľa", "Mobile phone number": "Číslo mobilného telefónu", "Forgot your password?": "Zabudli ste heslo?", - "%(serverName)s Matrix ID": "Matrix ID na servery %(serverName)s", + "%(serverName)s Matrix ID": "Matrix ID na serveri %(serverName)s", "Sign in with": "Na prihlásenie sa použije", "Email address": "Emailová adresa", "Sign in": "Prihlásiť sa", @@ -539,10 +539,10 @@ "were unbanned %(count)s times|one": "mali povolený vstup", "was unbanned %(count)s times|other": "mal %(count)s krát povolený vstup", "was unbanned %(count)s times|one": "mal povolený vstup", - "were kicked %(count)s times|other": "boli %(count)s krát vykopnutí", - "were kicked %(count)s times|one": "boli vykopnutí", - "was kicked %(count)s times|other": "bol %(count)s krát vykopnutý", - "was kicked %(count)s times|one": "bol vykopnutý", + "were kicked %(count)s times|other": "boli %(count)s krát vykázaní", + "were kicked %(count)s times|one": "boli vykázaní", + "was kicked %(count)s times|other": "bol %(count)s krát vykázaný", + "was kicked %(count)s times|one": "bol vykázaný", "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)ssi %(count)s krát zmenili meno", "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)ssi zmenili meno", "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)ssi %(count)s krát zmenil meno", @@ -621,7 +621,7 @@ "An error occurred: %(error_string)s": "Vyskytla sa chyba: %(error_string)s", "Username available": "Používateľské meno je k dispozícii", "To get started, please pick a username!": "Začnite tým, že si zvolíte používateľské meno!", - "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Toto bude názov vašeho účtu na domovskom servery <span></span>, alebo si môžete zvoliť <a>iný server</a>.", + "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Toto bude názov vašeho účtu na domovskom serveri <span></span>, alebo si môžete zvoliť <a>iný server</a>.", "If you already have a Matrix account you can <a>log in</a> instead.": "Ak už máte Matrix účet, môžete sa hneď <a>Prihlásiť</a>.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Momentálne sa ku všetkym neovereným zariadeniam správate ako by boli na čiernej listine; aby ste na tieto zariadenia mohli posielať správy, mali by ste ich overiť.", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Odporúčame vám prejsť procesom overenia pre všetky tieto zariadenia aby ste si potvrdili, že skutočne patria ich pravým vlastníkom, ak si to však želáte, môžete tiež znovu poslať správu bez overovania.", @@ -725,7 +725,7 @@ "Don't send typing notifications": "Neposielať oznámenia keď píšete", "Always show message timestamps": "Vždy zobrazovať časovú značku správ", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Pri zobrazovaní časových značiek používať 12 hodinový formát (napr. 2:30pm)", - "Hide join/leave messages (invites/kicks/bans unaffected)": "Skryť správy o vstupe a opustení miestnosti (netýka sa pozvaní/vykopnutí/zákazov vstupu)", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Skryť správy o vstupe a opustení miestnosti (netýka sa pozvaní/vykázaní/zákazov vstupu)", "Use compact timeline layout": "Použiť kompaktné rozloženie časovej osy", "Hide removed messages": "Skryť odstránené správy", "Enable automatic language detection for syntax highlighting": "Povoliť automatickú detegciu jazyka pre zvýrazňovanie syntaxe", @@ -813,7 +813,7 @@ "Create an account": "Vytvoriť účet", "This Home Server does not support login using email address.": "Tento domovský server nepodporuje prihlasovanie sa emailom.", "Incorrect username and/or password.": "Nesprávne meno používateľa a / alebo heslo.", - "Guest access is disabled on this Home Server.": "Na tomto domovskom servery je zakázaný prístup pre hostí.", + "Guest access is disabled on this Home Server.": "Na tomto domovskom serveri je zakázaný prístup pre hostí.", "The phone number entered looks invalid": "Zdá sa, že zadané telefónne číslo je neplatné", "Error: Problem communicating with the given homeserver.": "Chyba: Nie je možné komunikovať so zadaným domovským serverom.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "K domovskému serveru nie je možné pripojiť sa použitím protokolu HTTP keďže v adresnom riadku prehliadača máte HTTPS adresu. Použite protokol HTTPS alebo <a>povolte nezabezpečené skripty</a>.", @@ -838,7 +838,7 @@ "Invites user with given id to current room": "Pošle používateľovi so zadaným ID pozvanie do tejto miestnosti", "Joins room with given alias": "Vstúpi do miestnosti so zadaným aliasom", "Sets the room topic": "Nastaví tému miestnosti", - "Kicks user with given id": "Vykopne používateľa so zadaným ID", + "Kicks user with given id": "Vykáže používateľa so zadaným ID", "Changes your display nickname": "Zmení vaše zobrazované meno", "Searches DuckDuckGo for results": "Vyhľadá výsledky na DuckDuckGo", "Changes colour scheme of current room": "Zmení farebnú schému aktuálnej miestnosti", @@ -884,7 +884,7 @@ "Sign in to get started": "Začnite prihlásením sa", "Status.im theme": "Téma status.im", "Please note you are logging into the %(hs)s server, not matrix.org.": "Všimnite si: Práve sa prihlasujete na server %(hs)s, nie na server matrix.org.", - "Username on %(hs)s": "Meno používateľa na servery %(hs)s", + "Username on %(hs)s": "Meno používateľa na serveri %(hs)s", "Restricted": "Obmedzené", "Hide avatar changes": "Skryť zmeny obrázka v profile", "Hide display name changes": "Skryť zmeny zobrazovaného mena", @@ -1095,7 +1095,7 @@ "When I'm invited to a room": "Pozvania vstúpiť do miestnosti", "Can't update user notification settings": "Nie je možné aktualizovať používateľské nastavenia oznamovania", "Notify for all other messages/rooms": "oznamovať všetky ostatné správy / miestnosti", - "Unable to look up room ID from server": "Nie je možné vyhľadať ID miestnosti na servery", + "Unable to look up room ID from server": "Nie je možné vyhľadať ID miestnosti na serveri", "Couldn't find a matching Matrix room": "Nie je možné nájsť zodpovedajúcu Matrix miestnosť", "Invite to this room": "Pozvať do tejto miestnosti", "You cannot delete this message. (%(code)s)": "Nemôžete vymazať túto správu. (%(code)s)", @@ -1201,5 +1201,6 @@ "The phone number field must not be blank.": "Telefonné číslo nemôže ostať nevyplnené.", "The password field must not be blank.": "Položka s heslom nemôže ostať nevyplnená.", "Jitsi Conference Calling": "Konferenčné hovory Jitsi", - "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.": "Náhľady URL adries sú v šifrovaných miestnostiach ako je táto predvolene zakázané, aby ste si mohli byť istí, že obsah odkazov z vašej konverzácii nebude zaznamenaný na vašom domovskom serveri počas ich generovania." + "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.": "Náhľady URL adries sú v šifrovaných miestnostiach ako je táto predvolene zakázané, aby ste si mohli byť istí, že obsah odkazov z vašej konverzácii nebude zaznamenaný na vašom domovskom serveri počas ich generovania.", + "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.": "Ak niekto vo svojej správe pošle URL adresu, môže byť zobrazený jej náhľad obsahujúci názov, popis a obrázok z cieľovej web stránky." } From 5c7f2cc32f5d8d518148197518e4c2f0713da56f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Tue, 26 Jun 2018 19:57:33 +0000 Subject: [PATCH 407/480] Translated using Weblate (Slovak) Currently translated at 100.0% (1207 of 1207 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index ec5dce1139..633734acfc 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1202,5 +1202,8 @@ "The password field must not be blank.": "Položka s heslom nemôže ostať nevyplnená.", "Jitsi Conference Calling": "Konferenčné hovory Jitsi", "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.": "Náhľady URL adries sú v šifrovaných miestnostiach ako je táto predvolene zakázané, aby ste si mohli byť istí, že obsah odkazov z vašej konverzácii nebude zaznamenaný na vašom domovskom serveri počas ich generovania.", - "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.": "Ak niekto vo svojej správe pošle URL adresu, môže byť zobrazený jej náhľad obsahujúci názov, popis a obrázok z cieľovej web stránky." + "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.": "Ak niekto vo svojej správe pošle URL adresu, môže byť zobrazený jej náhľad obsahujúci názov, popis a obrázok z cieľovej web stránky.", + "Call in Progress": "Prebiehajúci hovor", + "A call is already in progress!": "Jeden hovor už prebieha!", + "You have no historical rooms": "Nemáte žiadne historické miestnosti" } From 09b09846cfe20b1fc1e83956397003d199fff100 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 23:33:35 +0100 Subject: [PATCH 408/480] allow `:port` specifiers in roomalias,groupid and userid as per spec Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/linkify-matrix.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 132695b9de..4cfd7382e5 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -41,6 +41,7 @@ function matrixLinkify(linkify) { const S_HASH_NAME_COLON_DOMAIN = new linkify.parser.State(); const S_HASH_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_ROOMALIAS = new linkify.parser.State(ROOMALIAS); + const S_ROOMALIAS_COLON = new linkify.parser.State(); const roomname_tokens = [ TT.DOT, @@ -72,6 +73,8 @@ function matrixLinkify(linkify) { S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_ROOMALIAS); S_ROOMALIAS.on(TT.DOT, S_HASH_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) + S_ROOMALIAS.on(TT.COLON, S_ROOMALIAS_COLON); // do not accept trailing `:` + S_ROOMALIAS_COLON.on(TT.NUM, S_ROOMALIAS); // but do accept :NUM (port specifier) const USERID = function(value) { @@ -87,6 +90,7 @@ function matrixLinkify(linkify) { const S_AT_NAME_COLON_DOMAIN = new linkify.parser.State(); const S_AT_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_USERID = new linkify.parser.State(USERID); + const S_USERID_COLON = new linkify.parser.State(); const username_tokens = [ TT.DOT, @@ -116,6 +120,8 @@ function matrixLinkify(linkify) { S_AT_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_USERID); S_USERID.on(TT.DOT, S_AT_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) + S_USERID.on(TT.COLON, S_USERID_COLON); // do not accept trailing `:` + S_USERID_COLON.on(TT.NUM, S_USERID); // but do accept :NUM (port specifier) const GROUPID = function(value) { @@ -131,6 +137,7 @@ function matrixLinkify(linkify) { const S_PLUS_NAME_COLON_DOMAIN = new linkify.parser.State(); const S_PLUS_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_GROUPID = new linkify.parser.State(GROUPID); + const S_GROUPID_COLON = new linkify.parser.State(); const groupid_tokens = [ TT.DOT, @@ -160,6 +167,8 @@ function matrixLinkify(linkify) { S_PLUS_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_GROUPID); S_GROUPID.on(TT.DOT, S_PLUS_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) + S_GROUPID.on(TT.COLON, S_GROUPID_COLON); // do not accept trailing `:` + S_GROUPID_COLON.on(TT.NUM, S_GROUPID); // but do accept :NUM (port specifier) } // stubs, overwritten in MatrixChat's componentDidMount From 9f3a121abca1b2a40ceb9feb46489c8095a3f1cc Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 23:36:01 +0100 Subject: [PATCH 409/480] optimize linkify-matrix by skipping an intermediary state Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/linkify-matrix.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 4cfd7382e5..637b5869ef 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -35,7 +35,7 @@ function matrixLinkify(linkify) { }; ROOMALIAS.prototype = new MultiToken(); - const S_HASH = new linkify.parser.State(); + const S_HASH = S_START.jump(TT.POUND); const S_HASH_NAME = new linkify.parser.State(); const S_HASH_NAME_COLON = new linkify.parser.State(); const S_HASH_NAME_COLON_DOMAIN = new linkify.parser.State(); @@ -57,8 +57,6 @@ function matrixLinkify(linkify) { TT.LOCALHOST, ]; - S_START.on(TT.POUND, S_HASH); - S_HASH.on(roomname_tokens, S_HASH_NAME); S_HASH_NAME.on(roomname_tokens, S_HASH_NAME); S_HASH_NAME.on(TT.DOMAIN, S_HASH_NAME); @@ -84,7 +82,7 @@ function matrixLinkify(linkify) { }; USERID.prototype = new MultiToken(); - const S_AT = new linkify.parser.State(); + const S_AT = S_START.jump(TT.AT); const S_AT_NAME = new linkify.parser.State(); const S_AT_NAME_COLON = new linkify.parser.State(); const S_AT_NAME_COLON_DOMAIN = new linkify.parser.State(); @@ -104,8 +102,6 @@ function matrixLinkify(linkify) { TT.LOCALHOST, ]; - S_START.on(TT.AT, S_AT); - S_AT.on(username_tokens, S_AT_NAME); S_AT_NAME.on(username_tokens, S_AT_NAME); S_AT_NAME.on(TT.DOMAIN, S_AT_NAME); @@ -131,7 +127,7 @@ function matrixLinkify(linkify) { }; GROUPID.prototype = new MultiToken(); - const S_PLUS = new linkify.parser.State(); + const S_PLUS = S_START.jump(TT.PLUS); const S_PLUS_NAME = new linkify.parser.State(); const S_PLUS_NAME_COLON = new linkify.parser.State(); const S_PLUS_NAME_COLON_DOMAIN = new linkify.parser.State(); @@ -151,8 +147,6 @@ function matrixLinkify(linkify) { TT.LOCALHOST, ]; - S_START.on(TT.PLUS, S_PLUS); - S_PLUS.on(groupid_tokens, S_PLUS_NAME); S_PLUS_NAME.on(groupid_tokens, S_PLUS_NAME); S_PLUS_NAME.on(TT.DOMAIN, S_PLUS_NAME); From 96163d14025ed9cc3707ba52b255c31bc1bbe9c4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 23:41:46 +0100 Subject: [PATCH 410/480] prevent multiple ports (:1234:1234:1234) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/linkify-matrix.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index 637b5869ef..50d50f219a 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -42,6 +42,7 @@ function matrixLinkify(linkify) { const S_HASH_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_ROOMALIAS = new linkify.parser.State(ROOMALIAS); const S_ROOMALIAS_COLON = new linkify.parser.State(); + const S_ROOMALIAS_COLON_NUM = new linkify.parser.State(ROOMALIAS); const roomname_tokens = [ TT.DOT, @@ -72,7 +73,7 @@ function matrixLinkify(linkify) { S_ROOMALIAS.on(TT.DOT, S_HASH_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) S_ROOMALIAS.on(TT.COLON, S_ROOMALIAS_COLON); // do not accept trailing `:` - S_ROOMALIAS_COLON.on(TT.NUM, S_ROOMALIAS); // but do accept :NUM (port specifier) + S_ROOMALIAS_COLON.on(TT.NUM, S_ROOMALIAS_COLON_NUM); // but do accept :NUM (port specifier) const USERID = function(value) { @@ -89,6 +90,7 @@ function matrixLinkify(linkify) { const S_AT_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_USERID = new linkify.parser.State(USERID); const S_USERID_COLON = new linkify.parser.State(); + const S_USERID_COLON_NUM = new linkify.parser.State(USERID); const username_tokens = [ TT.DOT, @@ -117,7 +119,7 @@ function matrixLinkify(linkify) { S_USERID.on(TT.DOT, S_AT_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) S_USERID.on(TT.COLON, S_USERID_COLON); // do not accept trailing `:` - S_USERID_COLON.on(TT.NUM, S_USERID); // but do accept :NUM (port specifier) + S_USERID_COLON.on(TT.NUM, S_USERID_COLON_NUM); // but do accept :NUM (port specifier) const GROUPID = function(value) { @@ -134,6 +136,7 @@ function matrixLinkify(linkify) { const S_PLUS_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); const S_GROUPID = new linkify.parser.State(GROUPID); const S_GROUPID_COLON = new linkify.parser.State(); + const S_GROUPID_COLON_NUM = new linkify.parser.State(GROUPID); const groupid_tokens = [ TT.DOT, @@ -162,7 +165,7 @@ function matrixLinkify(linkify) { S_GROUPID.on(TT.DOT, S_PLUS_NAME_COLON_DOMAIN_DOT); // accept repeated TLDs (e.g .org.uk) S_GROUPID.on(TT.COLON, S_GROUPID_COLON); // do not accept trailing `:` - S_GROUPID_COLON.on(TT.NUM, S_GROUPID); // but do accept :NUM (port specifier) + S_GROUPID_COLON.on(TT.NUM, S_GROUPID_COLON_NUM); // but do accept :NUM (port specifier) } // stubs, overwritten in MatrixChat's componentDidMount From 2782b2ff9ddc6b963d551f5bf9dc39a95c3ffdbb Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Wed, 27 Jun 2018 05:52:45 +0000 Subject: [PATCH 411/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1207 of 1207 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 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 56025bb00c..024166b37c 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1196,5 +1196,14 @@ "Share Message": "Сподели съобщението", "No Audio Outputs detected": "Не са открити аудио изходи", "Audio Output": "Аудио изходи", - "Jitsi Conference Calling": "Jitsi конферентни разговори" + "Jitsi Conference Calling": "Jitsi конферентни разговори", + "Call in Progress": "Тече разговор", + "A call is already in progress!": "В момента вече тече разговор!", + "You have no historical rooms": "Нямате стаи в архива", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "В шифровани стаи като тази, по подразбиране URL прегледите са изключени, за да се подсигури че сървърът (където става генерирането на прегледите) не може да събира информация за връзките споделени в стаята.", + "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Когато някой сподели URL връзка в съобщение, може да бъде показан URL преглед даващ повече информация за връзката (заглавие, описание и картинка от уебсайта).", + "The email field must not be blank.": "Имейл полето не може да бъде празно.", + "The user name field must not be blank.": "Полето за потребителско име не може да е празно.", + "The phone number field must not be blank.": "Полето за телефонен номер не може да е празно.", + "The password field must not be blank.": "Полето за парола не може да е празно." } From 13d26d0d5864125deac5e9d1b3050810720e9f92 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Wed, 27 Jun 2018 08:31:27 +0000 Subject: [PATCH 412/480] Translated using Weblate (Basque) Currently translated at 100.0% (1207 of 1207 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 e23a7493fd..bf7b3da656 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1202,5 +1202,8 @@ "The email field must not be blank.": "E-mail eremua ezin da hutsik laga.", "The user name field must not be blank.": "Erabiltzaile-izen eremua ezin da hutsik laga.", "The phone number field must not be blank.": "Telefono zenbakia eremua ezin da hutsik laga.", - "The password field must not be blank.": "Pasahitza eremua ezin da hutsik laga." + "The password field must not be blank.": "Pasahitza eremua ezin da hutsik laga.", + "Call in Progress": "Deia abian", + "A call is already in progress!": "Badago dei bat abian!", + "You have no historical rooms": "Ez duzu gelen historialik" } From 0c2240a1f278347f18dfed7cc535e02c4c8ff5ea Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Wed, 27 Jun 2018 08:48:32 +0000 Subject: [PATCH 413/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1207 of 1207 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 04ee69b04a..561a6bd35a 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1202,5 +1202,8 @@ "The email field must not be blank.": "Az e-mail mező nem lehet üres.", "The user name field must not be blank.": "A felhasználói név mező nem lehet üres.", "The phone number field must not be blank.": "A telefonszám mező nem lehet üres.", - "The password field must not be blank.": "A jelszó mező nem lehet üres." + "The password field must not be blank.": "A jelszó mező nem lehet üres.", + "Call in Progress": "Hívás folyamatban", + "A call is already in progress!": "A hívás már folyamatban van!", + "You have no historical rooms": "Nincsenek archív szobáid" } From b3341e6664ccfaf76e2a8673fe9b26d7a19b74a7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 27 Jun 2018 09:16:37 +0100 Subject: [PATCH 414/480] on click roomsublist notif badge, goto first room with notif Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/_RoomSubList.scss | 4 ++++ src/components/structures/RoomSubList.js | 27 +++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/res/css/structures/_RoomSubList.scss b/res/css/structures/_RoomSubList.scss index a2863460ad..6798f75a14 100644 --- a/res/css/structures/_RoomSubList.scss +++ b/res/css/structures/_RoomSubList.scss @@ -91,6 +91,10 @@ limitations under the License. background-color: $accent-color; } +.mx_RoomSubList_label .mx_RoomSubList_badge:hover { + filter: brightness($focus-brightness); +} + /* .collapsed .mx_RoomSubList_badge { display: none; diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 0b6f7eaa45..db23466f9a 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -237,6 +237,29 @@ const RoomSubList = React.createClass({ }); }, + _onNotifBadgeClick: function(e) { + // prevent the roomsublist collapsing + e.preventDefault(); + e.stopPropagation(); + // find first room which has notifications and switch to it + for (const room of this.state.sortedList) { + const roomNotifState = RoomNotifs.getRoomNotifsState(room.roomId); + const highlight = room.getUnreadNotificationCount('highlight') > 0; + const notificationCount = room.getUnreadNotificationCount(); + + const notifBadges = notificationCount > 0 && this._shouldShowNotifBadge(roomNotifState); + const mentionBadges = highlight && this._shouldShowMentionBadge(roomNotifState); + + if (notifBadges || mentionBadges) { + dis.dispatch({ + action: 'view_room', + room_id: room.roomId, + }); + return; + } + } + }, + _getHeaderJsx: function() { const subListNotifications = this.roomNotificationCount(); const subListNotifCount = subListNotifications[0]; @@ -258,7 +281,9 @@ const RoomSubList = React.createClass({ let badge; if (subListNotifCount > 0) { - badge = <div className={badgeClasses}>{FormattingUtils.formatCount(subListNotifCount)}</div>; + badge = <div className={badgeClasses} onClick={this._onNotifBadgeClick}> + { FormattingUtils.formatCount(subListNotifCount) } + </div>; } else if (this.props.isInvite) { // no notifications but highlight anyway because this is an invite badge badge = <div className={badgeClasses}>!</div>; From 613e83edb4b89368e54f2ecca559337130f0c351 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 27 Jun 2018 09:49:58 +0100 Subject: [PATCH 415/480] on roomsublist invite badge click goto first room/group Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index db23466f9a..e5a08d62ea 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -26,6 +26,7 @@ import Unread from '../../Unread'; import * as RoomNotifs from '../../RoomNotifs'; import * as FormattingUtils from '../../utils/FormattingUtils'; import { KeyCode } from '../../Keyboard'; +import { Group } from 'matrix-js-sdk'; // turn this on for drop & drag console debugging galore @@ -260,6 +261,28 @@ const RoomSubList = React.createClass({ } }, + _onInviteBadgeClick: function(e) { + // prevent the roomsublist collapsing + e.preventDefault(); + e.stopPropagation(); + // switch to first room in sortedList as that'll be the top of the list for the user + if (this.state.sortedList && this.state.sortedList.length > 0) { + dis.dispatch({ + action: 'view_room', + room_id: this.state.sortedList[0].roomId, + }); + } else if (this.props.extraTiles && this.props.extraTiles.length > 0) { + // Group Invites are different in that they are all extra tiles and not rooms + // XXX: this is a horrible special case because Group Invite sublist is a hack + if (this.props.extraTiles[0].props && this.props.extraTiles[0].props.group instanceof Group) { + dis.dispatch({ + action: 'view_group', + group_id: this.props.extraTiles[0].props.group.groupId, + }); + } + } + }, + _getHeaderJsx: function() { const subListNotifications = this.roomNotificationCount(); const subListNotifCount = subListNotifications[0]; @@ -286,7 +309,7 @@ const RoomSubList = React.createClass({ </div>; } else if (this.props.isInvite) { // no notifications but highlight anyway because this is an invite badge - badge = <div className={badgeClasses}>!</div>; + badge = <div className={badgeClasses} onClick={this._onInviteBadgeClick}>!</div>; } // When collapsed, allow a long hover on the header to show user From a6ab51cd73589eb7c076be4aaba54d7ffec49253 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 27 Jun 2018 09:50:32 +0100 Subject: [PATCH 416/480] change GroupInviteTile from RoomSubList css so new :hover won't apply Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/groups/GroupInviteTile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 7c471cca2e..9e28ff5adf 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -134,7 +134,7 @@ export default React.createClass({ </EmojiText>; const badgeEllipsis = this.state.badgeHover || this.state.menuDisplayed; - const badgeClasses = classNames('mx_RoomSubList_badge mx_RoomSubList_badgeHighlight', { + const badgeClasses = classNames('mx_RoomTile_badge mx_RoomTile_highlight', { 'mx_RoomTile_badgeButton': badgeEllipsis, }); From ee729233c849af843e451ad49d4bd49e2f37c709 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 27 Jun 2018 10:17:25 +0100 Subject: [PATCH 417/480] Update package-lock.json --- package-lock.json | 2427 ++++++++++++++++++++++++++------------------- 1 file changed, 1386 insertions(+), 1041 deletions(-) diff --git a/package-lock.json b/package-lock.json index 433ed3ea4a..048fba30e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", "dev": true, "requires": { - "mime-types": "~2.1.11", + "mime-types": "2.1.17", "negotiator": "0.6.1" } }, @@ -35,7 +35,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "^3.0.4" + "acorn": "3.3.0" }, "dependencies": { "acorn": { @@ -52,6 +52,17 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, "ajv-keywords": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", @@ -64,9 +75,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" } }, "amdefine": { @@ -75,6 +86,11 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "another-json": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", + "integrity": "sha1-tfQBnJc7bdXGUGotk0acttMq7tw=" + }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", @@ -99,8 +115,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" } }, "argparse": { @@ -109,7 +125,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" }, "dependencies": { "sprintf-js": { @@ -126,7 +142,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "arr-flatten": { @@ -141,8 +157,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "1.1.2", + "es-abstract": "1.9.0" } }, "array-slice": { @@ -157,7 +173,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "array-uniq": "1.0.3" } }, "array-uniq": { @@ -189,6 +205,11 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, "assert": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", @@ -198,6 +219,11 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", @@ -210,27 +236,42 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, "babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" + "babel-core": "6.26.0", + "babel-polyfill": "6.26.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "commander": "2.11.0", + "convert-source-map": "1.5.0", + "fs-readdir-recursive": "1.0.0", + "glob": "7.1.2", + "lodash": "4.17.4", + "output-file-sync": "1.1.2", + "path-is-absolute": "1.0.1", + "slash": "1.0.0", + "source-map": "0.5.7", + "v8flags": "2.1.1" }, "dependencies": { "glob": { @@ -239,12 +280,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } } } @@ -255,9 +296,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" } }, "babel-core": { @@ -266,25 +307,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.0", - "debug": "^2.6.8", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.7", - "slash": "^1.0.0", - "source-map": "^0.5.6" + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.0", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" } }, "babel-eslint": { @@ -293,11 +334,11 @@ "integrity": "sha1-UpNBn+NnLWZZjTJ9qWlFZ7pqXy8=", "dev": true, "requires": { - "babel-traverse": "^6.0.20", - "babel-types": "^6.0.19", - "babylon": "^6.0.18", - "lodash.assign": "^4.0.0", - "lodash.pickby": "^4.0.0" + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash.assign": "4.2.0", + "lodash.pickby": "4.6.0" } }, "babel-generator": { @@ -306,14 +347,14 @@ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.6", - "trim-right": "^1.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -322,9 +363,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-builder-react-jsx": { @@ -333,9 +374,9 @@ "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" } }, "babel-helper-call-delegate": { @@ -344,10 +385,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { @@ -356,10 +397,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -368,9 +409,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -379,11 +420,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -392,8 +433,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -402,8 +443,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { @@ -412,8 +453,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { @@ -422,9 +463,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -433,11 +474,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -446,12 +487,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -460,8 +501,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-loader": { @@ -470,10 +511,10 @@ "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", "dev": true, "requires": { - "find-cache-dir": "^0.1.1", - "loader-utils": "^0.2.16", - "mkdirp": "^0.5.1", - "object-assign": "^4.0.1" + "find-cache-dir": "0.1.1", + "loader-utils": "0.2.17", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" } }, "babel-messages": { @@ -482,7 +523,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-add-module-exports": { @@ -497,7 +538,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-syntax-async-functions": { @@ -548,10 +589,10 @@ "integrity": "sha1-Ruo+fFr2KXgqyfHtG3zTj4Qlr9Q=", "dev": true, "requires": { - "babel-helper-function-name": "^6.8.0", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-template": "^6.9.0", - "babel-traverse": "^6.10.4" + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0" } }, "babel-plugin-transform-async-to-generator": { @@ -560,9 +601,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-class-properties": { @@ -571,10 +612,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -583,7 +624,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -592,7 +633,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -601,11 +642,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -614,15 +655,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -631,8 +672,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -641,7 +682,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -650,8 +691,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { @@ -660,7 +701,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -669,9 +710,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { @@ -680,7 +721,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -689,9 +730,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -700,10 +741,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -712,9 +753,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -723,9 +764,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { @@ -734,8 +775,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -744,12 +785,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -758,8 +799,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -768,7 +809,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -777,9 +818,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -788,7 +829,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -797,7 +838,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -806,9 +847,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -817,9 +858,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -828,8 +869,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -838,8 +879,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-display-name": { @@ -848,7 +889,7 @@ "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx": { @@ -857,9 +898,9 @@ "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx-self": { @@ -868,8 +909,8 @@ "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx-source": { @@ -878,8 +919,8 @@ "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -888,7 +929,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "^0.10.0" + "regenerator-transform": "0.10.1" } }, "babel-plugin-transform-runtime": { @@ -897,7 +938,7 @@ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-strict-mode": { @@ -906,8 +947,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-polyfill": { @@ -916,9 +957,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "regenerator-runtime": "0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -935,30 +976,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" } }, "babel-preset-es2016": { @@ -967,7 +1008,7 @@ "integrity": "sha1-+QC/k+LrwNJ235uKtZck6/2Vn4s=", "dev": true, "requires": { - "babel-plugin-transform-exponentiation-operator": "^6.24.1" + "babel-plugin-transform-exponentiation-operator": "6.24.1" } }, "babel-preset-es2017": { @@ -976,8 +1017,8 @@ "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", "dev": true, "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.24.1" + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1" } }, "babel-preset-flow": { @@ -986,7 +1027,7 @@ "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "dev": true, "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" + "babel-plugin-transform-flow-strip-types": "6.22.0" } }, "babel-preset-react": { @@ -995,12 +1036,12 @@ "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" } }, "babel-register": { @@ -1009,13 +1050,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" } }, "babel-runtime": { @@ -1023,8 +1064,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" } }, "babel-template": { @@ -1033,11 +1074,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" } }, "babel-traverse": { @@ -1046,15 +1087,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" } }, "babel-types": { @@ -1063,10 +1104,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -1104,6 +1145,15 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1148,15 +1198,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", + "depd": "1.1.1", + "http-errors": "1.6.2", "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "~1.6.15" + "type-is": "1.6.15" } }, "brace-expansion": { @@ -1164,7 +1214,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1174,9 +1224,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "browser-encrypt-attachment": { @@ -1201,7 +1251,7 @@ "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", "dev": true, "requires": { - "inherits": "^2.0.1" + "inherits": "2.0.3" } }, "browserify-zlib": { @@ -1210,7 +1260,7 @@ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", "dev": true, "requires": { - "pako": "~0.2.0" + "pako": "0.2.9" }, "dependencies": { "pako": { @@ -1227,9 +1277,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" } }, "builtin-status-codes": { @@ -1250,7 +1300,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "^0.2.0" + "callsites": "0.2.0" } }, "callsite": { @@ -1271,14 +1321,19 @@ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chalk": { @@ -1287,11 +1342,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "chokidar": { @@ -1300,15 +1355,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" } }, "circular-json": { @@ -1328,7 +1383,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "cli-width": { @@ -1343,8 +1398,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" }, "dependencies": { @@ -1365,8 +1420,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { "version": "1.1.0", @@ -1386,7 +1440,15 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "^4.5.0" + "lodash": "4.17.4" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" } }, "commander": { @@ -1406,10 +1468,10 @@ "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.28.1.tgz", "integrity": "sha1-Buq41SM4uDn6Gi11rwCF7tGxvq4=", "requires": { - "entities": "~ 1.1.1", - "mdurl": "~ 1.0.1", - "minimist": "~ 1.2.0", - "string.prototype.repeat": "^0.2.0" + "entities": "1.1.1", + "mdurl": "1.0.1", + "minimist": "1.2.0", + "string.prototype.repeat": "0.2.0" } }, "component-bind": { @@ -1441,9 +1503,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" } }, "connect": { @@ -1454,7 +1516,7 @@ "requires": { "debug": "2.6.9", "finalhandler": "1.0.6", - "parseurl": "~1.3.2", + "parseurl": "1.3.2", "utils-merge": "1.0.1" } }, @@ -1464,7 +1526,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "^0.1.4" + "date-now": "0.1.4" } }, "constants-browserify": { @@ -1476,8 +1538,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { "version": "1.5.0", @@ -1506,11 +1567,11 @@ "resolved": "https://registry.npmjs.org/counterpart/-/counterpart-0.18.3.tgz", "integrity": "sha512-tli4qPAFeYB34LvvCc/1xYRLCWjf4WsUt6sXfpggDfGDKoI8rhnabz0SljDoBpAK8z1u8GBCg0YDkbvWb16uUQ==", "requires": { - "date-names": "^0.1.9", - "except": "^0.1.3", - "extend": "^3.0.0", - "pluralizers": "^0.1.6", - "sprintf-js": "^1.0.3" + "date-names": "0.1.10", + "except": "0.1.3", + "extend": "3.0.1", + "pluralizers": "0.1.6", + "sprintf-js": "1.1.1" } }, "create-react-class": { @@ -1518,9 +1579,9 @@ "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "crypto-browserify": { @@ -1547,7 +1608,15 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "0.10.35" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" } }, "date-names": { @@ -1588,8 +1657,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "foreach": "2.0.5", + "object-keys": "1.0.11" } }, "del": { @@ -1598,15 +1667,20 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", @@ -1619,7 +1693,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "di": { @@ -1640,8 +1714,8 @@ "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "2.0.2", + "isarray": "1.0.0" } }, "dom-serialize": { @@ -1650,10 +1724,10 @@ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.1", + "void-elements": "2.0.1" } }, "dom-serializer": { @@ -1661,8 +1735,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "1.1.3", + "entities": "1.1.1" }, "dependencies": { "domelementtype": { @@ -1688,7 +1762,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "domutils": { @@ -1696,8 +1770,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" } }, "draft-js": { @@ -1705,9 +1779,9 @@ "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.0-alpha.tgz", "integrity": "sha1-MtshCPkn6bhEbaH3nkR1wrf4aK4=", "requires": { - "fbjs": "^0.8.12", - "immutable": "~3.7.4", - "object-assign": "^4.1.0" + "fbjs": "0.8.16", + "immutable": "3.7.6", + "object-assign": "4.1.1" } }, "draft-js-export-html": { @@ -1715,7 +1789,7 @@ "resolved": "https://registry.npmjs.org/draft-js-export-html/-/draft-js-export-html-0.6.0.tgz", "integrity": "sha1-zIDwVExD0Kf+28U8DLCRToCQ92k=", "requires": { - "draft-js-utils": ">=0.2.0" + "draft-js-utils": "1.2.0" } }, "draft-js-export-markdown": { @@ -1723,7 +1797,7 @@ "resolved": "https://registry.npmjs.org/draft-js-export-markdown/-/draft-js-export-markdown-0.3.0.tgz", "integrity": "sha1-hjkOA86vHTR/xhaGerf1Net2v0I=", "requires": { - "draft-js-utils": ">=0.2.0" + "draft-js-utils": "1.2.0" } }, "draft-js-utils": { @@ -1731,6 +1805,15 @@ "resolved": "https://registry.npmjs.org/draft-js-utils/-/draft-js-utils-1.2.0.tgz", "integrity": "sha1-9csj6xZzJf/tPXmIL9wxdyHS/RI=" }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1759,7 +1842,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.19" } }, "engine.io": { @@ -1856,9 +1939,9 @@ "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" + "graceful-fs": "4.1.11", + "memory-fs": "0.2.0", + "tapable": "0.1.10" }, "dependencies": { "memory-fs": { @@ -1886,7 +1969,7 @@ "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "dev": true, "requires": { - "prr": "~0.0.0" + "prr": "0.0.0" } }, "es-abstract": { @@ -1895,11 +1978,11 @@ "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" } }, "es-to-primitive": { @@ -1908,9 +1991,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" } }, "es5-ext": { @@ -1919,8 +2002,8 @@ "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, "requires": { - "es6-iterator": "~2.0.1", - "es6-symbol": "~3.1.1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "es6-iterator": { @@ -1929,9 +2012,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" } }, "es6-map": { @@ -1940,12 +2023,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-set": { @@ -1954,11 +2037,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" } }, "es6-symbol": { @@ -1967,8 +2050,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.35" } }, "es6-weak-map": { @@ -1977,10 +2060,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "escape-html": { @@ -2001,10 +2084,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" } }, "eslint": { @@ -2013,41 +2096,41 @@ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.1", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" }, "dependencies": { "glob": { @@ -2056,12 +2139,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "user-home": { @@ -2070,7 +2153,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "os-homedir": "1.0.2" } } } @@ -2093,7 +2176,7 @@ "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", "dev": true, "requires": { - "lodash": "^4.15.0" + "lodash": "4.17.4" } }, "eslint-plugin-react": { @@ -2102,10 +2185,10 @@ "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", "dev": true, "requires": { - "doctrine": "^2.0.2", - "has": "^1.0.1", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.0" + "doctrine": "2.1.0", + "has": "1.0.1", + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.0" }, "dependencies": { "doctrine": { @@ -2114,7 +2197,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2" + "esutils": "2.0.2" } } } @@ -2125,8 +2208,8 @@ "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", "dev": true, "requires": { - "acorn": "^5.1.1", - "acorn-jsx": "^3.0.0" + "acorn": "5.1.2", + "acorn-jsx": "3.0.1" } }, "esprima": { @@ -2141,7 +2224,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "4.2.0" } }, "esrecurse": { @@ -2150,8 +2233,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "^4.1.0", - "object-assign": "^4.0.1" + "estraverse": "4.2.0", + "object-assign": "4.1.1" } }, "estraverse": { @@ -2178,8 +2261,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.35" } }, "eventemitter3": { @@ -2214,9 +2297,9 @@ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, "requires": { - "array-slice": "^0.2.3", - "array-unique": "^0.2.1", - "braces": "^0.1.2" + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" }, "dependencies": { "braces": { @@ -2225,7 +2308,7 @@ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, "requires": { - "expand-range": "^0.1.0" + "expand-range": "0.1.1" } }, "expand-range": { @@ -2234,8 +2317,8 @@ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "is-number": "^0.1.1", - "repeat-string": "^0.2.2" + "is-number": "0.1.1", + "repeat-string": "0.2.2" } }, "is-number": { @@ -2258,7 +2341,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "expand-range": { @@ -2267,7 +2350,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.3" } }, "expect": { @@ -2276,13 +2359,13 @@ "integrity": "sha1-1Fj+TFYAQDa64yMkFqP2Nh8E+WU=", "dev": true, "requires": { - "define-properties": "~1.1.2", - "has": "^1.0.1", - "is-equal": "^1.5.1", - "is-regex": "^1.0.3", - "object-inspect": "^1.1.0", - "object-keys": "^1.0.9", - "tmatch": "^2.0.1" + "define-properties": "1.1.2", + "has": "1.0.1", + "is-equal": "1.5.5", + "is-regex": "1.0.4", + "object-inspect": "1.3.0", + "object-keys": "1.0.11", + "tmatch": "2.0.1" } }, "extend": { @@ -2296,9 +2379,24 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -2310,7 +2408,7 @@ "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", "requires": { - "fbjs": "^0.8.4" + "fbjs": "0.8.16" } }, "fbjs": { @@ -2318,13 +2416,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.17" }, "dependencies": { "core-js": { @@ -2340,8 +2438,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" } }, "file-entry-cache": { @@ -2350,8 +2448,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, "file-saver": { @@ -2376,11 +2474,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" } }, "finalhandler": { @@ -2390,12 +2488,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" } }, "find-cache-dir": { @@ -2404,9 +2502,9 @@ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" } }, "find-up": { @@ -2415,8 +2513,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "flat-cache": { @@ -2425,10 +2523,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" } }, "flow-parser": { @@ -2442,9 +2540,9 @@ "resolved": "https://registry.npmjs.org/flux/-/flux-2.1.1.tgz", "integrity": "sha1-LGrGUtQzdIiWhInGWG86/yajjqQ=", "requires": { - "fbemitter": "^2.0.0", + "fbemitter": "2.1.1", "fbjs": "0.1.0-alpha.7", - "immutable": "^3.7.4" + "immutable": "3.7.6" }, "dependencies": { "core-js": { @@ -2457,9 +2555,9 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.1.0-alpha.7.tgz", "integrity": "sha1-rUMIuPIy+zxzYDNJ6nJdHpw5Mjw=", "requires": { - "core-js": "^1.0.0", - "promise": "^7.0.3", - "whatwg-fetch": "^0.9.0" + "core-js": "1.2.7", + "promise": "7.3.1", + "whatwg-fetch": "0.9.0" } }, "whatwg-fetch": { @@ -2474,7 +2572,7 @@ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.3.tgz", "integrity": "sha512-sT5Ip9nyAIxWq8Apt1Fdv6yTci5GotaOtO5Ro1/+F3PizttNBcCYz8j/Qze54PPFK73KUbOqh++HUCiyNPqvhA==", "requires": { - "tabbable": "^1.0.3" + "tabbable": "1.1.2" } }, "focus-trap-react": { @@ -2482,7 +2580,7 @@ "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-3.1.2.tgz", "integrity": "sha512-MoQmONoy9gRPyrC5DGezkcOMGgx7MtIOAQDHe098UtL2sA2vmucJwEmQisb+8LRXNYFHxuw5zJ1oLFeKu4Mteg==", "requires": { - "focus-trap": "^2.0.1" + "focus-trap": "2.4.3" } }, "for-in": { @@ -2497,7 +2595,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "foreach": { @@ -2512,13 +2610,28 @@ "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.17" + } + }, "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { - "null-check": "^1.0.0" + "null-check": "1.0.0" } }, "fs-readdir-recursive": { @@ -2540,8 +2653,8 @@ "dev": true, "optional": true, "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.36" + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" }, "dependencies": { "abbrev": { @@ -2556,8 +2669,8 @@ "dev": true, "optional": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, "ansi-regex": { @@ -2577,8 +2690,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.2.9" } }, "asn1": { @@ -2622,7 +2735,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "block-stream": { @@ -2630,7 +2743,7 @@ "bundled": true, "dev": true, "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } }, "boom": { @@ -2638,7 +2751,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.x.x" + "hoek": "2.16.3" } }, "brace-expansion": { @@ -2646,7 +2759,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "^0.4.1", + "balanced-match": "0.4.2", "concat-map": "0.0.1" } }, @@ -2677,7 +2790,7 @@ "bundled": true, "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "concat-map": { @@ -2701,7 +2814,7 @@ "dev": true, "optional": true, "requires": { - "boom": "2.x.x" + "boom": "2.10.1" } }, "dashdash": { @@ -2710,7 +2823,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" }, "dependencies": { "assert-plus": { @@ -2753,7 +2866,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "extend": { @@ -2794,10 +2907,10 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" } }, "fstream-ignore": { @@ -2806,9 +2919,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" } }, "gauge": { @@ -2817,14 +2930,14 @@ "dev": true, "optional": true, "requires": { - "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" + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" } }, "getpass": { @@ -2833,7 +2946,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" }, "dependencies": { "assert-plus": { @@ -2849,12 +2962,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "graceful-fs": { @@ -2874,8 +2987,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "ajv": "4.11.8", + "har-schema": "1.0.5" } }, "has-unicode": { @@ -2890,10 +3003,10 @@ "dev": true, "optional": true, "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" } }, "hoek": { @@ -2907,9 +3020,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" } }, "inflight": { @@ -2917,8 +3030,8 @@ "bundled": true, "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -2963,7 +3076,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "jsbn": { @@ -2984,7 +3097,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, "json-stringify-safe": { @@ -3065,15 +3178,15 @@ "dev": true, "optional": true, "requires": { - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "request": "^2.81.0", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" } }, "nopt": { @@ -3082,8 +3195,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.0", + "osenv": "0.1.4" } }, "npmlog": { @@ -3092,10 +3205,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -3120,7 +3233,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -3179,10 +3292,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -3198,13 +3311,13 @@ "bundled": true, "dev": true, "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" } }, "request": { @@ -3213,28 +3326,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" } }, "rimraf": { @@ -3242,7 +3355,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -3274,7 +3387,7 @@ "dev": true, "optional": true, "requires": { - "hoek": "2.x.x" + "hoek": "2.16.3" } }, "sshpk": { @@ -3283,15 +3396,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" }, "dependencies": { "assert-plus": { @@ -3307,9 +3420,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -3317,7 +3430,7 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.0.1" } }, "stringstream": { @@ -3331,7 +3444,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -3345,9 +3458,9 @@ "bundled": true, "dev": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" } }, "tar-pack": { @@ -3356,14 +3469,14 @@ "dev": true, "optional": true, "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" } }, "tough-cookie": { @@ -3372,7 +3485,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" } }, "tunnel-agent": { @@ -3381,7 +3494,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.0.1" } }, "tweetnacl": { @@ -3422,7 +3535,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } }, "wrappy": { @@ -3443,6 +3556,9 @@ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-2.7.4.tgz", "integrity": "sha1-luQg/efvARrEnCWKYhMU/ldlNvk=" }, + "gemini-scrollbar": { + "version": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" + }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -3455,7 +3571,15 @@ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "^1.0.0" + "is-property": "1.0.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" } }, "gfm.css": { @@ -3468,11 +3592,11 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-base": { @@ -3481,8 +3605,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" } }, "glob-parent": { @@ -3491,7 +3615,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" } }, "globals": { @@ -3506,12 +3630,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" }, "dependencies": { "glob": { @@ -3520,12 +3644,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } } } @@ -3536,13 +3660,27 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -3551,7 +3689,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-binary": { @@ -3605,8 +3743,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "htmlparser2": { @@ -3614,12 +3752,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.6.2", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3" } }, "http-errors": { @@ -3631,7 +3769,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "statuses": "1.3.1" } }, "http-proxy": { @@ -3640,8 +3778,18 @@ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "dev": true, "requires": { - "eventemitter3": "1.x.x", - "requires-port": "1.x.x" + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "https-browserify": { @@ -3688,8 +3836,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -3703,19 +3851,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" } }, "interpret": { @@ -3729,7 +3877,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "is-arrow-function": { @@ -3738,7 +3886,7 @@ "integrity": "sha1-Kb4sLY2UUIUri7r7Y1unuNjofsI=", "dev": true, "requires": { - "is-callable": "^1.0.4" + "is-callable": "1.1.3" } }, "is-binary-path": { @@ -3747,7 +3895,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.10.0" } }, "is-boolean-object": { @@ -3786,17 +3934,17 @@ "integrity": "sha1-XoXxlX4FKIMkf+s4aWWju6Ffuz0=", "dev": true, "requires": { - "has": "^1.0.1", - "is-arrow-function": "^2.0.3", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-date-object": "^1.0.1", - "is-generator-function": "^1.0.6", - "is-number-object": "^1.0.3", - "is-regex": "^1.0.3", - "is-string": "^1.0.4", - "is-symbol": "^1.0.1", - "object.entries": "^1.0.4" + "has": "1.0.1", + "is-arrow-function": "2.0.3", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-generator-function": "1.0.6", + "is-number-object": "1.0.3", + "is-regex": "1.0.4", + "is-string": "1.0.4", + "is-symbol": "1.0.1", + "object.entries": "1.0.4" } }, "is-equal-shallow": { @@ -3805,7 +3953,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-extendable": { @@ -3826,7 +3974,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { @@ -3835,7 +3983,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-generator-function": { @@ -3850,7 +3998,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "is-my-json-valid": { @@ -3859,10 +4007,10 @@ "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", "dev": true, "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" } }, "is-number": { @@ -3871,7 +4019,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-number-object": { @@ -3892,7 +4040,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "1.0.0" } }, "is-path-inside": { @@ -3901,7 +4049,7 @@ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "path-is-inside": "1.0.2" } }, "is-posix-bracket": { @@ -3928,7 +4076,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "^1.0.1" + "has": "1.0.1" } }, "is-resolvable": { @@ -3937,7 +4085,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "^1.0.1" + "tryit": "1.0.3" } }, "is-stream": { @@ -3957,6 +4105,11 @@ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3988,15 +4141,19 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "node-fetch": "1.7.3", + "whatwg-fetch": "1.1.1" } }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "jquery": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=", - "optional": true + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" }, "js-tokens": { "version": "3.0.2", @@ -4009,10 +4166,16 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.9", + "esprima": "4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -4025,15 +4188,30 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", @@ -4058,13 +4236,24 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "array-includes": "^3.0.3" + "array-includes": "3.0.3" } }, "just-extend": { @@ -4079,33 +4268,33 @@ "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", "dev": true, "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "chokidar": "^1.4.1", - "colors": "^1.1.0", - "combine-lists": "^1.0.0", - "connect": "^3.6.0", - "core-js": "^2.2.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "expand-braces": "^0.1.1", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^3.8.0", - "log4js": "^0.6.31", - "mime": "^1.3.4", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", + "bluebird": "3.5.1", + "body-parser": "1.18.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.6.5", + "core-js": "2.5.1", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "http-proxy": "1.16.2", + "isbinaryfile": "3.0.2", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.4.1", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.1.5", + "range-parser": "1.2.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", "socket.io": "1.7.3", - "source-map": "^0.5.3", + "source-map": "0.5.7", "tmp": "0.0.31", - "useragent": "^2.1.12" + "useragent": "2.2.1" }, "dependencies": { "glob": { @@ -4114,12 +4303,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "lodash": { @@ -4136,8 +4325,8 @@ "integrity": "sha1-TG1wDRY6nTTGGO/YeRi+SeekqMk=", "dev": true, "requires": { - "fs-access": "^1.0.0", - "which": "^1.2.1" + "fs-access": "1.0.1", + "which": "1.3.0" } }, "karma-cli": { @@ -4146,7 +4335,7 @@ "integrity": "sha1-ys6oQ3Hs4Zh2JlyPoQLru5/uSow=", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "1.4.0" } }, "karma-junit-reporter": { @@ -4155,7 +4344,7 @@ "integrity": "sha1-SSojZyj+TJKqz0GfzQEQpDJ+nX8=", "dev": true, "requires": { - "path-is-absolute": "^1.0.0", + "path-is-absolute": "1.0.1", "xmlbuilder": "3.1.0" } }, @@ -4177,7 +4366,7 @@ "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2" + "graceful-fs": "4.1.11" } }, "karma-spec-reporter": { @@ -4186,7 +4375,7 @@ "integrity": "sha1-SDDccUihVcfXoYbmMjOaDYD63sM=", "dev": true, "requires": { - "colors": "^1.1.2" + "colors": "1.1.2" } }, "karma-summary-reporter": { @@ -4195,7 +4384,7 @@ "integrity": "sha1-nHQKJLYL+RNes59acylsTM0Q2Zs=", "dev": true, "requires": { - "chalk": "^1.1.3" + "chalk": "1.1.3" } }, "karma-webpack": { @@ -4204,11 +4393,11 @@ "integrity": "sha1-OdX9Lt7qPMPvW0BZibN9Ww5qO04=", "dev": true, "requires": { - "async": "~0.9.0", - "loader-utils": "^0.2.5", - "lodash": "^3.8.0", - "source-map": "^0.1.41", - "webpack-dev-middleware": "^1.0.11" + "async": "0.9.2", + "loader-utils": "0.2.17", + "lodash": "3.10.1", + "source-map": "0.1.43", + "webpack-dev-middleware": "1.12.0" }, "dependencies": { "lodash": { @@ -4223,7 +4412,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -4234,7 +4423,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.5" } }, "lazy-cache": { @@ -4249,18 +4438,50 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "linkifyjs": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-2.1.5.tgz", - "integrity": "sha512-8FqxPXQDLjI2nNHlM7eGewxE6DHvMbtiW0AiXzm0s4RkTwVZYRDTeVXkiRxLHTd4CuRBQY/JPtvtqJWdS7gHyA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-2.1.6.tgz", + "integrity": "sha512-nA94bEM9rmt7Iu4OEIYSKpW+Dy6fhlBTjk2Bg9bFuxHQYcy+lWq2EleHb0rp/ev8oBO82vLHZctM5YlSR5DTzw==", "requires": { - "jquery": ">=1.9.0", - "react": ">=0.14.0", - "react-dom": ">=0.14.0" + "jquery": "3.3.1", + "react": "16.4.1", + "react-dom": "16.4.1" + }, + "dependencies": { + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==", + "optional": true + }, + "react": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.4.1.tgz", + "integrity": "sha512-3GEs0giKp6E0Oh/Y9ZC60CmYgUPnp7voH9fbjWsvXtYFb4EWtgQub0ADSq0sJR0BbHc4FThLLtzlcFaFXIorwg==", + "optional": true, + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-dom": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.1.tgz", + "integrity": "sha512-1Gin+wghF/7gl4Cqcvr1DxFX2Osz7ugxSwl6gBqCMpdrxHjIFUS7GYxrFftZ9Ln44FHw0JxCFD9YtZsrbR5/4A==", + "optional": true, + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + } } }, "loader-utils": { @@ -4269,10 +4490,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } }, "lodash": { @@ -4309,8 +4530,8 @@ "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", "dev": true, "requires": { - "readable-stream": "~1.0.2", - "semver": "~4.3.3" + "readable-stream": "1.0.34", + "semver": "4.3.6" }, "dependencies": { "isarray": { @@ -4325,10 +4546,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -4355,7 +4576,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "lru-cache": { @@ -4364,14 +4585,27 @@ "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", "dev": true }, + "matrix-js-sdk": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-0.10.4.tgz", + "integrity": "sha512-jmO08eml0mr+us2Xs9F9UD2U6gX/MVD20QEqrEt3p+cuZ043OEWCg6Ko8mR65P/JteqjXMz+TXOMmfcxLwCLFA==", + "requires": { + "another-json": "0.2.0", + "babel-runtime": "6.26.0", + "bluebird": "3.5.1", + "browser-request": "0.3.3", + "content-type": "1.0.4", + "request": "2.87.0" + } + }, "matrix-mock-request": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/matrix-mock-request/-/matrix-mock-request-1.2.1.tgz", "integrity": "sha1-2aWrqNPYJG6I/3YyWYuZwUE/QjI=", "dev": true, "requires": { - "bluebird": "^3.5.0", - "expect": "^1.20.2" + "bluebird": "3.5.1", + "expect": "1.20.2" } }, "matrix-react-test-utils": { @@ -4380,8 +4614,8 @@ "integrity": "sha1-tUiETQ6+M46hucjxZHTDDRfDvfQ=", "dev": true, "requires": { - "react": "^15.6.1", - "react-dom": "^15.6.1" + "react": "15.6.2", + "react-dom": "15.6.2" } }, "mdurl": { @@ -4406,8 +4640,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "errno": "0.1.4", + "readable-stream": "2.3.3" } }, "micromatch": { @@ -4416,19 +4650,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } }, "mime": { @@ -4440,16 +4674,14 @@ "mime-db": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" }, "mime-types": { "version": "2.1.17", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "dev": true, "requires": { - "mime-db": "~1.30.0" + "mime-db": "1.30.0" } }, "minimatch": { @@ -4457,7 +4689,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.8" } }, "minimist": { @@ -4522,12 +4754,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "growl": { @@ -4548,7 +4780,7 @@ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } } } @@ -4590,11 +4822,11 @@ "integrity": "sha512-v1J/FLUB9PfGqZLGDBhQqODkbLotP0WtLo9R4EJY2PPu5f5Xg4o0rA8FDlmrjFSv9vBBKcfnOSpfYYuu5RTHqg==", "dev": true, "requires": { - "@sinonjs/formatio": "^2.0.0", - "just-extend": "^1.1.27", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" + "@sinonjs/formatio": "2.0.0", + "just-extend": "1.1.27", + "lolex": "2.6.0", + "path-to-regexp": "1.7.0", + "text-encoding": "0.6.4" }, "dependencies": { "lolex": { @@ -4610,8 +4842,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "encoding": "0.1.12", + "is-stream": "1.1.0" } }, "node-libs-browser": { @@ -4620,28 +4852,28 @@ "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.1.4", - "buffer": "^4.9.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", "crypto-browserify": "3.3.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", + "domain-browser": "1.1.7", + "events": "1.1.1", "https-browserify": "0.0.1", - "os-browserify": "^0.2.0", + "os-browserify": "0.2.1", "path-browserify": "0.0.0", - "process": "^0.11.0", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.0.5", - "stream-browserify": "^2.0.1", - "stream-http": "^2.3.1", - "string_decoder": "^0.10.25", - "timers-browserify": "^2.0.2", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.4", "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", + "url": "0.11.0", + "util": "0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -4659,7 +4891,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "null-check": { @@ -4674,6 +4906,11 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4703,10 +4940,10 @@ "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1", + "has": "1.0.1" } }, "object.omit": { @@ -4715,8 +4952,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "on-finished": { @@ -4733,7 +4970,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "onetime": { @@ -4747,8 +4984,8 @@ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.10", + "wordwrap": "0.0.3" }, "dependencies": { "minimist": { @@ -4764,12 +5001,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" }, "dependencies": { "wordwrap": { @@ -4810,9 +5047,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" } }, "pako": { @@ -4832,10 +5069,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "parsejson": { @@ -4844,7 +5081,7 @@ "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", "dev": true, "requires": { - "better-assert": "~1.0.0" + "better-assert": "1.0.2" } }, "parseqs": { @@ -4853,7 +5090,7 @@ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "dev": true, "requires": { - "better-assert": "~1.0.0" + "better-assert": "1.0.2" } }, "parseuri": { @@ -4862,7 +5099,7 @@ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "dev": true, "requires": { - "better-assert": "~1.0.0" + "better-assert": "1.0.2" } }, "parseurl": { @@ -4883,7 +5120,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "path-is-absolute": { @@ -4949,7 +5186,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -4958,7 +5195,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" } }, "pluralize": { @@ -5012,7 +5249,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "~2.0.3" + "asap": "2.0.6" } }, "prop-types": { @@ -5020,9 +5257,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "prr": { @@ -5034,8 +5271,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "qjobs": { "version": "1.1.5", @@ -5043,11 +5279,23 @@ "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", "dev": true }, + "qr.js": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", + "integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8=" + }, + "qrcode-react": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/qrcode-react/-/qrcode-react-0.1.16.tgz", + "integrity": "sha512-FK+QCfFqCQMSxUE1byzglERJQkwKqXYvYMCS+/Ad2zACJOfoHkHHtRqsQQPji7lfb1y1qCXLvL+3eP1hAfg8Ng==", + "requires": { + "qr.js": "0.0.0" + } + }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "querystring": { "version": "0.2.0", @@ -5065,7 +5313,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", "requires": { - "performance-now": "^2.1.0" + "performance-now": "2.1.0" } }, "raf-schd": { @@ -5079,8 +5327,8 @@ "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "is-number": { @@ -5089,7 +5337,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -5098,7 +5346,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.5" } } } @@ -5109,7 +5357,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.5" } } } @@ -5137,11 +5385,11 @@ "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", "requires": { - "create-react-class": "^15.6.0", - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" + "create-react-class": "15.6.2", + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" } }, "react-addons-css-transition-group": { @@ -5160,16 +5408,16 @@ "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-4.0.1.tgz", "integrity": "sha512-d73RMu4QOFCyjUELLWFyY/EuclnfqulI9pECx+2gIuJvV0ycf1uR88o+1x0RSB9ILD70inHMzCBKNkWVbbt+vA==", "requires": { - "babel-runtime": "^6.26.0", - "invariant": "^2.2.2", - "memoize-one": "^3.0.1", - "prop-types": "^15.6.0", - "raf-schd": "^2.1.0", - "react-motion": "^0.5.2", - "react-redux": "^5.0.6", - "redux": "^3.7.2", - "redux-thunk": "^2.2.0", - "reselect": "^3.0.1" + "babel-runtime": "6.26.0", + "invariant": "2.2.2", + "memoize-one": "3.1.1", + "prop-types": "15.6.0", + "raf-schd": "2.1.1", + "react-motion": "0.5.2", + "react-redux": "5.0.7", + "redux": "3.7.2", + "redux-thunk": "2.2.0", + "reselect": "3.0.1" } }, "react-dom": { @@ -5177,10 +5425,16 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-gemini-scrollbar": { + "version": "github:matrix-org/react-gemini-scrollbar#5e97aef7e034efc8db1431f4b0efe3b26e249ae9", + "requires": { + "gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279810d05319ac5ff1bd34910bff32325c7b" } }, "react-motion": { @@ -5188,9 +5442,9 @@ "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", "requires": { - "performance-now": "^0.2.0", - "prop-types": "^15.5.8", - "raf": "^3.1.0" + "performance-now": "0.2.0", + "prop-types": "15.6.0", + "raf": "3.4.0" }, "dependencies": { "performance-now": { @@ -5205,12 +5459,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", "requires": { - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.0.0", - "lodash": "^4.17.5", - "lodash-es": "^4.17.5", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.0" + "hoist-non-react-statics": "2.5.0", + "invariant": "2.2.2", + "lodash": "4.17.10", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "prop-types": "15.6.0" }, "dependencies": { "lodash": { @@ -5225,13 +5479,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "readdirp": { @@ -5240,10 +5494,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" } }, "readline2": { @@ -5252,8 +5506,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", "mute-stream": "0.0.5" } }, @@ -5263,7 +5517,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "1.4.0" } }, "redux": { @@ -5271,10 +5525,10 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "lodash": "4.17.4", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "symbol-observable": "1.2.0" } }, "redux-thunk": { @@ -5299,9 +5553,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" } }, "regex-cache": { @@ -5310,7 +5564,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regexp-quote": { @@ -5324,9 +5578,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "regjsgen": { @@ -5341,7 +5595,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" }, "dependencies": { "jsesc": { @@ -5376,7 +5630,34 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.3.0" } }, "require-json": { @@ -5391,8 +5672,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" } }, "requires-port": { @@ -5412,7 +5693,7 @@ "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.5" } }, "resolve-from": { @@ -5427,8 +5708,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, "right-align": { @@ -5437,7 +5718,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, "rimraf": { @@ -5446,7 +5727,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" }, "dependencies": { "glob": { @@ -5455,12 +5736,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } } } @@ -5477,7 +5758,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "^1.3.0" + "once": "1.4.0" } }, "rx-lite": { @@ -5491,6 +5772,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "samsam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", @@ -5502,9 +5788,9 @@ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.14.1.tgz", "integrity": "sha1-cw/6Ikm98YMz7/5FsoYXPJxa0Lg=", "requires": { - "htmlparser2": "^3.9.0", + "htmlparser2": "3.9.2", "regexp-quote": "0.0.0", - "xtend": "^4.0.0" + "xtend": "4.0.1" } }, "semver": { @@ -5542,9 +5828,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "glob": "7.1.2", + "interpret": "1.0.4", + "rechoir": "0.6.2" }, "dependencies": { "glob": { @@ -5553,12 +5839,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } } } @@ -5569,13 +5855,13 @@ "integrity": "sha512-GvNLrwpvLZ8jIMZBUhHGUZDq5wlUdceJWyHvZDmqBxnjazpxY1L0FNbGBX6VpcOEoQ8Q4XMWFzm2myJMvx+VjA==", "dev": true, "requires": { - "@sinonjs/formatio": "^2.0.0", - "diff": "^3.1.0", - "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^5.1.0", - "type-detect": "^4.0.5" + "@sinonjs/formatio": "2.0.0", + "diff": "3.5.0", + "lodash.get": "4.4.2", + "lolex": "2.6.0", + "nise": "1.3.3", + "supports-color": "5.4.0", + "type-detect": "4.0.8" }, "dependencies": { "has-flag": { @@ -5596,7 +5882,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5773,9 +6059,9 @@ "integrity": "sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw==", "dev": true, "requires": { - "async": "^2.5.0", - "loader-utils": "~0.2.2", - "source-map": "~0.6.1" + "async": "2.6.0", + "loader-utils": "0.2.17", + "source-map": "0.6.1" }, "dependencies": { "async": { @@ -5784,7 +6070,7 @@ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "^4.14.0" + "lodash": "4.17.4" } }, "source-map": { @@ -5801,7 +6087,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" } }, "sprintf-js": { @@ -5809,6 +6095,22 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -5821,8 +6123,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "2.0.3", + "readable-stream": "2.3.3" } }, "stream-http": { @@ -5831,11 +6133,11 @@ "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.2.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" } }, "string-width": { @@ -5844,9 +6146,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string.prototype.repeat": { @@ -5859,7 +6161,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } }, "strip-ansi": { @@ -5868,7 +6170,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -5905,12 +6207,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "string-width": "2.1.1" }, "dependencies": { "ajv": { @@ -5919,8 +6221,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, "ansi-regex": { @@ -5941,8 +6243,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -5951,7 +6253,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -5997,7 +6299,7 @@ "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "setimmediate": "1.0.5" } }, "tmatch": { @@ -6012,7 +6314,7 @@ "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "os-tmpdir": "1.0.2" } }, "to-array": { @@ -6033,6 +6335,14 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "1.4.1" + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -6051,13 +6361,27 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "1.1.2" } }, "type-detect": { @@ -6073,7 +6397,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.15" + "mime-types": "2.1.17" } }, "typedarray": { @@ -6093,10 +6417,10 @@ "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", "dev": true, "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "async": { @@ -6153,8 +6477,8 @@ "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", "dev": true, "requires": { - "lru-cache": "2.2.x", - "tmp": "0.0.x" + "lru-cache": "2.2.4", + "tmp": "0.0.31" } }, "util": { @@ -6185,13 +6509,34 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "uuid": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.0.tgz", + "integrity": "sha512-ijO9N2xY/YaOqQ5yz5c4sy2ZjWmA6AR6zASb/gdpeKZ8+948CxwfMW9RrKVk5may6ev8c0/Xguu32e2Llelpqw==" + }, "v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "^1.1.1" + "user-home": "1.1.1" + } + }, + "velocity-vector": { + "version": "github:vector-im/velocity#059e3b2348f1110888d033974d3109fd5a3af00f", + "requires": { + "jquery": "3.2.1" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" } }, "vm-browserify": { @@ -6215,7 +6560,7 @@ "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins=", "dev": true, "requires": { - "foreachasync": "^3.0.0" + "foreachasync": "3.0.0" } }, "watchpack": { @@ -6224,9 +6569,9 @@ "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", "dev": true, "requires": { - "async": "^0.9.0", - "chokidar": "^1.0.0", - "graceful-fs": "^4.1.2" + "async": "0.9.2", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" } }, "webpack": { @@ -6235,21 +6580,21 @@ "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", "dev": true, "requires": { - "acorn": "^3.0.0", - "async": "^1.3.0", - "clone": "^1.0.2", - "enhanced-resolve": "~0.9.0", - "interpret": "^0.6.4", - "loader-utils": "^0.2.11", - "memory-fs": "~0.3.0", - "mkdirp": "~0.5.0", - "node-libs-browser": "^0.7.0", - "optimist": "~0.6.0", - "supports-color": "^3.1.0", - "tapable": "~0.1.8", - "uglify-js": "~2.7.3", - "watchpack": "^0.2.1", - "webpack-core": "~0.6.9" + "acorn": "3.3.0", + "async": "1.5.2", + "clone": "1.0.2", + "enhanced-resolve": "0.9.1", + "interpret": "0.6.6", + "loader-utils": "0.2.17", + "memory-fs": "0.3.0", + "mkdirp": "0.5.1", + "node-libs-browser": "0.7.0", + "optimist": "0.6.1", + "supports-color": "3.2.3", + "tapable": "0.1.10", + "uglify-js": "2.7.5", + "watchpack": "0.2.9", + "webpack-core": "0.6.9" }, "dependencies": { "acorn": { @@ -6276,8 +6621,8 @@ "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "errno": "0.1.4", + "readable-stream": "2.3.3" } }, "supports-color": { @@ -6286,7 +6631,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -6297,8 +6642,8 @@ "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", "dev": true, "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" + "source-list-map": "0.1.8", + "source-map": "0.4.4" }, "dependencies": { "source-map": { @@ -6307,7 +6652,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -6318,11 +6663,11 @@ "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", "dev": true, "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.3.4", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" + "memory-fs": "0.4.1", + "mime": "1.4.1", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" } }, "whatwg-fetch": { @@ -6336,7 +6681,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "window-size": { @@ -6361,7 +6706,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "^0.5.1" + "mkdirp": "0.5.1" } }, "ws": { @@ -6370,8 +6715,8 @@ "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", "dev": true, "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "options": "0.0.6", + "ultron": "1.0.2" } }, "wtf-8": { @@ -6386,7 +6731,7 @@ "integrity": "sha1-LIaIjy1OrehQ+jjKf3Ij9yCVFuE=", "dev": true, "requires": { - "lodash": "^3.5.0" + "lodash": "3.10.1" }, "dependencies": { "lodash": { @@ -6414,9 +6759,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } }, From 7ab229cd4d7eca4579e570f92daa2ea88f9d6603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= <pvdeejay@gmail.com> Date: Tue, 26 Jun 2018 20:59:21 +0000 Subject: [PATCH 418/480] Translated using Weblate (Slovak) Currently translated at 100.0% (1207 of 1207 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 633734acfc..9043f86686 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -775,8 +775,8 @@ "No media permissions": "Žiadne oprávnenia k médiám", "You may need to manually permit Riot to access your microphone/webcam": "Mali by ste aplikácii Riot ručne udeliť právo pristupovať k mikrofónu a kamere", "Missing Media Permissions, click here to request.": "Kliknutím sem vyžiadate chýbajúce oprávnenia na prístup k mediálnym zariadeniam.", - "No Microphones detected": "Neboli nájdené žiadne mikrofóny", - "No Webcams detected": "Neboli nájdené žiadne kamery", + "No Microphones detected": "Neboli rozpoznané žiadne mikrofóny", + "No Webcams detected": "Neboli rozpoznané žiadne kamery", "Default Device": "Predvolené zariadenie", "Microphone": "Mikrofón", "Camera": "Kamera", @@ -1181,25 +1181,25 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Ak chcete aj naďalej používať domovský server %(homeserverDomain)s, mali by ste si prečítať a odsúhlasiť naše zmluvné podmienky.", "Review terms and conditions": "Prečítať zmluvné podmienky", "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť", - "Encrypting": "Enkriptovanie", - "Encrypted, not sent": "Zakódované, ale neposlané", - "Share Link to User": "Pošli link užívateľovi", + "Encrypting": "Šifrovanie", + "Encrypted, not sent": "Zašifrované, ale neodoslané", + "Share Link to User": "Zdieľať odkaz na používateľa", "Share room": "Zdieľaj miestnosť", - "Share Room": "Zdieľaj miestnosť", - "Link to most recent message": "Link na najnovšiu správu", - "Share User": "Zdieľaj užívateľa", - "Share Community": "Zdieľaj komunitu", - "Link to selected message": "Link na vybranú správu", - "COPY": "Kopíruj", + "Share Room": "Zdieľať miestnosť", + "Link to most recent message": "Odkaz na najnovšiu správu", + "Share User": "Zdieľať používateľa", + "Share Community": "Zdieľať komunitu", + "Link to selected message": "Odkaz na vybratú správu", + "COPY": "Kopírovať", "Share Message": "Zdieľaj správu", "No Audio Outputs detected": "Neboli rozpoznané žiadne zvukové výstupy", - "Audio Output": "Zvukový výstup", - "Try the app first": "Najskôr aplikáciu vyskúšaj", - "Share Room Message": "Správa o zdieľaní miestnosti", - "The email field must not be blank.": "Položka emailu nemôže byť prázdna.", - "The user name field must not be blank.": "Položka užívateľovej prezývky nemôže byť prázdna.", - "The phone number field must not be blank.": "Telefonné číslo nemôže ostať nevyplnené.", - "The password field must not be blank.": "Položka s heslom nemôže ostať nevyplnená.", + "Audio Output": "Výstup zvuku", + "Try the app first": "Vyskúšať si aplikáciu", + "Share Room Message": "Zdieľať správu z miestnosti", + "The email field must not be blank.": "Email nemôže ostať prázdny.", + "The user name field must not be blank.": "Používateľské meno nemôže ostať prázdne.", + "The phone number field must not be blank.": "Telefónne číslo nemôže ostať prázdne.", + "The password field must not be blank.": "Heslo nemôže ostať prázdne.", "Jitsi Conference Calling": "Konferenčné hovory Jitsi", "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.": "Náhľady URL adries sú v šifrovaných miestnostiach ako je táto predvolene zakázané, aby ste si mohli byť istí, že obsah odkazov z vašej konverzácii nebude zaznamenaný na vašom domovskom serveri počas ich generovania.", "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.": "Ak niekto vo svojej správe pošle URL adresu, môže byť zobrazený jej náhľad obsahujúci názov, popis a obrázok z cieľovej web stránky.", From 483edb821106bda1579dbf44bd556ffe4acbaacb Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 27 Jun 2018 10:31:51 +0100 Subject: [PATCH 419/480] `pathname` is not constant --- src/Analytics.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Analytics.js b/src/Analytics.js index 41eaca0f63..fbc8fb79c8 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -42,7 +42,8 @@ function getRedactedHash(hash) { // Return the current origin, path and hash separated with a `/`. This does // not include query parameters. function getRedactedUrl() { - const { origin, pathname, hash } = window.location; + const { origin, hash } = window.location; + let { pathname } = window.location; // Redact paths which could contain unexpected PII if (origin.startsWith('file://')) { From 6345fcb8f2d1770aa64f3e88c8700ce928117cd3 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 27 Jun 2018 11:31:55 +0100 Subject: [PATCH 420/480] Fix incorrectly positioned copy button on `<pre>` blocks --- res/css/views/rooms/_EventTile.scss | 9 +++++++-- src/components/views/messages/TextualBody.js | 13 ++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 80d2cd3418..d95ed2ded0 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -400,6 +400,12 @@ limitations under the License. color: #333; } +.mx_EventTile_pre_container { + // For correct positioning of _copyButton (See TextualBody) + position: relative; +} + +// Inserted adjacent to <pre> blocks, (See TextualBody) .mx_EventTile_copyButton { position: absolute; display: inline-block; @@ -413,7 +419,6 @@ limitations under the License. } .mx_EventTile_body pre { - position: relative; border: 1px solid transparent; } @@ -422,7 +427,7 @@ limitations under the License. border: 1px solid #e5e5e5; // deliberate constant as we're behind an invert filter } -.mx_EventTile_body pre:hover .mx_EventTile_copyButton +.mx_EventTile_body .mx_EventTile_pre_container:hover .mx_EventTile_copyButton { visibility: visible; } diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 20cf2b69f4..2e5fe2aabc 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -340,7 +340,18 @@ module.exports = React.createClass({ }, false); e.target.onmouseleave = close; }; - p.appendChild(button); + + // Wrap a div around <pre> so that the copy button can be correctly positioned + // when the <pre> overflows and is scrolled horizontally. + const div = document.createElement("div"); + div.className = "mx_EventTile_pre_container"; + + // Insert containing div in place of <pre> block + p.parentNode.replaceChild(div, p); + + // Append <pre> block and copy button to container + div.appendChild(p); + div.appendChild(button); }); }, From 8be173cae357931edd6d4561ce3e2241915d2648 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 27 Jun 2018 15:08:56 +0100 Subject: [PATCH 421/480] Show nicer error when receiving a consent error after sending a message --- src/components/structures/RoomStatusBar.js | 21 ++++++++++++++++++++- src/i18n/strings/en_EN.json | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 36f4719abb..e6e0fa70f0 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -308,7 +308,26 @@ module.exports = React.createClass({ }, ); } else { - if ( + let consentError = null; + for (const m of unsentMessages) { + if (m.error && m.error.errcode === 'M_CONSENT_NOT_GIVEN') { + consentError = m.error; + break; + } + } + if (consentError) { + title = _t( + "You can't send any messages until you review and agree to " + + "<consentLink>our terms and conditions</consentLink>.", + {}, + { + 'consentLink': (sub) => + <a href={consentError.data && consentError.data.consent_uri} target="_blank"> + { sub } + </a>, + }, + ); + } else if ( unsentMessages.length === 1 && unsentMessages[0].error && unsentMessages[0].error.data && diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b18d167ea4..7717d45aa5 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1030,6 +1030,7 @@ "Scroll to bottom of page": "Scroll to bottom of page", "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.", "%(count)s of your messages have not been sent.|other": "Some of your messages have not been sent.", "%(count)s of your messages have not been sent.|one": "Your message was not sent.", "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "<resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.", From 66002a4c0061b7b58d1309f937b1dd9ba2064550 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Wed, 27 Jun 2018 15:19:27 +0100 Subject: [PATCH 422/480] Fix status bar element positioning --- res/css/structures/_RoomStatusBar.scss | 3 +++ src/components/structures/RoomStatusBar.js | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/res/css/structures/_RoomStatusBar.scss b/res/css/structures/_RoomStatusBar.scss index ca7431eac2..2a9cc9f6c7 100644 --- a/res/css/structures/_RoomStatusBar.scss +++ b/res/css/structures/_RoomStatusBar.scss @@ -113,6 +113,8 @@ limitations under the License. } .mx_RoomStatusBar_connectionLostBar { + display: flex; + margin-top: 19px; min-height: 58px; } @@ -132,6 +134,7 @@ limitations under the License. color: $primary-fg-color; font-size: 13px; opacity: 0.5; + padding-bottom: 20px; } .mx_RoomStatusBar_resend_link { diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index e6e0fa70f0..d1dc8d3c12 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -351,11 +351,13 @@ module.exports = React.createClass({ return <div className="mx_RoomStatusBar_connectionLostBar"> <img src="img/warning.svg" width="24" height="23" title={_t("Warning")} alt={_t("Warning")} /> - <div className="mx_RoomStatusBar_connectionLostBar_title"> - { title } - </div> - <div className="mx_RoomStatusBar_connectionLostBar_desc"> - { content } + <div> + <div className="mx_RoomStatusBar_connectionLostBar_title"> + { title } + </div> + <div className="mx_RoomStatusBar_connectionLostBar_desc"> + { content } + </div> </div> </div>; }, From 239b973df37f75d8224e9875d2d23a6d445e5994 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Wed, 27 Jun 2018 11:42:29 +0000 Subject: [PATCH 423/480] Translated using Weblate (Russian) Currently translated at 99.8% (1205 of 1207 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 0ec001a138..1416921ea0 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1198,5 +1198,10 @@ "The email field must not be blank.": "Поле email не должно быть пустым.", "The user name field must not be blank.": "Поле имени пользователя не должно быть пустым.", "The phone number field must not be blank.": "Поле номера телефона не должно быть пустым.", - "The password field must not be blank.": "Поле пароля не должно быть пустым." + "The password field must not be blank.": "Поле пароля не должно быть пустым.", + "Call in Progress": "Выполнение вызова", + "A call is already in progress!": "Вызов выполняется!", + "You have no historical rooms": "У вас нет архивных комнат", + "Share Room Message": "Обмен сообщениями в комнате", + "Share Message": "Обмен сообщениями" } From b5266f0f51033a13fe3e5114db9965b4305f24e4 Mon Sep 17 00:00:00 2001 From: Krombel <krombel@krombel.de> Date: Wed, 27 Jun 2018 16:05:26 +0000 Subject: [PATCH 424/480] Translated using Weblate (German) Currently translated at 100.0% (1208 of 1208 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, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1570c5c285..b4e244f542 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1202,5 +1202,9 @@ "The email field must not be blank.": "Das E-Mail-Feld darf nicht leer sein.", "The user name field must not be blank.": "Das Benutzername-Feld darf nicht leer sein.", "The phone number field must not be blank.": "Das Telefonnummern-Feld darf nicht leer sein.", - "The password field must not be blank.": "Das Passwort-Feld darf nicht leer sein." + "The password field must not be blank.": "Das Passwort-Feld darf nicht leer sein.", + "Call in Progress": "Gespräch läuft", + "A call is already in progress!": "Ein Gespräch läuft bereits!", + "You have no historical rooms": "Du hast keine historischen Räume", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Du kannst keine Nachrichten senden bis du die <consentLink>unsere Geschläftsbedingungen</consentLink> gelesen und akzeptiert hast." } From 7bce29db6e41cfdb7655481732617b3d824a9224 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Wed, 27 Jun 2018 17:17:44 +0100 Subject: [PATCH 425/480] Replace share icons with ones that look a bit more like the actual logos those sites use now --- res/img/social/facebook.png | Bin 1201 -> 1604 bytes res/img/social/linkedin.png | Bin 1366 -> 1624 bytes res/img/social/reddit.png | Bin 2279 -> 1559 bytes res/img/social/twitter-2.png | Bin 1519 -> 2026 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/img/social/facebook.png b/res/img/social/facebook.png index 6a29e3820aa997e5bc06d42995891ce570defd25..457ef761a146c8cdf29ab13dc432aa1aceb1390d 100644 GIT binary patch delta 1587 zcmV-32F&@f3B(MLB!32COGiWi{{a60|De66lK=n!32;bRa{vGf5&!@T5&_cPe*6Fc z00(qQO+^Rd1{)9u1|<Zgl>h(*(Md!>RCwCun}29kWf;dl_uRYPZK=5$YPfKvK@JoJ zQ$izlXiy>VAEiMgs7W0)&`8=JAq6h59E1f0FM`@Yip+lw6@OUpP6Dme2t!b)#mZSu zb8KzSyL<0Br$5fQ^KRbVd$!%Pdw1^_#>US3zUMsO_j%s;eSW+l0)TFqC@E5Z&jNH{ zHLw(D03HD50##m@7|;(~1G<3Az*(R}NzpfU%zPpg5CO}9Ex<;geu~5O0LOuLCB?a- zCO|jL*MSyqhJS-VFVF@YP*T|W(27u=1aAfQGQIc!Xi-vFQyD~?tc`oWx9NtNEP(I; zZvaW%Fn6VY)3j)SZkTm|0+vx6_#J3cQgjEV0co@T9B`wEga=pxT+t14>qNCd^DDfP z0^KkV0w*Y59M%o<Q}0{zV*+Wye*-+j%)n_S#X3K`M1RPq@ZSSZ6iOP$f#HNjv@*=% zg>$HzTSZkgjN?EeX%kOa+#a?V7)sDTILyty7?l;_3rdO=xkv~V^UT|hLv=L53(bpZ zUQ^G)dH4A4+q~l|Y{xmHq*$Acgj^bM5ZGM^;S))l9UB^X@##k<)!!ok;FywP(}Wj6 zZ?!Lo@P8E%jnDQ!HEH3;;3eHKU-4}M-s)NBZFL2~7w<Q7|GiaH8Y4{uQg{gH8fyx7 zX@J*26+-ZM!sgwbtEVjdI5?GQ9ndmpz_vmia#lWC$K%WA2Q~a6-7w$uvj)h*%)Z6; z=Np55%>msoqv?kvErVAVE(8I!v!gUVTstjZWPiFTM8-TUgjWZ^x|I_TAzZmO$c?@j ziKIR1|5cS?obkKu)D3fwk|H*W056zP5ZJau<6{4_ug+cNy(7Oc6icFMp}V#+$J<J? z;4R?ou_n+`C;}|o;lcT{e6{`UuYUG^d=|@gh*pNFh-gH{{NxZGV9$sNcniYv0K-_m zG=HFWcGOqf6Y3ADt0Gf<WsPo_O+bg{EeKl*?Y@OW{$ev-e-GsAm7A3mBPOu1&;&R> z+r{EmzFxTzK=b1E^~?}BPTq#9(G7EvhMTk~S2St38Jlv&Dh)SXRjyd7;pXbf6%CQ; z*#DyyVZ@USSeBjfdBSp-Ra4>5&tFqd|9`-6);4{EalZSho3NI1Yh4h*&C&*ns%V7m z8}j4nZF)9$l<0?Fd-(RpEBFX{*J#{HQ5V53pC5Gh3=-D-<$SbKH0<u{xA1weM8hpk zC@EaMe#>`T4Yx9*<TSwV$y&oLODR_kxTfLO<dh7CV##s0+f2@-hFg$SQnMcp`+qKb zxUAt;V+D#(Ftu12@z1|QzPCW&d<5tS`lAMJ$JyO>8r#l%9*8GxT6aFiyxQuVW9>Wi zGdFr~kNf;)|L{aK;8a9O(We_`4-i;J!m=DLcJ_|@d^m0qkNdOR&hG!{?itL-XT_Bi zohe;8UWSg)m*7T(0NTrtfOg$5iGO%O(Q~?C_5$~niSP*}#mTY0KwBBj{=rPn(19`{ zpf!~s9U(wTVdIvcmO73qDF#vr(h&kYMq0{%fL-b7@kp8m09d+V?gl<AQQ`L~DF(6z zM3fXC;nv=k8hVrz?_`PxjDn{gO(jS`Q>OCSNCpi6=++JMW#Dj$2;ZWlxPO%C!MJXd zlHy2-oDjcOQjB}X$yO+dl43J(dIk%BQAx2rTjh8*4M>r&4!AG_h3`~SEX!3aoi%ch zM#2i<%nY0PC4S1~bB0dRNLULTn;|y8%<qjdU$LV!5;g&^7Wrzwej?ZDd<V}`11c#F z;T9hMSxko<pfR=DPvkD)WPej*T}q0EBJmyeDJd2JmnPGBQUs)FLmO^#^^<86_fC<} zQD9E$cstn}r1?mW4l5~M1FC^mU?@QG6Vb|Wn<w~IV9GUfL0z710yg88qSfSNFmCbr z{$}duXS@>>#|>b%heDx~X@|7Dd}}12nd(qdbO2j)!(8M!SF5;leJp-K24Z52zCM2* lI28(oI$h0o?lQrA;D3sSDN|uesSf}E002ovPDHLkV1jm1?;HRC delta 1181 zcmV;O1Y-Nd46zB2B!2{FK}|sb0I$e51&Zka000?uMObuGZ)S9NVRB^vL1b@YWgtmy zVP|DhWnpA_ami&o000C-Nkl<Zc-rJ!Z%9*76hFSrnPr(nLo1X(Gc-TQ!bpTb3JN1X z6cpBnVq$$z6oW|eWB(8o1u+VwPYPo6A&3M^7>I&UK?7;1k$-|A8OzzoG=<J_XYktQ z+V<Xkd-MI^#~b?Iz32Siz31L@?|n&i4_<>{WFb!?3z7NA68<|~E&O{8>Ez#ZokqHl z4&<Up<IIA}wIMGet7Hy`gN2^~*%f4hyh1)lzSFY+X~;UH9a*Gexh2dy$Vp@`@+s1* zM&XhQWuznTB7bL*?J7GTh$60Img`K9w*c3WQ^<QrD`*ER*Ez*DXfD7Z<QVc92f275 zi)|R=0IP`r6x=={Pk??vwtQgQgbG0YZ;%6?-jK$&b&3#xhN(VeGw2_UY^z1BVbFwp z!DD)&poT|?YUGB}7SNtx&ihftwkzrac5YIMibnP!rhhI_f$R}7|29c*{OEqL9mxjk zo*j^rxphpv@o-3Kbv>L{j7B3sF86zj+Rh)y+6^}^l)}D@om#a53;S{mITvXc=o2x) zp*MZ&N|~0<%O^~Ik;VW!H-FV}^=vWhN==SeJg5j252O%t>^2d#=O4`2WSr3!n6pSB zqNb3frhlwBM-QWdHE>ju0;ZDnqG~>zYXzO4UOttV3s5IArOn)%suuyQ>}$|4XctwZ zl#~R?W>eUE{;Y4n;9D0sr@w)F`L}2h$kz^e3$TH}m7Eld>A&|341WU0`#CL~2lmw_ z7vNI7+of}6QR^ye<N}<Dw*aea>snWN+AjbFg?|z-9>`}a2~Y{fMJ0^_g(6DsY(534 zDdwo|55&sqIy7~>5h*~SBuW4^@a3yV_-G)3*o_QDn3?|}x{A#fkS(I*WV7;3r@4h? z;b}5inJ%JaTJ=$i&+|*71xS-XpKJW^eQ5=L{#p|*fT->9ptZawE#c={6zwVMYYl1v zUVktyyd;3f=mIPlSb#+mz-3?orb&QF0}J3ZdJAxo01g8S;2;5LDaL8U=I;-Jgb@P@ zFyfyG5&8`%K)+mo34;Yg7yJCr#z?P$1n8CL0)9L;$h6qQz6J?ENl}*p1n80{fKrHm zy0@|O?!cEUg}9-08w=1H_<}>NTT%ZQ-G7G8kIMUgH~|Q?u)P*ayzCQ1Du8RN2ND#u zTg`LAtqBf*?_iNCr$$sb?-wh&*%yeW1^CgF;M3%O_5orQfDRg8M-C;R^TTYr;=|Ik zIA0yE8R-yY>p8X^lnUS%;WGCpy`!6Ljc8XT+Wo5rE?kd8q?c`Lh~^<F#^zOu9Dmo5 z^W$t&)ZH}J9ZdSPwVcP-c;*gnwxOJD0<8p)=hX$s`x>Xx9<H-M={km_(p#V;BM;dE zVpo=2Tt{B0#3mM)Remdvm}TJmhVMKmKY~L}zXadM(-UedDr$Rtf_WQ!Cs1fgO~=ym vSr7{ZAI)>}(B<O(?Boni=-%aD0Tu=TqC(z?^D_)000000NkvXXu0mjfT~;BP diff --git a/res/img/social/linkedin.png b/res/img/social/linkedin.png index 2b868a585ba59ca2f716f0a21254ccbdb3c95438..4c92adb56be870593394a4b5082e8b55397d8033 100644 GIT binary patch delta 1607 zcmV-N2Dtgw3fK&gB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rd1{)9!C<8q}&;S4h<w-<ARCwC$n|o|iRUF4Z_qJsNWGm>B0pk&Q43G>7 z0U-{RM2xgC{KNbc<{$U~k^y4s1H^=cQ4$DC@bQN+h(==wiGP|Di5fSusR_aGP5}kR zABDkO*~T8-Zrkf0=XNVwAE%>T?^eIbva~z*ob&tccYf#hx(b<w%ToZX0+s>uftf%t zU<dMzQ30S8XaX7mFK`;D#qDg*<o1*d3B4Ft4^#kCA8|Gxa11z#+j-W!1h_mZupM~Y z_z!0SO~3)*Ab)OW*c=47JQiRN@E*g9YG4;`XXsHTQHLmW<o71y{0_J97;6TMJ@oHs zSTw-pnFKT#M$HWH0_C`!{>*ED%d-J!F_G{XducKDmH`6#RsIlg1oPsEu}A46p-2hu zc7n^}p*Q4MG-D!;(jxM0Dp#62`S#px&@*<S4izVGJAa*hdml0Z#srGXQ(u^GEkE_< z3d)Kn3>x;<_m}vr{wCNgW+I^hw{vAO5@a;MW6!rbnm=5PRgFJ<Z|y&P@Y7XL74vDr zkZpj=a|kWu_;us*gu(;7ziKv%OA5_q6C8auA!P!DMXg#;Qpl321yZZ+eYq4uVY87? zmFRX*;(u8DNyb&jJI_7Ie#bm{$71V`kZ(2P4e>bOA7~E-Yk(Ng5c&96UW$fI*UfrG zHpDW9Y77n76z$|(Z|Ra=!QZ8UMKLP@^ZVT9xCDs6rY8EUZ_eG8Ug4{=KC@kg15snh z7*_-K01qADU?|MapRXmIIT+U2;qii^n3({pA%9~GBPine*rBBs;_$jMHm{fw^Ur}` zn3?-(x!2Ky&WL~|l23@%fbDUI+bnE3ev#FmpXQHS_xrxS+tEYK?~RPzd2%EP|B$TF z8gNG{lM@V!A6*BF3O3d3Y9BkZ<aSQ(*8q{jlS^Y+RdLUcwZRz6NE9BR*pRvJ2&^~l zR)2LJv=H<Jp<9DM5PE}#7CzF<>xr`X6-m`zOP+dD#@Pn>L5c!;mzMgoT8Oggb}E;Y zux4%%)9hmzKgQDMZ=Ao=&KX}DU!V1H;a02A#?(*&Y*UQ9eOscD)i0Ow?hCV$3sLoh zI2zID*3fI#%0C;{Sva|XFDlAdDj8f|`+v8SSB{+FT61Trd5J<5QM5>ip5QPAI9iC0 zUYg6rZ7ZdP2blZBc&_evo;CA|Qgy{wsfdbA_MwG2ysnJhFU}cy@c-IU%BB>g^2jn3 zlO#7^Up*(Tqm>GN+qfKhrAr0#RYa{W>-c!>Q|XC$$Jto>^c30QGgUHI#!AgePk&=7 z?Tu%q%O+-uRYa9`RAEhNk?b+BTj?)Rn+oUev{QG(PiwbEVZMzGOQte$;1!zyvr6n- zZ|O`n%zU}4``sGPe)=a~Uz>2d6$NyiZO1Qg_|-+yhH_rfco_mv5yef@c)hdt*Wta_ zArdQ*I73k&&&rnX&U5MR1F5+tPk+dh85U3xof)Qp>*N)YR!g9;hZ-8C=9*@gI@zr% zqUpdCI9Pu(sVjTxhF@BnWWr(<(UX&P-0*i13IvmmYYS-UT((g~)Yh|(i%k!tGRn<u zX*F417152Ab#(NE<dQ2|D4olmR)JbG5a93b%|?m6RyF$Yd|4-;OB?R=ntu<svptd$ zJ4Wu|Si}(mIGTe59PKASbYM2+knl~BuG8qk$blRp;6QXN(C3Kd5CI1V6Ci43)j1%1 zb#$Nc!0PZWAUKMJ4;nHOn*h;xTs4Xbs2bQ@9jis=6SKqzX@=L3jl=|qCaLmKNI-e4 z_E~ET4FK@t@>F8(zTi|)8Go;nJbs^`+xaB}`h`X)Y7ALOjQ~NyR^UWfA9+$6dp=>v z5EqHF!lKdGd3oVq^}B!hyF5|tBG0PE?hvzC*jINwX@Rv)GSwwBUs#9BcONv!bd0Cg zE)R|oq5#tE^2uMA5W-`0UDu3|GcP5)oCXZmhz%yb9V!zUyz~$tNI=Npm!<^#xSb1t z%~_5eg1}~DFaDuSkn=B2{{QN1Mz)!gFHgrO!_=?O{|C623?&8Ra037U002ovPDHLk FV1l9I0muLV delta 1347 zcmV-J1-$y$4Au&eB!2{FK}|sb0I$e51&Zka000?uMObuGZ)S9NVRB^vL1b@YWgtmy zVP|DhWnpA_ami&o000E&Nkl<Zc-rJ!U1$_n6h1qylO}GnaqZTKH8H6YOj$Jsq=uBD zv{<TC1);^hC@VsXqVz#p>_Z<EidIkv3YJh`vZYx1P}(9CLVr`zSOQVWmXsx_t+iFt zXzH3pV-nMzGdUyU?##OLx4E<P!N*Q!a_^k;&AIoUd*@DIYoZHWMilunvH`ga8RPTx zEA#OLGRepEJA_Oj$+!_WjSIR|Z!>Z`a+Aj4e2}>eXnsK>$hXKZk$oZy5JK)j#*vK< z)*EBKj~qa@BY)2zGfq@4IZ#I!c?fwGdE8;=v(d=+xXSko&$a+Nk%P#?$Ose<5x(aj z+fZ}?>X1Fi&$yGDEkxOd9`0a^A^>%6{m6A74#<{EY@4eBQ2RT_9iC_iv27>Z5P*iM z4&-|vKK8S%vQxw09OPF#rh5fDc!b!3d}ucUj(f~`6@Q!9c3Vv#&LQPh>}MY=3DAl> z1>VOg_QjL{HQesy5)eRUUuw*Bf*pk<I19?lVCR~8SP`vM{{D63E}Xr11#aJeAesnK z_UWZUA|ReGWK=A!EQb@XH$!VpR1tzm$8>H<xI)B8Xw~ZvB%K`lXhGx5$~p+ixdBAy zcC1_~YJYP$nmuQcbb8H#CN-<8tMXi%FRB2M>`_h1N+tI~>0_@pmDdWe$IO(rfB25! zwaYjE6<L4?`<f#_+)OQr{y!iyF_m+k&e1i&5ziK&8BDI^Tua}B1K;&Q&$U}{XM92- z9n(3wCO8_|=SO+Kn^tO}@%~u%fLHqhnlSaL5r6O+_z$nDO@KOum=6UYpCcr|2JkO7 zP#@4>rDVtU7O0qOyq>b{^B+zBzZ3{4>2z#i71YfSK~M@nZPh$wWEswk<L@N=@=qFm z`f~(sjNNxafCkF~IE|{OWcX-(OmSE*y$(fYa+g(@WxkE6cITC0__S{b#-|?I8Vw|H z_kTr3;Ys?&CSB(ZW4C@Ge6n#3RF=)P6#*nbwGi{wiZat>XhwRl)z<Tik^o`wFkW~z z3@<+SjMd_yAPBU^e}3?~l1)-3IW;{Ei=HlrwTl<P))h;X4$%m&JYNkz|8>i<079Vs z;&1Rx>hH(S4c;D8IEJIZuBLj!vg(SI6@O3@$cP}o55Esvx<;VkRi0z%HD`uOr9}{6 z`ak1qcOOhXv3yXnF2GGMbawY9r`)J^gak<WI29fu0S0_5K+^9KkRk!Pd@Mj02|)Ys zl70+-wG$+C`cQyQH4!2td?-LdD?qQ$I>QwE{MdVeb{`4QuAK|0I4w$A>@w2qYk!Ua zG$}gi0|8EICxDX9#nBRWel+_b2Xwv{cn3;jZ;&3|)rP-b1gL#McL_S*o$b7l0EFEj z$U=!j$godPr~oOW0v^R~qdX_yGRhaowi0l@jeP;L0uT;(JWWop4`5XQdhfIgdESH0 zf6unt-YiX@v~9^3MgoFt-ORRwU4H>o5#I7hpU}p(P89ObX4jJUapfWokr}papP53E z#qerEUJ%In3v83=W@`1TG5WN%g~!*~oI8xN4J~XF6iWc@ym~qENRg+~X};%jyXzQ| zLr>vDWG(UoaCc=X#rLS?d)kh^pu<n)W9C|z`G)Teu)hU|oc<bSKA!G%T0Bv=UXS-O z55mk26xyp#+tQY?ATs1`%}esomE!iC<Qbf+?=JrrU;t@uC6PgoH%kBj002ovPDHLk FV1oS;cq;$^ diff --git a/res/img/social/reddit.png b/res/img/social/reddit.png index bd6131186f990ad2902c6d76165f5bf7e6457244..131016847070dd6499d46452341d45064b933f1f 100644 GIT binary patch delta 1541 zcmV+g2KxEu5tj^*B!3BTNLh0L00oHv00oHwZD^hP000HaNkl<Zc%1E<J#ZRF6vuz3 zQ76p^S8^97>IH6<LZ?F48o5`DySSsUYvVea37yM8+*_zU7daZ*aP(qu7gf>Ci271I zHXw1_?jCmtP5hr>4vzhN`@VPAiQ||;;W;kg0#%?4R5Ue0V1En@fB-)Z3L6{X<W2z3 zDFL<V=VeZ<UIAU8iyz<S)FzN80c54?!0UV(T#63R!jA`eG`2bcWa3TWc=h2}p$9Zq z6_M-&5LRzd{EF+)0UB9FBO3ucrv|ivy)2y;fC#AL$6ecsTh?89P8+ynb0!Zmmdokb ztYFRo!tw!nGk^Bj2m#krB+NMA=}aDEjKOrwTIe~zbIOQQvPmp&f(R(<I3b+_go<6B z-sC~XtmOoq2n0M0wqFJjhZHO)fN0e9On$cn6<40Ra$X(In{ZS!ZM~9a9g=l`*!fG- z9#+Py2K@4ye82ey*8>;^@(crce^7;s0Cwi2aoB@q4S(*86#iL~pRh;(k(n{;l>3VS z4pThoQ3yLF*#BYizt11xbJL`kM5VZ$P_V_im7bdXt7kINiYqIAP?i6FOp(Nj3!ja8 z*+b@5pMQCu020`&*S9~Y%5xM7E8pFM-(D>9>90I`dyVI`=L4vRO0bznFIG?lxK4>~ zuLmOUNq<l}!W_-{A2R}YPL=hCv}ObV_|$+&bpPG32bV3|9*?J-4%`=khHXo^pyJ9? zx02TbI4_I&+b_%SzIE`YP-p5Nh!qgc|4-J|R)RmZLY}kko}b~zw@L(zy^36+R)3j% z7mFIqbim^fz*PQ=!94=xmA$pYp({^&O`Zo{0)K4JYsA8_Tas1ZDa{-mfS;xeIJp&W zFmr8Jhv&FXd`c7eP)G;6CDGbPHIernLkDvb30L&H@+poWAD#G=E_sVU#f7s59Ocw( z|4QtA{-Sc_#HS3f342vYs=`s_y7s%m(r;Vofz2uy_QWB&9!URQeHKFZyD|<tZV8?E z6o2!)_-;uex1``?*eh=0rhSb<_)vqJv2jy&1ki=8n}A^t-nqub&G!XVXu9b*Jf2w> z1DF%QJO%amuo!DnLL?tdB2id3W3l_M8s;1{?7^3o_yzlAQLLsW)Dq@8z$Pg%i9`+` zy0|7fBuR#o@_}i1`@-10HWz`kq{Kt?yMM_8_+k*dCzY`YeMg~HY+<)K`fFV}(BbcK z^81N_jb2t}S)21vX3zp#$Y!D$ZpOl%IwGhr_aXMn`aYJGS=Oe)D3q~T_y9n-g`~jE zp%RyAI6M|FZ63-?)ZuMw(TsU@z3wm>*CNK-$i`>>;qbfPW#C}|&&y((OqAHpo_{F3 zeplGO;uh(D47QQnm|Zk@GsY-?dU%{|@H=~OYMGt4V||5SE7KvP$4OwMBg>flI8avL z%Bo_&yO^SWOiZFI8R9FLnL)eSceiFXeO>s{%Ax?fkd*)+35uI<`f~42pm}D;F_TE@ zyg$*G9fesoN8la-WXH5)RsHT(wtuE|6FY0jR`*#6F5bY`PO?Wi?8$!@Z=~!nkh*D@ zMB<#;uYO1E63@2BB{}-1ZA(Ue`XrKUjo;S0sRvatpI%+xW>UOih8OCn?fvrso)eH| zfAF9R@7w9y*b0+K20fqseO?w1@StkuD~v)}`D~N#;m5A}@sI#6S-3#qynhMj#Uz;j zgZY7oWjL8P{YfW8+N^R$V80AMH|-r69lmzpk7ibfN1=ls*XLgpcSL4>Patc0ynmJF z-az6Jne`o#QpaADtS2E1X1hcAdz*%bq!d;ah0VeO>no%mmGvCEO_R+;h#xOa6YDZU zE;b31&4ZjAPl3r{>3o#p`hF1sRs49IR!E-{6s=k2X>me`X#BCRpjlE>h~V-xh+uVL z!v4<CW?P4)+I|`A?+i%?XNZh#3L?bL*KI4>69AYx6lH8f=wi@8<lR1}!S{=kxn7;E rBBxE)ado!6>ckbkU!MNIU!VUM1UzH=D*fU300000NkvXXu0mjfW+3&t delta 2267 zcmV<12qgEH4CfJ$B!2{FK}|sb0I$e51&Zka000?uMObuGZ)S9NVRB^vL1b@YWgtmy zVP|DhWnpA_ami&o000PiNkl<Zc-q`sd2AGA6o1`f1p)}ga>!MV(sIgWIfWo9R1i=r zqVW&44aP`=M??vYMuUGKAzH1N7|=waK_DQ?83Iy{maANaN`Gm~B}dC?p+c=td_Ued z?6jTT&au1Q?Mq%}I-U8x_uluu-#cbD>~7kt<Y$Uv9>pBX+>N=9x{hOnI<H{PRp&Ss zGUqdAGGFqia1H!4?m*^5=J7g(y-|dEhIB{L8DuT<3g#SN3mWD_4`{+XjX8<Ar=JX) z$GnL7d*(7<41ehI!59xQ&t^W&Jl~JXlNx)znrpV2yG{-88gl{j9Og(097U=*3zQ52 zH$Z3REao2-$ki1^DH*a9zy`zs0Jp=;Ln(L&vK&yd`PBf}f6Eo%1sgR{vVG+b10YN- zVSbN-pJpgoBYc$ygfp*HF+Ei16%`>SG2e0O0rNvld4G+@E7=`wfh6Tpp-MB94z>(1 zf_VXjJ}pqXSTaCIweKV9fdL|vE*-6a;F3B{aB5PgzFa2pwr<ba@Xb=93!DUQ&mg*P zs#uItIz4X207>3l#&7gUccM6+wi(NM>pB;~XIM$Dh%azu+>5K}G0AdY*)?9%2Z_24 z;x+9}w10XY(fQ+MW*DJ#TjZ@8j8yq`WI&Z4&FOrfF~<M<yM(A|OQOo#Tok7fojD@c z<DVlM^1S^2=b1!zE6vPwl{rQo4Lx8+z?FyM;5)3~p^ZdE`{a7-u0+xOWR*cVzq^$O z?O7$;qAiyIZMul3m@A^7<0nQSh*WZVK$UO6_<uCy1v%gN9np@Zq6qjP8{^lxas-tc z?DZR$<=D8nm073jQ+d4srUiWU0ceeyvO}IDD%|72Y0t?qCcf(RhO9&T9`0>ot(2Z- zWPqeP0Y1>FgP!jx+)GqmCfi}cy8?ba7|at>dF46VEh!?p@|V?_ld5CDKtFeKJk)Q> z;eRfBQ2@$s_?GCI6rwHzgf+T$LAH*)&JuLa(G2iX;M0@F67udT`H%N|0e*`=BI-Am zs8wg8igKc2g%h_coD@tsS{OuwqmN${4RZ-v1F0eW!<~5LThzP{@x8P}R`udZIi5S_ z&m};&xi1U=KfGcK!Lc9P#mV2u$nv&HmVX9n*@1`W@D?*z0INFT{_-;SSdr}vP@cs) zw2A0X9{1J_xdyN4+)u^_o#$k!D2M33ayv$72?HdmPKtR#?0u4fv_;#h*Wr%))^Ot4 zQH-O}rPD+w_w&l0V%IHl8_8%}w2Br_iS8>=0)!l)U^g4>B2oVYq6ZpQeGcQTPk*=L zF)zXZXfMw(A4GVirhX=?2K3EYE7v>p5_HxGLg#KKI+|$*r4>l>R_QU4l^$2si!de( z3UBB=T4buYNtBUlwl>fx6(AUENhqYBQ2uP5<l#^>oQLVAi_^z<5$#+mF6@MW3wu|~ zHi(}ns}D>;?r{3B%ncwM_cl@YA%8?88PC>yX(<}GEQdb;8ffP-xAKV32v7KX^Fj$* zPL<aaRu@^~s=0y%m@6Sg<_7IvskUZ})sbUifHszZPuqVQ=nPF1qhS9db%lHSi{N$3 zKXn^n_*6IcfZ!R{D5?QjdA)>*u%Cgz$jo4n0jgcN<p*OBLX;Sx1jQ=W27gqw-H)_) z-Pc5uKa{+nV3!n5Aaey#6_jz2)gC`k9yELk(b%`-9C7>DPUHI%ri*~!1QWHEnfqZB zZ9YUJ%@Yo+w`Blpl%GYkYo&mZ76vt=7*S=V@wwCcQ67UJ1F!(z;;Epjr73FtH8W~) zxI74r2yev<KoM~ojPu&a?0@~(3R<POZ86dQwYK66Frbv|yz0_`2Y}=)A4j-aXrawu z<$gpO<N)@vz<UOO2NXL(W><LKHA=%Bf8cTn2FSPdXlaSNF@c_4U657}l-mA`s1OFo zvuC?AlAwT)t_GTr2O#ca`xO`39VOSk2Vmm-Y&n1QDJf)(2wfYb&wtu#nIRziuqoaX zo5v=qsFdxbCy);V*iYS%r^5>%=+kdXXsl5=#z+er1r(HO7UkWganH+Kn+<x_b7~8N zB2NJLK?eJj>AWF=jBw)na*m<}AxYn(hf$zR{N$>jg%I}dExyJe+NfDg96=?y^{1Ns zepG)?ydmf7zOfbi^?wZ!O`<Kf4S*aVYniMZwnFpP(x=m!9Z&$PbaX419>ZksqF-Rt z06`ZB`F`GZX?9jed{led3lxlLUwKXE`)`I&%kFjrO6Ub(WgsY&&tAcbWJ-nTsrdn8 zX}tq)Jp*_d>H`=J28EZw+nmv0q;&dMW5+D_2C5U<+%ST+x_?Mi(9S~MZmoAOxB`!f z8!jCpZQEd5oXvBpJb*t=?*X6>n7{Bz6BPRtZ+!G94&l)fL*WEtRBww#G!l=1vRYeA zBh90Z{9*PTU~M#$d0uq`ARRtSKKT0bz9G=O>^Vw~VJ>_40z5$b%hOh}k-{;z*J>br zE{O|i%pdz?8h@<RiT%RBh1Ok&+Qg_;j&>W#<#H>B<O)Ct04zD-B))s2G<^XW9IwX% zM>SrLy9{nfrTR;$dgYA_0K&_*9raN89ZEN<%>bZe^3nJBK|*CpCo*e*d`}OAC?$I; z`n<)aUzpSDf%54}7qV&q&^yc-A*_6c(t+$603RB^&VRfi1eM>UWOw|rG_sLN-rOh% z39?R5vXfH-XhxVCBAAe_WHpsWT20VX)ZoDwBFmI)DOMhG*>tb|%-KPte72Iw@;0^m zt1+};hpG5_wT^T9WF?EO*09sx4K7l}#pkNb3>1~BIb*2W$IpQ_fWCn0#5{}aw%N^h za%QQyQdE86ePMq3^*DNr`1lIV`&b_+{Ts=Tr}y|;(69jfd>&t*;9Grkox3T6L{QBx pbgl|r`D#DsstT^ypThkwzyNr(v=B#;25kTU002ovPDHLkV1kvnK|=rl diff --git a/res/img/social/twitter-2.png b/res/img/social/twitter-2.png index 84f8033a30c5cef33bb14ee59b5b8d5398b9162f..9f6e7c602bca62fe41cc5a6f0a1d99765dc0c433 100644 GIT binary patch delta 2012 zcmV<22P63J3+fM$B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rd1{)9n8RtztrvLy4cS%G+RCwC$n}2LuR~5%U@A}!X<K{J_tb;mEr<HYr zwn!Z+=|HGd+NfwinxGv8B;Njj3EE0jOdUaG6$6Pe!J<}LC4W?PNS-!r+CNO9DP_|p zD5AxSLOPh*!rD#Cb3)fOZQ|6P?PtHsAMd$!(m1i-d(N-&{VPi1>vPUM_ndpq`CbK| z5l^HsbglezGtdsifDOQU;4UBzv;nH~u_AB<Fo3s#0iX{U0#b&qWhbxg7nBAm-U;jn zI)Nw<cDZa0$bSGy;OB;}CH*#pp9W|L9t8F{JKP8uzyaVTL)TJsYJl=C#1rWta0K`c zvx{ee?;5&hdhrP1Msc95d^d1u4wT3F&P(w`y1U}&HP!<vc0J~t%NX+mLqMmYYeV&V zgK(kzUf{w!QXWT^3-LsHuOp-X9uQBY1HeIG7xNp3fPWtvx>oYV0FE_P;G~nw7Xtc# z&jH1mjzcX+Km~dikn%XP_Euc9>h}O==L5j01*ZIDPq-H-Rr3Tf!>#V%0#?542?wVO zjADjpzl(*BUDIU;rHTi{oK)Au;y@l)W$4<_v>s4lq2wY`9!HntRJTQCirw!9o?vm} zCx)*5s(-2hoWkZ3(7H$sFbXU;bj_?51dq%Y<t0$Gz_g$weOtEG(Q%>&IOn3>ski48 zg%aFzTYwF>2l(Vi1mOUT<|PA{Elyo5F*t4!3QYWrX+cD_4OZ*T-sv>mI0ErR`bWT1 zb(fP0NdI<-m$o$1xjcYU<%;(7zY6@aKaVPGFMmP8H&+MQv_fU)Up}NpQ64dLtp`A@ zxb*C)SJ;w-hwcus{-c7OCvt=X?iIhIMey?0X4;yjFHd%_3vqX=;MG)-dv90S6bsPS zq|nuyrH*~r1N6ib>FY<J6Zm_*LSHi_0}r;avPI#=^CsP=a#$|B!L*=%`w~_}-8HE8 zC4cigbEd$OAQWmp1{)1sOO}J+em7qn4Jxc`v4!68i6Do+7(u#FzUT8{SISG^XMK6z zO<Nq^9A?|9U_EhQKY-%2t_Oi-^$KuXM9{xII^lP3jacZfXL&y>5jE)48dCV%*Q2xq z>o-8&f+lARlkb=K+VL!b+LsvtI)oGbqkpcFYW`+(uU#fM@j#T_>zYUx<cuD%BC61= zx^w-q@&lJkeCyS^l*iGzT{!I|SAF}-ImtCsPI)xC?+NkGZ?tfKTqU9^m=;qSLklVO z3O)gU94zvc-fTUtUq%>+2`}Ytv#RjBvu4%5ceE%xvpGWl_9%~U2(vV#P_UQ~D1R-y z;it(wLIIbVc!P>Pu5yK-fam{HVCT9J)x1~%mIM_ZUK8ZuH9;<nSqxk*@$XTK|7Ij@ zVFii%0flKvFVmg%D)y|-6%-(qkv!g)=NF%?t$19uRIqBPz%PsyJl(?X61W^=N#M?< zg6Hmw@NU}TH>dOXcp<DK5PSO8xPOX0rFFIY#<<1in9Amu%3R>wsO2eu0&RjCI;T|= zX<qW)xW!!I)Ws4(;mHE3r^DE+DjayTFlPpMEoI(R8P*GdO-^uyfC5L~Gr5wV{nP(p zQS#21^g7=!3T$SE2SH%#(JWVI*$5Z25+mdJ_>Bm!O%S2LaK>WO%NYi*&3~Q|dfqI! zsyrtlC9pX;-dk7_zWj#_dr#&$bEUC?aX2G+@x19Z0|30OViS^fcwOn!%K|)qe`Hp6 z|JSGUo|-Qe7!cU=Gtc<*aFKIY8=n$C$Vq<xj_DV<sZU_DD{@{}3MkOkoAG)xn-LEj zb5;3Gg&Z&>fD|?r%`;33wtpPWGLmbI5uQ4oXK>s?__O^PASE0UV$#0=W$~#O#yRv> zf%9V)`I0~DzLqNS<Uqb^x7Y=ehOT8jHAQDCmO=uGQsKG#!hGT5?(2oVOC@%^lEw5l z#Mn(yr!Ahu$Dv4B(68PR<c)1nPs$%3EVAuSzAJASx|WP5(x?^8iGKsQ7>ra_hl*kc z!*8z+vF|e>mIS@|>$B%f_PvqwkIs4n2f*e!x*CmH67JLl-(MRdUxKI#ZDED>s9<%g z@EoL4*DM}6nd9|Tk%-y=^`{z*Ifh73BkQvyAr=+<c2k%&Z2_8mxR{I;B!|zKJkg)? z>^;*UVd&aJm7ZH^fPcEi<FdjVwsffcU`>c+;razXF<j!v*#iIgpu|W{5)_Tn{pRtw zZv=^=1=*rxZCik?D^)grEWq-JAfj@;VJd-K5i&)|*{c?R9WHX*D3UQHk$~c7imQeh z2@++3R0@|=*z&|yI_(x!+#n%H=jfQ0T|6lYG+yWH7&3INeSb2S`2QrSDU`?g$H!Pa zc&yAMpDKM*#R$X`>8DxvT){(zuI;Wyqrc^;vbC_q%Vg;<EimO@0lExbo3`m&OU5k% zU4AuAW^w1csG;M1%RiW?=gw6!bZs~AsFPOaW2$@9k+J43#4Z15s_u)}q!*&yz>k?b zcIhbaWchmQ=2iXRLVh@z0KVt-;p8p<bk@(pGiB&nkD+TFz((L0HWkfF%RT3;aSXeM u*WplHQ+^5Udofny^Z9mcUgDfTpZ_22)*QteKuO#H0000<MNUMnLSTZ0r`p&6 delta 1501 zcmV<31tR+D5AO?*B!2{FK}|sb0I$e51&Zka000?uMObuGZ)S9NVRB^vL1b@YWgtmy zVP|DhWnpA_ami&o000GnNkl<Zc-rJ!e`p*<6n?k4Zhm-8(u=9FN@CK~NJ#wAs$dBU z6;W($p;TG~(Q*<HS|SQ!X#UfJREic$1tIhgNi;+YDoU|X2!DiD18Iw=v9U2GwXM;_ z%UyaVX?jU~@A5XDm+fVDXLfJbe(-U}-QMhb-@ci7Z)VQ7qiYasMk(?!WDT+!S<j!- ztIF?ZkYRpLuLH<_WEXPOPUHMGwYvei1GzcH;Y?8ZH<0oQDS~{3{1n;iW&r}oMq~(C zE3w^r<{QX9WPdC2Lu6b=<BEhfijez|!^ne@oli$C-(#5XS(I%7UPN9%zJ&~ea|rT1 zFR%@c3s8wXg*?iGT((fkHk{%C))4_{aQhzl2)GAi%UQO~RspF0b@G7cHU!wV_v{dW zrl~gMtKfb#v8}4CX)p(QjOTQ(;5nWlwjpOlBjBLNoPXD_nQa&90wE45ucC>4u+#+_ zkVlN(sd{BDJX=wmd?gHAy#^l-jl)oUCfgz$;ku&Ri~!}_?+pzkPv21pFI1I);`{fr z^}zzTcU3+d{Urk5T$#wG04n?PAo8NoF3@H)!J#Lf?);*<J|BeEmOxb?H``HA%03wy z1411BhJQd|ujl;Y4e-0i%UqE*H0X^7icXGwz)Y+66y_~|O;H}W1P9V<7DZ>&G*#3T z_!TMFI9NnA-ADk6(>?J2$DY(wK2?B5hfCUQMnR*V03o<}5K0$d1K7Kg<2KZ?&x?uB zPCM^*Ypx$UAFUK_XEHGd=O?D2b2ysJG$j;Fy?<H+JmrPQMzaZJnEUTv16%GCUJiUh z>jE?=)O#s@DY<&SG6;7U3T2q&bC3ks<i$=*BJ8YKCECm;5}?MbBbiot3ZTZ*0{Al( zAqHmy#mm#*p!iIXjDRw)3ebVmp=g;*0u*`C`C}KO@I!P;w3&b(+_}cDi#R4i6!s^6 zzkdqfj{Pm8$$;Mp!^f^A;N|arbLVsllD3&WiZ}@nyV(U85ouv&ZhrY3K1Xq@0Hb7C zzeo$yvvY=un8Fn~ZWLgE1n3iKVPq;{=(_d6d^ZXZ7LI@`Q`Ze$_Y9V=;+d;-^pgNx zA}#!AFc~SoMU_##$wn6mK<DtnR$DkXK7R!U#=#`EmlwnCwIyzegs?UU5>8reB|0-} zDkY_T#5eC-lU&)!vJgq1wM?)b1h&CH!@Qg}LXCn}a+>RIvoz)YJTVQQUy8xGh;SXy zu4RIR9+APYFE%ZsFj*EVhD=>?KJ2S2OLirZ!H<3Z&%QvbNQ-U1jzeO8-m&<lu7A|9 z+HxJ&npz8J_&_8rre*4n1|yDk;wNukY2{}z_H~H>R1_T&G3e{d6SB%wL#VR0CU_{d z0916o6nc#BpC5Hhgv6ZbE*D9E$coMdEuzKIyFdL2#~nBpGZ;6$CfJhxfc45W>L1-A zhS7s*9rz30>H7m~h3mEn@Z}{_B7b+M_Weu(5MGk8P|`Ct39t2DP7aQ=DkKXeFwHt= zB9n&ee)eezd>Q^SLmQ@_$b4e7k?~MT0o)Z(p;*m<)p;u*VB+)$tqD>h)G-t_8~(eH z9eQ76S`(xn(7_^Ur$%V1l(4I77Kd--e5Nj-;T0`q^eEcd2e2vt9W>sJJb&&%=TETh z!iS~ltn0Q+VdO%Pty|c35EVcZVHfu&x8pF|YUq%%+2z{3+_)R}65?#zUNb*ZEQZ$u z$kQ%z{xsWUx|>>Eu&2MaZsg=5l10ZOY{N#j37irjwXR-=+z-y~Fva+u>qOTv6iH8k zii`?mGYBrT8(7I{=6kish*mzo<frmB^I=%{58qZ0KY~L}e*p`Bp6-#Ys9oFRJ<Qi( z;RFh$)O0MZngvl|>CwC}PhI`opTk_ijo8_j{t;jRWgubk*2>pD00000NkvXXu0mjf DAEm;9 From 2e892fa3992b426526af66820b2914b99aa6cddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Wed, 27 Jun 2018 21:34:11 +0000 Subject: [PATCH 426/480] Translated using Weblate (French) Currently translated at 100.0% (1208 of 1208 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 0e0980c0cc..b0062c0d90 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1202,5 +1202,9 @@ "The email field must not be blank.": "Le champ de l'adresse e-mail ne doit pas être vide.", "The user name field must not be blank.": "Le champ du nom d'utilisateur ne doit pas être vide.", "The phone number field must not be blank.": "Le champ du numéro de téléphone ne doit pas être vide.", - "The password field must not be blank.": "Le champ du mot de passe ne doit pas être vide." + "The password field must not be blank.": "Le champ du mot de passe ne doit pas être vide.", + "Call in Progress": "Appel en cours", + "A call is already in progress!": "Un appel est déjà en cours !", + "You have no historical rooms": "Vous n'avez aucun salon historique", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Vous ne pouvez voir aucun message tant que vous ne lisez et n'acceptez pas nos <consentLink>conditions générales</consentLink>." } From fc841d2dc586596d46b338e84aeb911342f4c4a4 Mon Sep 17 00:00:00 2001 From: Osoitz <oelkoro@gmail.com> Date: Wed, 27 Jun 2018 08:31:40 +0000 Subject: [PATCH 427/480] Translated using Weblate (Basque) Currently translated at 100.0% (1208 of 1208 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index bf7b3da656..9d46758420 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1205,5 +1205,6 @@ "The password field must not be blank.": "Pasahitza eremua ezin da hutsik laga.", "Call in Progress": "Deia abian", "A call is already in progress!": "Badago dei bat abian!", - "You have no historical rooms": "Ez duzu gelen historialik" + "You have no historical rooms": "Ez duzu gelen historialik", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Ezin duzu mezurik bidali <consentLink>gure termino eta baldintzak</consentLink> irakurri eta onartu arte." } From 01dd3879702ed19b60d882b183338b62c797d967 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 28 Jun 2018 15:03:47 +0100 Subject: [PATCH 428/480] Track UISIs in bulk Piwik supports sending an event value, which we can use to indicate cardinality of UISIs to be tracked instead of tracking them individually. This means we can track them at a lower frequency of (fairly arbitrary) 60s. --- src/Analytics.js | 4 +- src/DecryptionFailureTracker.js | 8 ++-- src/components/structures/MatrixChat.js | 4 +- test/DecryptionFailureTracker-test.js | 52 +++++++------------------ 4 files changed, 21 insertions(+), 47 deletions(-) diff --git a/src/Analytics.js b/src/Analytics.js index fbc8fb79c8..d85d635b28 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -199,9 +199,9 @@ class Analytics { this._paq.push(['trackPageView']); } - trackEvent(category, action, name) { + trackEvent(category, action, name, value) { if (this.disabled) return; - this._paq.push(['trackEvent', category, action, name]); + this._paq.push(['trackEvent', category, action, name, value]); } logout() { diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index b1c6a71289..447562af26 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -40,9 +40,8 @@ export default class DecryptionFailureTracker { checkInterval = null; trackInterval = null; - // Spread the load on `Analytics` by sending at most 1 event per - // `TRACK_INTERVAL_MS`. - static TRACK_INTERVAL_MS = 1000; + // Spread the load on `Analytics` by tracking at a low frequency, `TRACK_INTERVAL_MS`. + static TRACK_INTERVAL_MS = 60000; // Call `checkFailures` every `CHECK_INTERVAL_MS`. static CHECK_INTERVAL_MS = 5000; @@ -163,7 +162,8 @@ export default class DecryptionFailureTracker { */ trackFailure() { if (this.failuresToTrack.length > 0) { - this.trackDecryptionFailure(this.failuresToTrack.shift()); + // Remove all failures, and expose the number of failures + this.trackDecryptionFailure(this.failuresToTrack.splice(0).length); } } } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 4b8b75ad74..293b0130d0 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1304,9 +1304,9 @@ export default React.createClass({ } }); - const dft = new DecryptionFailureTracker((failure) => { + const dft = new DecryptionFailureTracker((total) => { // TODO: Pass reason for failure as third argument to trackEvent - Analytics.trackEvent('E2E', 'Decryption failure'); + Analytics.trackEvent('E2E', 'Decryption failure', null, total); }); // Shelved for later date when we have time to think about persisting history of diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index c4f3116cba..4979fb9bb4 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -33,10 +33,9 @@ function createFailedDecryptionEvent() { describe('DecryptionFailureTracker', function() { it('tracks a failed decryption', function(done) { const failedDecryptionEvent = createFailedDecryptionEvent(); - let trackedFailure = null; - const tracker = new DecryptionFailureTracker((failure) => { - trackedFailure = failure; - }); + + let count = 0; + const tracker = new DecryptionFailureTracker((total) => count += total); tracker.eventDecrypted(failedDecryptionEvent); @@ -46,14 +45,14 @@ describe('DecryptionFailureTracker', function() { // Immediately track the newest failure, if there is one tracker.trackFailure(); - expect(trackedFailure).toNotBe(null, 'should track a failure for an event that failed decryption'); + expect(count).toNotBe(0, 'should track a failure for an event that failed decryption'); done(); }); it('does not track a failed decryption where the event is subsequently successfully decrypted', (done) => { const decryptedEvent = createFailedDecryptionEvent(); - const tracker = new DecryptionFailureTracker((failure) => { + const tracker = new DecryptionFailureTracker((total) => { expect(true).toBe(false, 'should not track an event that has since been decrypted correctly'); }); @@ -76,7 +75,7 @@ describe('DecryptionFailureTracker', function() { const decryptedEvent2 = createFailedDecryptionEvent(); let count = 0; - const tracker = new DecryptionFailureTracker((failure) => count++); + const tracker = new DecryptionFailureTracker((total) => count += total); // Arbitrary number of failed decryptions for both events tracker.eventDecrypted(decryptedEvent); @@ -102,36 +101,11 @@ describe('DecryptionFailureTracker', function() { done(); }); - it('track failures in the order they occured', (done) => { - const decryptedEvent = createFailedDecryptionEvent(); - const decryptedEvent2 = createFailedDecryptionEvent(); - - const failures = []; - const tracker = new DecryptionFailureTracker((failure) => failures.push(failure)); - - // Indicate decryption - tracker.eventDecrypted(decryptedEvent); - tracker.eventDecrypted(decryptedEvent2); - - // Pretend "now" is Infinity - tracker.checkFailures(Infinity); - - // Simulated polling of `trackFailure`, an arbitrary number ( > 2 ) times - tracker.trackFailure(); - tracker.trackFailure(); - - expect(failures.length).toBe(2, 'expected 2 failures to be tracked, got ' + failures.length); - expect(failures[0].failedEventId).toBe(decryptedEvent.getId(), 'the first failure should be tracked first'); - expect(failures[1].failedEventId).toBe(decryptedEvent2.getId(), 'the second failure should be tracked second'); - - done(); - }); - it('should not track a failure for an event that was tracked previously', (done) => { const decryptedEvent = createFailedDecryptionEvent(); - const failures = []; - const tracker = new DecryptionFailureTracker((failure) => failures.push(failure)); + let count = 0; + const tracker = new DecryptionFailureTracker((total) => count += total); // Indicate decryption tracker.eventDecrypted(decryptedEvent); @@ -146,7 +120,7 @@ describe('DecryptionFailureTracker', function() { tracker.trackFailure(); - expect(failures.length).toBe(1, 'should only track a single failure per event'); + expect(count).toBe(1, 'should only track a single failure per event'); done(); }); @@ -157,8 +131,8 @@ describe('DecryptionFailureTracker', function() { const decryptedEvent = createFailedDecryptionEvent(); - const failures = []; - const tracker = new DecryptionFailureTracker((failure) => failures.push(failure)); + let count = 0; + const tracker = new DecryptionFailureTracker((total) => count += total); // Indicate decryption tracker.eventDecrypted(decryptedEvent); @@ -170,7 +144,7 @@ describe('DecryptionFailureTracker', function() { tracker.trackFailure(); // Simulate the browser refreshing by destroying tracker and creating a new tracker - const secondTracker = new DecryptionFailureTracker((failure) => failures.push(failure)); + const secondTracker = new DecryptionFailureTracker((total) => count += total); //secondTracker.loadTrackedEventHashMap(); @@ -178,7 +152,7 @@ describe('DecryptionFailureTracker', function() { secondTracker.checkFailures(Infinity); secondTracker.trackFailure(); - expect(failures.length).toBe(1, 'should track a single failure per event per session, got ' + failures.length); + expect(count).toBe(1, count + ' failures tracked, should only track a single failure per event'); done(); }); From ab990d8cec6caba17b6716a12ad3d12bc67ddafd Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 28 Jun 2018 15:07:58 +0100 Subject: [PATCH 429/480] Increase grace period to allow time for key sharing --- src/DecryptionFailureTracker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 447562af26..58ba1ae8dc 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -48,7 +48,7 @@ export default class DecryptionFailureTracker { // Give events a chance to be decrypted by waiting `GRACE_PERIOD_MS` before moving // the failure to `failuresToTrack`. - static GRACE_PERIOD_MS = 5000; + static GRACE_PERIOD_MS = 60000; constructor(fn) { if (!fn || typeof fn !== 'function') { From 3846aef8a1ce05fe1722122a7e63ce181ec48c54 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 28 Jun 2018 16:06:12 +0100 Subject: [PATCH 430/480] Alter docs, add comments --- src/DecryptionFailureTracker.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index 58ba1ae8dc..e7809d2f6c 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -157,12 +157,15 @@ export default class DecryptionFailureTracker { } /** - * If there is a failure that should be tracked, call the given trackDecryptionFailure - * function with the first failure in the FIFO of failures that should be tracked. + * If there are failures that should be tracked, call the given trackDecryptionFailure + * function with the number of failures that should be tracked. */ trackFailure() { if (this.failuresToTrack.length > 0) { - // Remove all failures, and expose the number of failures + // Remove all failures, and expose the number of failures for now. + // + // TODO: Track a histogram of error types to cardinailty to allow for + // aggregation by error type. this.trackDecryptionFailure(this.failuresToTrack.splice(0).length); } } From 016e9176f6e624b57565452f15140c2a84e99be0 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 28 Jun 2018 18:11:52 +0100 Subject: [PATCH 431/480] Fix room topics/names reseting when UserSetting re-renders This reverts a fix to EditableText introduced in https://github.com/matrix-org/matrix-react-sdk/pull/1445 which introduced a bug that causes room name and topic to reset when UserSettings is rerendered because `initialValue != this.value` This also fixes the same bug originally fixed by #1445: >fix entering the same thing twice (which had the bug of not >emptying the "new" field) which, in other words meant that clicking "+" when adding a room alias would not reset the contents of the bottom-most alias in the list. The fix is to increment the `key` of the element, causing a new instance to be mounted instead of passing new props to the existing one. --- src/components/views/elements/EditableItemList.js | 5 ++++- src/components/views/elements/EditableText.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/EditableItemList.js b/src/components/views/elements/EditableItemList.js index 05ae625515..02fdc96a78 100644 --- a/src/components/views/elements/EditableItemList.js +++ b/src/components/views/elements/EditableItemList.js @@ -139,8 +139,11 @@ module.exports = React.createClass({ </div> { editableItems } { this.props.canEdit ? + // This is slightly evil; we want a new instance of + // EditableItem when the list grows. To make sure it's + // reset to its initial state. <EditableItem - key={-1} + key={editableItems.length} initialValue={this.props.newItem} onAdd={this.onItemAdded} onChange={this.onNewItemChanged} diff --git a/src/components/views/elements/EditableText.js b/src/components/views/elements/EditableText.js index 1f49bcddae..44f86f1be8 100644 --- a/src/components/views/elements/EditableText.js +++ b/src/components/views/elements/EditableText.js @@ -61,7 +61,7 @@ module.exports = React.createClass({ }, componentWillReceiveProps: function(nextProps) { - if (nextProps.initialValue !== this.props.initialValue || nextProps.initialValue !== this.value) { + if (nextProps.initialValue !== this.props.initialValue) { this.value = nextProps.initialValue; if (this.refs.editable_div) { this.showPlaceholder(!this.value); From ad5f1bf180af19cb9448c555567e9497d124766c Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 29 Jun 2018 09:46:01 +0100 Subject: [PATCH 432/480] Fix layout bug introduced by #2025 Fixes https://github.com/vector-im/riot-web/issues/6958 (https://github.com/matrix-org/matrix-react-sdk/pull/2025) --- src/components/structures/RoomStatusBar.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index d1dc8d3c12..9aa77e695a 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -374,11 +374,13 @@ module.exports = React.createClass({ return ( <div className="mx_RoomStatusBar_connectionLostBar"> <img src="img/warning.svg" width="24" height="23" title="/!\ " alt="/!\ " /> - <div className="mx_RoomStatusBar_connectionLostBar_title"> - { _t('Connectivity to the server has been lost.') } - </div> - <div className="mx_RoomStatusBar_connectionLostBar_desc"> - { _t('Sent messages will be stored until your connection has returned.') } + <div> + <div className="mx_RoomStatusBar_connectionLostBar_title"> + { _t('Connectivity to the server has been lost.') } + </div> + <div className="mx_RoomStatusBar_connectionLostBar_desc"> + { _t('Sent messages will be stored until your connection has returned.') } + </div> </div> </div> ); From fcc9479c1d92634e4fc8b401c022a12dcd0a630c Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Wed, 27 Jun 2018 08:49:00 +0000 Subject: [PATCH 433/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1208 of 1208 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 561a6bd35a..f6bb85b0c7 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1205,5 +1205,6 @@ "The password field must not be blank.": "A jelszó mező nem lehet üres.", "Call in Progress": "Hívás folyamatban", "A call is already in progress!": "A hívás már folyamatban van!", - "You have no historical rooms": "Nincsenek archív szobáid" + "You have no historical rooms": "Nincsenek archív szobáid", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Nem tudsz üzenetet küldeni amíg nem olvasod el és nem fogadod el a <consentLink>felhasználási feltételeket</consentLink>." } From 1539180cdccc008676ef34577926aa3c3801b958 Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Wed, 27 Jun 2018 17:54:51 +0000 Subject: [PATCH 434/480] Translated using Weblate (Russian) Currently translated at 99.8% (1206 of 1208 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 1416921ea0..2b75f9c443 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1203,5 +1203,6 @@ "A call is already in progress!": "Вызов выполняется!", "You have no historical rooms": "У вас нет архивных комнат", "Share Room Message": "Обмен сообщениями в комнате", - "Share Message": "Обмен сообщениями" + "Share Message": "Обмен сообщениями", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Вы не можете отправлять сообщения до тех пор, пока вы не примете <consentLink>наши правила и положения</consentLink>." } From c4b6b458f22dbd05e551d2a8d85f9b33216e6522 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 16:59:49 +0100 Subject: [PATCH 435/480] don't fire share dialog when clicking timestamp of event, it was tripping people up and broke search permalinks Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/EventTile.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index aa2f28024e..bae3ac8fa7 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -439,17 +439,6 @@ module.exports = withMatrixClient(React.createClass({ }); }, - onPermalinkShareClicked: function(e) { - // These permalinks are like above, can be opened in new tab/window to matrix.to - // but otherwise fire the ShareDialog as it makes little sense to click permalink - // whilst it is in the current room - e.preventDefault(); - const ShareDialog = sdk.getComponent("dialogs.ShareDialog"); - Modal.createTrackedDialog('share room event dialog', '', ShareDialog, { - target: this.props.mxEvent, - }); - }, - _renderE2EPadlock: function() { const ev = this.props.mxEvent; const props = {onClick: this.onCryptoClicked}; @@ -680,7 +669,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender } <div className="mx_EventTile_reply"> - <a href={permalink} onClick={this.onPermalinkShareClicked}> + <a href={permalink} onClick={this.onPermalinkClicked}> { timestamp } </a> { this._renderE2EPadlock() } @@ -707,7 +696,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender } <div className="mx_EventTile_line"> - <a href={permalink} onClick={this.onPermalinkShareClicked}> + <a href={permalink} onClick={this.onPermalinkClicked}> { timestamp } </a> { this._renderE2EPadlock() } From 21978b18df2ecdde7ef91b8c96a9c80e8d42e8a1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 26 Jun 2018 17:07:39 +0100 Subject: [PATCH 436/480] when the user switches room, close room settings this is especially annoying if they choose Leave Room which indirectly switches room Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/stores/RoomViewStore.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index 923c073065..35cfe69086 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -147,6 +147,8 @@ class RoomViewStore extends Store { joining: payload.joining || false, // Reset replyingToEvent because we don't want cross-room because bad UX replyingToEvent: null, + // pull the user out of Room Settings + isEditingSettings: false, }; if (this._state.forwardingEvent) { From a1fcff8bb803eb36cb71660bbca09734491c78cd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@googlemail.com> Date: Mon, 25 Jun 2018 16:31:43 +0100 Subject: [PATCH 437/480] Revert "affix copyButton so that it doesn't get scrolled horizontally" --- res/css/views/rooms/_EventTile.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 525855f3ed..80d2cd3418 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -392,7 +392,6 @@ limitations under the License. overflow-x: overlay; overflow-y: visible; max-height: 30vh; - position: static; } .mx_EventTile_content .markdown-body code { @@ -407,7 +406,7 @@ limitations under the License. visibility: hidden; cursor: pointer; top: 6px; - right: 36px; + right: 6px; width: 19px; height: 19px; background-image: url($copy-button-url); From 30ddc9610a908fdfb5b49675518abb39b21111af Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 29 Jun 2018 11:34:56 +0100 Subject: [PATCH 438/480] Released js-sdk --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 091158c035..27763d39f8 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "linkifyjs": "^2.1.3", "lodash": "^4.13.1", "lolex": "2.3.2", - "matrix-js-sdk": "0.10.5-rc.1", + "matrix-js-sdk": "0.10.5", "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", From 66b17d9120cd3cf0fb316b2a442f503c2720702c Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 29 Jun 2018 11:39:35 +0100 Subject: [PATCH 439/480] Prepare changelog for v0.12.8 --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c497dc363..8483e2a0a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +Changes in [0.12.8](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.8) (2018-06-29) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.8-rc.2...v0.12.8) + + * Revert "affix copyButton so that it doesn't get scrolled horizontally" + [\#2013](https://github.com/matrix-org/matrix-react-sdk/pull/2013) + * don't fire share dialog when clicking timestamp of event + [\#2017](https://github.com/matrix-org/matrix-react-sdk/pull/2017) + * when the user switches room, close room settings + [\#2019](https://github.com/matrix-org/matrix-react-sdk/pull/2019) + Changes in [0.12.8-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.8-rc.2) (2018-06-22) =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.8-rc.1...v0.12.8-rc.2) From 2dc94ac277bfaed6e7a8116ff08bba22ee8fb642 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Fri, 29 Jun 2018 11:40:18 +0100 Subject: [PATCH 440/480] v0.12.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 27763d39f8..c6d5a403bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.12.8-rc.2", + "version": "0.12.8", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From e93171831c3bea28729a5befee54ec61707a497a Mon Sep 17 00:00:00 2001 From: Jeff Huang <s8321414@gmail.com> Date: Fri, 29 Jun 2018 13:13:10 +0000 Subject: [PATCH 441/480] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (1208 of 1208 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 2235621f07..d5d43fa2a0 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1202,5 +1202,9 @@ "The email field must not be blank.": "電子郵件欄不能留空。", "The user name field must not be blank.": "使用者名稱欄不能留空。", "The phone number field must not be blank.": "電話號碼欄不能留空。", - "The password field must not be blank.": "密碼欄不能留空。" + "The password field must not be blank.": "密碼欄不能留空。", + "Call in Progress": "進行中的通話", + "A call is already in progress!": "已有一通電話進行中!", + "You have no historical rooms": "您沒有過去的聊天室", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "您在審閱並同意<consentLink>我們的條款與條件</consentLink>前無法傳送訊息。" } From 1d91469104bae6f94c33cc772130cb5c67b52847 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 29 Jun 2018 14:52:25 +0100 Subject: [PATCH 442/480] switch to <ClickableUsername> and use `<a>` over `<span>` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/TextForEvent.js | 68 +++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 0cdaaac4ab..3d2e3c1fb5 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -19,16 +19,30 @@ import { _t } from './languageHandler'; import * as Roles from './Roles'; import dis from "./dispatcher"; import React from 'react'; +import PropTypes from 'prop-types'; -function onUsernameClick(e) { - dis.dispatch({ - action: 'insert_mention', - user_id: e.target.id, - }); -} +class ClickableUsername extends React.PureComponent { + static propTypes = { + mxid: PropTypes.string.isRequired, + text: PropTypes.string.isRequired, + }; -function makeUsernameSpan(mxid, text) { - return <span className="mx_TextForEvent_username" dir="auto" onClick={onUsernameClick} id={mxid}>{ text }</span>; + constructor(props) { + super(props); + this.onClick = this.onClick.bind(this); + } + + onClick() { + dis.dispatch({ + action: 'insert_mention', + user_id: this.props.mxid, + }); + } + + render() { + const {mxid, text} = this.props; + return <a className="mx_TextForEvent_username" dir="auto" onClick={this.onClick} data-mxid={mxid}>{ text }</a>; + } } function textForMemberEvent(ev) { @@ -36,8 +50,8 @@ function textForMemberEvent(ev) { const senderName = ev.sender ? ev.sender.name : ev.getSender(); const targetName = ev.target ? ev.target.name : ev.getStateKey(); - const sender = makeUsernameSpan(ev.getSender(), senderName); - const target = makeUsernameSpan(ev.getStateKey(), targetName); + const sender = <ClickableUsername mxid={ev.getSender()} text={senderName} />; + const target = <ClickableUsername mxid={ev.getStateKey()} text={targetName} />; const prevContent = ev.getPrevContent(); const content = ev.getContent(); @@ -71,18 +85,18 @@ function textForMemberEvent(ev) { if (prevContent && prevContent.membership === 'join') { if (prevContent.displayname && content.displayname && prevContent.displayname !== content.displayname) { return _t('<oldDisplayName> changed their display name to <displayName>.', {}, { - oldDisplayName: makeUsernameSpan(ev.getStateKey(), prevContent.displayname), - displayName: makeUsernameSpan(ev.getStateKey(), content.displayname), + oldDisplayName: <ClickableUsername mxid={ev.getStateKey()} text={prevContent.displayname} />, + displayName: <ClickableUsername mxid={ev.getStateKey()} text={content.displayname} />, }); } else if (!prevContent.displayname && content.displayname) { return _t('<sender> set their display name to <displayName>.', {}, { sender, - displayName: makeUsernameSpan(ev.getSender(), content.displayname), + displayName: <ClickableUsername mxid={ev.getSender()} text={content.displayname} />, }); } else if (prevContent.displayname && !content.displayname) { return _t('<sender> removed their display name (<oldDisplayName>).', { sender, - oldDisplayName: makeUsernameSpan(ev.getSender(), prevContent.displayname), + oldDisplayName: <ClickableUsername mxid={ev.getSender()} text={prevContent.displayname} />, }); } else if (prevContent.avatar_url && !content.avatar_url) { return _t('<sender> removed their profile picture.', {}, {sender}); @@ -129,13 +143,13 @@ function textForTopicEvent(ev) { return _t('<sender> changed the topic to "%(topic)s".', { topic: ev.getContent().topic, }, { - sender: makeUsernameSpan(ev.getSender(), senderDisplayName), + sender: <ClickableUsername mxid={ev.getSender()} text={senderDisplayName} />, }); } function textForRoomNameEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - const sender = makeUsernameSpan(ev.getSender(), senderDisplayName); + const sender = <ClickableUsername mxid={ev.getSender()} text={senderDisplayName} />; if (!ev.getContent().name || ev.getContent().name.trim().length === 0) { return _t('<sender> removed the room name.', {}, {sender}); @@ -154,7 +168,7 @@ function textForMessageEvent(ev) { message = "* " + senderDisplayName + " " + message; } else if (ev.getContent().msgtype === "m.image") { message = _t('<sender> sent an image.', {}, { - sender: makeUsernameSpan(ev.getSender(), senderDisplayName), + sender: <ClickableUsername mxid={ev.getSender()} text={senderDisplayName} />, }); } return message; @@ -164,7 +178,7 @@ function textForCallAnswerEvent(event) { const senderName = event.sender ? event.sender.name : _t('Someone'); const supported = MatrixClientPeg.get().supportsVoip() ? '' : _t('(not supported by this browser)'); return _t('<sender> answered the call.', {}, { - sender: makeUsernameSpan(event.getSender(), senderName), + sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }) + ' ' + supported; } @@ -184,13 +198,13 @@ function textForCallHangupEvent(event) { } } return _t('<sender> ended the call.', {}, { - sender: makeUsernameSpan(event.getSender(), senderName), + sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }) + ' ' + reason; } function textForCallInviteEvent(event) { const senderName = event.sender ? event.sender.name : _t('Someone'); - const sender = makeUsernameSpan(event.getSender(), senderName); + const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; // FIXME: Find a better way to determine this from the event? let callType = "voice"; if (event.getContent().offer && event.getContent().offer.sdp && @@ -206,13 +220,13 @@ function textForThreePidInviteEvent(event) { return _t('<sender> sent an invitation to %(targetDisplayName)s to join the room.', { targetDisplayName: event.getContent().display_name, }, { - sender: makeUsernameSpan(event.getSender(), senderName), + sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }); } function textForHistoryVisibilityEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - const sender = makeUsernameSpan(event.getSender(), senderName); + const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; switch (event.getContent().history_visibility) { case 'invited': return _t('<sender> made future room history visible to all room members, ' @@ -238,7 +252,7 @@ function textForEncryptionEvent(event) { return _t('<sender> turned on end-to-end encryption (algorithm %(algorithm)s).', { algorithm: event.getContent().algorithm, }, { - sender: makeUsernameSpan(event.getSender(), senderName), + sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }); } @@ -274,7 +288,7 @@ function textForPowerEvent(event) { fromPowerLevel: Roles.textualPowerLevel(from, userDefault), toPowerLevel: Roles.textualPowerLevel(to, userDefault), }, { - user: makeUsernameSpan(userId, userId), + user: <ClickableUsername mxid={userId} text={userId} />, }), ); } @@ -285,19 +299,19 @@ function textForPowerEvent(event) { return _t('<sender> changed the power level of %(powerLevelDiffText)s.', { powerLevelDiffText: diff.join(", "), }, { - sender: makeUsernameSpan(event.getSender(), senderName), + sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }); } function textForPinnedEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - const sender = makeUsernameSpan(event.getSender(), senderName); + const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; return _t("<sender> changed the pinned messages for the room.", {}, {sender}); } function textForWidgetEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - const sender = makeUsernameSpan(event.getSender(), senderName); + const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; const {name: prevName, type: prevType, url: prevUrl} = event.getPrevContent(); const {name, type, url} = event.getContent() || {}; From dddf7991b904353eb6884b185d17fd877256b226 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 29 Jun 2018 14:52:50 +0100 Subject: [PATCH 443/480] create map-i18n to aid with transforming the i18n entries not to waste them Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- scripts/map-i18n.js | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 scripts/map-i18n.js diff --git a/scripts/map-i18n.js b/scripts/map-i18n.js new file mode 100644 index 0000000000..32f81d5e82 --- /dev/null +++ b/scripts/map-i18n.js @@ -0,0 +1,69 @@ +#!/usr/bin/env node + +/* +Copyright 2018 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. +*/ + +/* + * Looks through all the translation files and maps matches of fromRegex + * in both key and value of the i18n translation to toStr where i18nKeyRegex + * matches. Simplifies changing from text to react replacements. + * e.g: + * node scripts\map-i18n.js "%\(targetName\)s accepted the invitation for %\(displayName\)s\." "%\(targetName\)s" "<target>" + */ + +const fs = require('fs'); +const path = require('path'); + +const I18NDIR = 'src/i18n/strings'; + +if (process.argv.length !== 5) { + console.error("Required exactly 3 arguments"); + console.info("Usage: <i18n_key> <fromStr> <toStr>"); + return; +} + +const [, , i18nKey, fromStr, toStr] = process.argv; +const i18nKeyRegex = new RegExp(i18nKey, 'i'); +const fromRegex = new RegExp(fromStr, 'i'); + +console.info(`Replacing instances of "${fromRegex}" with "${toStr}" in keys and values where key matches "${i18nKey}"`); + +for (const filename of fs.readdirSync(I18NDIR)) { + if (!filename.endsWith('.json')) continue; + + let numChanged = 0; + + const trs = JSON.parse(fs.readFileSync(path.join(I18NDIR, filename))); + for (const tr of Object.keys(trs)) { + if (i18nKeyRegex.test(tr) && (fromRegex.test(tr) || fromRegex.test(tr))) { + const v = trs[tr]; + delete trs[tr]; + + trs[tr.replace(fromRegex, toStr)] = v.replace(fromRegex, toStr); + numChanged++; + } + } + + if (numChanged > 0) { + console.log(`${filename}: transformed ${numChanged} translations`); + // XXX: This is totally relying on the impl serialising the JSON object in the + // same order as they were parsed from the file. JSON.stringify() has a specific argument + // that can be used to control the order, but JSON.parse() lacks any kind of equivalent. + // Empirically this does maintain the order on my system, so I'm going to leave it like + // this for now. + fs.writeFileSync(path.join(I18NDIR, filename), JSON.stringify(trs, undefined, 4) + "\n"); + } +} From 36ace9dcb935b7b91f87963c3d8815566ecc0e69 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 29 Jun 2018 15:21:44 +0100 Subject: [PATCH 444/480] using map-i18n remap all changed `%(...)s` => `<...>` to keep i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/bg.json | 80 +++++++++++++++++------------------ src/i18n/strings/ca.json | 80 +++++++++++++++++------------------ src/i18n/strings/cs.json | 78 +++++++++++++++++----------------- src/i18n/strings/da.json | 48 ++++++++++----------- src/i18n/strings/de_DE.json | 80 +++++++++++++++++------------------ src/i18n/strings/el.json | 80 +++++++++++++++++------------------ src/i18n/strings/en_EN.json | 80 +++++++++++++++++------------------ src/i18n/strings/en_US.json | 76 ++++++++++++++++----------------- src/i18n/strings/eo.json | 80 +++++++++++++++++------------------ src/i18n/strings/es.json | 64 ++++++++++++++-------------- src/i18n/strings/eu.json | 80 +++++++++++++++++------------------ src/i18n/strings/fi.json | 78 +++++++++++++++++----------------- src/i18n/strings/fr.json | 80 +++++++++++++++++------------------ src/i18n/strings/gl.json | 80 +++++++++++++++++------------------ src/i18n/strings/hu.json | 80 +++++++++++++++++------------------ src/i18n/strings/id.json | 20 ++++----- src/i18n/strings/is.json | 10 ++--- src/i18n/strings/it.json | 80 +++++++++++++++++------------------ src/i18n/strings/ja.json | 4 +- src/i18n/strings/ko.json | 70 +++++++++++++++--------------- src/i18n/strings/lv.json | 80 +++++++++++++++++------------------ src/i18n/strings/nl.json | 80 +++++++++++++++++------------------ src/i18n/strings/pl.json | 80 +++++++++++++++++------------------ src/i18n/strings/pt.json | 76 ++++++++++++++++----------------- src/i18n/strings/pt_BR.json | 80 +++++++++++++++++------------------ src/i18n/strings/ru.json | 80 +++++++++++++++++------------------ src/i18n/strings/sk.json | 80 +++++++++++++++++------------------ src/i18n/strings/sr.json | 80 +++++++++++++++++------------------ src/i18n/strings/sv.json | 80 +++++++++++++++++------------------ src/i18n/strings/te.json | 10 ++--- src/i18n/strings/th.json | 48 ++++++++++----------- src/i18n/strings/tr.json | 70 +++++++++++++++--------------- src/i18n/strings/uk.json | 20 ++++----- src/i18n/strings/zh_Hans.json | 80 +++++++++++++++++------------------ src/i18n/strings/zh_Hant.json | 80 +++++++++++++++++------------------ 35 files changed, 1176 insertions(+), 1176 deletions(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 5ec9a93bc5..cd5cf5058e 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -148,49 +148,13 @@ "Verified key": "Потвърден ключ", "Unrecognised command:": "Неразпозната команда:", "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 зададе снимка на профила си.", "VoIP conference started.": "Започна VoIP групов разговор.", - "%(targetName)s joined the room.": "%(targetName)s се присъедини към стаята.", "VoIP conference finished.": "Груповият разговор приключи.", - "%(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 изпрати снимка.", "Someone": "Някой", "(not supported by this browser)": "(не се поддържа от този браузър)", - "%(senderName)s answered the call.": "%(senderName)s отговори на повикването.", "(no answer)": "(няма отговор)", "(unknown failure: %(reason)s)": "(неизвестна грешка: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s прекрати разговора.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s започна %(callType)s разговор.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s изпрати покана на %(targetDisplayName)s да се присъедини към стаята.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s направи бъдещата история на стаята видима за всички членове, от момента на поканването им в нея.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s направи бъдещата история на стаята видима за всички членове, от момента на присъединяването им в нея.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s направи бъдещата история на стаята видима за всички членове в нея.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s направи бъдещата история на стаята видима за всеки.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s направи бъдещата история на стаята видима по непознат начин (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включи шифроване от край до край (алгоритъм %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s от %(fromPowerLevel)s на %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s смени нивото на достъп на %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s смени закачените съобщения за стаята.", - "%(widgetName)s widget modified by %(senderName)s": "Приспособлението %(widgetName)s беше променено от %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "Приспособлението %(widgetName)s беше добавено от %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Приспособлението %(widgetName)s беше премахнато от %(senderName)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 и още един човек пишат", @@ -526,9 +490,6 @@ "Invalid file%(extra)s": "Невалиден файл%(extra)s", "Error decrypting image": "Грешка при разшифроване на снимка", "Error decrypting video": "Грешка при разшифроване на видео", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s промени аватара на %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s премахна аватара на стаята.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s промени аватара на стаята на <img/>", "Copied!": "Копирано!", "Failed to copy": "Неуспешно копиране", "Add an Integration": "Добавяне на интеграция", @@ -1181,5 +1142,44 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "За да продължите да ползвате %(homeserverDomain)s е необходимо да прегледате и да се съгласите с правилата и условията за ползване.", "Review terms and conditions": "Прегледай правилата и условията", "Failed to indicate account erasure": "Неуспешно указване на желанието за изтриване на акаунта", - "Try the app first": "Първо пробвайте приложението" + "Try the app first": "Първо пробвайте приложението", + "<target> accepted the invitation for %(displayName)s.": "<target> прие поканата за %(displayName)s.", + "<target> accepted an invitation.": "<target> прие поканата.", + "<sender> requested a VoIP conference.": "<sender> заяви VoIP групов разговор.", + "<sender> invited <target>.": "<sender> покани <target>.", + "<sender> banned <target>.": "<sender> блокира <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> смени своето име на <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> си сложи име <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> премахна своето име (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> премахна своята профилна снимка.", + "<sender> changed their profile picture.": "<sender> промени своята профилна снимка.", + "<sender> set a profile picture.": "<sender> зададе снимка на профила си.", + "<target> joined the room.": "<target> се присъедини към стаята.", + "<target> rejected the invitation.": "<target> отхвърли поканата.", + "<target> left the room.": "<target> напусна стаята.", + "<sender> unbanned <target>.": "<sender> отблокира <target>.", + "<sender> kicked <target>.": "<sender> изгони <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> оттегли поканата си за <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> смени темата на \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> промени името на стаята на %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> промени аватара на %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> промени аватара на стаята на <img/>", + "<sender> removed the room name.": "<sender> премахна името на стаята.", + "<sender> removed the room avatar.": "<sender> премахна аватара на стаята.", + "<sender> answered the call.": "<sender> отговори на повикването.", + "<sender> ended the call.": "<sender> прекрати разговора.", + "<sender> placed a %(callType)s call.": "<sender> започна %(callType)s разговор.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> изпрати покана на %(targetDisplayName)s да се присъедини към стаята.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> направи бъдещата история на стаята видима за всички членове, от момента на поканването им в нея.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> направи бъдещата история на стаята видима за всички членове, от момента на присъединяването им в нея.", + "<sender> made future room history visible to all room members.": "<sender> направи бъдещата история на стаята видима за всички членове в нея.", + "<sender> made future room history visible to anyone.": "<sender> направи бъдещата история на стаята видима за всеки.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> направи бъдещата история на стаята видима по непознат начин (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> включи шифроване от край до край (алгоритъм %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> от %(fromPowerLevel)s на %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> смени нивото на достъп на %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> смени закачените съобщения за стаята.", + "%(widgetName)s widget modified by <sender>": "Приспособлението %(widgetName)s беше променено от <sender>", + "%(widgetName)s widget added by <sender>": "Приспособлението %(widgetName)s беше добавено от <sender>", + "%(widgetName)s widget removed by <sender>": "Приспособлението %(widgetName)s беше премахнато от <sender>" } diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 98d51e99ac..2e84e60e4c 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -153,49 +153,14 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La clau de signatura que heu proporcionat coincideix amb la clau de signatura que heu rebut del dispositiu %(deviceId)s de l'usuari %(userId)s. S'ha marcat el dispositiu com a dispositiu verificat.", "Unrecognised command:": "Ordre no reconegut:", "Reason": "Raó", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha acceptat la invitació de %(displayName)s.", - "%(targetName)s accepted an invitation.": "%(targetName)s ha acceptat una invitació.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s ha sol·licitat una conferència VoIP.", - "%(senderName)s invited %(targetName)s.": "%(senderName)s ha convidat a %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s ha expulsat a %(targetName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ha establert %(displayName)s com el seu nom visible.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha retirat el seu nom visible %(oldDisplayName)s.", - "%(senderName)s removed their profile picture.": "%(senderName)s ha retirat la seva foto de perfil.", - "%(senderName)s changed their profile picture.": "%(senderName)s ha canviat la seva foto de perfil.", - "%(senderName)s set a profile picture.": "%(senderName)s ha establert una foto de perfil.", "VoIP conference started.": "S'ha iniciat la conferència VoIP.", - "%(targetName)s joined the room.": "%(targetName)s ha entrat a la sala.", "VoIP conference finished.": "S'ha finalitzat la conferència VoIP.", - "%(targetName)s rejected the invitation.": "%(targetName)s ha rebutjat la invitació.", - "%(targetName)s left the room.": "%(targetName)s ha sortir de la sala.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha readmès a %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha fet fora a %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha retirat la invitació per a %(targetName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha canviat el tema a \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha eliminat el nom de la sala.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha canviat el nom de la sala a %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ha enviat una imatge.", "Someone": "Algú", "(not supported by this browser)": "(no és compatible amb aquest navegador)", - "%(senderName)s answered the call.": "%(senderName)s ha contestat la trucada.", "(could not connect media)": "(no s'ha pogut connectar el medi)", "(no answer)": "(sense resposta)", "(unknown failure: %(reason)s)": "(error desconegut: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s ha penjat.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha col·locat una trucada de %(callType)s.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ha enviat una invitació a %(targetDisplayName)s a entrar a aquesta sala.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha fet visible l'històric futur de la sala per a tots els membres, a partir de que hi són convidats.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha fet visible l'històric futur de la sala a tots els membres, des de que entren a la sala.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha fet visible l'històric futur de la sala a tots els membres de la sala.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha fet visible l´historial de la sala per a tothom.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha fet visible l'històric de la sala per a desconeguts (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activat l'encriptació d'extrem a extrem (algoritme %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s fins %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha canviat el nivell de potència de %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha canviat els missatges fixats de la sala.", - "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s ha modificat el giny %(widgetName)s", - "%(widgetName)s widget added by %(senderName)s": "%(senderName)s ha afegit el giny %(widgetName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s ha eliminat el giny %(widgetName)s", "%(displayName)s is typing": "%(displayName)s està escrivint", "%(names)s and %(count)s others are typing|other": "%(names)s i %(count)s més estan escrivint", "%(names)s and %(count)s others are typing|one": "%(names)s i algú altre està escrivint", @@ -495,9 +460,6 @@ "Invalid file%(extra)s": "Fitxer invàlid%(extra)s", "Error decrypting image": "S'ha produït un error en desencriptar la imatge", "Error decrypting video": "S'ha produït un error en desencriptar el vídeo", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha canviat el seu avatar per a la sala %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha eliminat l'avatar de la sala.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s ha canviat l'avatar de la sala per aquest <img/>", "Copied!": "Copiat!", "Failed to copy": "No s'ha pogut copiar", "Add an Integration": "Afegeix una integració", @@ -851,7 +813,6 @@ "Your homeserver's URL": "URL del teu homeserver", "Your identity server's URL": "URL del teu servidor d'identitat", "Analytics": "Analítiques", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha canviat el seu nom visible a %(displayName)s.", "Server may be unavailable or overloaded": "El servidor pot estar inaccessible o sobrecarregat", "Display name": "Nom visible", "Identity Server is": "El servidor d'identitat es", @@ -1016,5 +977,44 @@ "Collapse panel": "Col·lapsa el tauler", "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!": "Amb el vostre navegador actual, l'aparença de l'aplicació pot ser completament incorrecta i algunes o totes les funcions poden no funcionar correctament. Si voleu provar-ho de totes maneres, podeu continuar, però esteu sols pel que fa als problemes que pugueu trobar!", "Checking for an update...": "Comprovant si hi ha actualitzacions...", - "There are advanced notifications which are not shown here": "Hi ha notificacions avançades que no es mostren aquí" + "There are advanced notifications which are not shown here": "Hi ha notificacions avançades que no es mostren aquí", + "<target> accepted the invitation for %(displayName)s.": "<target> ha acceptat la invitació de %(displayName)s.", + "<target> accepted an invitation.": "<target> ha acceptat una invitació.", + "<sender> requested a VoIP conference.": "<sender> ha sol·licitat una conferència VoIP.", + "<sender> invited <target>.": "<sender> ha convidat a <target>.", + "<sender> banned <target>.": "<sender> ha expulsat a <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> ha canviat el seu nom visible a <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> ha establert <displayName> com el seu nom visible.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> ha retirat el seu nom visible <oldDisplayName>.", + "<sender> removed their profile picture.": "<sender> ha retirat la seva foto de perfil.", + "<sender> changed their profile picture.": "<sender> ha canviat la seva foto de perfil.", + "<sender> set a profile picture.": "<sender> ha establert una foto de perfil.", + "<target> joined the room.": "<target> ha entrat a la sala.", + "<target> rejected the invitation.": "<target> ha rebutjat la invitació.", + "<target> left the room.": "<target> ha sortir de la sala.", + "<sender> unbanned <target>.": "<sender> ha readmès a <target>.", + "<sender> kicked <target>.": "<sender> ha fet fora a <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> ha retirat la invitació per a <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> ha canviat el tema a \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> ha canviat el nom de la sala a %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> ha canviat el seu avatar per a la sala %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> ha canviat l'avatar de la sala per aquest <img/>", + "<sender> removed the room name.": "<sender> ha eliminat el nom de la sala.", + "<sender> removed the room avatar.": "<sender> ha eliminat l'avatar de la sala.", + "<sender> answered the call.": "<sender> ha contestat la trucada.", + "<sender> ended the call.": "<sender> ha penjat.", + "<sender> placed a %(callType)s call.": "<sender> ha col·locat una trucada de %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> ha enviat una invitació a %(targetDisplayName)s a entrar a aquesta sala.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> ha fet visible l'històric futur de la sala per a tots els membres, a partir de que hi són convidats.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> ha fet visible l'històric futur de la sala a tots els membres, des de que entren a la sala.", + "<sender> made future room history visible to all room members.": "<sender> ha fet visible l'històric futur de la sala a tots els membres de la sala.", + "<sender> made future room history visible to anyone.": "<sender> ha fet visible l´historial de la sala per a tothom.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> ha fet visible l'històric de la sala per a desconeguts (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ha activat l'encriptació d'extrem a extrem (algoritme %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s fins %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ha canviat el nivell de potència de %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> ha canviat els missatges fixats de la sala.", + "%(widgetName)s widget modified by <sender>": "<sender> ha modificat el giny %(widgetName)s", + "%(widgetName)s widget added by <sender>": "<sender> ha afegit el giny %(widgetName)s", + "%(widgetName)s widget removed by <sender>": "<sender> ha eliminat el giny %(widgetName)s" } diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index b7298f80ab..a2646300a7 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -61,7 +61,6 @@ "Custom Server Options": "Vlastní serverové volby", "Add a widget": "Přidat widget", "Accept": "Přijmout", - "%(targetName)s accepted an invitation.": "%(targetName)s přijal/a pozvání.", "Account": "Účet", "Access Token:": "Přístupový žeton:", "Add": "Přidat", @@ -100,10 +99,6 @@ "Can't load user settings": "Nelze načíst uživatelské nastavení", "Cannot add any more widgets": "Nelze přidat žádné další widgety", "Change Password": "Změnit heslo", - "%(senderName)s changed their profile picture.": "%(senderName)s změnil/a svůj profilový obrázek.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s změnil/a název místnosti na %(roomName)s.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s odstranil/a název místnosti.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s změnil/a téma na „%(topic)s“.", "Changes to who can read history will only apply to future messages in this room": "Změny viditelnosti historie budou platné až pro budoucí zprávy v této místnosti", "Changes your display nickname": "Změní vaši zobrazovanou přezdívku", "Changes colour scheme of current room": "Změní barevné schéma aktuální místnosti", @@ -165,7 +160,6 @@ "Encrypted room": "Zašifrovaná místnost", "Encryption is enabled in this room": "V této místnosti je zapnuto šifrování", "Encryption is not enabled in this room": "V této místnosti není zapnuto šifrování", - "%(senderName)s ended the call.": "%(senderName)s ukončil/a hovor.", "End-to-end encryption information": "Informace o end-to-end šifrování", "End-to-end encryption is in beta and may not be reliable": "End-to-end šifrování je v raném vývoji a nemusí být spolehlivé", "Enter Code": "Zadejte kód", @@ -198,12 +192,8 @@ "For security, this session has been signed out. Please sign in again.": "Z bezpečnostních důvodů bylo toto přihlášení ukončeno. Přihlašte se prosím znovu.", "%(names)s and %(lastPerson)s are typing": "%(names)s a %(lastPerson)s píší", "and %(count)s others...|other": "a %(count)s další...", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget upravil/a %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget odstranil/a %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget přidal/a %(senderName)s", "Automatically replace plain text Emoji": "Automaticky nahrazovat textové emodži", "Failed to upload image": "Obrázek se nepodařilo nahrát", - "%(senderName)s answered the call.": "%(senderName)s přijal/a hovor.", "Click to mute audio": "Kliknutím ztlumíte zvuk", "Failed to verify email address: make sure you clicked the link in the email": "E-mailovou adresu se nepodařilo ověřit. Přesvědčte se, že jste kliknul/a na zaslaný odkaz", "Guest access is disabled on this Home Server.": "Na tomto domovském serveru je hostům vstup odepřen.", @@ -223,15 +213,12 @@ "Invalid alias format": "Neplaný formát aliasu", "Invalid address format": "Neplatný formát adresy", "Invalid Email Address": "Neplatná e-mailová adresa", - "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval/a %(targetName)s.", "Invite new room members": "Pozvat do místnosti nové členy", "Invites": "Pozvánky", "Invites user with given id to current room": "Pozve do aktuální místnosti uživatele s daným id", "'%(alias)s' is not a valid format for an address": "'%(alias)s' není platný formát adresy", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' není platný formát aliasu", "Join Room": "Vstoupit do místnosti", - "%(targetName)s joined the room.": "%(targetName)s vstoupil/a do místnosti.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s vykopnul/a %(targetName)s.", "Kick": "Vykopnout", "Kicks user with given id": "Vykopne uživatele s daným id", "Last seen": "Naposledy viděn/a", @@ -266,7 +253,6 @@ "Passwords can't be empty": "Hesla nemohou být prázdná", "Permissions": "Oprávnění", "Phone": "Telefon", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s změnil/a úroveň moci o %(powerLevelDiffText)s.", "Define the power level of a user": "Stanovte úroveň moci uživatele", "Failed to change power level": "Nepodařilo se změnit úroveň moci", "Power level must be positive integer.": "Úroveň moci musí být kladné celé číslo.", @@ -290,7 +276,6 @@ "Sender device information": "Informace o odesilatelově zařízení", "Send Reset Email": "Poslat resetovací e-mail", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s poslal/a obrázek.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s poslal/a %(targetDisplayName)s pozvánku ke vstupu do místnosti.", "Server error": "Chyba serveru", "Server may be unavailable or overloaded": "Server může být nedostupný nebo přetížený", "Server may be unavailable, overloaded, or search timed out :(": "Server může být nedostupný, přetížený nebo vyhledávání vypršelo :(", @@ -298,8 +283,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Server může být nedostupný, přetížený nebo jste narazili na chybu.", "Server unavailable, overloaded, or something else went wrong.": "Server je nedostupný, přetížený nebo se pokazilo něco jiného.", "Session ID": "ID sezení", - "%(senderName)s set a profile picture.": "%(senderName)s si nastavil/a profilový obrázek.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s si změnil/a zobrazované jméno na %(displayName)s.", "Sets the room topic": "Nastavuje téma místnosti", "Show panel": "Zobrazit panel", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Zobrazovat časové značky v 12hodinovém formátu (např. 2:30 odp.)", @@ -349,9 +332,7 @@ "Start chatting": "Zahájit rozhovor", "Start Chatting": "Začít chatovat", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Textová zpráva byla odeslána na +%(msisdn)s. Prosím vložte ověřovací kód z dané zprávy", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s přijal/a pozvánku pro %(displayName)s.", "Active call (%(roomName)s)": "Probíhající hovor (%(roomName)s)", - "%(senderName)s banned %(targetName)s.": "%(senderName)s vykázal/a %(targetName)s.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nelze se připojit k domovskému serveru přes HTTP, pokud je v adresním řádku HTTPS. Buď použijte HTTPS, nebo <a>povolte nebezpečné scripty</a>.", "Click here to fix": "Klikněte zde pro opravu", "Click to mute video": "Klikněte pro zakázání videa", @@ -363,7 +344,6 @@ "Do you want to load widget from URL:": "Chcete načíst widget z URL:", "Ed25519 fingerprint": "Ed25519 otisk", "Fill screen": "Vyplnit obrazovku", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s", "This doesn't appear to be a valid email address": "Tato e-mailová adresa se zdá být neplatná", "This is a preview of this room. Room interactions have been disabled": "Toto je náhled místnosti. Interakce byly zakázány", "This phone number is already in use": "Toto číslo se již používá", @@ -375,14 +355,12 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Zpráva v daném časovém úseku nenalezena.", "Turn Markdown off": "Vypnout Markdown", "Turn Markdown on": "Zapnout Markdown", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s zapnul/a end-to-end šifrování (algoritmus %(algorithm)s).", "Unable to add email address": "Nepodařilo se přidat e-mailovou adresu", "Unable to create widget.": "Nepodařilo se vytvořit widget.", "Unable to remove contact information": "Nepodařilo se smazat kontaktní údaje", "Unable to verify email address.": "Nepodařilo se ověřit e-mailovou adresu.", "Unban": "Přijmout zpět", "Unbans user with given id": "Přijme zpět uživatele s daným id", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s přijal/a zpět %(targetName)s.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Nepodařilo se prokázat, že adresa, na kterou byla tato pozvánka odeslána, se shoduje s adresou přidruženou k vašemu účtu.", "Unable to capture screen": "Nepodařilo se zachytit obrazovku", "Unable to enable Notifications": "Nepodařilo se povolit upozornění", @@ -456,11 +434,7 @@ "Reason": "Důvod", "VoIP conference started.": "VoIP konference započata.", "VoIP conference finished.": "VoIP konference ukončena.", - "%(targetName)s left the room.": "%(targetName)s opustil/a místnost.", "You are already in a call.": "Již máte probíhající hovor.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s požádal/a o VoIP konferenci.", - "%(senderName)s removed their profile picture.": "%(senderName)s odstranil/a svůj profilový obrázek.", - "%(targetName)s rejected the invitation.": "%(targetName)s odmítl/a pozvání.", "Communities": "Skupiny", "Message Pinning": "Připíchnutí zprávy", "Your browser does not support the required cryptography extensions": "Váš prohlížeč nepodporuje požadovaná kryptografická rozšíření", @@ -480,21 +454,12 @@ "numbullet": "číselný seznam", "No pinned messages.": "Žádné připíchnuté zprávy.", "Pinned Messages": "Připíchnuté zprávy", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s odstranil/a svoje zobrazované jméno (%(oldDisplayName)s).", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s odvolal/a pozvánku pro %(targetName)s.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich pozvání.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich vstupu do místnosti.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou všem členům.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou komukoliv.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s změnil/a připíchnuté zprávy této místnosti.", "%(names)s and %(count)s others are typing|other": "%(names)s a %(count)s další píší", "Authentication check failed: incorrect password?": "Kontrola ověření selhala: špatné heslo?", "You need to be able to invite users to do that.": "Pro tuto akci musíte mít právo zvát uživatele.", "Delete Widget": "Smazat widget", "Error decrypting image": "Chyba při dešifrování obrázku", "Error decrypting video": "Chyba při dešifrování videa", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstranil/a avatar místnosti.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s změnil/a avatar místnosti na <img/>", "Copied!": "Zkopírováno!", "Failed to copy": "Nepodařilo se zkopírovat", "Removed or unknown message type": "Zpráva odstraněna nebo neznámého typu", @@ -614,7 +579,6 @@ "You have <a>disabled</a> URL previews by default.": "<a>Vypnul/a</a> jste automatické náhledy webových adres.", "You have <a>enabled</a> URL previews by default.": "<a>Zapnul/a</a> jste automatické náhledy webových adres.", "URL Previews": "Náhledy webových adres", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s změnil/a avatar místnosti %(roomName)s", "Add an Integration": "Přidat začlenění", "Message removed": "Zpráva odstraněna", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Ochrana před roboty není aktuálně na desktopu dostupná. Použijte prosím <a>webový prohlížeč</a>", @@ -634,8 +598,6 @@ "Missing room_id in request": "V zadání chybí room_id", "Missing user_id in request": "V zadání chybí user_id", "(could not connect media)": "(média se nepodařilo spojit)", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s uskutečnil %(callType)s hovor.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s zpřístupnil budoucí historii místnosti neznámým (%(visibility)s).", "Not a valid Riot keyfile": "Neplatný soubor s klíčem Riot", "Disable Emoji suggestions while typing": "Zakázat návrhy Emoji během psaní", "Hide avatar changes": "Skrýt změny avatara", @@ -1076,5 +1038,43 @@ "Collapse panel": "Sbalit panel", "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!": "Vzhled a chování aplikace může být ve vašem aktuální prohlížeči nesprávné a některé nebo všechny funkce mohou být chybné. Chcete-li i přes to pokračovat, nebudeme vám bránit, ale se všemi problémy, na které narazíte, si musíte poradit sami!", "Checking for an update...": "Kontrola aktualizací...", - "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena" + "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena", + "<target> accepted the invitation for %(displayName)s.": "<target> přijal/a pozvánku pro %(displayName)s.", + "<target> accepted an invitation.": "<target> přijal/a pozvání.", + "<sender> requested a VoIP conference.": "<sender> požádal/a o VoIP konferenci.", + "<sender> invited <target>.": "<sender> pozval/a <target>.", + "<sender> banned <target>.": "<sender> vykázal/a <target>.", + "<sender> set their display name to <displayName>.": "<sender> si změnil/a zobrazované jméno na <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> odstranil/a svoje zobrazované jméno (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> odstranil/a svůj profilový obrázek.", + "<sender> changed their profile picture.": "<sender> změnil/a svůj profilový obrázek.", + "<sender> set a profile picture.": "<sender> si nastavil/a profilový obrázek.", + "<target> joined the room.": "<target> vstoupil/a do místnosti.", + "<target> rejected the invitation.": "<target> odmítl/a pozvání.", + "<target> left the room.": "<target> opustil/a místnost.", + "<sender> unbanned <target>.": "<sender> přijal/a zpět <target>.", + "<sender> kicked <target>.": "<sender> vykopnul/a <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> odvolal/a pozvánku pro <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> změnil/a téma na „%(topic)s“.", + "<sender> changed the room name to %(roomName)s.": "<sender> změnil/a název místnosti na %(roomName)s.", + "<sender> changed the room avatar to <img/>": "<sender> změnil/a avatar místnosti na <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> změnil/a avatar místnosti %(roomName)s", + "<sender> removed the room name.": "<sender> odstranil/a název místnosti.", + "<sender> removed the room avatar.": "<sender> odstranil/a avatar místnosti.", + "<sender> answered the call.": "<sender> přijal/a hovor.", + "<sender> ended the call.": "<sender> ukončil/a hovor.", + "<sender> placed a %(callType)s call.": "<sender> uskutečnil %(callType)s hovor.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> poslal/a %(targetDisplayName)s pozvánku ke vstupu do místnosti.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich pozvání.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich vstupu do místnosti.", + "<sender> made future room history visible to all room members.": "<sender> učinil/a budoucí historii místnosti viditelnou všem členům.", + "<sender> made future room history visible to anyone.": "<sender> učinil/a budoucí historii místnosti viditelnou komukoliv.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> zpřístupnil budoucí historii místnosti neznámým (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> zapnul/a end-to-end šifrování (algoritmus %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> z %(fromPowerLevel)s na %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> změnil/a úroveň moci o %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> změnil/a připíchnuté zprávy této místnosti.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s widget upravil/a <sender>", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s widget odstranil/a <sender>", + "%(widgetName)s widget added by <sender>": "%(widgetName)s widget přidal/a <sender>" } diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index e90de5edfc..9f2e3f5b59 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -87,10 +87,7 @@ "Remove": "Fjern", "Settings": "Indstillinger", "unknown error code": "Ukendt fejlkode", - "%(targetName)s accepted an invitation.": "%(targetName)s accepterede en invitation.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepterede invitationen til %(displayName)s.", "%(names)s and %(lastPerson)s are typing": "%(names)s og %(lastPerson)s er ved at skrive", - "%(senderName)s answered the call.": "%(senderName)s besvarede opkaldet.", "Add a widget": "Tilføj en widget", "OK": "OK", "Search": "Søg", @@ -211,34 +208,14 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signaturnøglen du oplste passer med nøglen fra %(userId)ss enhed %(deviceId)s. Enheden er markeret som verificeret.", "Unrecognised command:": "Ukendt kommando:", "Reason": "Årsag", - "%(senderName)s requested a VoIP conference.": "%(senderName)s forespurgte en VoIP konference.", - "%(senderName)s invited %(targetName)s.": "%(senderName)s inviterede %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s bannede %(targetName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s satte deres viste navn til %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s fjernede deres viste navn (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s fjernede deres profilbillede.", - "%(senderName)s changed their profile picture.": "%(senderName)s ændrede deres profilbillede.", - "%(senderName)s set a profile picture.": "%(senderName)s indstillede deres profilbillede.", "VoIP conference started.": "VoIP konference startet.", - "%(targetName)s joined the room.": "%(targetName)s forbandt til rummet.", "VoIP conference finished.": "VoIP konference afsluttet.", - "%(targetName)s rejected the invitation.": "%(targetName)s afviste invitationen.", - "%(targetName)s left the room.": "%(targetName)s forlod rummet.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbannede %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s kickede %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s trak %(targetName)ss invitation tilbage.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ændrede emnet til \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s fjernede rumnavnet.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ændrede rumnavnet til %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendte et billed.", "Someone": "Nogen", "(not supported by this browser)": "(Ikke understøttet af denne browser)", "(could not connect media)": "(kunne ikke forbinde til mediet)", "(no answer)": "(intet svar)", "(unknown failure: %(reason)s)": "(ukendt fejl: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s afsluttede opkaldet.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s startede et %(callType)s opkald.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterede %(targetDisplayName)s til rummet.", "Submit debug logs": "Indsend debug-logfiler", "Online": "Online", "Fetching third party location failed": "Hentning af tredjeparts placering mislykkedes", @@ -397,5 +374,28 @@ "View Community": "Vis community", "%(count)s Members|one": "%(count)s medlem", "Notes:": "Noter:", - "Preparing to send logs": "Forbereder afsendelse af logfiler" + "Preparing to send logs": "Forbereder afsendelse af logfiler", + "<target> accepted the invitation for %(displayName)s.": "<target> accepterede invitationen til %(displayName)s.", + "<target> accepted an invitation.": "<target> accepterede en invitation.", + "<sender> requested a VoIP conference.": "<sender> forespurgte en VoIP konference.", + "<sender> invited <target>.": "<sender> inviterede <target>.", + "<sender> banned <target>.": "<sender> bannede <target>.", + "<sender> set their display name to <displayName>.": "<sender> satte deres viste navn til <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> fjernede deres viste navn (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> fjernede deres profilbillede.", + "<sender> changed their profile picture.": "<sender> ændrede deres profilbillede.", + "<sender> set a profile picture.": "<sender> indstillede deres profilbillede.", + "<target> joined the room.": "<target> forbandt til rummet.", + "<target> rejected the invitation.": "<target> afviste invitationen.", + "<target> left the room.": "<target> forlod rummet.", + "<sender> unbanned <target>.": "<sender> unbannede <target>.", + "<sender> kicked <target>.": "<sender> kickede <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> trak <target>s invitation tilbage.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> ændrede emnet til \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> ændrede rumnavnet til %(roomName)s.", + "<sender> removed the room name.": "<sender> fjernede rumnavnet.", + "<sender> answered the call.": "<sender> besvarede opkaldet.", + "<sender> ended the call.": "<sender> afsluttede opkaldet.", + "<sender> placed a %(callType)s call.": "<sender> startede et %(callType)s opkald.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> inviterede %(targetDisplayName)s til rummet." } diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9b1c5acb8d..72d6570ec9 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -239,51 +239,21 @@ "Share message history with new users": "Bisherigen Chatverlauf mit neuen Nutzern teilen", "Encrypt room": "Raum verschlüsseln", "%(names)s and %(lastPerson)s are typing": "%(names)s und %(lastPerson)s schreiben", - "%(targetName)s accepted an invitation.": "%(targetName)s hat eine Einladung angenommen.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s hat die Einladung für %(displayName)s akzeptiert.", - "%(senderName)s answered the call.": "%(senderName)s hat den Anruf angenommen.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s hat %(targetName)s verbannt.", - "%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".", "/ddg is not a command": "/ddg ist kein Kommando", - "%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.", "Failed to send request.": "Anfrage konnte nicht gesendet werden.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s hat %(targetName)s eingeladen.", "%(displayName)s is typing": "%(displayName)s schreibt", - "%(targetName)s joined the room.": "%(targetName)s hat den Raum betreten.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s hat %(targetName)s gekickt.", - "%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden).", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für: Alle Raum-Mitglieder.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Alle.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).", "Missing room_id in request": "Fehlende room_id in Anfrage", "Missing user_id in request": "Fehlende user_id in Anfrage", "(not supported by this browser)": "(wird von diesem Browser nicht unterstützt)", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s startete einen %(callType)s-Anruf.", "Power level must be positive integer.": "Berechtigungslevel muss eine positive ganze Zahl sein.", "Reason": "Grund", - "%(targetName)s rejected the invitation.": "%(targetName)s hat die Einladung abgelehnt.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s hat den Anzeigenamen entfernt (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s hat das Profilbild gelöscht.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s möchte eine VoIP-Konferenz beginnen.", "Room %(roomId)s not visible": "Raum %(roomId)s ist nicht sichtbar", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s hat ein Bild gesendet.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s hat %(targetDisplayName)s in diesen Raum eingeladen.", - "%(senderName)s set a profile picture.": "%(senderName)s hat ein Profilbild gesetzt.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s hat den Anzeigenamen geändert in %(displayName)s.", "This room is not recognised.": "Dieser Raum wurde nicht erkannt.", "These are experimental features that may break in unexpected ways": "Dies sind experimentelle Funktionen, die in unerwarteter Weise Fehler verursachen können", "To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Autovervollständigungsergebnisse und benutze dann die TAB-Taste zum durchblättern.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s hat die Ende-zu-Ende-Verschlüsselung aktiviert (Algorithmus: %(algorithm)s).", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s hat die Verbannung von %(targetName)s aufgehoben.", "Usage": "Verwendung", "Use with caution": "Mit Vorsicht zu verwenden", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen.", "You need to be able to invite users to do that.": "Du musst die Berechtigung haben, Benutzer einzuladen, um diese Aktion ausführen zu können.", "You need to be logged in.": "Du musst angemeldet sein.", "There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum", @@ -406,7 +376,6 @@ "Invalid file%(extra)s": "Ungültige Datei%(extra)s", "Remove %(threePid)s?": "%(threePid)s entfernen?", "Please select the destination room for this message": "Bitte den Raum auswählen, an den diese Nachricht gesendet werden soll", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s hat den Raum-Namen entfernt.", "Passphrases must match": "Passphrases müssen übereinstimmen", "Passphrase must not be empty": "Passphrase darf nicht leer sein", "Export room keys": "Raum-Schlüssel exportieren", @@ -486,7 +455,6 @@ "Jump to first unread message.": "Zur ersten ungelesenen Nachricht springen.", "Options": "Optionen", "Invited": "Eingeladen", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s hat das Raum-Bild entfernt.", "VoIP": "VoIP", "No Webcams detected": "Keine Webcam erkannt", "Missing Media Permissions, click here to request.": "Fehlende Medienberechtigungen. Hier klicken, um Berechtigungen zu beantragen.", @@ -528,8 +496,6 @@ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signatur-Schlüssel für %(userId)s und das Gerät %(deviceId)s ist \"%(fprint)s\", welcher nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Dies kann bedeuten, dass deine Kommunikation abgehört wird!", "You have <a>disabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>deaktiviert</a>.", "You have <a>enabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>aktiviert</a>.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s hat das Raum-Bild geändert zu <img/>", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s hat das Raum-Bild für %(roomName)s geändert", "Hide removed messages": "Gelöschte Nachrichten verbergen", "Start new chat": "Neuen Chat starten", "Add": "Hinzufügen", @@ -664,10 +630,7 @@ "Do you want to load widget from URL:": "Möchtest du das Widget von folgender URL laden:", "Integrations Error": "Integrations-Error", "NOTE: Apps are not end-to-end encrypted": "BEACHTE: Apps sind nicht Ende-zu-Ende-verschlüsselt", - "%(widgetName)s widget added by %(senderName)s": "%(senderName)s hat das Widget %(widgetName)s hinzugefügt", - "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s hat das Widget %(widgetName)s entfernt", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "In der Desktop-Version kann derzeit nicht geprüft werden, ob ein Benutzer ein Roboter ist. Bitte einen <a>Webbrowser</a> verwenden", - "%(widgetName)s widget modified by %(senderName)s": "Das Widget '%(widgetName)s' wurde von %(senderName)s bearbeitet", "Copied!": "Kopiert!", "Failed to copy": "Kopieren fehlgeschlagen", "Ignored Users": "Ignorierte Benutzer", @@ -734,7 +697,6 @@ "Remove avatar": "Profilbild entfernen", "Disable big emoji in chat": "Große Emojis im Chat deaktiveren", "Pinned Messages": "Angeheftete Nachrichten", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s hat die angehefteten Nachrichten für diesen Raum geändert.", "Jump to read receipt": "Zur Lesebestätigung springen", "Message Pinning": "Anheften von Nachrichten", "Long Description (HTML)": "Lange Beschreibung (HTML)", @@ -955,7 +917,6 @@ "Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn es der Fall ist", "<a>In reply to</a> <pill>": "<a>Antwort zu</a> <pill>", "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.", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s änderte den Anzeigenamen auf %(displayName)s.", "Failed to set direct chat tag": "Fehler beim Setzen der Direkt-Chat-Markierung", "Failed to remove tag %(tagName)s from room": "Fehler beim Entfernen des \"%(tagName)s\"-Tags von dem Raum", "Failed to add tag %(tagName)s to room": "Fehler beim Hinzufügen des \"%(tagName)s\"-Tags an dem Raum", @@ -1195,5 +1156,44 @@ "Share Message": "Teile Nachricht", "No Audio Outputs detected": "Keine Ton-Ausgabe erkannt", "Audio Output": "Ton-Ausgabe", - "Try the app first": "App erst ausprobieren" + "Try the app first": "App erst ausprobieren", + "<target> accepted the invitation for %(displayName)s.": "<target> hat die Einladung für %(displayName)s akzeptiert.", + "<target> accepted an invitation.": "<target> hat eine Einladung angenommen.", + "<sender> requested a VoIP conference.": "<sender> möchte eine VoIP-Konferenz beginnen.", + "<sender> invited <target>.": "<sender> hat <target> eingeladen.", + "<sender> banned <target>.": "<sender> hat <target> verbannt.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> änderte den Anzeigenamen auf <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> hat den Anzeigenamen geändert in <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> hat den Anzeigenamen entfernt (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> hat das Profilbild gelöscht.", + "<sender> changed their profile picture.": "<sender> hat das Profilbild geändert.", + "<sender> set a profile picture.": "<sender> hat ein Profilbild gesetzt.", + "<target> joined the room.": "<target> hat den Raum betreten.", + "<target> rejected the invitation.": "<target> hat die Einladung abgelehnt.", + "<target> left the room.": "<target> hat den Raum verlassen.", + "<sender> unbanned <target>.": "<sender> hat die Verbannung von <target> aufgehoben.", + "<sender> kicked <target>.": "<sender> hat <target> gekickt.", + "<sender> withdrew <target>'s invitation.": "<sender> hat die Einladung für <target> zurückgezogen.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> hat das Thema geändert in \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> hat den Raumnamen geändert zu %(roomName)s.", + "<sender> changed the room avatar to <img/>": "<sender> hat das Raum-Bild geändert zu <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> hat das Raum-Bild für %(roomName)s geändert", + "<sender> removed the room name.": "<sender> hat den Raum-Namen entfernt.", + "<sender> removed the room avatar.": "<sender> hat das Raum-Bild entfernt.", + "<sender> answered the call.": "<sender> hat den Anruf angenommen.", + "<sender> ended the call.": "<sender> hat den Anruf beendet.", + "<sender> placed a %(callType)s call.": "<sender> startete einen %(callType)s-Anruf.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> hat %(targetDisplayName)s in diesen Raum eingeladen.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden).", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).", + "<sender> made future room history visible to all room members.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für: Alle Raum-Mitglieder.", + "<sender> made future room history visible to anyone.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für Alle.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> hat die Ende-zu-Ende-Verschlüsselung aktiviert (Algorithmus: %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> von %(fromPowerLevel)s zu %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", + "<sender> changed the pinned messages for the room.": "<sender> hat die angehefteten Nachrichten für diesen Raum geändert.", + "%(widgetName)s widget modified by <sender>": "Das Widget '%(widgetName)s' wurde von <sender> bearbeitet", + "%(widgetName)s widget added by <sender>": "<sender> hat das Widget %(widgetName)s hinzugefügt", + "%(widgetName)s widget removed by <sender>": "<sender> hat das Widget %(widgetName)s entfernt" } diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index c4514f629b..1bc4972dac 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -8,8 +8,6 @@ "Search": "Αναζήτηση", "Settings": "Ρυθμίσεις", "unknown error code": "άγνωστος κωδικός σφάλματος", - "%(targetName)s accepted an invitation.": "%(targetName)s δέχτηκε την πρόσκληση.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s δέχτηκες την πρόσκληση για %(displayName)s.", "Account": "Λογαριασμός", "Add a topic": "Προσθήκη θέματος", "Add email address": "Προσθήκη διεύθυνσης ηλ. αλληλογραφίας", @@ -26,7 +24,6 @@ "Hide removed messages": "Απόκρυψη διαγραμμένων μηνυμάτων", "Authentication": "Πιστοποίηση", "A new password must be entered.": "Ο νέος κωδικός πρόσβασης πρέπει να εισαχθεί.", - "%(senderName)s answered the call.": "Ο χρήστης %(senderName)s απάντησε την κλήση.", "An error has occurred.": "Παρουσιάστηκε ένα σφάλμα.", "Anyone": "Oποιοσδήποτε", "Are you sure?": "Είστε σίγουροι;", @@ -34,7 +31,6 @@ "Are you sure you want to reject the invitation?": "Είστε σίγουροι ότι θέλετε να απορρίψετε την πρόσκληση;", "Are you sure you want to upload the following files?": "Είστε σίγουροι ότι θέλετε να αποστείλετε τα ακόλουθα αρχεία;", "Attachment": "Επισύναψη", - "%(senderName)s banned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "Autoplay GIFs and videos": "Αυτόματη αναπαραγωγή GIFs και βίντεο", "Anyone who knows the room's link, apart from guests": "Oποιοσδήποτε", "%(items)s and %(lastItem)s": "%(items)s %(lastItem)s", @@ -48,13 +44,9 @@ "Blacklisted": "Στη μαύρη λίστα", "Can't load user settings": "Δεν είναι δυνατή η φόρτωση των ρυθμίσεων χρήστη", "Change Password": "Αλλαγή κωδικού πρόσβασης", - "%(senderName)s changed their profile picture.": "Ο %(senderName)s άλλαξε τη φωτογραφία του προφίλ του.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "Ο %(senderDisplayName)s άλλαξε το όνομα του δωματίου σε %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "Ο %(senderDisplayName)s άλλαξε το θέμα σε \"%(topic)s\".", "Clear Cache and Reload": "Εκκαθάριση μνήμης και ανανέωση", "Clear Cache": "Εκκαθάριση μνήμης", "Bans user with given id": "Αποκλεισμός χρήστη με το συγκεκριμένο αναγνωριστικό", - "%(senderDisplayName)s removed the room name.": "Ο %(senderDisplayName)s διέγραψε το όνομα του δωματίου.", "Changes your display nickname": "Αλλάζει το ψευδώνυμο χρήστη", "Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.", "powered by Matrix": "βασισμένο στο Matrix", @@ -92,7 +84,6 @@ "Emoji": "Εικονίδια", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Τα κρυπτογραφημένα μηνύματα δεν θα είναι ορατά σε εφαρμογές που δεν παρέχουν τη δυνατότητα κρυπτογράφησης", "Encrypted room": "Κρυπτογραφημένο δωμάτιο", - "%(senderName)s ended the call.": "%(senderName)s τερμάτισε την κλήση.", "End-to-end encryption information": "Πληροφορίες σχετικά με τη κρυπτογράφηση από άκρο σε άκρο (End-to-end encryption)", "Error decrypting attachment": "Σφάλμα κατά την αποκρυπτογράφηση της επισύναψης", "Event information": "Πληροφορίες συμβάντος", @@ -132,14 +123,11 @@ "Invites": "Προσκλήσεις", "%(displayName)s is typing": "Ο χρήστης %(displayName)s γράφει", "Sign in with": "Συνδεθείτε με", - "%(targetName)s joined the room.": "ο %(targetName)s συνδέθηκε στο δωμάτιο.", "Jump to first unread message.": "Πηγαίνετε στο πρώτο μη αναγνωσμένο μήνυμα.", - "%(senderName)s kicked %(targetName)s.": "Ο %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "Kick": "Απομάκρυνση", "Kicks user with given id": "Διώχνει χρήστες με το συγκεκριμένο id", "Labs": "Πειραματικά", "Leave room": "Αποχώρηση από το δωμάτιο", - "%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.", "Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:", "Logged in as:": "Συνδεθήκατε ως:", "Logout": "Αποσύνδεση", @@ -254,7 +242,6 @@ "Reason": "Αιτία", "Reason: %(reasonText)s": "Αιτία: %(reasonText)s", "Revoke Moderator": "Ανάκληση συντονιστή", - "%(targetName)s rejected the invitation.": "Ο %(targetName)s απέρριψε την πρόσκληση.", "Reject invitation": "Απόρριψη πρόσκλησης", "Remote addresses for this room:": "Απομακρυσμένες διευθύνσεις για το δωμάτιο:", "Remove Contact Information?": "Αφαίρεση πληροφοριών επαφής;", @@ -271,7 +258,6 @@ "%(senderDisplayName)s sent an image.": "Ο %(senderDisplayName)s έστειλε μια φωτογραφία.", "Server may be unavailable or overloaded": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος ή υπερφορτωμένος", "Session ID": "Αναγνωριστικό συνεδρίας", - "%(senderName)s set a profile picture.": "Ο %(senderName)s όρισε τη φωτογραφία του προφίλ του.", "Start authentication": "Έναρξη πιστοποίησης", "Submit": "Υποβολή", "Tagged as: ": "Με ετικέτα: ", @@ -289,7 +275,6 @@ "Unable to remove contact information": "Αδυναμία αφαίρεσης πληροφοριών επαφής", "Unable to verify email address.": "Αδυναμία επιβεβαίωσης διεύθυνσης ηλεκτρονικής αλληλογραφίας.", "Unban": "Άρση αποκλεισμού", - "%(senderName)s unbanned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "Unable to enable Notifications": "Αδυναμία ενεργοποίησης των ειδοποιήσεων", "Unable to load device list": "Αδυναμία φόρτωσης της λίστας συσκευών", "Unencrypted room": "Μη κρυπτογραφημένο δωμάτιο", @@ -410,8 +395,6 @@ "Start chatting": "Έναρξη συνομιλίας", "Start Chatting": "Έναρξη συνομιλίας", "Click on the button below to start chatting!": "Κάντε κλικ στο κουμπί παρακάτω για να ξεκινήσετε μια συνομιλία!", - "%(senderDisplayName)s removed the room avatar.": "Ο %(senderDisplayName)s διέγραψε την προσωπική εικόνα του δωματίου.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "Ο %(senderDisplayName)s άλλαξε την προσωπική εικόνα του %(roomName)s", "Username available": "Διαθέσιμο όνομα χρήστη", "Username not available": "Μη διαθέσιμο όνομα χρήστη", "Something went wrong!": "Κάτι πήγε στραβά!", @@ -425,7 +408,6 @@ "Failed to change power level": "Δεν ήταν δυνατή η αλλαγή του επιπέδου δύναμης", "Failed to fetch avatar URL": "Δεν ήταν δυνατή η ανάκτηση της διεύθυνσης εικόνας", "Failed to unban": "Δεν ήταν δυνατή η άρση του αποκλεισμού", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s από %(fromPowerLevel)s σε %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Έχει απενεργοποιηθεί η πρόσβαση στους επισκέπτες σε αυτόν τον διακομιστή.", "Guests cannot join this room even if explicitly invited.": "Οι επισκέπτες δεν μπορούν να συνδεθούν στο δωμάτιο ακόμη και αν έχουν καλεστεί.", "Hide Text Formatting Toolbar": "Απόκρυψη εργαλειοθήκης μορφοποίησης κειμένου", @@ -435,15 +417,9 @@ "Invalid alias format": "Μη έγκυρη μορφή ψευδώνυμου", "Invalid address format": "Μη έγκυρη μορφή διεύθυνσης", "Invalid file%(extra)s": "Μη έγκυρο αρχείο %(extra)s", - "%(senderName)s invited %(targetName)s.": "Ο %(senderName)s προσκάλεσε τον %(targetName)s.", "Invites user with given id to current room": "Προσκαλεί τον χρήστη με το δοσμένο αναγνωριστικό στο τρέχον δωμάτιο", "'%(alias)s' is not a valid format for an address": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή διεύθυνσης", "'%(alias)s' is not a valid format for an alias": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή ψευδώνυμου", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που προσκλήθηκαν.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που συνδέθηκαν.", - "%(senderName)s made future room history visible to all room members.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη.", - "%(senderName)s made future room history visible to anyone.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο οποιοσδήποτε.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο άγνωστο (%(visibility)s).", "Missing user_id in request": "Λείπει το user_id στο αίτημα", "Mobile phone number (optional)": "Αριθμός κινητού τηλεφώνου (προαιρετικό)", "Never send encrypted messages to unverified devices from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές από αυτή τη συσκευή", @@ -456,12 +432,9 @@ "No users have specific privileges in this room": "Κανένας χρήστης δεν έχει συγκεκριμένα δικαιώματα σε αυτό το δωμάτιο", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Μόλις ενεργοποιηθεί η κρυπτογράφηση για ένα δωμάτιο, δεν μπορεί να απενεργοποιηθεί ξανά (για τώρα)", "Only people who have been invited": "Μόνο άτομα που έχουν προσκληθεί", - "%(senderName)s placed a %(callType)s call.": "Ο %(senderName)s πραγματοποίησε μια %(callType)s κλήση.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία και κάντε κλικ στον σύνδεσμο που περιέχει. Μόλις γίνει αυτό, κάντε κλίκ στο κουμπί συνέχεια.", "Refer a friend to Riot:": "Πείτε για το Riot σε έναν φίλο σας:", "Rejoin": "Επανασύνδεση", - "%(senderName)s removed their profile picture.": "Ο %(senderName)s αφαίρεσε τη φωτογραφία του προφίλ του.", - "%(senderName)s requested a VoIP conference.": "Ο %(senderName)s αιτήθηκε μια συνδιάσκεψη VoIP.", "Riot does not have permission to send you notifications - please check your browser settings": "Το Riot δεν έχει δικαιώματα για αποστολή ειδοποιήσεων - παρακαλούμε ελέγξτε τις ρυθμίσεις του περιηγητή σας", "Riot was not given permission to send notifications - please try again": "Δεν δόθηκαν δικαιώματα αποστολής ειδοποιήσεων στο Riot - παρακαλούμε προσπαθήστε ξανά", "Room contains unknown devices": "Το δωμάτιο περιέχει άγνωστες συσκευές", @@ -495,7 +468,6 @@ "Who can access this room?": "Ποιος μπορεί να προσπελάσει αυτό το δωμάτιο;", "Who can read history?": "Ποιος μπορεί να διαβάσει το ιστορικό;", "Who would you like to add to this room?": "Ποιον θέλετε να προσθέσετε σε αυτό το δωμάτιο;", - "%(senderName)s withdrew %(targetName)s's invitation.": "Ο %(senderName)s ανακάλεσε την πρόσκληση του %(targetName)s.", "You cannot place a call with yourself.": "Δεν μπορείτε να καλέσετε τον ευατό σας.", "You cannot place VoIP calls in this browser.": "Δεν μπορείτε να πραγματοποιήσετε κλήσεις VoIP με αυτόν τον περιηγητή.", "You do not have permission to post to this room": "Δεν έχετε δικαιώματα για να δημοσιεύσετε σε αυτό το δωμάτιο", @@ -522,19 +494,14 @@ "You are registering with %(SelectedTeamName)s": "Εγγραφείτε με %(SelectedTeamName)s", "Removed or unknown message type": "Αφαιρέθηκε ή άγνωστος τύπος μηνύματος", " (unsupported)": " (μη υποστηριζόμενο)", - "%(senderDisplayName)s changed the room avatar to <img/>": "Ο %(senderDisplayName)s άλλαξε την εικόνα του δωματίου σε <img/>", "Missing Media Permissions, click here to request.": "Λείπουν τα δικαιώματα πολύμεσων, κάντε κλικ για να ζητήσετε.", "You may need to manually permit Riot to access your microphone/webcam": "Μπορεί να χρειαστεί να ορίσετε χειροκίνητα την πρόσβαση του Riot στο μικρόφωνο/κάμερα", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή - παρακαλούμε ελέγξτε την συνδεσιμότητα, βεβαιωθείτε ότι το <a>πιστοποιητικό SSL</a> του διακομιστή είναι έμπιστο και ότι κάποιο πρόσθετο περιηγητή δεν αποτρέπει τα αιτήματα.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή μέσω HTTP όταν μια διεύθυνση HTTPS βρίσκεται στην μπάρα του περιηγητή. Είτε χρησιμοποιήστε HTTPS ή <a>ενεργοποιήστε τα μη ασφαλή σενάρια εντολών</a>.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Ο %(senderName)s άλλαξε το επίπεδο δύναμης του %(powerLevelDiffText)s.", "Changes to who can read history will only apply to future messages in this room": "Οι αλλαγές που αφορούν την ορατότητα του ιστορικού θα εφαρμοστούν μόνο στα μελλοντικά μηνύματα του δωματίου", "Conference calling is in development and may not be reliable.": "Η κλήση συνδιάσκεψης είναι υπό ανάπτυξη και μπορεί να μην είναι αξιόπιστη.", "Devices will not yet be able to decrypt history from before they joined the room": "Οι συσκευές δεν θα είναι σε θέση να αποκρυπτογραφήσουν το ιστορικό πριν από την είσοδο τους στο δωμάτιο", "End-to-end encryption is in beta and may not be reliable": "Η κρυπτογράφηση από άκρο σε άκρο είναι σε δοκιμαστικό στάδιο και μπορεί να μην είναι αξιόπιστη", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "Ο %(senderName)s αφαίρεσε το όνομα εμφάνισης του (%(oldDisplayName)s).", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "Ο %(senderName)s έστειλε μια πρόσκληση στον %(targetDisplayName)s για να συνδεθεί στο δωμάτιο.", - "%(senderName)s set their display name to %(displayName)s.": "Ο %(senderName)s όρισε το όνομα του σε %(displayName)s.", "The phone number entered looks invalid": "Ο αριθμός που καταχωρίσατε δεν είναι έγκυρος", "The email address linked to your account must be entered.": "Πρέπει να εισηχθεί η διεύθυνση ηλ. αλληλογραφίας που είναι συνδεδεμένη με τον λογαριασμό σας.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Το αρχείο '%(fileName)s' υπερβαίνει το όριο μεγέθους του διακομιστή για αποστολές", @@ -546,7 +513,6 @@ "This is a preview of this room. Room interactions have been disabled": "Αυτή είναι μια προεπισκόπηση του δωματίου. Οι αλληλεπιδράσεις δωματίου έχουν απενεργοποιηθεί", "This room is not accessible by remote Matrix servers": "Αυτό το δωμάτιο δεν είναι προσβάσιμο από απομακρυσμένους διακομιστές Matrix", "To reset your password, enter the email address linked to your account": "Για να επαναφέρετε τον κωδικό πρόσβασης σας, πληκτρολογήστε τη διεύθυνση ηλ. αλληλογραφίας όπου είναι συνδεδεμένη με τον λογαριασμό σας", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Ο %(senderName)s ενεργοποίησε την από άκρο σε άκρο κρυπτογράφηση (algorithm %(algorithm)s).", "Undecryptable": "Μη αποκρυπτογραφημένο", "Uploading %(filename)s and %(count)s others|one": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπα", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Θα θέλατε να <acceptText>δεχθείτε</acceptText> ή να <declineText>απορρίψετε</declineText> την πρόσκληση;", @@ -803,11 +769,6 @@ "You do not have permission to do that in this room.": "Δεν έχετε την άδεια να το κάνετε αυτό σε αυτό το δωμάτιο.", "You are now ignoring %(userId)s": "Τώρα αγνοείτε τον/την %(userId)s", "You are no longer ignoring %(userId)s": "Δεν αγνοείτε πια τον/την %(userId)s", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "Ο/Η %(oldDisplayName)s άλλαξε το εμφανιζόμενο όνομά του/της σε %(displayName)s.", - "%(senderName)s changed the pinned messages for the room.": "Ο/Η %(senderName)s άλλαξε τα καρφιτσωμένα μηνύματα του δωματίου.", - "%(widgetName)s widget modified by %(senderName)s": "Έγινε αλλαγή στο widget %(widgetName)s από τον/την %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "Προστέθηκε το widget %(widgetName)s από τον/την %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Το widget %(widgetName)s αφαιρέθηκε από τον/την %(senderName)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 και άλλος ένας πληκτρολογούν", "Message Pinning": "Καρφίτσωμα Μηνυμάτων", @@ -849,5 +810,44 @@ "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Διαβάστηκε από τον/την %(displayName)s (%(userName)s) στις %(dateTime)s", "Room Notification": "Ειδοποίηση Δωματίου", "Notify the whole room": "Ειδοποιήστε όλο το δωμάτιο", - "Sets the room topic": "Ορίζει το θέμα του δωματίου" + "Sets the room topic": "Ορίζει το θέμα του δωματίου", + "<target> accepted the invitation for %(displayName)s.": "<target> δέχτηκες την πρόσκληση για %(displayName)s.", + "<target> accepted an invitation.": "<target> δέχτηκε την πρόσκληση.", + "<sender> requested a VoIP conference.": "Ο <sender> αιτήθηκε μια συνδιάσκεψη VoIP.", + "<sender> invited <target>.": "Ο <sender> προσκάλεσε τον <target>.", + "<sender> banned <target>.": "Ο χρήστης <sender> έδιωξε τον χρήστη <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "Ο/Η <oldDisplayName> άλλαξε το εμφανιζόμενο όνομά του/της σε <displayName>.", + "<sender> set their display name to <displayName>.": "Ο <sender> όρισε το όνομα του σε <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "Ο <sender> αφαίρεσε το όνομα εμφάνισης του (<oldDisplayName>).", + "<sender> removed their profile picture.": "Ο <sender> αφαίρεσε τη φωτογραφία του προφίλ του.", + "<sender> changed their profile picture.": "Ο <sender> άλλαξε τη φωτογραφία του προφίλ του.", + "<sender> set a profile picture.": "Ο <sender> όρισε τη φωτογραφία του προφίλ του.", + "<target> joined the room.": "ο <target> συνδέθηκε στο δωμάτιο.", + "<target> rejected the invitation.": "Ο <target> απέρριψε την πρόσκληση.", + "<target> left the room.": "Ο χρήστης <target> έφυγε από το δωμάτιο.", + "<sender> unbanned <target>.": "Ο χρήστης <sender> έδιωξε τον χρήστη <target>.", + "<sender> kicked <target>.": "Ο <sender> έδιωξε τον χρήστη <target>.", + "<sender> withdrew <target>'s invitation.": "Ο <sender> ανακάλεσε την πρόσκληση του <target>.", + "<sender> changed the topic to \"%(topic)s\".": "Ο <sender> άλλαξε το θέμα σε \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "Ο <sender> άλλαξε το όνομα του δωματίου σε %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "Ο <sender> άλλαξε την προσωπική εικόνα του %(roomName)s", + "<sender> changed the room avatar to <img/>": "Ο <sender> άλλαξε την εικόνα του δωματίου σε <img/>", + "<sender> removed the room name.": "Ο <sender> διέγραψε το όνομα του δωματίου.", + "<sender> removed the room avatar.": "Ο <sender> διέγραψε την προσωπική εικόνα του δωματίου.", + "<sender> answered the call.": "Ο χρήστης <sender> απάντησε την κλήση.", + "<sender> ended the call.": "<sender> τερμάτισε την κλήση.", + "<sender> placed a %(callType)s call.": "Ο <sender> πραγματοποίησε μια %(callType)s κλήση.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "Ο <sender> έστειλε μια πρόσκληση στον %(targetDisplayName)s για να συνδεθεί στο δωμάτιο.", + "<sender> made future room history visible to all room members, from the point they are invited.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που προσκλήθηκαν.", + "<sender> made future room history visible to all room members, from the point they joined.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που συνδέθηκαν.", + "<sender> made future room history visible to all room members.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη.", + "<sender> made future room history visible to anyone.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο οποιοσδήποτε.", + "<sender> made future room history visible to unknown (%(visibility)s).": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο άγνωστο (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "Ο <sender> ενεργοποίησε την από άκρο σε άκρο κρυπτογράφηση (algorithm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> από %(fromPowerLevel)s σε %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "Ο <sender> άλλαξε το επίπεδο δύναμης του %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "Ο/Η <sender> άλλαξε τα καρφιτσωμένα μηνύματα του δωματίου.", + "%(widgetName)s widget modified by <sender>": "Έγινε αλλαγή στο widget %(widgetName)s από τον/την <sender>", + "%(widgetName)s widget added by <sender>": "Προστέθηκε το widget %(widgetName)s από τον/την <sender>", + "%(widgetName)s widget removed by <sender>": "Το widget %(widgetName)s αφαιρέθηκε από τον/την <sender>" } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 7717d45aa5..969d68082f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -148,50 +148,14 @@ "Displays action": "Displays action", "Unrecognised command:": "Unrecognised command:", "Reason": "Reason", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", - "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", - "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s changed their display name to %(displayName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", - "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", - "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", "VoIP conference started.": "VoIP conference started.", - "%(targetName)s joined the room.": "%(targetName)s joined the room.", "VoIP conference finished.": "VoIP conference finished.", - "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", - "%(targetName)s left the room.": "%(targetName)s left the room.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", "Someone": "Someone", "(not supported by this browser)": "(not supported by this browser)", - "%(senderName)s answered the call.": "%(senderName)s answered the call.", "(could not connect media)": "(could not connect media)", "(no answer)": "(no answer)", "(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s ended the call.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s placed a %(callType)s call.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s made future room history visible to all room members, from the point they are invited.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s made future room history visible to all room members, from the point they joined.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", "%(displayName)s is typing": "%(displayName)s is typing", "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", @@ -591,9 +555,6 @@ "Invalid file%(extra)s": "Invalid file%(extra)s", "Error decrypting image": "Error decrypting image", "Error decrypting video": "Error decrypting video", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s changed the room avatar to <img/>", "Copied!": "Copied!", "Failed to copy": "Failed to copy", "Add an Integration": "Add an Integration", @@ -1206,5 +1167,44 @@ "Import": "Import", "Failed to set direct chat tag": "Failed to set direct chat tag", "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", - "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" + "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room", + "<target> accepted the invitation for %(displayName)s.": "<target> accepted the invitation for %(displayName)s.", + "<target> accepted an invitation.": "<target> accepted an invitation.", + "<sender> requested a VoIP conference.": "<sender> requested a VoIP conference.", + "<sender> invited <target>.": "<sender> invited <target>.", + "<sender> banned <target>.": "<sender> banned <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> changed their display name to <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> set their display name to <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> removed their display name (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> removed their profile picture.", + "<sender> changed their profile picture.": "<sender> changed their profile picture.", + "<sender> set a profile picture.": "<sender> set a profile picture.", + "<target> joined the room.": "<target> joined the room.", + "<target> rejected the invitation.": "<target> rejected the invitation.", + "<target> left the room.": "<target> left the room.", + "<sender> unbanned <target>.": "<sender> unbanned <target>.", + "<sender> kicked <target>.": "<sender> kicked <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> withdrew <target>'s invitation.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> changed the topic to \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> changed the room name to %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> changed the avatar for %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> changed the room avatar to <img/>", + "<sender> removed the room name.": "<sender> removed the room name.", + "<sender> removed the room avatar.": "<sender> removed the room avatar.", + "<sender> answered the call.": "<sender> answered the call.", + "<sender> ended the call.": "<sender> ended the call.", + "<sender> placed a %(callType)s call.": "<sender> placed a %(callType)s call.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> sent an invitation to %(targetDisplayName)s to join the room.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> made future room history visible to all room members, from the point they are invited.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> made future room history visible to all room members, from the point they joined.", + "<sender> made future room history visible to all room members.": "<sender> made future room history visible to all room members.", + "<sender> made future room history visible to anyone.": "<sender> made future room history visible to anyone.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> made future room history visible to unknown (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> from %(fromPowerLevel)s to %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> changed the power level of %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> changed the pinned messages for the room.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s widget modified by <sender>", + "%(widgetName)s widget added by <sender>": "%(widgetName)s widget added by <sender>", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s widget removed by <sender>" } diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index 6f0708f0c2..e1b91cfa81 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -3,8 +3,6 @@ "AM": "AM", "PM": "PM", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains", - "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", "Account": "Account", "Access Token:": "Access Token:", "Add a topic": "Add a topic", @@ -30,7 +28,6 @@ "and %(count)s others...|one": "and one other...", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", "A new password must be entered.": "A new password must be entered.", - "%(senderName)s answered the call.": "%(senderName)s answered the call.", "An error has occurred.": "An error has occurred.", "Anyone": "Anyone", "Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests", @@ -41,7 +38,6 @@ "Are you sure you want to upload the following files?": "Are you sure you want to upload the following files?", "Attachment": "Attachment", "Autoplay GIFs and videos": "Autoplay GIFs and videos", - "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.", "Ban": "Ban", "Banned users": "Banned users", "Bans user with given id": "Bans user with given id", @@ -51,11 +47,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.", "Can't load user settings": "Can't load user settings", "Change Password": "Change Password", - "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room", "Changes your display nickname": "Changes your display nickname", "Changing password will currently reset any end-to-end encryption keys on all devices, 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 devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", @@ -117,7 +108,6 @@ "Enable encryption": "Enable encryption", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Encrypted messages will not be visible on clients that do not yet implement encryption", "Encrypted room": "Encrypted room", - "%(senderName)s ended the call.": "%(senderName)s ended the call.", "End-to-end encryption information": "End-to-end encryption information", "End-to-end encryption is in beta and may not be reliable": "End-to-end encryption is in beta and may not be reliable", "Enter Code": "Enter Code", @@ -157,7 +147,6 @@ "Forgot your password?": "Forgot your password?", "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.", "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "Hangup": "Hangup", @@ -176,7 +165,6 @@ "Invalid address format": "Invalid address format", "Invalid Email Address": "Invalid Email Address", "Invalid file%(extra)s": "Invalid file%(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", "Invite new room members": "Invite new room members", "Invited": "Invited", "Invites": "Invites", @@ -186,10 +174,8 @@ "%(displayName)s is typing": "%(displayName)s is typing", "Sign in with": "Sign in with", "Join Room": "Join Room", - "%(targetName)s joined the room.": "%(targetName)s joined the room.", "Joins room with given alias": "Joins room with given alias", "Jump to first unread message.": "Jump to first unread message.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.", "Kick": "Kick", "Kicks user with given id": "Kicks user with given id", "Labs": "Labs", @@ -204,17 +190,11 @@ "Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward", "Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you", "Leave room": "Leave room", - "%(targetName)s left the room.": "%(targetName)s left the room.", "Publish this room to the public in %(domain)s's room directory?": "Publish this room to the public in %(domain)s's room directory?", "Local addresses for this room:": "Local addresses for this room:", "Logged in as:": "Logged in as:", "Logout": "Logout", "Low priority": "Low priority", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s made future room history visible to all room members, from the point they are invited.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s made future room history visible to all room members, from the point they joined.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", "Manage Integrations": "Manage Integrations", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", @@ -256,7 +236,6 @@ "People": "People", "Permissions": "Permissions", "Phone": "Phone", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s placed a %(callType)s call.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.", "Power level must be positive integer.": "Power level must be positive integer.", "Privacy warning": "Privacy warning", @@ -267,15 +246,11 @@ "Revoke widget access": "Revoke widget access", "Refer a friend to Riot:": "Refer a friend to Riot:", "Register": "Register", - "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", "Reject invitation": "Reject invitation", "Remote addresses for this room:": "Remote addresses for this room:", "Remove Contact Information?": "Remove Contact Information?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", "Remove": "Remove", "Remove %(threePid)s?": "Remove %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", "Results from DuckDuckGo": "Results from DuckDuckGo", "Return to login screen": "Return to login screen", @@ -296,7 +271,6 @@ "Send Invites": "Send Invites", "Send Reset Email": "Send Reset Email", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", "Server error": "Server error", "Server may be unavailable or overloaded": "Server may be unavailable or overloaded", "Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(", @@ -304,8 +278,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.", "Session ID": "Session ID", - "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", "Settings": "Settings", "Show panel": "Show panel", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", @@ -344,12 +316,10 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.", "Turn Markdown off": "Turn Markdown off", "Turn Markdown on": "Turn Markdown on", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", "Unable to add email address": "Unable to add email address", "Unable to remove contact information": "Unable to remove contact information", "Unable to verify email address.": "Unable to verify email address.", "Unban": "Unban", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", "Unable to capture screen": "Unable to capture screen", "Unable to enable Notifications": "Unable to enable Notifications", "Unable to load device list": "Unable to load device list", @@ -393,7 +363,6 @@ "Who can read history?": "Who can read history?", "Who would you like to add to this room?": "Who would you like to add to this room?", "Who would you like to communicate with?": "Who would you like to communicate with?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", "You are already in a call.": "You are already in a call.", "You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.", "You cannot place a call with yourself.": "You cannot place a call with yourself.", @@ -561,9 +530,6 @@ "Online": "Online", "Idle": "Idle", "Offline": "Offline", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s changed the room avatar to <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", "Active call (%(roomName)s)": "Active call (%(roomName)s)", "Accept": "Accept", "Add": "Add", @@ -690,11 +656,8 @@ "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", "Failed to upload image": "Failed to upload image", "Hide avatars in user and room mentions": "Hide avatars in user and room mentions", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot check is currently unavailable on desktop - please use a <a>web browser</a>", "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "Fetching third party location failed": "Fetching third party location failed", "A new version of Riot is available.": "A new version of Riot is available.", "Couldn't load home page": "Couldn't load home page", @@ -828,5 +791,42 @@ "Collapse panel": "Collapse panel", "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!": "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...": "Checking for an update...", - "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here" + "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here", + "<target> accepted the invitation for %(displayName)s.": "<target> accepted the invitation for %(displayName)s.", + "<target> accepted an invitation.": "<target> accepted an invitation.", + "<sender> requested a VoIP conference.": "<sender> requested a VoIP conference.", + "<sender> invited <target>.": "<sender> invited <target>.", + "<sender> banned <target>.": "<sender> banned <target>.", + "<sender> set their display name to <displayName>.": "<sender> set their display name to <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> removed their display name (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> removed their profile picture.", + "<sender> changed their profile picture.": "<sender> changed their profile picture.", + "<sender> set a profile picture.": "<sender> set a profile picture.", + "<target> joined the room.": "<target> joined the room.", + "<target> rejected the invitation.": "<target> rejected the invitation.", + "<target> left the room.": "<target> left the room.", + "<sender> unbanned <target>.": "<sender> unbanned <target>.", + "<sender> kicked <target>.": "<sender> kicked <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> withdrew <target>'s invitation.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> changed the topic to \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> changed the room name to %(roomName)s.", + "<sender> changed the room avatar to <img/>": "<sender> changed the room avatar to <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> changed the avatar for %(roomName)s", + "<sender> removed the room name.": "<sender> removed the room name.", + "<sender> removed the room avatar.": "<sender> removed the room avatar.", + "<sender> answered the call.": "<sender> answered the call.", + "<sender> ended the call.": "<sender> ended the call.", + "<sender> placed a %(callType)s call.": "<sender> placed a %(callType)s call.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> sent an invitation to %(targetDisplayName)s to join the room.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> made future room history visible to all room members, from the point they are invited.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> made future room history visible to all room members, from the point they joined.", + "<sender> made future room history visible to all room members.": "<sender> made future room history visible to all room members.", + "<sender> made future room history visible to anyone.": "<sender> made future room history visible to anyone.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> made future room history visible to unknown (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> from %(fromPowerLevel)s to %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> changed the power level of %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> changed the pinned messages for the room.", + "%(widgetName)s widget added by <sender>": "%(widgetName)s widget added by <sender>", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s widget removed by <sender>" } diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index abcbcd636a..9e606ea90a 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -108,49 +108,14 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La donita subskriba ŝlosilo kongruas kun la ŝlosilo ricevita de %(userId)s por ĝia aparato %(deviceId)s. Aparato markita kiel kontrolita.", "Unrecognised command:": "Nerekonita komando:", "Reason": "Kialo", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s akceptis la inviton por %(displayName)s.", - "%(targetName)s accepted an invitation.": "%(targetName)s akceptis inviton.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s petis rettelefonan vokon.", - "%(senderName)s invited %(targetName)s.": "%(senderName)s invitis uzanton %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s forbaris uzanton %(targetName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s agordis sian vidigan nomon al %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s forigis sian vidigan nomon (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s forigis sian profilbildon.", - "%(senderName)s changed their profile picture.": "%(senderName)s ŝanĝis sian profilbildon.", - "%(senderName)s set a profile picture.": "%(senderName)s agordis profilbildon.", "VoIP conference started.": "Rettelefona voko komenciĝis.", - "%(targetName)s joined the room.": "%(targetName)s venis en la ĉambron.", "VoIP conference finished.": "Rettelefona voko finiĝis.", - "%(targetName)s rejected the invitation.": "%(targetName)s rifuzis la inviton.", - "%(targetName)s left the room.": "%(targetName)s forlasis la ĉambron.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s malbaris uzanton %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s forpelis uzanton %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s nuligis inviton por %(targetName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ŝanĝis la temon al «%(topic)s».", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s forigis nomon de la ĉambro.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ŝanĝis nomon de la ĉambro al %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendis bildon.", "Someone": "Iu", "(not supported by this browser)": "(nesubtenata de tiu ĉi foliumilo)", - "%(senderName)s answered the call.": "%(senderName)s akceptis la vokon.", "(could not connect media)": "(aŭdvidaĵoj ne kunigeblis)", "(no answer)": "(sen respondo)", "(unknown failure: %(reason)s)": "(nekonata eraro: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s finis la vokon.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s faris vokon de speco: %(callType)s.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sendis ĉambran inviton al %(targetDisplayName)s.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de invito.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de aliĝo.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s videbligis estontan historion de la ĉambro al nekonatoj (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ŝaltis ĝiscelan ĉifradon (algoritmo: %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s al %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ŝanĝis la potencan nivelon de %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ŝanĝis la fiksitajn mesaĝojn de la ĉambro.", - "%(widgetName)s widget modified by %(senderName)s": "Fenestraĵon %(widgetName)s ŝanĝis %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "Fenestraĵon %(widgetName)s aldonis %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Fenestraĵon %(widgetName)s forigis %(senderName)s", "%(displayName)s is typing": "%(displayName)s tajpas", "%(names)s and %(count)s others are typing|other": "%(names)s kaj %(count)s aliaj tajpas", "%(names)s and %(count)s others are typing|one": "%(names)s kaj unu alia tajpas", @@ -276,7 +241,6 @@ "Unignore": "Reatenti", "Ignore": "Malatenti", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ŝanĝo de pasvorto nuntempe nuligos ĉiujn ĝiscele ĉifrajn ŝlosilojn sur ĉiuj viaj aparatoj. Tio faros ĉifritajn babilajn historiojn nelegeblaj, krom se vi unue elportos viajn ĉambrajn ŝlosilojn kaj reenportos ilin poste. Estontece ĉi tio pliboniĝos.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ŝanĝis la profilbildon de %(roomName)s", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Vi estas direktota al ekstera retejo por aŭtentigi vian konton por uzo kun %(integrationsUrl)s. Ĉu vi volas daŭrigi tion?", "Jump to read receipt": "Salti al legokonfirmo", "Mention": "Mencio", @@ -472,8 +436,6 @@ "Invalid file%(extra)s": "Malvalida dosiero%(extra)s", "Error decrypting image": "Eraro malĉifrante bildon", "Error decrypting video": "Eraro malĉifrante videon", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s forigis la ĉambran profilbildon.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s agordis la ĉambran profilbildon al <img/>", "Copied!": "Kopiita!", "Failed to copy": "Malsukcesis kopii", "Add an Integration": "Aldoni integron", @@ -925,7 +887,6 @@ "Whether or not you're logged in (we don't record your user name)": "Ĉu vi salutis aŭ ne (ni ne registras vian salutnomon)", "Your language of choice": "Via preferata lingvo", "The information being sent to us to help make Riot.im better includes:": "Informoj sendataj al ni por plibonigi la servon Riot.im inkluzivas:", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ŝanĝis sian vidigan nomon al %(displayName)s.", "Send an encrypted reply…": "Sendi ĉifritan respondon…", "Send a reply (unencrypted)…": "Sendi respondon (neĉifritan)…", "Send an encrypted message…": "Sendi ĉifritan mesaĝon…", @@ -1096,5 +1057,44 @@ "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.": "Sencimigaj protokoloj enhavas informojn pri uzo de aplikaĵo, inkluzive vian salutnomon, la identigilojn aŭ nomojn de la ĉambroj aŭ grupoj kiujn vi vizitis, kaj la salutnomojn de aliaj uzantoj. Ili ne enhavas mesaĝojn.", "Failed to send logs: ": "Malsukcesis sendi protokolon: ", "Notes:": "Rimarkoj:", - "Preparing to send logs": "Pretiganta sendon de protokolo" + "Preparing to send logs": "Pretiganta sendon de protokolo", + "<target> accepted the invitation for %(displayName)s.": "<target> akceptis la inviton por %(displayName)s.", + "<target> accepted an invitation.": "<target> akceptis inviton.", + "<sender> requested a VoIP conference.": "<sender> petis rettelefonan vokon.", + "<sender> invited <target>.": "<sender> invitis uzanton <target>.", + "<sender> banned <target>.": "<sender> forbaris uzanton <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> ŝanĝis sian vidigan nomon al <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> agordis sian vidigan nomon al <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> forigis sian vidigan nomon (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> forigis sian profilbildon.", + "<sender> changed their profile picture.": "<sender> ŝanĝis sian profilbildon.", + "<sender> set a profile picture.": "<sender> agordis profilbildon.", + "<target> joined the room.": "<target> venis en la ĉambron.", + "<target> rejected the invitation.": "<target> rifuzis la inviton.", + "<target> left the room.": "<target> forlasis la ĉambron.", + "<sender> unbanned <target>.": "<sender> malbaris uzanton <target>.", + "<sender> kicked <target>.": "<sender> forpelis uzanton <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> nuligis inviton por <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> ŝanĝis la temon al «%(topic)s».", + "<sender> changed the room name to %(roomName)s.": "<sender> ŝanĝis nomon de la ĉambro al %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> ŝanĝis la profilbildon de %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> agordis la ĉambran profilbildon al <img/>", + "<sender> removed the room name.": "<sender> forigis nomon de la ĉambro.", + "<sender> removed the room avatar.": "<sender> forigis la ĉambran profilbildon.", + "<sender> answered the call.": "<sender> akceptis la vokon.", + "<sender> ended the call.": "<sender> finis la vokon.", + "<sender> placed a %(callType)s call.": "<sender> faris vokon de speco: %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> sendis ĉambran inviton al %(targetDisplayName)s.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de invito.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de aliĝo.", + "<sender> made future room history visible to all room members.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj.", + "<sender> made future room history visible to anyone.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> videbligis estontan historion de la ĉambro al nekonatoj (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ŝaltis ĝiscelan ĉifradon (algoritmo: %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s al %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ŝanĝis la potencan nivelon de %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> ŝanĝis la fiksitajn mesaĝojn de la ĉambro.", + "%(widgetName)s widget modified by <sender>": "Fenestraĵon %(widgetName)s ŝanĝis <sender>", + "%(widgetName)s widget added by <sender>": "Fenestraĵon %(widgetName)s aldonis <sender>", + "%(widgetName)s widget removed by <sender>": "Fenestraĵon %(widgetName)s forigis <sender>" } diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 5434c570f7..8b010d70b3 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1,7 +1,5 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un mensaje de texto ha sido enviado a +%(msisdn)s. Por favor ingrese el código de verificación que lo contiene", - "%(targetName)s accepted an invitation.": "%(targetName)s ha aceptado una invitación.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha aceptado la invitación para %(displayName)s.", "Account": "Cuenta", "Access Token:": "Token de Acceso:", "Add email address": "Agregar correo eléctronico", @@ -16,7 +14,6 @@ "and %(count)s others...|one": "y otro...", "%(names)s and %(lastPerson)s are typing": "%(names)s y %(lastPerson)s están escribiendo", "A new password must be entered.": "Una nueva clave debe ser ingresada.", - "%(senderName)s answered the call.": "%(senderName)s atendió la llamada.", "An error has occurred.": "Un error ha ocurrido.", "Anyone who knows the room's link, apart from guests": "Cualquiera que sepa el enlace de la sala, salvo invitados", "Anyone who knows the room's link, including guests": "Cualquiera que sepa del enlace de la sala, incluyendo los invitados", @@ -24,7 +21,6 @@ "Are you sure you want to reject the invitation?": "¿Estás seguro que quieres rechazar la invitación?", "Attachment": "Adjunto", "Autoplay GIFs and videos": "Reproducir automáticamente GIFs y videos", - "%(senderName)s banned %(targetName)s.": "%(senderName)s ha bloqueado a %(targetName)s.", "Ban": "Bloquear", "Banned users": "Usuarios bloqueados", "Bans user with given id": "Bloquear usuario por ID", @@ -34,10 +30,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "No se puede conectar al servidor via HTTP, cuando es necesario un enlace HTTPS en la barra de direcciones de tu navegador. Ya sea usando HTTPS o <a>habilitando los scripts inseguros</a>.", "Can't load user settings": "No se puede cargar las configuraciones del usuario", "Change Password": "Cambiar clave", - "%(senderName)s changed their profile picture.": "%(senderName)s ha cambiado su foto de perfil.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha cambiado el nivel de acceso de %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha cambiado el nombre de la sala a %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha cambiado el tema de la sala a \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Cambios para quien pueda leer el historial solo serán aplicados a futuros mensajes en la sala", "Changes your display nickname": "Cambia la visualización de tu apodo", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "El cambio de contraseña restablecerá actualmente todas las claves de cifrado de extremo a extremo de todos los dispositivos, haciendo que el historial de chat cifrado sea ilegible, a menos que primero exporte las claves de la habitación y vuelva a importarlas después. En el futuro esto será mejorado.", @@ -91,7 +83,6 @@ "Enable encryption": "Habilitar encriptación", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Los mensajes encriptados no serán visibles en navegadores que no han implementado aun la encriptación", "Encrypted room": "Sala encriptada", - "%(senderName)s ended the call.": "%(senderName)s terminó la llamada.", "End-to-end encryption information": "Información de encriptación de extremo a extremo", "End-to-end encryption is in beta and may not be reliable": "El cifrado de extremo a extremo está en pruebas, podría no ser fiable", "Enter Code": "Ingresar Código", @@ -130,7 +121,6 @@ "Forgot your password?": "¿Olvidaste tu clave?", "For security, this session has been signed out. Please sign in again.": "Por seguridad, esta sesión ha sido cerrada. Por favor inicia sesión nuevamente.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por seguridad, al cerrar la sesión borrará cualquier clave de encriptación de extremo a extremo en este navegador. Si quieres ser capaz de descifrar tu historial de conversación, para las futuras sesiones en Riot, por favor exporta las claves de la sala para protegerlas.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.", "Hangup": "Colgar", "Hide read receipts": "Ocultar mensajes leídos", @@ -146,7 +136,6 @@ "Invalid address format": "Formato de dirección inválida", "Invalid Email Address": "Dirección de correo electrónico inválida", "Invalid file%(extra)s": "Archivo inválido %(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s ha invitado a %(targetName)s.", "Invite new room members": "Invitar nuevos miembros a la sala", "Invites": "Invitar", "Invites user with given id to current room": "Invitar a usuario con ID dado a esta sala", @@ -155,14 +144,11 @@ "%(displayName)s is typing": "%(displayName)s está escribiendo", "Sign in with": "Quiero iniciar sesión con", "Join Room": "Unirte a la sala", - "%(targetName)s joined the room.": "%(targetName)s se ha unido a la sala.", "Joins room with given alias": "Unirse a la sala con el alias dado", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha expulsado a %(targetName)s.", "Kick": "Expulsar", "Kicks user with given id": "Expulsar usuario con ID dado", "Labs": "Laboratorios", "Leave room": "Dejar sala", - "%(targetName)s left the room.": "%(targetName)s ha dejado la sala.", "Local addresses for this room:": "Direcciones locales para esta sala:", "Logged in as:": "Sesión iniciada como:", "Logout": "Cerrar Sesión", @@ -212,11 +198,6 @@ "Jump to first unread message.": "Ir al primer mensaje sin leer.", "Last seen": "Visto por última vez", "Level:": "Nivel:", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que son invitados.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que se han unido.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha configurado el historial de la sala visible para Todos los miembros de la sala.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha configurado el historial de la sala visible para nadie.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha configurado el historial de la sala visible para desconocido (%(visibility)s).", "Something went wrong!": "¡Algo ha fallado!", "Please select the destination room for this message": "Por favor, seleccione la sala destino para este mensaje", "Create new room": "Crear nueva sala", @@ -263,15 +244,12 @@ "Send Invites": "Enviar invitaciones", "Send Reset Email": "Enviar e-mail de reinicio", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s envió una imagen.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s invitó a %(targetDisplayName)s a unirse a la sala.", "Server error": "Error del servidor", "Server may be unavailable, overloaded, or search timed out :(": "El servidor podría estar saturado o desconectado, o la búsqueda caducó :(", "Server may be unavailable, overloaded, or the file too big": "El servidor podría estar saturado o desconectado, o el fichero ser demasiado grande", "Server may be unavailable, overloaded, or you hit a bug.": "El servidor podría estar saturado o desconectado, o encontraste un fallo.", "Server unavailable, overloaded, or something else went wrong.": "Servidor saturado, desconectado, o alguien ha roto algo.", "Session ID": "ID de sesión", - "%(senderName)s set a profile picture.": "%(senderName)s puso una foto de perfil.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s cambió su nombre a %(displayName)s.", "Settings": "Configuración", "Show panel": "Mostrar panel", "Show Text Formatting Toolbar": "Mostrar la barra de formato de texto", @@ -297,7 +275,6 @@ "Are you sure you want to leave the room '%(roomName)s'?": "¿Está seguro de que desea abandonar la sala '%(roomName)s'?", "Are you sure you want to upload the following files?": "¿Está seguro que desea enviar los siguientes archivos?", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "No se puede conectar al servidor - compruebe su conexión, asegúrese de que el <a>certificado SSL del servidor</a> es de confiaza, y compruebe que no hay extensiones del navegador bloqueando las peticiones.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha quitado el nombre de la sala.", "Device key:": "Clave del dispositivo:", "Drop File Here": "Deje el fichero aquí", "Guest access is disabled on this Home Server.": "El acceso de invitados está desactivado en este servidor.", @@ -344,7 +321,6 @@ "People": "Gente", "Permissions": "Permisos", "Phone": "Teléfono", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha hecho una llamada de tipo %(callType)s.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, compruebe su e-mail y pulse el enlace que contiene. Una vez esté hecho, pulse continuar.", "Power level must be positive integer.": "El nivel debe ser un entero positivo.", "Privacy warning": "Alerta de privacidad", @@ -357,16 +333,12 @@ "Revoke Moderator": "Eliminar Moderador", "Refer a friend to Riot:": "Informar a un amigo sobre Riot:", "Register": "Registro", - "%(targetName)s rejected the invitation.": "%(targetName)s ha rechazado la invitación.", "Reject invitation": "Rechazar invitación", "Rejoin": "Volver a unirse", "Remote addresses for this room:": "Dirección remota de esta sala:", "Remove Contact Information?": "¿Eliminar información del contacto?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha suprimido su nombre para mostar (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s ha eliminado su foto de perfil.", "Remove": "Eliminar", "Remove %(threePid)s?": "¿Eliminar %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s ha solicitado una conferencia Voz-IP.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Reiniciar la contraseña también reiniciará las claves de cifrado extremo-a-extremo, haciendo ilegible el historial de las conversaciones, salvo que exporte previamente las claves de sala, y las importe posteriormente. Esto será mejorado en futuras versiones.", "Results from DuckDuckGo": "Resultados desde DuckDuckGo", "Return to login screen": "Volver a la pantalla de inicio de sesión", @@ -427,7 +399,6 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no se ha podido encontrarlo.", "Turn Markdown off": "Desactivar markdown", "Turn Markdown on": "Activar markdown", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activado el cifrado de extremo-a-extremo (algorithm %(algorithm)s).", "Unable to add email address": "No se ha podido añadir la dirección de correo electrónico", "Unable to create widget.": "No se ha podido crear el widget.", "Unable to remove contact information": "No se ha podido eliminar la información de contacto", @@ -483,7 +454,6 @@ "Who can read history?": "¿Quién puede leer el historial?", "Who would you like to add to this room?": "¿A quién quiere añadir a esta sala?", "Who would you like to communicate with?": "¿Con quién quiere comunicar?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha retirado la invitación de %(targetName)s.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "¿Quiere <acceptText>aceptar</acceptText> o <declineText>rechazar</declineText> esta invitación?", "You already have existing direct chats with this user:": "Ya tiene chats directos con este usuario:", "You are already in a call.": "Ya está participando en una llamada.", @@ -502,7 +472,6 @@ "Revoke widget access": "Revocar acceso del widget", "The maximum permitted number of widgets have already been added to this room.": "La cantidad máxima de widgets permitida ha sido alcanzada en esta sala.", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar, solo espere a que carguen los resultados de auto-completar y navegue entre ellos.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s levanto la suspensión de %(targetName)s.", "unencrypted": "no cifrado", "Unmute": "desactivar el silencio", "Unrecognised command:": "comando no reconocido:", @@ -736,5 +705,36 @@ "Collapse panel": "Colapsar panel", "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!": "En su navegador actual, la apariencia y comportamiento de la aplicación puede ser completamente incorrecta, y algunas de las características podrían no funcionar. Si aún desea probarlo puede continuar, pero ¡no podremos ofrecer soporte por cualquier problema que pudiese tener!", "Checking for an update...": "Comprobando actualizaciones...", - "There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí" + "There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí", + "<target> accepted the invitation for %(displayName)s.": "<target> ha aceptado la invitación para %(displayName)s.", + "<target> accepted an invitation.": "<target> ha aceptado una invitación.", + "<sender> requested a VoIP conference.": "<sender> ha solicitado una conferencia Voz-IP.", + "<sender> invited <target>.": "<sender> ha invitado a <target>.", + "<sender> banned <target>.": "<sender> ha bloqueado a <target>.", + "<sender> set their display name to <displayName>.": "<sender> cambió su nombre a <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> ha suprimido su nombre para mostar (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> ha eliminado su foto de perfil.", + "<sender> changed their profile picture.": "<sender> ha cambiado su foto de perfil.", + "<sender> set a profile picture.": "<sender> puso una foto de perfil.", + "<target> joined the room.": "<target> se ha unido a la sala.", + "<target> rejected the invitation.": "<target> ha rechazado la invitación.", + "<target> left the room.": "<target> ha dejado la sala.", + "<sender> unbanned <target>.": "<sender> levanto la suspensión de <target>.", + "<sender> kicked <target>.": "<sender> ha expulsado a <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> ha retirado la invitación de <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> ha cambiado el tema de la sala a \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> ha cambiado el nombre de la sala a %(roomName)s.", + "<sender> removed the room name.": "<sender> ha quitado el nombre de la sala.", + "<sender> answered the call.": "<sender> atendió la llamada.", + "<sender> ended the call.": "<sender> terminó la llamada.", + "<sender> placed a %(callType)s call.": "<sender> ha hecho una llamada de tipo %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> invitó a %(targetDisplayName)s a unirse a la sala.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que son invitados.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que se han unido.", + "<sender> made future room history visible to all room members.": "<sender> ha configurado el historial de la sala visible para Todos los miembros de la sala.", + "<sender> made future room history visible to anyone.": "<sender> ha configurado el historial de la sala visible para nadie.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> ha configurado el historial de la sala visible para desconocido (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ha activado el cifrado de extremo-a-extremo (algorithm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s a %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ha cambiado el nivel de acceso de %(powerLevelDiffText)s." } diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 1abaec65c7..d48798c222 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1,7 +1,6 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Mezu bat bidali da +%(msisdn)s zenbakira. Sartu hemen mezuko egiaztaketa kodea", "Accept": "Onartu", - "%(targetName)s accepted an invitation.": "%(targetName)s erabiltzaileak gonbidapena onartu du.", "Close": "Itxi", "Create new room": "Sortu gela berria", "Continue": "Jarraitu", @@ -166,7 +165,6 @@ "Are you sure you want to upload the following files?": "Ziur hurrengo fitxategiak igo nahi dituzula?", "Attachment": "Eranskina", "Autoplay GIFs and videos": "Automatikoki erreproduzitu GIFak eta bideoa", - "%(senderName)s banned %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s debekatu du.", "Bans user with given id": "Debekatu ID zehatz bat duen erabiltzailea", "Call Timeout": "Deiaren denbora-muga", "Change Password": "Aldatu pasahitza", @@ -210,10 +208,7 @@ "Displays action": "Ekintza bistaratzen du", "Drop File Here": "Jaregin fitxategia hona", "%(items)s and %(lastItem)s": "%(items)s eta %(lastItem)s", - "%(senderName)s answered the call.": "%(senderName)s erabiltzaileak deia erantzun du.", "Can't load user settings": "Ezin izan dira erabiltzailearen ezarpenak kargatu", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s erabiltzaileak gelaren izena kendu du.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s erabiltzaileak mintzagaia aldatu du beste honetara: \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Historiala irakurtzeko baimenen aldaketak gela honetara hemendik aurrera heldutako mezuei aplikatuko zaizkie", "Clear Cache and Reload": "Garbitu cachea eta birkargatu", "Devices will not yet be able to decrypt history from before they joined the room": "Gailuek ezin izango dute taldera elkartu aurretiko historiala deszifratu", @@ -229,7 +224,6 @@ "Encrypted room": "Zifratutako gela", "Encryption is enabled in this room": "Zifratzea gaitu da gela honetan", "Encryption is not enabled in this room": "Ez da zifratzea gaitu gela honetan", - "%(senderName)s ended the call.": "%(senderName)s erabiltzaileak deia amaitu du.", "End-to-end encryption is in beta and may not be reliable": "Muturretik muturrerako zifratzea beta egoeran dago eta agian ez dabil guztiz ondo", "Enter Code": "Sartu kodea", "Error decrypting attachment": "Errorea eranskina deszifratzean", @@ -259,18 +253,13 @@ "Fill screen": "Bete pantaila", "Forget room": "Ahaztu gela", "Forgot your password?": "Pasahitza ahaztu duzu?", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s mailatik %(toPowerLevel)s mailara", "Guest access is disabled on this Home Server.": "Bisitarien sarbidea desgaituta dago hasiera zerbitzari honetan.", "Hide Text Formatting Toolbar": "Ezkutatu testu-formatuaren tresna-barra", "Incoming call from %(name)s": "%(name)s erabiltzailearen deia jasotzen", "Incoming video call from %(name)s": "%(name)s erabiltzailearen bideo deia jasotzen", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s erabiltzaileak %(displayName)s erabiltzailearen gonbidapena onartu du.", "Bulk Options": "Aukera masiboak", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Ezin da hasiera zerbitzarira konektatu, egiaztatu zure konexioa, ziurtatu zure <a>hasiera zerbitzariaren SSL ziurtagiria</a> fidagarritzat jotzen duela zure gailuak, eta nabigatzailearen pluginen batek ez dituela eskaerak blokeatzen.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Ezin zara hasiera zerbitzarira HTTP bidez konektatu zure nabigatzailearen barran dagoen URLa HTTS bada. Erabili HTTPS edo <a>gaitu script ez seguruak</a>.", - "%(senderName)s changed their profile picture.": "%(senderName)s erabiltzaileak bere profileko argazkia aldatu du.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s erabiltzaileak botere mailaz aldatu du %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s erabiltzaileak gelaren izena aldatu du, orain %(roomName)s da.", "Drop here to tag %(section)s": "Jaregin hona %(section)s atalari etiketa jartzeko", "Incoming voice call from %(name)s": "%(name)s erabiltzailearen deia jasotzen", "Incorrect username and/or password.": "Erabiltzaile-izen edo pasahitz okerra.", @@ -278,7 +267,6 @@ "Invalid address format": "Helbide formatu baliogabea", "Invalid Email Address": "E-mail helbide baliogabea", "Invalid file%(extra)s": "Fitxategi %(extra)s baliogabea", - "%(senderName)s invited %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s gonbidatu du.", "Invite new room members": "Gonbidatu kide berriak gelara", "Invited": "Gonbidatuta", "Invites user with given id to current room": "Emandako ID-a duen erabiltzailea gonbidatzen du gelara", @@ -287,20 +275,12 @@ "%(displayName)s is typing": "%(displayName)s idazten ari da", "Sign in with": "Hasi saioa hau erabilita:", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Elkartu <voiceText>ahotsa</voiceText> edo <videoText>bideoa</videoText> erabiliz.", - "%(targetName)s joined the room.": "%(targetName)s erabiltzailea gelara elkartu da.", "Joins room with given alias": "Gelara emandako ezizenarekin elkartu da", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s kanporatu du.", "Kick": "Kanporatu", "Kicks user with given id": "Kanporatu emandako ID-a duen erabiltzailea", - "%(targetName)s left the room.": "%(targetName)s erabiltzailea gelatik atera da.", "Level:": "Maila:", "Local addresses for this room:": "Gela honen tokiko helbideak:", "Logged in as:": "Saioa hasteko erabiltzailea:", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, gonbidapena egiten zaienetik.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, elkartzen direnetik.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du edonorentzat.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du ezezagunentzat (%(visibility)s).", "Manage Integrations": "Kudeatu interakzioak", "Markdown is disabled": "Markdown desgaituta dago", "Markdown is enabled": "Markdown gaituta dago", @@ -329,7 +309,6 @@ "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Segurtasunagatik, saioa amaitzeak nabigatzaile honetako muturretik muturrerako zifratze gako guztiak ezabatuko ditu. Zure elkarrizketen historiala deszifratzeko gai izan nahi baduzu etorkizuneko Riot saioetan, esportatu zure gelako gakoen babes-kopia bat.", "Passwords can't be empty": "Pasahitzak ezin dira hutsik egon", "Permissions": "Baimenak", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s erabiltzaileak %(callType)s dei bat hasi du.", "Power level must be positive integer.": "Botere maila osoko zenbaki positibo bat izan behar da.", "Press <StartChatButton> to start a chat with someone": "Sakatu <StartChatButton> norbaitekin txat bat hasteko", "Privacy warning": "Pribatutasun abisua", @@ -341,16 +320,12 @@ "Reason: %(reasonText)s": "Arrazoia: %(reasonText)s", "Revoke Moderator": "Kendu moderatzaile baimena", "Refer a friend to Riot:": "Aipatu Riot lagun bati:", - "%(targetName)s rejected the invitation.": "%(targetName)s erabiltzaileak gonbidapena baztertu du.", "Reject invitation": "Baztertu gonbidapena", "Reject all %(invitedRooms)s invites": "Baztertu %(invitedRooms)s gelarako gonbidapen guztiak", "Rejoin": "Berriro elkartu", "Remote addresses for this room:": "Gela honen urruneko helbideak:", "Remove Contact Information?": "Kendu kontaktuaren informazioa?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s erabiltzaileak bere pantaila-izena kendu du (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s erabiltzaileak bere profileko argazkia kendu du.", "Remove %(threePid)s?": "Kendu %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s erabiltzaileak VoIP konferentzia bat eskatu du.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Oraingoz pasahitza aldatzeak gailu guztietako muturretik muturrerako zifratze-gakoak berrezarriko ditu, eta ezin izango dituzu zifratutako txatetako historialak irakurri ez badituzu aurretik zure gelako gakoak esportatzen eta aldaketa eta gero berriro inportatzen.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Une honetan egiaztatu gabeko gailuak blokeatzen ari zara, gailu hauetara mezuak bidali ahal izateko egiaztatu behar dituzu.", "Results from DuckDuckGo": "DuckDuckGo bilatzaileko emaitzak", @@ -370,14 +345,11 @@ "Send anyway": "Bidali hala ere", "Send Invites": "Bidali gonbidapenak", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s erabiltzaileak irudi bat bidali du.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %(targetDisplayName)s erbiltzaileari.", "Server error": "Zerbitzari-errorea", "Server may be unavailable or overloaded": "Zerbitzaria eskuraezin edo gainezka egon daiteke", "Server may be unavailable, overloaded, or search timed out :(": "Zerbitzaria eskuraezin edo gainezka egon daiteke, edo bilaketaren denbora muga gainditu da :(", "Server may be unavailable, overloaded, or the file too big": "Zerbitzaria eskuraezin edo gainezka egon daiteke edo fitxategia handiegia da", "Server unavailable, overloaded, or something else went wrong.": "Zerbitzaria eskuraezin edo gainezka egon daiteke edo zerbaitek huts egin du.", - "%(senderName)s set a profile picture.": "%(senderName)s erabiltzaileak profileko argazkia ezarri du.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s erabiltzaileak %(displayName)s ezarri du pantaila izen gisa.", "Show panel": "Erakutsi panela", "Show Text Formatting Toolbar": "Erakutsi testu-formatuaren tresna-barra", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Erakutsi denbora-zigiluak 12 ordutako formatuan (adib. 2:30pm)", @@ -410,11 +382,9 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Gela honen denbora-lerroko puntu zehatz bat kargatzen saiatu da, baina ezin izan da aurkitu.", "Turn Markdown off": "Desaktibatu Markdown", "Turn Markdown on": "Aktibatu Markdown", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s erabiltzaileak muturretik muturrerako (%(algorithm)s algoritmoa) zifratzea aktibatu du.", "Unable to add email address": "Ezin izan da e-mail helbidea gehitu", "Unable to remove contact information": "Ezin izan da kontaktuaren informazioa kendu", "Unable to verify email address.": "Ezin izan da e-mail helbidea egiaztatu.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s erabiltzaileak debekua kendu dio %(targetName)s erabiltzaileari.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Ezin izan da ziurtatu gonbidapen hau zure kontuarekin lotutako helbide batera bidali zela.", "Unable to capture screen": "Ezin izan da pantaila-argazkia atera", "Unable to enable Notifications": "Ezin izan dira jakinarazpenak gaitu", @@ -462,7 +432,6 @@ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ABISUA: GAKOEN EGIAZTAKETAK HUTS EGIN DU! %(userId)s erabiltzailearen %(deviceId)s gailuaren sinadura-gakoa \"%(fprint)s\" da, eta ez dator bat emandako \"%(fingerprint)s\" gakoarekin. Honek inor komunikazioa antzematen ari dela esan nahi lezake!", "Who would you like to add to this room?": "Nor gehitu nahi duzu gela honetara?", "Who would you like to communicate with?": "Norekin komunikatu nahi duzu?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s erabiltzaileak atzera bota du %(targetName)s erabiltzailearen gonbidapena.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Gonbidapen hau <acceptText>onartu</acceptText> ala <declineText>ukatu</declineText> nahi duzu?", "You already have existing direct chats with this user:": "Baduzu jada txat zuzen bat erabiltzaile honekin:", "You are already in a call.": "Bazaude dei batean.", @@ -603,9 +572,6 @@ "Start chatting": "Hasi txateatzen", "Start Chatting": "Hasi txateatzen", "Click on the button below to start chatting!": "Egin klik beheko botoian txateatzen hasteko!", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s erabiltzaileak gelaren abatarra aldatu du beste honetara: <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s erabiltzaileak gelaren abatarra ezabatu du.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s erabiltzaileak %(roomName)s gelaren abatarra aldatu du", "Username available": "Erabiltzaile-izena eskuragarri dago", "Username not available": "Erabiltzaile-izena ez dago eskuragarri", "Something went wrong!": "Zerk edo zerk huts egin du!", @@ -661,11 +627,8 @@ "Automatically replace plain text Emoji": "Automatikoki ordezkatu Emoji testu soila", "Failed to upload image": "Irudia igotzeak huts egin du", "Hide avatars in user and room mentions": "Ezkutatu abatarrak erabiltzaile eta gelen aipamenetan", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s trepeta gehitu du %(senderName)s erabiltzaileak", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s trepeta kendu du %(senderName)s erabiltzaileak", "Verifies a user, device, and pubkey tuple": "Erabiltzaile, gailu eta gako publiko multzoa egiaztatzen du", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot egiaztaketa orain ez dago eskuragarri mahaigainean - erabili <a>web nabigatzailea</a>", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s trepeta aldatu du %(senderName)s erabiltzaileak", "Copied!": "Kopiatuta!", "Failed to copy": "Kopiak huts egin du", "Cancel": "Utzi", @@ -715,7 +678,6 @@ "Failed to invite users to %(groupId)s": "Huts egin du erabiltzaileak %(groupId)s komunitatera gonbidatzean", "Failed to add the following rooms to %(groupId)s:": "Huts egin du honako gela hauek %(groupId)s komunitatera gehitzean:", "Restricted": "Mugatua", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s erabiltzaileak gelan finkatutako mezuak aldatu ditu.", "%(names)s and %(count)s others are typing|other": "%(names)s eta beste %(count)s idazten ari dira", "%(names)s and %(count)s others are typing|one": "%(names)s eta beste bat idazten ari dira", "Send": "Bidali", @@ -955,7 +917,6 @@ "Community IDs cannot not be empty.": "Komunitate ID-ak ezin dira hutsik egon.", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Erakutsi gailuak</showDevicesText>, <sendAnywayText>bidali hala ere</sendAnywayText> edo <cancelText>ezeztatu</cancelText>.", "<a>In reply to</a> <pill>": "<a>honi erantzunez:</a> <pill>", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s erabiltzaileak bere pantaila izena aldatu du %(displayName)s izatera.", "Failed to set direct chat tag": "Huts egin du txat zuzenarenaren etiketa jartzean", "Failed to remove tag %(tagName)s from room": "Huts egin du %(tagName)s etiketa gelatik kentzean", "Failed to add tag %(tagName)s to room": "Huts egin du %(tagName)s etiketa gelara gehitzean", @@ -1195,5 +1156,44 @@ "COPY": "KOPIATU", "Share Message": "Partekatu mezua", "No Audio Outputs detected": "Ez da audio irteerarik antzeman", - "Audio Output": "Audio irteera" + "Audio Output": "Audio irteera", + "<target> accepted the invitation for %(displayName)s.": "<target> erabiltzaileak %(displayName)s erabiltzailearen gonbidapena onartu du.", + "<target> accepted an invitation.": "<target> erabiltzaileak gonbidapena onartu du.", + "<sender> requested a VoIP conference.": "<sender> erabiltzaileak VoIP konferentzia bat eskatu du.", + "<sender> invited <target>.": "<sender> erabiltzaileak <target> gonbidatu du.", + "<sender> banned <target>.": "<sender> erabiltzaileak <target> debekatu du.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> erabiltzaileak bere pantaila izena aldatu du <displayName> izatera.", + "<sender> set their display name to <displayName>.": "<sender> erabiltzaileak <displayName> ezarri du pantaila izen gisa.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> erabiltzaileak bere pantaila-izena kendu du (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> erabiltzaileak bere profileko argazkia kendu du.", + "<sender> changed their profile picture.": "<sender> erabiltzaileak bere profileko argazkia aldatu du.", + "<sender> set a profile picture.": "<sender> erabiltzaileak profileko argazkia ezarri du.", + "<target> joined the room.": "<target> erabiltzailea gelara elkartu da.", + "<target> rejected the invitation.": "<target> erabiltzaileak gonbidapena baztertu du.", + "<target> left the room.": "<target> erabiltzailea gelatik atera da.", + "<sender> unbanned <target>.": "<sender> erabiltzaileak debekua kendu dio <target> erabiltzaileari.", + "<sender> kicked <target>.": "<sender> erabiltzaileak <target> kanporatu du.", + "<sender> withdrew <target>'s invitation.": "<sender> erabiltzaileak atzera bota du <target> erabiltzailearen gonbidapena.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> erabiltzaileak mintzagaia aldatu du beste honetara: \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> erabiltzaileak gelaren izena aldatu du, orain %(roomName)s da.", + "<sender> changed the room avatar to <img/>": "<sender> erabiltzaileak gelaren abatarra aldatu du beste honetara: <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> erabiltzaileak %(roomName)s gelaren abatarra aldatu du", + "<sender> removed the room name.": "<sender> erabiltzaileak gelaren izena kendu du.", + "<sender> removed the room avatar.": "<sender> erabiltzaileak gelaren abatarra ezabatu du.", + "<sender> answered the call.": "<sender> erabiltzaileak deia erantzun du.", + "<sender> ended the call.": "<sender> erabiltzaileak deia amaitu du.", + "<sender> placed a %(callType)s call.": "<sender> erabiltzaileak %(callType)s dei bat hasi du.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %(targetDisplayName)s erbiltzaileari.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, gonbidapena egiten zaienetik.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, elkartzen direnetik.", + "<sender> made future room history visible to all room members.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat.", + "<sender> made future room history visible to anyone.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du edonorentzat.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du ezezagunentzat (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> erabiltzaileak muturretik muturrerako (%(algorithm)s algoritmoa) zifratzea aktibatu du.", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> %(fromPowerLevel)s mailatik %(toPowerLevel)s mailara", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> erabiltzaileak botere mailaz aldatu du %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> erabiltzaileak gelan finkatutako mezuak aldatu ditu.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s trepeta aldatu du <sender> erabiltzaileak", + "%(widgetName)s widget added by <sender>": "%(widgetName)s trepeta gehitu du <sender> erabiltzaileak", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s trepeta kendu du <sender> erabiltzaileak" } diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index d39091b619..0c207bb505 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -46,7 +46,6 @@ "%(items)s and %(lastItem)s": "%(items)s ja %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s ja %(lastPerson)s kirjoittavat", "A new password must be entered.": "Sinun täytyy syöttää uusi salasana.", - "%(senderName)s answered the call.": "%(senderName)s vastasi puheluun.", "An error has occurred.": "Virhe.", "Anyone": "Kaikki", "Anyone who knows the room's link, apart from guests": "Kaikki jotka tietävät huoneen osoitteen, paitsi vieraat", @@ -57,14 +56,10 @@ "Are you sure you want to upload the following files?": "Oletko varma että haluat ladata seuraavat tiedostot?", "Attachment": "Liite", "Autoplay GIFs and videos": "Toista automaattisesti GIF-animaatiot ja videot", - "%(senderName)s banned %(targetName)s.": "%(senderName)s antoi porttikiellon käyttäjälle %(targetName)s.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Yhdistäminen kotipalvelimeen epäonnistui. Ole hyvä ja tarkista verkkoyhteytesi ja varmista että <a>kotipalvelimen SSL-sertifikaatti</a> on luotettu, ja että jokin selaimen lisäosa ei estä pyyntöjen lähettämisen.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Yhdistäminen kotipalveluun HTTP:n avulla ei ole mahdollista kun selaimen osoitepalkissa on HTTPS URL. Käytä joko HTTPS tai <a>salli turvattomat skriptit</a>.", "Can't load user settings": "Käyttäjäasetusten lataaminen epäonnistui", "Change Password": "Muuta salasana", - "%(senderName)s changed their profile picture.": "%(senderName)s muutti profiilikuvansa.", - "%(targetName)s accepted an invitation.": "%(targetName)s hyväksyi kutsun.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s hyväksyi kutsun käyttäjän %(displayName)s puolesta.", "Account": "Tili", "and %(count)s others...|other": "ja %(count)s lisää...", "and %(count)s others...|one": "ja yksi lisää...", @@ -294,11 +289,9 @@ "Uploading %(filename)s and %(count)s others|zero": "Ladataan %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Ladataan %(filename)s ja %(count)s muuta", "Blacklisted": "Estetyt", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s muuti huoneen nimeksi %(roomName)s.", "Drop here to tag %(section)s": "Pudota tähän tägätäksesi %(section)s", "Enable automatic language detection for syntax highlighting": "Ota automaattinen kielentunnistus käyttöön koodin väritystä varten", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Salatut viestit eivät näy ohjelmissa joissa salaus ei ole vielä implementoitu", - "%(senderName)s ended the call.": "%(senderName)s lopetti puhelun.", "Guest access is disabled on this Home Server.": "Vierailijat on estetty tällä kotipalvelimella.", "Guests cannot join this room even if explicitly invited.": "Vierailijat eivät voi liittyä tähän huoneeseen vaikka heidät on eksplisiittisesti kutsuttu.", "Hangup": "Lopeta", @@ -306,15 +299,11 @@ "Historical": "Vanhat", "Home": "Etusivu", "Invalid file%(extra)s": "Virheellinen tiedosto%(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s kutsui käyttäjän %(targetName)s.", "%(displayName)s is typing": "%(displayName)s kirjoittaa", "none": "Ei mikään", "No devices with registered encryption keys": "Ei laitteita joilla rekisteröityjä salausavaimia", "No users have specific privileges in this room": "Kellään käyttäjällä ei ole erityisiä oikeuksia", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s soitti %(callType)spuhelun.", "Remove %(threePid)s?": "Poista %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s pyysi VoIP konferenssia.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s asetti näyttönimekseen %(displayName)s.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Tiedosto ‘%(fileName)s’ ylittää tämän kotipalvelimen maksimitiedostokoon", "The file '%(fileName)s' failed to upload": "Tiedoston ‘%(fileName)s’ lataaminen epäonnistui", "This Home Server does not support login using email address.": "Kotipalvelin ei tue kirjatumista sähköpostiosoitteen avulla.", @@ -327,7 +316,6 @@ "To link to a room it must have <a>an address</a>.": "Linkittääksesi tähän huoneseen sillä on oltava <a>osoite</a>.", "Turn Markdown off": "Ota Markdown pois käytöstä", "Turn Markdown on": "Ota Markdown käyttöön", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s otti päästä päähän-salauksen käyttöön (algoritmi %(algorithm)s).", "Username invalid: %(errMessage)s": "Virheellinen käyttäjänimi: %(errMessage)s", "Users": "Käyttäjät", "Verification": "Varmennus", @@ -437,7 +425,6 @@ "Verify device": "Varmenna laite", "I verify that the keys match": "Totean että avaimet vastaavat toisiaan", "Unable to restore session": "Istunnon palautus epäonnistui", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s poisti huoneen nimen.", "Changes to who can read history will only apply to future messages in this room": "Muutokset koskien ketkä voivat lukea historian koskevat vain uusia viestejä", "<a>Click here</a> to join the discussion!": "<a>Paina tästä</a> liittyäksesi keskusteluun", "%(count)s new messages|one": "%(count)s uusi viesti", @@ -451,9 +438,6 @@ "Error: Problem communicating with the given homeserver.": "Virhe: Ongelma yhteydenpidossa kotipalvelimeen.", "Existing Call": "Käynnissä oleva puhelu", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Liity käyttäen <voiceText>ääntä</voiceText> tai <videoText>videota</videoText>.", - "%(targetName)s joined the room.": "%(targetName)s liittyi huoneeseen.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s poisti käyttäjän %(targetName)s huoneesta.", - "%(targetName)s left the room.": "%(targetName)s poistui huoneesta.", "Publish this room to the public in %(domain)s's room directory?": "Julkaise tämä huone domainin %(domain)s huoneluettelossa?", "Missing room_id in request": "room_id puuttuu kyselystä", "Missing user_id in request": "user_id puuttuu kyselystä", @@ -463,9 +447,7 @@ "Press <StartChatButton> to start a chat with someone": "Paina <StartChatButton>", "Revoke Moderator": "Poista moderaattorioikeudet", "Refer a friend to Riot:": "Suosittele Riot ystävälle:", - "%(targetName)s rejected the invitation.": "%(targetName)s hylkäsi kutsun.", "Remote addresses for this room:": "Tämän huoneen etäosoitteet:", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s poisti näyttönimensä (%(oldDisplayName)s).", "Riot does not have permission to send you notifications - please check your browser settings": "Riotilla ei ole oikeuksia lähettää sinulle ilmoituksia. Ole hyvä ja tarkista selaimen asetukset", "Riot was not given permission to send notifications - please try again": "Riotilla ei saannut oikeuksia lähettää ilmoituksia. Ole hyvä ja yritä uudelleen", "Room %(roomId)s not visible": "Huone %(roomId)s ei ole näkyvissä", @@ -474,7 +456,6 @@ "Seen by %(userName)s at %(dateTime)s": "Käyttäjän %(userName)s näkemä %(dateTime)s", "Send Reset Email": "Lähetä salasanan palautusviesti", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s lähetti kuvan.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s lähetti kutsun käyttäjälle %(targetDisplayName)s liittyäkseen huoneeseen.", "Server may be unavailable or overloaded": "Palvelin saattaa olla saavuttamattomissa tai ylikuormitettu", "Show Text Formatting Toolbar": "Näytä tekstinmuotoilupalkki", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Näytä aikaleimat 12h muodossa (esim. 2:30pm)", @@ -490,7 +471,6 @@ "Unable to remove contact information": "Yhteystietojen poistaminen epäonnistui", "Unable to verify email address.": "Sähköpostin varmentaminen epäonnistui.", "Unbans user with given id": "Poistaa porttikiellon annetun ID:n omaavalta käyttäjältä", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s poisti porttikiellon käyttäjältä %(targetName)s.", "Unable to capture screen": "Ruudun kaappaus epäonnistui", "Unable to enable Notifications": "Ilmoitusten käyttöönotto epäonnistui", "Unable to load device list": "Laitelistan lataaminen epäonnistui", @@ -505,7 +485,6 @@ "User ID": "Käyttäjätunniste", "User Interface": "Käyttöliittymä", "User name": "Käyttäjänimi", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s asetti aiheeksi \"%(topic)s\".", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Salasanan muuttaminen uudelleenalustaa myös päästä päähän-salausavaimet kaikilla laitteilla, jolloin vanhojen viestien lukeminen ei ole enään mahdollista, ellet ensin vie huoneavaimet ja tuo ne takaisin jälkeenpäin. Tämä tulee muuttumaan tulevaisuudessa.", "Define the power level of a user": "Määritä käyttäjän oikeustaso", "Failed to change power level": "Oikeustason muuttaminen epäonnistui", @@ -531,7 +510,6 @@ "(could not connect media)": "(mediaa ei voitu yhdistää)", "WARNING: Device already verified, but keys do NOT MATCH!": "VAROITUS: Laite on jo varmennettu mutta avaimet eivät vastaa toisiaan!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VAROITUS: AVAIMEN VARMENNUS EPÄONNISTUI! Käyttäjän %(userId)s ja laitteen %(deviceId)s allekirjoitusavain on \"%(fprint)s\" joka ei vastaa annettua avainta \"%(fingerprint)s\". Tämä saattaa tarkoittaa että viestintäsi siepataan!", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s veti takaisin käyttäjän %(targetName)s kutsun.", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Et ole vielä missään huoneessa! Paina <CreateRoomButton> luodaksesi huoneen tai <RoomDirectoryButton> selatakseski hakemistoa", "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Sinut on kirjattu ulos kaikista laitteista etkä enää saa Push-ilmoituksia. Jotta saisit jälleen ilmoituksia pitää sinun jälleen kirjautua sisään jokaisella laitteella", "You may wish to login with a different account, or add this email to this account.": "Haluat ehkä kirjautua toiseen tiliin tai lisätä tämä sähköpostiosoite tähän tiliin.", @@ -630,14 +608,6 @@ "Restricted": "Rajoitettu", "You are now ignoring %(userId)s": "Et enää huomioi käyttäjää %(userId)s", "You are no longer ignoring %(userId)s": "Huomioit jälleen käyttäjän %(userId)s", - "%(senderName)s removed their profile picture.": "%(senderName)s poisti profiilikuvansa.", - "%(senderName)s set a profile picture.": "%(senderName)s asetti profiilikuvan.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s muutti tulevat viestit näkyviksi kaikille huoneen jäsenille, alkaen kutsusta huoneeseen.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille, liittymisestä asti.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s teki tulevan huonehistorian näkyväksi tuntemattomalle (%(visibility)s).", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s muutti tämän huoneen kiinnitetyt viestit.", "%(names)s and %(count)s others are typing|other": "%(names)s ja %(count)s muuta kirjoittavat", "%(names)s and %(count)s others are typing|one": "%(names)s ja yksi muu kirjoittvat", "Message Pinning": "Kiinnitetyt viestit", @@ -702,9 +672,6 @@ "Invalid community ID": "Virheellinen yhteistötunniste", "'%(groupId)s' is not a valid community ID": "'%(groupId)s' on virheellinen yhteisötunniste", "New community ID (e.g. +foo:%(localDomain)s)": "Uusi yhteisötunniste (esim. +foo:%(localDomain)s)", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s muutti huoneen %(roomName)s avatarin", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s poisti huoneen avatarin.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s vaihtoi huoneen kuvaksi <img/>", "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?": "Sinut ohjataan kolmannen osapuolen sivustolle jotta voit autentikoida tilisi käyttääksesi %(integrationsUrl)s. Haluatko jatkaa?", "Message removed by %(userId)s": "Käyttäjän %(userId)s poistama viesti", "Message removed": "Viesti poistettu", @@ -814,11 +781,6 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", "Ignored user": "Estetyt käyttäjät", "Unignored user": "Sallitut käyttäjät", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s tasolta %(fromPowerLevel)s tasolle %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s muutettiin tehotasoa %(powerLevelDiffText)s.", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s pienoisohjelmaa muokannut %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s pienoisohjelman lisännyt %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s pienoisohjelman poistanut %(senderName)s", "Send": "Lähetä", "Delete %(count)s devices|other": "Poista %(count)s laitetta", "Delete %(count)s devices|one": "Poista laite", @@ -1065,5 +1027,43 @@ "Collapse panel": "Piilota paneeli", "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!": "Nykyisellä selaimellasi ohjelman ulkonäkö voi olla aivan virheellinen, ja jotkut ominaisuudet eivät saata toimia. Voit jatkaa jos haluat kokeilla mutta et voi odottaa saavasi apua mahdollisesti ilmeneviin ongelmiin!", "Checking for an update...": "Tarkistetaan päivityksen saatavuutta...", - "There are advanced notifications which are not shown here": "On kehittyneitä ilmoituksia joita ei näytetä tässä" + "There are advanced notifications which are not shown here": "On kehittyneitä ilmoituksia joita ei näytetä tässä", + "<target> accepted the invitation for %(displayName)s.": "<target> hyväksyi kutsun käyttäjän %(displayName)s puolesta.", + "<target> accepted an invitation.": "<target> hyväksyi kutsun.", + "<sender> requested a VoIP conference.": "<sender> pyysi VoIP konferenssia.", + "<sender> invited <target>.": "<sender> kutsui käyttäjän <target>.", + "<sender> banned <target>.": "<sender> antoi porttikiellon käyttäjälle <target>.", + "<sender> set their display name to <displayName>.": "<sender> asetti näyttönimekseen <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> poisti näyttönimensä (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> poisti profiilikuvansa.", + "<sender> changed their profile picture.": "<sender> muutti profiilikuvansa.", + "<sender> set a profile picture.": "<sender> asetti profiilikuvan.", + "<target> joined the room.": "<target> liittyi huoneeseen.", + "<target> rejected the invitation.": "<target> hylkäsi kutsun.", + "<target> left the room.": "<target> poistui huoneesta.", + "<sender> unbanned <target>.": "<sender> poisti porttikiellon käyttäjältä <target>.", + "<sender> kicked <target>.": "<sender> poisti käyttäjän <target> huoneesta.", + "<sender> withdrew <target>'s invitation.": "<sender> veti takaisin käyttäjän <target> kutsun.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> asetti aiheeksi \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> muuti huoneen nimeksi %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> muutti huoneen %(roomName)s avatarin", + "<sender> changed the room avatar to <img/>": "<sender> vaihtoi huoneen kuvaksi <img/>", + "<sender> removed the room name.": "<sender> poisti huoneen nimen.", + "<sender> removed the room avatar.": "<sender> poisti huoneen avatarin.", + "<sender> answered the call.": "<sender> vastasi puheluun.", + "<sender> ended the call.": "<sender> lopetti puhelun.", + "<sender> placed a %(callType)s call.": "<sender> soitti %(callType)spuhelun.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> lähetti kutsun käyttäjälle %(targetDisplayName)s liittyäkseen huoneeseen.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> muutti tulevat viestit näkyviksi kaikille huoneen jäsenille, alkaen kutsusta huoneeseen.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille, liittymisestä asti.", + "<sender> made future room history visible to all room members.": "<sender> teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille.", + "<sender> made future room history visible to anyone.": "<sender> teki tulevan huonehistorian näkyväksi kaikille.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> teki tulevan huonehistorian näkyväksi tuntemattomalle (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> otti päästä päähän-salauksen käyttöön (algoritmi %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> tasolta %(fromPowerLevel)s tasolle %(toPowerLevel)s", + "<sender> changed the pinned messages for the room.": "<sender> muutti tämän huoneen kiinnitetyt viestit.", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> muutettiin tehotasoa %(powerLevelDiffText)s.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s pienoisohjelmaa muokannut <sender>", + "%(widgetName)s widget added by <sender>": "%(widgetName)s pienoisohjelman lisännyt <sender>", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s pienoisohjelman poistanut <sender>" } diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 8843ad89ca..8c6e6c2998 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -12,7 +12,6 @@ "Enable encryption": "Activer le chiffrement", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Les messages chiffrés ne seront pas visibles dans les clients qui n’implémentent pas encore le chiffrement", "Encrypted room": "Salon chiffré", - "%(senderName)s ended the call.": "%(senderName)s a terminé l’appel.", "End-to-end encryption information": "Informations sur le chiffrement de bout en bout", "End-to-end encryption is in beta and may not be reliable": "Le chiffrement de bout en bout est en bêta et risque de ne pas être fiable", "Enter Code": "Saisir le code", @@ -33,7 +32,6 @@ "Notifications": "Notifications", "Settings": "Paramètres", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un SMS a été envoyé à +%(msisdn)s. Merci de saisir le code de vérification qu'il contient", - "%(targetName)s accepted an invitation.": "%(targetName)s a accepté une invitation.", "Account": "Compte", "Add email address": "Ajouter une adresse e-mail", "Add phone number": "Ajouter un numéro de téléphone", @@ -52,7 +50,6 @@ "Are you sure you want to upload the following files?": "Voulez-vous vraiment envoyer les fichiers suivants ?", "Attachment": "Pièce jointe", "Autoplay GIFs and videos": "Jouer automatiquement les GIFs et les vidéos", - "%(senderName)s banned %(targetName)s.": "%(senderName)s a banni %(targetName)s.", "Ban": "Bannir", "Banned users": "Utilisateurs bannis", "Bans user with given id": "Bannit l'utilisateur à partir de son identifiant", @@ -61,10 +58,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Impossible de se connecter au serveur d'accueil en HTTP si l'URL dans la barre de votre explorateur est en HTTPS. Utilisez HTTPS ou <a>activez le support des scripts non-vérifiés</a>.", "Can't load user settings": "Impossible de charger les paramètres de l'utilisateur", "Change Password": "Changer le mot de passe", - "%(senderName)s changed their profile picture.": "%(senderName)s a changé son image de profil.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s a changé le rang de %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s a changé le nom du salon en %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s a changé le sujet du salon en \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Les changements de visibilité de l’historique de ce salon ne s’appliquent qu’aux futurs messages", "Changes your display nickname": "Change votre nom affiché", "Claimed Ed25519 fingerprint key": "Clé d'empreinte Ed25519 déclarée", @@ -114,11 +107,9 @@ "Failed to set display name": "Échec de l'enregistrement du nom affiché", "Failed to set up conference call": "Échec de l’établissement de la téléconférence", "Failed to toggle moderator status": "Échec de l’activation du statut de modérateur", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s a accepté l’invitation de %(displayName)s.", "Access Token:": "Jeton d’accès :", "Always show message timestamps": "Toujours afficher l'heure des messages", "Authentication": "Authentification", - "%(senderName)s answered the call.": "%(senderName)s a répondu à l’appel.", "An error has occurred.": "Une erreur est survenue.", "Email": "E-mail", "Failed to unban": "Échec de la révocation du bannissement", @@ -131,7 +122,6 @@ "Forget room": "Oublier le salon", "Forgot your password?": "Mot de passe oublié ?", "For security, this session has been signed out. Please sign in again.": "Par mesure de sécurité, la session a expiré. Merci de vous authentifier à nouveau.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s", "Hangup": "Raccrocher", "Hide read receipts": "Cacher les accusés de lecture", "Hide Text Formatting Toolbar": "Cacher la barre de formatage de texte", @@ -145,7 +135,6 @@ "Invalid alias format": "Format d'alias non valide", "Invalid address format": "Format d'adresse non valide", "Invalid Email Address": "Adresse e-mail non valide", - "%(senderName)s invited %(targetName)s.": "%(senderName)s a invité %(targetName)s.", "Invite new room members": "Inviter de nouveaux membres", "Invited": "Invités", "Invites": "Invitations", @@ -155,23 +144,15 @@ "%(displayName)s is typing": "%(displayName)s écrit", "Sign in with": "Se connecter avec", "Join Room": "Rejoindre le salon", - "%(targetName)s joined the room.": "%(targetName)s a rejoint le salon.", "Joins room with given alias": "Rejoint le salon avec l'alias renseigné", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s a exclu %(targetName)s.", "Kick": "Exclure", "Kicks user with given id": "Exclut l'utilisateur à partir de son identifiant", "Labs": "Laboratoire", "Leave room": "Quitter le salon", - "%(targetName)s left the room.": "%(targetName)s a quitté le salon.", "Local addresses for this room:": "Adresses locales pour ce salon :", "Logged in as:": "Identifié en tant que :", "Logout": "Se déconnecter", "Low priority": "Priorité basse", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont été invités.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont rejoint.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s a rendu l'historique visible à tous les membres du salon.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s a rendu l'historique visible à n'importe qui.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s a rendu l'historique visible à inconnu (%(visibility)s).", "Manage Integrations": "Gestion des intégrations", "Markdown is disabled": "Le formatage Markdown est désactivé", "Markdown is enabled": "Le formatage Markdown est activé", @@ -220,7 +201,6 @@ "Mute": "Mettre en sourdine", "No users have specific privileges in this room": "Aucun utilisateur n’a de privilège spécifique dans ce salon", "olm version:": "version de olm :", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s a passé un appel %(callType)s.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Veuillez vérifier vos e-mails et cliquer sur le lien que vous avez reçu. Puis cliquez sur continuer.", "Power level must be positive integer.": "Le niveau d'autorité doit être un entier positif.", "Privacy warning": "Alerte de confidentialité", @@ -229,13 +209,9 @@ "Reason": "Raison", "Revoke Moderator": "Révoquer le modérateur", "Refer a friend to Riot:": "Recommander Riot à un ami :", - "%(targetName)s rejected the invitation.": "%(targetName)s a rejeté l’invitation.", "Reject invitation": "Rejeter l'invitation", "Remove Contact Information?": "Supprimer les informations du contact ?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s a supprimé son nom affiché (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s a supprimé son image de profil.", "Remove %(threePid)s?": "Supprimer %(threePid)s ?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s a demandé une téléconférence audio.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Pour le moment, réinitialiser le mot de passe va réinitialiser les clés de chiffrement sur tous les appareils, rendant l’historique des salons chiffrés illisible, à moins que vous exportiez d'abord les clés de salon puis que vous les ré-importiez après. Cela sera amélioré prochainement.", "Return to login screen": "Retourner à l’écran de connexion", "Riot does not have permission to send you notifications - please check your browser settings": "Riot n’a pas la permission de vous envoyer des notifications - merci de vérifier les paramètres de votre navigateur", @@ -254,7 +230,6 @@ "Send Invites": "Envoyer des invitations", "Send Reset Email": "Envoyer l'e-mail de réinitialisation", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s a envoyé une image.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s a invité %(targetDisplayName)s à rejoindre le salon.", "Server error": "Erreur du serveur", "Server may be unavailable or overloaded": "Le serveur semble être inaccessible ou surchargé", "Server may be unavailable, overloaded, or search timed out :(": "Le serveur semble être inaccessible, surchargé ou la recherche a expiré :(", @@ -262,8 +237,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Le serveur semble être indisponible, surchargé ou vous avez rencontré un problème.", "Server unavailable, overloaded, or something else went wrong.": "Le serveur semble être inaccessible, surchargé ou quelque chose s'est mal passé.", "Session ID": "Identifiant de session", - "%(senderName)s set a profile picture.": "%(senderName)s a défini une image de profil.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a défini son nom affiché comme %(displayName)s.", "Show panel": "Dévoiler le panneau", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Afficher l’heure au format am/pm (par ex. 2:30pm)", "Signed Out": "Déconnecté", @@ -298,12 +271,10 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Un instant donné de la chronologie n’a pu être chargé car il n’a pas pu être trouvé.", "Turn Markdown off": "Désactiver le formatage ’Markdown’", "Turn Markdown on": "Activer le formatage ’Markdown’", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s a activé le chiffrement de bout-en-bout (algorithme %(algorithm)s).", "Unable to add email address": "Impossible d'ajouter l'adresse e-mail", "Unable to remove contact information": "Impossible de supprimer les informations du contact", "Unable to verify email address.": "Impossible de vérifier l’adresse e-mail.", "Unban": "Révoquer le bannissement", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s a révoqué le bannissement de %(targetName)s.", "Unable to capture screen": "Impossible de capturer l'écran", "Unable to enable Notifications": "Impossible d'activer les notifications", "Unable to load device list": "Impossible de charger la liste des appareils", @@ -336,7 +307,6 @@ "Who can read history?": "Qui peut lire l'historique ?", "Who would you like to add to this room?": "Qui voulez-vous ajouter à ce salon ?", "Who would you like to communicate with?": "Avec qui voulez-vous communiquer ?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s a annulé l’invitation de %(targetName)s.", "You are already in a call.": "Vous avez déjà un appel en cours.", "You are trying to access %(roomName)s.": "Vous essayez d'accéder à %(roomName)s.", "You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.", @@ -405,7 +375,6 @@ "bullet": "liste à puces", "numbullet": "liste numérotée", "Please select the destination room for this message": "Merci de sélectionner le salon de destination pour ce message", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s a supprimé le nom du salon.", "Analytics": "Collecte de données", "Riot collects anonymous analytics to allow us to improve the application.": "Riot collecte des données anonymes qui nous permettent d’améliorer l’application.", "Passphrases must match": "Les phrases de passe doivent être identiques", @@ -485,9 +454,6 @@ "Options": "Options", "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?": "Vous êtes sur le point d’accéder à un site tiers afin de pouvoir vous identifier pour utiliser %(integrationsUrl)s. Voulez-vous continuer ?", "Removed or unknown message type": "Type de message inconnu ou supprimé", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s a changé l’avatar du salon en <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s a supprimé l'avatar du salon.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s a changé l’avatar de %(roomName)s", "Device already verified!": "Appareil déjà vérifié !", "Export": "Exporter", "Guest access is disabled on this Home Server.": "L’accès en tant que visiteur est désactivé sur ce serveur d'accueil.", @@ -655,8 +621,6 @@ "Failed to upload image": "Impossible d'envoyer l'image", "Hide avatars in user and room mentions": "Masquer les avatars dans les mentions d'utilisateur et de salon", "Do you want to load widget from URL:": "Voulez-vous charger le widget depuis l’URL :", - "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s ajouté par %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s supprimé par %(senderName)s", "Publish this room to the public in %(domain)s's room directory?": "Publier ce salon dans le répertoire de salons public de %(domain)s ?", "Integrations Error": "Erreur d'intégration", "Cannot add any more widgets": "Impossible d'ajouter plus de widgets", @@ -667,7 +631,6 @@ "Copied!": "Copié !", "Failed to copy": "Échec de la copie", "Verifies a user, device, and pubkey tuple": "Vérifie un utilisateur, un appareil et une clé publique", - "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modifié par %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "La vérification robot n'est pas encore disponible pour le bureau - veuillez utiliser un <a>navigateur</a>", "Who would you like to add to this community?": "Qui souhaitez-vous ajouter à cette communauté ?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Attention : toute personne ajoutée à une communauté sera visible par tous ceux connaissant l'identifiant de la communauté", @@ -712,7 +675,6 @@ "To modify widgets in the room, you must be a": "Pour modifier les widgets, vous devez être un", "Banned by %(displayName)s": "Banni par %(displayName)s", "To send messages, you must be a": "Pour envoyer des messages, vous devez être un(e)", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s a changé les messages épinglés du salon.", "%(names)s and %(count)s others are typing|other": "%(names)s et %(count)s autres écrivent", "Jump to read receipt": "Aller à l'accusé de lecture", "World readable": "Lisible publiquement", @@ -955,7 +917,6 @@ "Community IDs cannot not be empty.": "Les identifiants de communauté ne peuvent pas être vides.", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Afficher les appareils</showDevicesText>, <sendAnywayText>envoyer quand même</sendAnywayText> ou <cancelText>annuler</cancelText>.", "<a>In reply to</a> <pill>": "<a>En réponse à</a> <pill>", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s a changé son nom affiché en %(displayName)s.", "Failed to set direct chat tag": "Échec de l'ajout de l'étiquette discussion directe", "Failed to remove tag %(tagName)s from room": "Échec de la suppression de l'étiquette %(tagName)s du salon", "Failed to add tag %(tagName)s to room": "Échec de l'ajout de l'étiquette %(tagName)s au salon", @@ -1195,5 +1156,44 @@ "Share Room Message": "Partager le message du salon", "Link to selected message": "Lien vers le message sélectionné", "COPY": "COPIER", - "Share Message": "Partager le message" + "Share Message": "Partager le message", + "<target> accepted the invitation for %(displayName)s.": "<target> a accepté l’invitation de %(displayName)s.", + "<target> accepted an invitation.": "<target> a accepté une invitation.", + "<sender> requested a VoIP conference.": "<sender> a demandé une téléconférence audio.", + "<sender> invited <target>.": "<sender> a invité <target>.", + "<sender> banned <target>.": "<sender> a banni <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> a changé son nom affiché en <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> a défini son nom affiché comme <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> a supprimé son nom affiché (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> a supprimé son image de profil.", + "<sender> changed their profile picture.": "<sender> a changé son image de profil.", + "<sender> set a profile picture.": "<sender> a défini une image de profil.", + "<target> joined the room.": "<target> a rejoint le salon.", + "<target> rejected the invitation.": "<target> a rejeté l’invitation.", + "<target> left the room.": "<target> a quitté le salon.", + "<sender> unbanned <target>.": "<sender> a révoqué le bannissement de <target>.", + "<sender> kicked <target>.": "<sender> a exclu <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> a annulé l’invitation de <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> a changé le sujet du salon en \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> a changé le nom du salon en %(roomName)s.", + "<sender> changed the room avatar to <img/>": "<sender> a changé l’avatar du salon en <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> a changé l’avatar de %(roomName)s", + "<sender> removed the room name.": "<sender> a supprimé le nom du salon.", + "<sender> removed the room avatar.": "<sender> a supprimé l'avatar du salon.", + "<sender> answered the call.": "<sender> a répondu à l’appel.", + "<sender> ended the call.": "<sender> a terminé l’appel.", + "<sender> placed a %(callType)s call.": "<sender> a passé un appel %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> a invité %(targetDisplayName)s à rejoindre le salon.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont été invités.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont rejoint.", + "<sender> made future room history visible to all room members.": "<sender> a rendu l'historique visible à tous les membres du salon.", + "<sender> made future room history visible to anyone.": "<sender> a rendu l'historique visible à n'importe qui.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> a rendu l'historique visible à inconnu (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> a activé le chiffrement de bout-en-bout (algorithme %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s à %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> a changé le rang de %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> a changé les messages épinglés du salon.", + "%(widgetName)s widget modified by <sender>": "Widget %(widgetName)s modifié par <sender>", + "%(widgetName)s widget added by <sender>": "Widget %(widgetName)s ajouté par <sender>", + "%(widgetName)s widget removed by <sender>": "Widget %(widgetName)s supprimé par <sender>" } diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 57d8301df6..f61389ad9b 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -111,49 +111,14 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "A chave de firma que proporcionou concorda coa chave de firma que recibiu do dispositivo %(deviceId)s de %(userId)s. Dispositivo marcado como verificado.", "Unrecognised command:": "Orde non recoñecida:", "Reason": "Razón", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceptou o convite para %(displayName)s.", - "%(targetName)s accepted an invitation.": "%(targetName)s aceptou o convite.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s solicitou unha conferencia VoIP.", - "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou a %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s bloqueou a %(targetName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s estableceu o seu nome público a %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s eliminou o seu nome público (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s eliminou a súa imaxe de perfil.", - "%(senderName)s changed their profile picture.": "%(senderName)s cambiou a súa imaxe de perfil.", - "%(senderName)s set a profile picture.": "%(senderName)s estableceu a imaxe de perfil.", "VoIP conference started.": "Comezou a conferencia VoIP.", - "%(targetName)s joined the room.": "%(targetName)s uniuse a sala.", "VoIP conference finished.": "Rematou a conferencia VoIP.", - "%(targetName)s rejected the invitation.": "%(targetName)s rexeitou a invitación.", - "%(targetName)s left the room.": "%(targetName)s deixou a sala.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desbloqueou a %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s expulsou a %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s rexeitou o convite de %(targetName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s cambiou o asunto a \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s eliminou o nome da sala.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s cambiou o nome da sala a %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou unha imaxe.", "Someone": "Alguén", "(not supported by this browser)": "(non soportado por este navegador)", - "%(senderName)s answered the call.": "%(senderName)s respondeu a chamada.", "(could not connect media)": "(non puido conectar os medios)", "(no answer)": "(sen resposta)", "(unknown failure: %(reason)s)": "(fallo descoñecido: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s rematou a chamada.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s estableceu unha chamada %(callType)s.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou un convite a %(targetDisplayName)s para unirse a sala.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s fixo o historial da sala visible para todos os participantes, desde o punto en que foron convidadas.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s estableceu o historial futuro visible a todos os participantes, desde o punto en que se uniron.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s fixo visible para todos participantes o historial futuro da sala.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s fixo visible para calquera o historial futuro da sala.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s fixo visible o historial futuro da sala para descoñecidos (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s activou o cifrado de par-a-par (algoritmo %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s desde %(fromPowerLevel)s a %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s cambiou o nivel de autoridade a %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s cambiou as mensaxes fixadas para a sala.", - "%(widgetName)s widget modified by %(senderName)s": "O trebello %(widgetName)s modificado por %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "O trebello %(widgetName)s engadido por %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s eliminado por %(senderName)s", "%(displayName)s is typing": "%(displayName)s está a escribir", "%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras están a escribir", "%(names)s and %(count)s others are typing|one": "%(names)s e outra está a escribir", @@ -472,9 +437,6 @@ "Invalid file%(extra)s": "Ficheiro non válido %(extra)s", "Error decrypting image": "Fallo ao descifrar a imaxe", "Error decrypting video": "Fallo descifrando vídeo", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s cambiou o avatar para %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s eliminou o avatar da sala.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s cambiou o avatar da sala a <img/>", "Copied!": "Copiado!", "Failed to copy": "Fallo ao copiar", "Add an Integration": "Engadir unha integración", @@ -949,7 +911,6 @@ "<a>In reply to</a> <pill>": "<a>En resposta a</a> <pill>", "This room is not public. You will not be able to rejoin without an invite.": "Esta sala non é pública. Non poderá volver a ela sen un convite.", "This room is not showing flair for any communities": "Esta sala non mostra popularidade para as comunidades", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s cambiou o seu nome mostrado a %(displayName)s.", "Clear filter": "Quitar filtro", "Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo", "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", @@ -1195,5 +1156,44 @@ "Review terms and conditions": "Revise os termos e condicións", "No Audio Outputs detected": "Non se detectou unha saída de audio", "Audio Output": "Saída de audio", - "Try the app first": "Probe a aplicación primeiro" + "Try the app first": "Probe a aplicación primeiro", + "<target> accepted the invitation for %(displayName)s.": "<target> aceptou o convite para %(displayName)s.", + "<target> accepted an invitation.": "<target> aceptou o convite.", + "<sender> requested a VoIP conference.": "<sender> solicitou unha conferencia VoIP.", + "<sender> invited <target>.": "<sender> convidou a <target>.", + "<sender> banned <target>.": "<sender> bloqueou a <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> cambiou o seu nome mostrado a <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> estableceu o seu nome público a <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> eliminou o seu nome público (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> eliminou a súa imaxe de perfil.", + "<sender> changed their profile picture.": "<sender> cambiou a súa imaxe de perfil.", + "<sender> set a profile picture.": "<sender> estableceu a imaxe de perfil.", + "<target> joined the room.": "<target> uniuse a sala.", + "<target> rejected the invitation.": "<target> rexeitou a invitación.", + "<target> left the room.": "<target> deixou a sala.", + "<sender> unbanned <target>.": "<sender> desbloqueou a <target>.", + "<sender> kicked <target>.": "<sender> expulsou a <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> rexeitou o convite de <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> cambiou o asunto a \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> cambiou o nome da sala a %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> cambiou o avatar para %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> cambiou o avatar da sala a <img/>", + "<sender> removed the room name.": "<sender> eliminou o nome da sala.", + "<sender> removed the room avatar.": "<sender> eliminou o avatar da sala.", + "<sender> answered the call.": "<sender> respondeu a chamada.", + "<sender> ended the call.": "<sender> rematou a chamada.", + "<sender> placed a %(callType)s call.": "<sender> estableceu unha chamada %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> enviou un convite a %(targetDisplayName)s para unirse a sala.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> fixo o historial da sala visible para todos os participantes, desde o punto en que foron convidadas.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> estableceu o historial futuro visible a todos os participantes, desde o punto en que se uniron.", + "<sender> made future room history visible to all room members.": "<sender> fixo visible para todos participantes o historial futuro da sala.", + "<sender> made future room history visible to anyone.": "<sender> fixo visible para calquera o historial futuro da sala.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> fixo visible o historial futuro da sala para descoñecidos (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> activou o cifrado de par-a-par (algoritmo %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> desde %(fromPowerLevel)s a %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> cambiou o nivel de autoridade a %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> cambiou as mensaxes fixadas para a sala.", + "%(widgetName)s widget modified by <sender>": "O trebello %(widgetName)s modificado por <sender>", + "%(widgetName)s widget added by <sender>": "O trebello %(widgetName)s engadido por <sender>", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s eliminado por <sender>" } diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 2aea205a15..d0a87414d1 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -16,8 +16,6 @@ "unknown error code": "ismeretlen hibakód", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Elküldtük a szöveges üzenetet ide: +%(msisdn)s. Kérlek add meg az ellenőrző kódot ami benne van", "Accept": "Elfogad", - "%(targetName)s accepted an invitation.": "%(targetName)s elfogadta a meghívást.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s elfogadta a meghívást ide: %(displayName)s.", "Account": "Fiók", "Access Token:": "Elérési kulcs:", "Active call (%(roomName)s)": "Hívás folyamatban (%(roomName)s)", @@ -53,7 +51,6 @@ "and %(count)s others...|one": "és még egy...", "%(names)s and %(lastPerson)s are typing": "%(names)s és %(lastPerson)s írnak", "A new password must be entered.": "Új jelszót kell megadni.", - "%(senderName)s answered the call.": "%(senderName)s felvette a telefont.", "An error has occurred.": "Hiba történt.", "Anyone": "Bárki", "Anyone who knows the room's link, apart from guests": "A vendégeken kívül bárki aki ismeri a szoba link-jét", @@ -64,7 +61,6 @@ "Are you sure you want to upload the following files?": "Biztos feltöltöd ezeket a fájlokat?", "Attachment": "Csatolmány", "Autoplay GIFs and videos": "GIF-ek és videók automatikus lejátszása", - "%(senderName)s banned %(targetName)s.": "%(senderName)s kitiltotta őt: %(targetName)s.", "Ban": "Kitilt", "Banned users": "Kitiltott felhasználók", "Bans user with given id": "Kitiltja a felhasználót a megadott ID-vel", @@ -75,11 +71,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nem lehet csatlakozni a saját szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</a>.", "Can't load user settings": "A felhasználói beállítások nem tölthetők be", "Change Password": "Jelszó megváltoztatása", - "%(senderName)s changed their profile picture.": "%(senderName)s megváltoztatta a profil képét.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s megváltoztatta a hozzáférési szintjét erre: %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s megváltoztatta a szoba nevét erre: %(roomName)s.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s törölte a szoba nevét.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s megváltoztatta a témát erre \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Változtatások a napló olvasási jogosultságon csak a szoba új üzeneteire fog vonatkozni", "Changes your display nickname": "Becenév megváltoztatása", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Jelszó megváltoztatása jelenleg alaphelyzetbe állítja a titkosításnál használt kulcsokat minden készüléken, ezzel a régi titkosított üzenetek olvashatatlanok lesznek hacsak először nem mented ki a kulcsokat és újra betöltöd. A jövőben ezen javítunk.", @@ -150,7 +141,6 @@ "Encrypted room": "Titkosított szoba", "Encryption is enabled in this room": "Ebben a szobában a titkosítás be van kapcsolva", "Encryption is not enabled in this room": "Ebben a szobában a titkosítás nincs bekapcsolva", - "%(senderName)s ended the call.": "%(senderName)s befejezte a hívást.", "End-to-end encryption information": "Ponttól pontig való titkosítási információk", "End-to-end encryption is in beta and may not be reliable": "Ponttól pontig tartó titkosítás béta állapotú és lehet, hogy nem megbízható", "Enter Code": "Kód megadása", @@ -190,7 +180,6 @@ "Forgot your password?": "Elfelejtetted a jelszavad?", "For security, this session has been signed out. Please sign in again.": "A biztonság érdekében ez a kapcsolat le lesz bontva. Légy szíves jelentkezz be újra.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "A biztonság érdekében a kilépéskor a ponttól pontig való (E2E) titkosításhoz szükséges kulcsok törlésre kerülnek a böngészőből. Ha a régi üzeneteket továbbra is el szeretnéd olvasni, kérlek mentsed ki a szobákhoz tartozó kulcsot.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s : %(fromPowerLevel)s -> %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Vendég belépés tiltva van a Saját szerveren.", "Guests cannot join this room even if explicitly invited.": "Vendégek akkor sem csatlakozhatnak ehhez a szobához ha külön meghívók kaptak.", "Hangup": "Megszakít", @@ -213,7 +202,6 @@ "Invalid address format": "Hibás cím formátum", "Invalid Email Address": "Hibás e-mail cím", "Invalid file%(extra)s": "Hibás fájl%(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s meghívta: %(targetName)s.", "Invite new room members": "Új tagok meghívása", "Invited": "Meghívva", "Invites": "Meghívók", @@ -224,26 +212,18 @@ "Sign in with": "Belépés ezzel:", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Csatlakozás <voiceText>hang</voiceText>gal vagy <videoText>videó</videoText>val.", "Join Room": "Belépés a szobába", - "%(targetName)s joined the room.": "%(targetName)s belépett a szobába.", "Joins room with given alias": "A megadott becenévvel belépett a szobába", "Jump to first unread message.": "Ugrás az első olvasatlan üzenetre.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s kizárta: %(targetName)s.", "Kick": "Kirúg", "Kicks user with given id": "Az adott azonosítójú felhasználó kirúgása", "Labs": "Labor", "Last seen": "Utoljára láttuk", "Leave room": "Szoba elhagyása", - "%(targetName)s left the room.": "%(targetName)s elhagyta a szobát.", "Level:": "Szint:", "Local addresses for this room:": "A szoba helyi címe:", "Logged in as:": "Bejelentkezve mint:", "Logout": "Kilép", "Low priority": "Alacsony prioritás", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta meg van hívva.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta csatlakozott.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik minden szoba tagság.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik bárki.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik ismeretlen (%(visibility)s).", "Manage Integrations": "Integrációk kezelése", "Markdown is disabled": "Markdown kikapcsolva", "Markdown is enabled": "Markdown engedélyezett", @@ -282,7 +262,6 @@ "People": "Emberek", "Permissions": "Jogosultságok", "Phone": "Telefon", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s %(callType)s hívást kezdeményezett.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ellenőrizd az e-mail-edet és kattints a benne lévő linkre. Ha ez megvan, kattints a folytatásra.", "Power level must be positive integer.": "A szintnek pozitív egésznek kell lennie.", "Private Chat": "Privát csevegés", @@ -294,15 +273,11 @@ "Revoke Moderator": "Moderátor visszahívása", "Refer a friend to Riot:": "Ismerős meghívása a Riotba:", "Register": "Regisztráció", - "%(targetName)s rejected the invitation.": "%(targetName)s elutasította a meghívót.", "Reject invitation": "Meghívó elutasítása", "Rejoin": "Újracsatlakozás", "Remote addresses for this room:": "A szoba távoli címei:", "Remove Contact Information?": "Kapcsolat információk törlése?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s törölte a megjelenítési nevet (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s törölte a profil képét.", "Remove %(threePid)s?": "Töröl: %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s VoIP konferenciát kezdeményez.", "Results from DuckDuckGo": "Eredmények a DuckDuckGo-ból", "Return to login screen": "Vissza a bejelentkezési képernyőre", "Riot does not have permission to send you notifications - please check your browser settings": "Riotnak nincs jogosultsága értesítést küldeni neked - ellenőrizd a böngésző beállításait", @@ -326,7 +301,6 @@ "Send Invites": "Meghívók elküldése", "Send Reset Email": "Visszaállítási e-mail küldése", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s képet küldött.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.", "Server error": "Szerver hiba", "Server may be unavailable or overloaded": "A szerver elérhetetlen vagy túlterhelt", "Server may be unavailable, overloaded, or search timed out :(": "A szerver elérhetetlen, túlterhelt vagy a keresés túllépte az időkorlátot :(", @@ -334,8 +308,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "A szerver elérhetetlen, túlterhelt vagy hibára futott.", "Server unavailable, overloaded, or something else went wrong.": "A szerver elérhetetlen, túlterhelt vagy valami más probléma van.", "Session ID": "Kapcsolat azonosító", - "%(senderName)s set a profile picture.": "%(senderName)s profil képet állított be.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a megjelenítési nevét megváltoztatta erre: %(displayName)s.", "Show panel": "Panel megjelenítése", "Show Text Formatting Toolbar": "Szöveg formázási eszköztár megjelenítése", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Az időbélyegek 12 órás formátumban mutatása (pl.: 2:30pm)", @@ -381,12 +353,10 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő adatait, de nem találom.", "Turn Markdown off": "Markdown kikapcsolása", "Turn Markdown on": "Markdown bekapcsolása", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a titkosítást ponttól pontig (algoritmus %(algorithm)s).", "Unable to add email address": "Az e-mail címet nem sikerült hozzáadni", "Unable to remove contact information": "A névjegy információkat nem sikerült törölni", "Unable to verify email address.": "Az e-mail cím ellenőrzése sikertelen.", "Unban": "Kitiltás visszavonása", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s visszaengedte %(targetName)s felhasználót.", "Unable to capture screen": "A képernyő felvétele sikertelen", "Unable to enable Notifications": "Az értesítések engedélyezése sikertelen", "Unable to load device list": "Az eszközlista betöltése sikertelen", @@ -440,7 +410,6 @@ "Who can read history?": "Ki olvashatja a régi üzeneteket?", "Who would you like to add to this room?": "Kit szeretnél hozzáadni ehhez a szobához?", "Who would you like to communicate with?": "Kivel szeretnél beszélgetni?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s visszavonta %(targetName)s meghívóját.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Ezt a meghívót szeretnéd <acceptText>elfogadni</acceptText> vagy <declineText>elutasítani</declineText>?", "You already have existing direct chats with this user:": "Már van közvetlen csevegésed ezzel a felhasználóval:", "You are already in a call.": "Már hívásban vagy.", @@ -590,9 +559,6 @@ "Start chatting": "Csevegés indítása", "Start Chatting": "Csevegés indítása", "Click on the button below to start chatting!": "Csevegés indításához kattints a gombra alább!", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s megváltoztatta a szoba avatar képét: <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s törölte a szoba avatar képét.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s megváltoztatta %(roomName)s szoba avatar képét", "Username available": "Szabad felhasználói név", "Username not available": "A felhasználói név foglalt", "Something went wrong!": "Valami tönkrement!", @@ -664,10 +630,7 @@ "Publish this room to the public in %(domain)s's room directory?": "Publikálod a szobát a(z) %(domain)s szoba listájába?", "NOTE: Apps are not end-to-end encrypted": "Megjegyzés: Az alkalmazások nem végponttól végpontig titkosítottak", "The maximum permitted number of widgets have already been added to this room.": "A maximálisan megengedett számú kisalkalmazás már hozzá van adva a szobához.", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s hozzáadta", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s eltávolította", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot ellenőrzés az asztali verzióban nem érhető el - használd a <a>web böngészőt</a>", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s módosította", "Copied!": "Lemásolva!", "Failed to copy": "Sikertelen másolás", "Advanced options": "További beállítások", @@ -736,7 +699,6 @@ "Message Pinning": "Üzenet kitűzése", "Remove avatar": "Avatar törlése", "Pinned Messages": "Kitűzött üzenetek", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s megváltoztatta a szoba kitűzött szövegeit.", "Who would you like to add to this community?": "Kit szeretnél hozzáadni ehhez a közösséghez?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Figyelem: minden személy akit hozzáadsz a közösséghez mindenki számára látható lesz aki ismeri a közösség azonosítóját", "Invite new community members": "Új tagok meghívása a közösségbe", @@ -955,7 +917,6 @@ "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Eszközök listája</showDevicesText>, <sendAnywayText>mindenképpen küld</sendAnywayText> vagy <cancelText>szakítsd meg</cancelText>.", "Community IDs cannot not be empty.": "A közösségi azonosító nem lehet üres.", "<a>In reply to</a> <pill>": "<a>Válaszolva neki</a> <pill>", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s megváltoztatta a nevét erre: %(displayName)s.", "Failed to set direct chat tag": "Nem sikerült a közvetlen beszélgetés jelzést beállítani", "Failed to remove tag %(tagName)s from room": "Nem sikerült a szobáról eltávolítani ezt: %(tagName)s", "Failed to add tag %(tagName)s to room": "Nem sikerült hozzáadni a szobához ezt: %(tagName)s", @@ -1195,5 +1156,44 @@ "Share Room Message": "Szoba üzenet megosztás", "Link to selected message": "Hivatkozás a kijelölt üzenetre", "COPY": "Másol", - "Share Message": "Üzenet megosztása" + "Share Message": "Üzenet megosztása", + "<target> accepted the invitation for %(displayName)s.": "<target> elfogadta a meghívást ide: %(displayName)s.", + "<target> accepted an invitation.": "<target> elfogadta a meghívást.", + "<sender> requested a VoIP conference.": "<sender> VoIP konferenciát kezdeményez.", + "<sender> invited <target>.": "<sender> meghívta: <target>.", + "<sender> banned <target>.": "<sender> kitiltotta őt: <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> megváltoztatta a nevét erre: <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> a megjelenítési nevét megváltoztatta erre: <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> törölte a megjelenítési nevet (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> törölte a profil képét.", + "<sender> changed their profile picture.": "<sender> megváltoztatta a profil képét.", + "<sender> set a profile picture.": "<sender> profil képet állított be.", + "<target> joined the room.": "<target> belépett a szobába.", + "<target> rejected the invitation.": "<target> elutasította a meghívót.", + "<target> left the room.": "<target> elhagyta a szobát.", + "<sender> unbanned <target>.": "<sender> visszaengedte <target> felhasználót.", + "<sender> kicked <target>.": "<sender> kizárta: <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> visszavonta <target> meghívóját.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> megváltoztatta a témát erre \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> megváltoztatta a szoba nevét erre: %(roomName)s.", + "<sender> changed the room avatar to <img/>": "<sender> megváltoztatta a szoba avatar képét: <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> megváltoztatta %(roomName)s szoba avatar képét", + "<sender> removed the room name.": "<sender> törölte a szoba nevét.", + "<sender> removed the room avatar.": "<sender> törölte a szoba avatar képét.", + "<sender> answered the call.": "<sender> felvette a telefont.", + "<sender> ended the call.": "<sender> befejezte a hívást.", + "<sender> placed a %(callType)s call.": "<sender> %(callType)s hívást kezdeményezett.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta meg van hívva.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta csatlakozott.", + "<sender> made future room history visible to all room members.": "<sender> elérhetővé tette a szoba új üzeneteit nekik minden szoba tagság.", + "<sender> made future room history visible to anyone.": "<sender> elérhetővé tette a szoba új üzeneteit nekik bárki.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> elérhetővé tette a szoba új üzeneteit nekik ismeretlen (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> bekapcsolta a titkosítást ponttól pontig (algoritmus %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> : %(fromPowerLevel)s -> %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> megváltoztatta a hozzáférési szintjét erre: %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> megváltoztatta a szoba kitűzött szövegeit.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s kisalkalmazást <sender> módosította", + "%(widgetName)s widget added by <sender>": "%(widgetName)s kisalkalmazást <sender> hozzáadta", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s kisalkalmazást <sender> eltávolította" } diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index 86605c1d41..a57b337acf 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -146,8 +146,6 @@ "Nov": "Nov", "Dec": "Des", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Sebuah pesan sudah dikirim ke +%(msisdn)s. Mohon masukkan kode verifikasi pada pesan tersebut", - "%(targetName)s accepted an invitation.": "%(targetName)s telah menerima undangan.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s menerima undangan untuk %(displayName)s.", "Access Token:": "Token Akses:", "Active call (%(roomName)s)": "Panggilan aktif (%(roomName)s)", "Admin": "Admin", @@ -165,22 +163,15 @@ "A new password must be entered.": "Password baru harus diisi.", "%(items)s and %(lastItem)s": "%(items)s dan %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s dan %(lastPerson)s sedang mengetik", - "%(senderName)s answered the call.": "%(senderName)s telah menjawab panggilan.", "Anyone who knows the room's link, including guests": "Siapa pun yang tahu tautan ruang, termasuk tamu", "Anyone who knows the room's link, apart from guests": "Siapa pun yang tahu tautan ruang, selain tamu", "Are you sure you want to upload the following files?": "Anda yakin akan mengunggah berkas-berkas berikut?", "Blacklisted": "Didaftarhitamkan", - "%(senderName)s banned %(targetName)s.": "%(senderName)s telah memblokir %(targetName)s.", "Banned users": "Pengguna yang diblokir", "Bulk Options": "Opsi Massal", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Tidak dapat terhubung ke server Home - harap cek koneksi anda, pastikan <a>sertifikat SSL server Home</a> Anda terpercaya, dan ekstensi dari browser tidak memblokir permintaan.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Tidak dapat terhubung ke server Home melalui HTTP ketika URL di browser berupa HTTPS. Pilih gunakan HTTPS atau <a>aktifkan skrip yang tidak aman</a>.", - "%(senderName)s changed their profile picture.": "%(senderName)s telah mengubah foto profilnya.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s telah mengubah tingkat kekuatan dari %(powerLevelDiffText)s.", "Changes your display nickname": "Ubah tampilan nama panggilan Anda", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s telah menghapus nama ruang.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s telah mengubah nama ruang menjadi %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s telah mengubah topik menjadi \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Pengubahan siapa yang dapat membaca sejarah akan berlaku untuk pesan selanjutnya di ruang ini", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Mengubah password saat ini akan mengatur ulang semua kunci enkripsi end-to-end di semua perangkat, menyebabkan sejarah obrolan yang terenkripsi menjadi tidak dapat dibaca, kecuali sebelumnya Anda ekspor dahulu kunci ruang lalu kemudian impor ulang setelahnya. Ke depan hal ini akan diperbaiki.", "<a>Click here</a> to join the discussion!": "<a>Klik di sini</a> untuk gabung diskusi!", @@ -341,5 +332,14 @@ "Collapse panel": "Lipat panel", "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!": "Dengan browser ini, tampilan dari aplikasi mungkin tidak sesuai, dan beberapa atau bahkan semua fitur mungkin tidak berjalan. Jika Anda ingin tetap mencobanya, Anda bisa melanjutkan, tapi Anda tanggung sendiri jika muncul masalah yang terjadi!", "Checking for an update...": "Cek pembaruan...", - "There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini" + "There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini", + "<target> accepted the invitation for %(displayName)s.": "<target> menerima undangan untuk %(displayName)s.", + "<target> accepted an invitation.": "<target> telah menerima undangan.", + "<sender> banned <target>.": "<sender> telah memblokir <target>.", + "<sender> changed their profile picture.": "<sender> telah mengubah foto profilnya.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> telah mengubah topik menjadi \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> telah mengubah nama ruang menjadi %(roomName)s.", + "<sender> removed the room name.": "<sender> telah menghapus nama ruang.", + "<sender> answered the call.": "<sender> telah menjawab panggilan.", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> telah mengubah tingkat kekuatan dari %(powerLevelDiffText)s." } diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 6770a0ea25..28d2faedf7 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -535,11 +535,7 @@ "Device already verified!": "Tæki er þegar sannreynt!", "Verified key": "Staðfestur dulritunarlykill", "Unrecognised command:": "Óþekkt skipun:", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s breytti umræðuefninu í \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s fjarlægði heiti spjallrásarinnar.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s breytti heiti spjallrásarinnar í %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendi mynd.", - "%(senderName)s answered the call.": "%(senderName)s svaraði símtalinu.", "Disinvite": "Taka boð til baka", "Unknown Address": "Óþekkt vistfang", "Delete Widget": "Eyða viðmótshluta", @@ -641,5 +637,9 @@ "Notify the whole room": "Tilkynna öllum á spjallrásinni", "Room Notification": "Tilkynning á spjallrás", "Passphrases must match": "Lykilfrasar verða að stemma", - "Passphrase must not be empty": "Lykilfrasi má ekki vera auður" + "Passphrase must not be empty": "Lykilfrasi má ekki vera auður", + "<sender> changed the topic to \"%(topic)s\".": "<sender> breytti umræðuefninu í \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> breytti heiti spjallrásarinnar í %(roomName)s.", + "<sender> removed the room name.": "<sender> fjarlægði heiti spjallrásarinnar.", + "<sender> answered the call.": "<sender> svaraði símtalinu." } diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 0957bc156d..4506b20f9f 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -20,8 +20,6 @@ "OK": "OK", "Failed to change password. Is your password correct?": "Modifica password fallita. La tua password è corretta?", "Continue": "Continua", - "%(targetName)s accepted an invitation.": "%(targetName)s ha accettato un invito.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha accettato l'invito per %(displayName)s.", "Account": "Account", "Access Token:": "Token di Accesso:", "Add": "Aggiungi", @@ -113,7 +111,6 @@ "Conference calling is in development and may not be reliable.": "Le chiamate di gruppo sono in sviluppo e potrebbero essere inaffidabili.", "Failed to set up conference call": "Impostazione della chiamata di gruppo fallita", "Conference call failed.": "Chiamata di gruppo fallita.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s ha richiesto una conferenza VoIP.", "VoIP conference started.": "Conferenza VoIP iniziata.", "VoIP conference finished.": "Conferenza VoIP terminata.", "Ongoing conference call%(supportedText)s.": "Chiamata di gruppo in corso%(supportedText)s.", @@ -178,44 +175,12 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La chiave che hai fornito corrisponde alla chiave che hai ricevuto dal dispositivo %(deviceId)s di %(userId)s . Dispositivo segnato come verificato.", "Unrecognised command:": "Comando non riconosciuto:", "Reason": "Motivo", - "%(senderName)s invited %(targetName)s.": "%(senderName)s ha invitato %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s ha bandito %(targetName)s.", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha modificato il proprio nome in %(displayName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ha impostato il proprio nome a %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha rimosso il proprio nome visibile (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s ha rimosso la propria immagine del profilo.", - "%(senderName)s changed their profile picture.": "%(senderName)s ha cambiato la propria immagine del profilo.", - "%(senderName)s set a profile picture.": "%(senderName)s ha impostato un'immagine del profilo.", - "%(targetName)s joined the room.": "%(targetName)s è entrato nella stanza.", - "%(targetName)s rejected the invitation.": "%(targetName)s ha rifiutato l'invito.", - "%(targetName)s left the room.": "%(targetName)s è uscito dalla stanza.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha rimosso il ban a %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha cacciato %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha revocato l'invito per %(targetName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha modificato l'argomento in \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha rimosso il nome della stanza.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha modificato il nome della stanza in %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ha inviato un'immagine.", "Someone": "Qualcuno", "(not supported by this browser)": "(non supportato da questo browser)", - "%(senderName)s answered the call.": "%(senderName)s ha risposto alla chiamata.", "(could not connect media)": "(connessione del media non riuscita)", "(no answer)": "(nessuna risposta)", "(unknown failure: %(reason)s)": "(errore sconosciuto: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s ha terminato la chiamata.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha avviato una chiamata %(callType)s .", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ha mandato un invito a %(targetDisplayName)s per unirsi alla stanza.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento del loro invito.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento in cui sono entrati.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha reso visibile la futura cronologia della stanza a (%(visibility)s) sconosciuto.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha attivato la crottografia end-to-end (algoritmo %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s da %(fromPowerLevel)s a %(toPowerLevel)s", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha cambiato il messaggio ancorato della stanza.", - "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificato da %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s aggiunto da %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s rimosso da %(senderName)s", "%(displayName)s is typing": "%(displayName)s sta scrivendo", "%(names)s and %(count)s others are typing|other": "%(names)s e altri %(count)s stanno scrivendo", "%(names)s and %(count)s others are typing|one": "%(names)s e un altro stanno scrivendo", @@ -416,7 +381,6 @@ "Historical": "Cronologia", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Impossibile verificare che l'indirizzo al quale questo invito è stato inviato corrisponda a uno associato al tuo account.", "Power level must be positive integer.": "Il livello di poteri deve essere un intero positivo.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha modificato il livello di poteri di %(powerLevelDiffText)s.", "Jump to read receipt": "Salta alla ricevuta di lettura", "This invitation was sent to an email address which is not associated with this account:": "Questo invito è stato mandato a un indirizzo email non associato a questo account:", "You may wish to login with a different account, or add this email to this account.": "Dovresti accedere con un account diverso, o aggiungere questa email all'account.", @@ -518,9 +482,6 @@ "Invalid file%(extra)s": "File non valido %(extra)s", "Error decrypting image": "Errore decifratura immagine", "Error decrypting video": "Errore decifratura video", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha cambiato l'avatar per %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha rimosso l'avatar della stanza.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s ha cambiato l'avatar della stanza a <img/>", "Copied!": "Copiato!", "Failed to copy": "Copia fallita", "Add an Integration": "Aggiungi un'integrazione", @@ -1180,5 +1141,44 @@ "Replying": "Rispondere", "Popout widget": "Oggetto a comparsa", "Failed to indicate account erasure": "Impossibile indicare la cancellazione dell'account", - "Bulk Options": "Opzioni applicate in massa" + "Bulk Options": "Opzioni applicate in massa", + "<target> accepted the invitation for %(displayName)s.": "<target> ha accettato l'invito per %(displayName)s.", + "<target> accepted an invitation.": "<target> ha accettato un invito.", + "<sender> requested a VoIP conference.": "<sender> ha richiesto una conferenza VoIP.", + "<sender> invited <target>.": "<sender> ha invitato <target>.", + "<sender> banned <target>.": "<sender> ha bandito <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> ha modificato il proprio nome in <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> ha impostato il proprio nome a <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> ha rimosso il proprio nome visibile (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> ha rimosso la propria immagine del profilo.", + "<sender> changed their profile picture.": "<sender> ha cambiato la propria immagine del profilo.", + "<sender> set a profile picture.": "<sender> ha impostato un'immagine del profilo.", + "<target> joined the room.": "<target> è entrato nella stanza.", + "<target> rejected the invitation.": "<target> ha rifiutato l'invito.", + "<target> left the room.": "<target> è uscito dalla stanza.", + "<sender> unbanned <target>.": "<sender> ha rimosso il ban a <target>.", + "<sender> kicked <target>.": "<sender> ha cacciato <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> ha revocato l'invito per <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> ha modificato l'argomento in \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> ha modificato il nome della stanza in %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> ha cambiato l'avatar per %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> ha cambiato l'avatar della stanza a <img/>", + "<sender> removed the room name.": "<sender> ha rimosso il nome della stanza.", + "<sender> removed the room avatar.": "<sender> ha rimosso l'avatar della stanza.", + "<sender> answered the call.": "<sender> ha risposto alla chiamata.", + "<sender> ended the call.": "<sender> ha terminato la chiamata.", + "<sender> placed a %(callType)s call.": "<sender> ha avviato una chiamata %(callType)s .", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> ha mandato un invito a %(targetDisplayName)s per unirsi alla stanza.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento del loro invito.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento in cui sono entrati.", + "<sender> made future room history visible to all room members.": "<sender> ha reso visibile la futura cronologia della stanza a tutti i membri della stanza.", + "<sender> made future room history visible to anyone.": "<sender> ha reso visibile la futura cronologia della stanza a tutti.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> ha reso visibile la futura cronologia della stanza a (%(visibility)s) sconosciuto.", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ha attivato la crottografia end-to-end (algoritmo %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> da %(fromPowerLevel)s a %(toPowerLevel)s", + "<sender> changed the pinned messages for the room.": "<sender> ha cambiato il messaggio ancorato della stanza.", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ha modificato il livello di poteri di %(powerLevelDiffText)s.", + "%(widgetName)s widget modified by <sender>": "Widget %(widgetName)s modificato da <sender>", + "%(widgetName)s widget added by <sender>": "Widget %(widgetName)s aggiunto da <sender>", + "%(widgetName)s widget removed by <sender>": "Widget %(widgetName)s rimosso da <sender>" } diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 741de4b551..233430978f 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -17,7 +17,6 @@ "Hide read receipts": "発言を読んでも既読状態にしない", "Invited": "招待中", "%(displayName)s is typing": "%(displayName)s 文字入力中", - "%(targetName)s joined the room.": "%(targetName)s 部屋に参加しました。", "Low priority": "低優先度", "Mute": "通知しない", "New password": "新しいパスワード", @@ -240,5 +239,6 @@ "Checking for an update...": "アップデートを確認しています…", "There are advanced notifications which are not shown here": "ここに表示されない詳細な通知があります", "Call": "通話", - "Answer": "応答" + "Answer": "応答", + "<target> joined the room.": "<target> 部屋に参加しました。" } diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 23b7efd97d..2fb6649f09 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -74,8 +74,6 @@ "Operation failed": "작업 실패", "Failed to change password. Is your password correct?": "비밀번호를 바꾸지 못했어요. 이 비밀번호가 정말 맞으세요?", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "+%(msisdn)s로 문자 메시지를 보냈어요. 인증 번호를 입력해주세요", - "%(targetName)s accepted an invitation.": "%(targetName)s님이 초대를 수락했어요.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s님이 %(displayName)s님에게서 초대를 수락했어요.", "Access Token:": "접근 토큰:", "Active call (%(roomName)s)": "(%(roomName)s)에서 전화를 걸고 받을 수 있어요", "Add a topic": "주제 추가", @@ -85,21 +83,14 @@ "and %(count)s others...|one": "그리고 다른 하나...", "and %(count)s others...|other": "그리고 %(count)s...", "%(names)s and %(lastPerson)s are typing": "%(names)s님과 %(lastPerson)s님이 입력중", - "%(senderName)s answered the call.": "%(senderName)s님이 전화를 받았어요.", "Anyone who knows the room's link, apart from guests": "손님을 제외하고, 방의 주소를 아는 누구나", "Anyone who knows the room's link, including guests": "손님을 포함하여, 방의 주소를 아는 누구나", "Are you sure you want to reject the invitation?": "초대를 거절하시겠어요?", - "%(senderName)s banned %(targetName)s.": "%(senderName)s님이 %(targetName)s님을 차단하셨어요.", "Bans user with given id": "받은 ID로 사용자 차단하기", "Bulk Options": "대규모 설정", "Call Timeout": "전화 대기 시간 초과", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "홈 서버에 연결할 수 없어요 - 연결을 확인해주시고, <a>홈 서버의 SSL 인증서</a>가 믿을 수 있는지 확인하시고, 브라우저 확장기능이 요청을 차단하고 있는지 확인해주세요.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "주소창에 HTTPS URL이 있을 때는 HTTP로 홈 서버를 연결할 수 없어요. HTTPS를 쓰거나 <a>안전하지 않은 스크립트를 허용해주세요</a>.", - "%(senderName)s changed their profile picture.": "%(senderName)s님이 자기 소개 사진을 바꾸셨어요.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s님이 %(powerLevelDiffText)s의 권한 등급을 바꾸셨어요.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s님이 방 이름을 %(roomName)s로 바꾸셨어요.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s님이 방 이름을 지우셨어요.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s님이 주제를 \"%(topic)s\"로 바꾸셨어요.", "Changes to who can read history will only apply to future messages in this room": "방의 이후 메시지부터 기록을 읽을 수 있는 조건의 변화가 적용되어요", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 바꾸면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.", "Claimed Ed25519 fingerprint key": "Ed25519 지문 키가 필요", @@ -151,7 +142,6 @@ "Encrypted room": "암호화한 방", "Encryption is enabled in this room": "이 방은 암호화중이에요", "Encryption is not enabled in this room": "이 방은 암호화하고 있지 않아요", - "%(senderName)s ended the call.": "%(senderName)s님이 전화를 끊었어요.", "End-to-end encryption information": "종단간 암호화 정보", "End-to-end encryption is in beta and may not be reliable": "종단간 암호화는 시험중이며 믿을 수 없어요", "Enter Code": "코드를 입력하세요", @@ -191,7 +181,6 @@ "Forgot your password?": "비밀번호를 잊어버리셨어요?", "For security, this session has been signed out. Please sign in again.": "보안을 위해서, 이 세션에서 로그아웃했어요. 다시 로그인해주세요.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "보안을 위해서, 로그아웃하면 이 브라우저에서 모든 종단간 암호화 키를 없앨 거에요. 이후 라이엇에서 이야기를 해독하고 싶으시면, 방 키를 내보내서 안전하게 보관하세요.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s를 %(fromPowerLevel)s에서 %(toPowerLevel)s로", "Guest access is disabled on this Home Server.": "손님은 이 홈 서버에 접근하실 수 없어요.", "Guests cannot join this room even if explicitly invited.": "손님은 분명하게 초대받았어도 이 방에 들어가실 수 없어요.", "Hangup": "전화 끊기", @@ -215,7 +204,6 @@ "Invalid address format": "주소 형식이 맞지 않아요", "Invalid Email Address": "이메일 주소가 맞지 않아요", "Invalid file%(extra)s": "파일%(extra)s이 맞지 않아요", - "%(senderName)s invited %(targetName)s.": "%(senderName)s님이 %(targetName)s님을 초대하셨어요.", "Invite new room members": "새 구성원 초대하기", "Invited": "초대받기", "Invites": "초대하기", @@ -226,26 +214,18 @@ "Sign in with": "로그인", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "<voiceText>음성</voiceText> 또는 <videoText>영상</videoText>으로 참여하세요.", "Join Room": "방에 들어가기", - "%(targetName)s joined the room.": "%(targetName)s님이 방에 들어오셨어요.", "Joins room with given alias": "받은 가명으로 방에 들어가기", "Jump to first unread message.": "읽지 않은 첫 메시지로 이동할래요.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s님이 %(targetName)s을 내쫓았어요.", "Kick": "내쫓기", "Kicks user with given id": "받은 ID로 사용자 내쫓기", "Labs": "실험실", "Last seen": "마지막으로 본 곳", "Leave room": "방 떠나기", - "%(targetName)s left the room.": "%(targetName)s님이 방을 떠나셨어요.", "Level:": "등급:", "Local addresses for this room:": "이 방의 로컬 주소:", "Logged in as:": "로그인:", "Logout": "로그아웃", "Low priority": "낮은 우선순위", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 초대받은 시점부터.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 방에 들어온 시점부터.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 누구나.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 알 수 없음 (%(visibility)s).", "Manage Integrations": "통합 관리", "Markdown is disabled": "마크다운이 꺼져있어요", "Markdown is enabled": "마크다운이 켜져있어요", @@ -283,7 +263,6 @@ "Phone": "전화", "Once encryption is enabled for a room it cannot be turned off again (for now)": "방을 암호화하면 암호화를 도중에 끌 수 없어요. (현재로서는)", "Only people who have been invited": "초대받은 사람만", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s님이 %(callType)s 전화를 걸었어요.", "Please check your email and click on the link it contains. Once this is done, click continue.": "이메일을 확인하시고 그 안에 있는 주소를 누르세요. 이 일을 하고 나서, 계속하기를 누르세요.", "Power level must be positive integer.": "권한 등급은 양의 정수여야만 해요.", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (권한 %(powerLevelNumber)s)", @@ -292,22 +271,17 @@ "Private Chat": "비공개 이야기", "Privileged Users": "권한 있는 사용자", "Profile": "자기 소개", - "%(senderName)s removed their profile picture.": "%(senderName)s님이 자기 소개 사진을 지우셨어요.", - "%(senderName)s set a profile picture.": "%(senderName)s님이 자기 소개 사진을 설정하셨어요.", "Public Chat": "공개 이야기", "Reason": "이유", "Reason: %(reasonText)s": "이유: %(reasonText)s", "Revoke Moderator": "조정자 철회", "Refer a friend to Riot:": "라이엇을 친구에게 추천해주세요:", "Register": "등록", - "%(targetName)s rejected the invitation.": "%(targetName)s님이 초대를 거절하셨어요.", "Reject invitation": "초대 거절", "Rejoin": "다시 들어가기", "Remote addresses for this room:": "이 방의 원격 주소:", "Remove Contact Information?": "연락처를 지우시겠어요?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s님이 별명 (%(oldDisplayName)s)을 지우셨어요.", "Remove %(threePid)s?": "%(threePid)s 지우시겠어요?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s님이 인터넷전화 회의를 요청하셨어요.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 다시 설정하면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.", "Results from DuckDuckGo": "덕덕고에서 검색한 결과", "Return to login screen": "로그인 화면으로 돌아가기", @@ -332,7 +306,6 @@ "Send Invites": "초대 보내기", "Send Reset Email": "재설정 이메일 보내기", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s님이 사진을 보냈어요.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s님이 %(targetDisplayName)s님에게 들어오라는 초대를 보냈어요.", "Server error": "서버 오류", "Server may be unavailable or overloaded": "서버를 쓸 수 없거나 과부하일 수 있어요", "Server may be unavailable, overloaded, or search timed out :(": "서버를 쓸 수 없거나 과부하거나, 검색 시간을 초과했어요 :(", @@ -340,7 +313,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "서버를 쓸 수 없거나 과부하거나, 오류에요.", "Server unavailable, overloaded, or something else went wrong.": "서버를 쓸 수 없거나 과부하거나, 다른 문제가 있어요.", "Session ID": "세션 ID", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s님이 별명을 %(displayName)s로 바꾸셨어요.", "Show panel": "패널 보이기", "Show Text Formatting Toolbar": "문자 서식 도구 보이기", "Show timestamps in 12 hour format (e.g. 2:30pm)": "시간을 12시간제로 보이기 (예. 오후 2:30)", @@ -384,12 +356,10 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 찾을 수 없었어요.", "Turn Markdown off": "마크다운 끄기", "Turn Markdown on": "마크다운 켜기", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s님이 종단간 암호화를 켜셨어요 (알고리즘 %(algorithm)s).", "Unable to add email address": "이메일 주소를 추가할 수 없어요", "Unable to remove contact information": "연락처를 지울 수 없어요", "Unable to verify email address.": "이메일 주소를 인증할 수 없어요.", "Unban": "차단풀기", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s님이 %(targetName)s님의 차단을 푸셨어요.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "이 이매알 주소가 초대를 받은 계정과 연결된 주소가 맞는지 확인할 수 없어요.", "Unable to capture screen": "화면을 찍을 수 없어요", "Unable to enable Notifications": "알림을 켤 수 없어요", @@ -443,7 +413,6 @@ "Who can read history?": "누가 기록을 읽을 수 있나요?", "Who would you like to add to this room?": "이 방에 누구를 초대하고 싶으세요?", "Who would you like to communicate with?": "누구와 이야기하고 싶으세요?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s님이 %(targetName)s니의 초대를 취소하셨어요.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "초대를 <acceptText>받아들이거나</acceptText> <declineText>거절</declineText>하시겠어요?", "You already have existing direct chats with this user:": "이미 이 사용자와 직접 이야기하는 중이에요:", "You are already in a call.": "이미 자신이 통화 중이네요.", @@ -608,9 +577,6 @@ "Start chatting": "이야기하기", "Start Chatting": "이야기하기", "Click on the button below to start chatting!": "이야기하려면 아래 버튼을 누르세요!", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s님이 방 아바타를 <img/>로 바꾸셨어요", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s님이 방 아바타를 지우셨어요.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s가 %(roomName)s 방의 아바타를 바꾸셨어요", "Username available": "쓸 수 있는 사용자 이름", "Username not available": "쓸 수 없는 사용자 이름", "Something went wrong!": "문제가 생겼어요!", @@ -767,5 +733,39 @@ "Collapse panel": "패널 접기", "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": "여기 보이지 않는 고급 알림이 있어요", + "<target> accepted the invitation for %(displayName)s.": "<target>님이 %(displayName)s님에게서 초대를 수락했어요.", + "<target> accepted an invitation.": "<target>님이 초대를 수락했어요.", + "<sender> requested a VoIP conference.": "<sender>님이 인터넷전화 회의를 요청하셨어요.", + "<sender> invited <target>.": "<sender>님이 <target>님을 초대하셨어요.", + "<sender> banned <target>.": "<sender>님이 <target>님을 차단하셨어요.", + "<sender> set their display name to <displayName>.": "<sender>님이 별명을 <displayName>로 바꾸셨어요.", + "<sender> removed their display name (<oldDisplayName>).": "<sender>님이 별명 (<oldDisplayName>)을 지우셨어요.", + "<sender> removed their profile picture.": "<sender>님이 자기 소개 사진을 지우셨어요.", + "<sender> changed their profile picture.": "<sender>님이 자기 소개 사진을 바꾸셨어요.", + "<sender> set a profile picture.": "<sender>님이 자기 소개 사진을 설정하셨어요.", + "<target> joined the room.": "<target>님이 방에 들어오셨어요.", + "<target> rejected the invitation.": "<target>님이 초대를 거절하셨어요.", + "<target> left the room.": "<target>님이 방을 떠나셨어요.", + "<sender> unbanned <target>.": "<sender>님이 <target>님의 차단을 푸셨어요.", + "<sender> kicked <target>.": "<sender>님이 <target>을 내쫓았어요.", + "<sender> withdrew <target>'s invitation.": "<sender>님이 <target>니의 초대를 취소하셨어요.", + "<sender> changed the topic to \"%(topic)s\".": "<sender>님이 주제를 \"%(topic)s\"로 바꾸셨어요.", + "<sender> changed the room name to %(roomName)s.": "<sender>님이 방 이름을 %(roomName)s로 바꾸셨어요.", + "<sender> changed the room avatar to <img/>": "<sender>님이 방 아바타를 <img/>로 바꾸셨어요", + "<sender> changed the avatar for %(roomName)s": "<sender>가 %(roomName)s 방의 아바타를 바꾸셨어요", + "<sender> removed the room name.": "<sender>님이 방 이름을 지우셨어요.", + "<sender> removed the room avatar.": "<sender>님이 방 아바타를 지우셨어요.", + "<sender> answered the call.": "<sender>님이 전화를 받았어요.", + "<sender> ended the call.": "<sender>님이 전화를 끊었어요.", + "<sender> placed a %(callType)s call.": "<sender>님이 %(callType)s 전화를 걸었어요.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender>님이 %(targetDisplayName)s님에게 들어오라는 초대를 보냈어요.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 초대받은 시점부터.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 방에 들어온 시점부터.", + "<sender> made future room history visible to all room members.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두.", + "<sender> made future room history visible to anyone.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 누구나.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 알 수 없음 (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender>님이 종단간 암호화를 켜셨어요 (알고리즘 %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user>를 %(fromPowerLevel)s에서 %(toPowerLevel)s로", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender>님이 %(powerLevelDiffText)s의 권한 등급을 바꾸셨어요." } diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 0c6bcb0977..b1552f91e7 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -1,8 +1,6 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Teksta ziņa tika nosūtīta +%(msisdn)s. Lūdzu ievadi tajā atrodamo verifikācijas kodu", "Accept": "Pieņemt", - "%(targetName)s accepted an invitation.": "%(targetName)s apstiprināja uzaicinājumu.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s apstiprināja uzaicinājumu no %(displayName)s.", "Account": "Konts", "Access Token:": "Pieejas tokens:", "Active call (%(roomName)s)": "Aktīvs zvans (%(roomName)s)", @@ -30,7 +28,6 @@ "%(items)s and %(lastItem)s": "%(items)s un %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s un %(lastPerson)s raksta", "A new password must be entered.": "Nepieciešams ievadīt jauno paroli.", - "%(senderName)s answered the call.": "%(senderName)s atbildēja zvanam.", "An error has occurred.": "Notikusi kļūda.", "Anyone": "Ikviens", "Anyone who knows the room's link, apart from guests": "Ikviens, kurš zina adreses saiti uz istabu, izņemot viesus", @@ -41,7 +38,6 @@ "Are you sure you want to upload the following files?": "Vai tiešām vēlies augšuplādēt sekojošos failus?", "Attachment": "Pielikums", "Autoplay GIFs and videos": "Automātiski rādīt GIF animācijas un video", - "%(senderName)s banned %(targetName)s.": "%(senderName)s liedza pieeju %(targetName)s.", "Ban": "Nobanot/liegt pieeju", "Banned users": "Banotie/bloķētie lietotāji (kuriem liegta pieeja)", "Bans user with given id": "Bloķē (liedz pieeju) lietotāju pēc uzdotā ID (nobano)", @@ -52,11 +48,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Neizdodas savienoties ar bāzes serveri izmantojot HTTP protokolu, kad Tava pārlūka adreses laukā norādīts HTTPS protokols. Tā vietā izmanto HTTPS vai <a>iespējo nedrošos skriptus</a>.", "Can't load user settings": "Neizdevās ielādēt lietotāja iestatījumus", "Change Password": "Paroles maiņa", - "%(senderName)s changed their profile picture.": "%(senderName)s nomainīja profila attēlu.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s nomainīja statusa līmeni %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s nomainīja istabas nosaukumu uz %(roomName)s.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s dzēsa istabas nosaukumu.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s nomainīja tēmas nosaukumu uz \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Izmaiņas attiecībā uz to, kurš varēs lasīt vēstures ziņas, stāsies spēkā tikai uz ziņām,kuras vēl tiks pievienotas šajā istabā", "Changes your display nickname": "Nomaina Tavu publisko segvārdu (niku)", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles maiņa dzēsīs pašreizējās šifrēšanas atslēgas visās savstarpēji saistītajās ierīcēs, padarot čata vēsturi neizlasāmu, ja vien vien istabas atslēgas nav tikušas iepriekš eksportētas un no jauna importētas atpakaļ. Nākotnē to plānojam uzlabot.", @@ -130,7 +121,6 @@ "Encrypted room": "Šifrēta istaba", "Encryption is enabled in this room": "Šajā istabā šifrēšana ir ieslēgta", "Encryption is not enabled in this room": "Šajā istabā šifrēšana ir izslēgta", - "%(senderName)s ended the call.": "%(senderName)s beidza zvanu.", "End-to-end encryption information": "\"End-to-End\" (ierīce-ierīce) šifrēšanas informācija", "End-to-end encryption is in beta and may not be reliable": "\"End-to-end\" (ierīce-ierīce) šifrēšana šobrīd ir beta stadijā, un var nebūt stabila", "Enter Code": "Ievadi kodu", @@ -176,7 +166,6 @@ "Forgot your password?": "Aizmirsi paroli?", "For security, this session has been signed out. Please sign in again.": "Drošības nolūkos, šī sesija ir beigusies. Lūdzu, pieraksties par jaunu.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Drošības nolūkos, izrakstīšanās dzēsīs jebkādas ierīce-ierīce šifrēšanas atslēgas no šī pārlūka. Ja Tu vēlies saglabāt iespēju atšifrēt tavu saziņas vēsturi no Riot nākotnes sesijām, lūdzu eksportē tavas istabas atslēgas, saglabājot tās drošā vietā.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s no %(fromPowerLevel)s uz %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Šajā Bāzes serverī viesu pierakstīšanās nav iespējama.", "Guests cannot join this room even if explicitly invited.": "Viesi nevar pievienoties šai istabai, pat ja ir uzaicināti.", "Hangup": "Beigt zvanu", @@ -199,7 +188,6 @@ "Invalid address format": "Nepareizs adreses formāts", "Invalid Email Address": "Nepareiza epasta adrese", "Invalid file%(extra)s": "Nederīgs fails %(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s uzaicināja %(targetName)s.", "Invite new room members": "Uzaicināt jaunus istabas biedrus", "Invited": "Uzaicināts/a", "Invites": "Uzaicinājumi", @@ -210,26 +198,18 @@ "Sign in with": "Pierakstīties ar", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Pievienoties kā <voiceText>AUDIO</voiceText> vai <videoText>VIDEO</videoText>.", "Join Room": "Pievienoties istabai", - "%(targetName)s joined the room.": "%(targetName)s pievienojās istabai.", "Joins room with given alias": "Pievienojas istabai ar minēto aliasi (pseidonīmu)", "Jump to first unread message.": "Pāriet uz pirmo neizlasīto ziņu.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s iespēra (kick) %(targetName)s.", "Kick": "Izspert/padzīt no istabas (kick)", "Kicks user with given id": "Padzen (kick) lietotāju ar norādīto Id", "Labs": "Izmēģinājumu lauciņš", "Last seen": "Pēdējo reizi redzēts/a", "Leave room": "Doties prom no istabas", - "%(targetName)s left the room.": "%(targetName)s devās prom no istabas.", "Level:": "Līmenis:", "Local addresses for this room:": "Šīs istabas lokālās adreses:", "Logged in as:": "Pierakstījās kā:", "Logout": "Izrakstīties", "Low priority": "Zemas prioritātes", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem no brīža, kad tie tika uzaicināti.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem ar brīdi, kad tie pievienojās.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu ikvienam.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu nepazīstamajiem (%(visibility)s).", "Manage Integrations": "Pārvaldīt integrācijas", "Markdown is disabled": "\"Markdown\" formatēšana izslēgta", "Markdown is enabled": "\"Markdown\" formatēšana ieslēgta", @@ -275,7 +255,6 @@ "People": "Cilvēki", "Permissions": "Atļaujas", "Phone": "Telefons", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s veica %(callType)s zvanu.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Lūdzu pārbaudi savu epastu un noklikšķini tajā esošo saiti. Tiklīdz tas ir izdarīts, klikšķini \"turpināt\".", "Press <StartChatButton> to start a chat with someone": "Nospied <StartChatButton>, lai ar kādu uzsāktu čalošanu", "Privacy warning": "Privātuma brīdinājums", @@ -288,16 +267,12 @@ "Revoke Moderator": "Atcelt moderatoru", "Refer a friend to Riot:": "Rekomendēt draugam Riot:", "Register": "Reģistrēties", - "%(targetName)s rejected the invitation.": "%(targetName)s noraidīja uzaicinājumu.", "Reject invitation": "Noraidīt uzaicinājumu", "Rejoin": "Pievienoties atkārtoti", "Remote addresses for this room:": "Attālinātā adrese šai istabai:", "Remove Contact Information?": "Dzēst kontaktinformāciju?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s dzēsa attēlojamo/redzamo vārdu (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s dzēsa profila attēlu.", "Remove": "Dzēst", "Remove %(threePid)s?": "Dzēst %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s vēlas VoIP konferenci.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles atiestatīšana atiestatīs visas ierīce-ierīce šifrēšanas atslēgas visās ierīcēs, padarot čata šifrēto ziņu vēsturi nelasāmu, ja vien Tu pirms tam neesi eksportējis savas istabas atslēgas un atkārtoti importējis tās atpakaļ. Nākotnē šo ir plānots uzlabot.", "Results from DuckDuckGo": "Rezultāti no DuckDuckGo", "Return to login screen": "Atgriezties uz pierakstīšanās lapu", @@ -314,14 +289,9 @@ "%(roomName)s is not accessible at this time.": "%(roomName)s šobrīd nav pieejama.", "Seen by %(userName)s at %(dateTime)s": "Redzējis %(userName)s %(dateTime)s", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s nosūtīja attēlu.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s nosūtīja uzaicinājumu %(targetDisplayName)s pievienoties istabai.", - "%(senderName)s set a profile picture.": "%(senderName)s uzstādīja profila attēlu.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s nomainīja attēlojamo/redzamo vārdu uz: %(displayName)s.", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Tevis uzdotā pierakstīšanās atslēga sakrīt ar atslēgu, kuru Tu saņēmi no %(userId)s ierīces %(deviceId)s. Ierīce tika atzīmēta kā verificēta.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Faila '%(fileName)s' izmērs pārsniedz šī Bāzes servera augšupielādes lieluma ierobežojumu", "The file '%(fileName)s' failed to upload": "Failu '%(fileName)s' neizdevās nosūtīt (augšuplādēt)", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ieslēdza \"end-to-end\" (ierīce-ierīce) šifrēšanu (algorithm %(algorithm)s).", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s atcēla pieejas ierobežojumu (atbanoja) %(targetName)s.", "Unknown room %(roomId)s": "Nezināma istaba %(roomId)s", "Uploading %(filename)s and %(count)s others|zero": "Tiek augšuplādēts %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Tiek augšuplādēts %(filename)s un %(count)s citi", @@ -330,7 +300,6 @@ "Username invalid: %(errMessage)s": "Neatbilstošs lietotājvārds: %(errMessage)s", "(unknown failure: %(reason)s)": "(nezināma kļūda: %(reason)s)", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "BRĪDINĀJUMS: NEIZDEVĀS VERIFICĒT ATSLĒGU! Pierakstīšanās atslēga priekš %(userId)s un ierīces %(deviceId)s ir \"%(fprint)s\", kura nesakrīt ar ievadīto atslēgu \"%(fingerprint)s\". Tas var nozīmēt, ka Tava saziņa var tikt pārtverta!", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s atsauca %(targetName)s uzaicinājumu.", "You are trying to access %(roomName)s.": "Tu mēģini piekļūt %(roomName)s.", "You have been banned from %(roomName)s by %(userName)s.": "Tev ir liegta pieeja istabai %(roomName)s no %(userName)s.", "You have been invited to join this room by %(inviterName)s": "%(inviterName)s Tevi uzaicināja pievienoties šai istabai", @@ -348,8 +317,6 @@ "You are registering with %(SelectedTeamName)s": "Tu reģistrējies ar %(SelectedTeamName)s", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Notiek Tevis novirzīšana uz ārēju trešās puses vietni. Tu vari atļaut savam kontam piekļuvi ar %(integrationsUrl)s. Vai vēlies turpināt?", "Ongoing conference call%(supportedText)s.": "Notiekošs konferences zvans %(supportedText)s.", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s dzēsa istabas avataru.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s nomainīja istabas avataru %(roomName)s", "You added a new device '%(displayName)s', which is requesting encryption keys.": "Tu pievienoji jaunu ierīci '%(displayName)s', kas prasa šifrēšanas atslēgas.", "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tava neverificētā ierīce '%(displayName)s' pieprasa šifrēšanas atslēgas.", "Room Colour": "Istabas krāsa", @@ -510,7 +477,6 @@ "Nov": "Nov.", "Dec": "Dec.", "Set a display name:": "Iestatīt attēloto vārdu:", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s nomainīja istabas avataru uz <img/>", "Upload an avatar:": "Augšuplādē avataru (profila attēlu):", "This server does not support authentication with a phone number.": "Šis serveris neatbalsta autentifikāciju pēc telefona numura.", "Missing password.": "Trūkst parole.", @@ -663,8 +629,6 @@ "Automatically replace plain text Emoji": "Automātiski aizvietot tekstu ar emocīšiem (emoji)", "Failed to upload image": "Neizdevās augšupielādēt attēlu", "Hide avatars in user and room mentions": "Slēpt profila attēlus lietotāja un istabas pieminējumos", - "%(widgetName)s widget added by %(senderName)s": "%(senderName)s pievienoja %(widgetName)s vidžetu", - "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s dzēsa vidžetu %(widgetName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robotu pārbaude šobrīd nav pieejama darbvirsmas versijā. Lūdzu izmanto <a>web pārlūku</a>", "Revoke widget access": "Atsaukt vidžeta piekļuvi", "Unpin Message": "Atkabināt ziņu", @@ -712,9 +676,6 @@ "You are now ignoring %(userId)s": "Tagad Tu ignorē %(userId)s", "Unignored user": "Atignorēts lietotājs", "You are no longer ignoring %(userId)s": "Tu vairāk neignorē %(userId)s", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s nomainīja savu attēlojamo/redzamo vārdu uz %(displayName)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s šai istabai nomainīja piestiprinātās ziņas.", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s vidžets, kuru mainīja %(senderName)s", "%(names)s and %(count)s others are typing|other": "%(names)s un %(count)s citi raksta", "%(names)s and %(count)s others are typing|one": "%(names)s un vēl kāds raksta", "Message Pinning": "Ziņu piekabināšana", @@ -1126,5 +1087,44 @@ "Collapse panel": "Sakļaut (saritināt) paneli", "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!": "Tavā pašreizējā pārlūkā aplikācijas izskats un uzvedība var būt pilnīgi neatbilstoša, kā arī dažas no visām funkcijām var nedarboties. Ja vēlies turpināt izmantot šo pārlūku, Tu vari arī turpināt, apzinoties, ka šajā gadījumā esi viens/a ar iespējamo problēmu!", "Checking for an update...": "Lūkojos pēc aktualizācijas...", - "There are advanced notifications which are not shown here": "Pastāv papildus paziņojumi, kuri šeit netiek rādīti" + "There are advanced notifications which are not shown here": "Pastāv papildus paziņojumi, kuri šeit netiek rādīti", + "<target> accepted the invitation for %(displayName)s.": "<target> apstiprināja uzaicinājumu no %(displayName)s.", + "<target> accepted an invitation.": "<target> apstiprināja uzaicinājumu.", + "<sender> requested a VoIP conference.": "<sender> vēlas VoIP konferenci.", + "<sender> invited <target>.": "<sender> uzaicināja <target>.", + "<sender> banned <target>.": "<sender> liedza pieeju <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> nomainīja savu attēlojamo/redzamo vārdu uz <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> nomainīja attēlojamo/redzamo vārdu uz: <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> dzēsa attēlojamo/redzamo vārdu (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> dzēsa profila attēlu.", + "<sender> changed their profile picture.": "<sender> nomainīja profila attēlu.", + "<sender> set a profile picture.": "<sender> uzstādīja profila attēlu.", + "<target> joined the room.": "<target> pievienojās istabai.", + "<target> rejected the invitation.": "<target> noraidīja uzaicinājumu.", + "<target> left the room.": "<target> devās prom no istabas.", + "<sender> unbanned <target>.": "<sender> atcēla pieejas ierobežojumu (atbanoja) <target>.", + "<sender> kicked <target>.": "<sender> iespēra (kick) <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> atsauca <target> uzaicinājumu.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> nomainīja tēmas nosaukumu uz \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> nomainīja istabas nosaukumu uz %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> nomainīja istabas avataru %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> nomainīja istabas avataru uz <img/>", + "<sender> removed the room name.": "<sender> dzēsa istabas nosaukumu.", + "<sender> removed the room avatar.": "<sender> dzēsa istabas avataru.", + "<sender> answered the call.": "<sender> atbildēja zvanam.", + "<sender> ended the call.": "<sender> beidza zvanu.", + "<sender> placed a %(callType)s call.": "<sender> veica %(callType)s zvanu.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> nosūtīja uzaicinājumu %(targetDisplayName)s pievienoties istabai.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem no brīža, kad tie tika uzaicināti.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem ar brīdi, kad tie pievienojās.", + "<sender> made future room history visible to all room members.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem.", + "<sender> made future room history visible to anyone.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu ikvienam.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu nepazīstamajiem (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ieslēdza \"end-to-end\" (ierīce-ierīce) šifrēšanu (algorithm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> no %(fromPowerLevel)s uz %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> nomainīja statusa līmeni %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> šai istabai nomainīja piestiprinātās ziņas.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s vidžets, kuru mainīja <sender>", + "%(widgetName)s widget added by <sender>": "<sender> pievienoja %(widgetName)s vidžetu", + "%(widgetName)s widget removed by <sender>": "<sender> dzēsa vidžetu %(widgetName)s" } diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1ba068daa0..90c9bf799e 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1,7 +1,5 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Voer alsjeblieft de verificatiecode in die is verstuurd naar +%(msisdn)s", - "%(targetName)s accepted an invitation.": "%(targetName)s heeft een uitnodiging geaccepteerd.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s heeft de uitnodiging voor %(displayName)s geaccepteerd.", "Account": "Account", "Access Token:": "Toegangstoken:", "Add email address": "Voeg een e-mailadres toe", @@ -16,7 +14,6 @@ "and %(count)s others...|one": "en één andere...", "%(names)s and %(lastPerson)s are typing": "%(names)s en %(lastPerson)s zijn aan het typen", "A new password must be entered.": "Er moet een nieuw wachtwoord worden ingevoerd.", - "%(senderName)s answered the call.": "%(senderName)s heeft deelgenomen aan het audiogesprek.", "An error has occurred.": "Er is een fout opgetreden.", "Anyone who knows the room's link, apart from guests": "Iedereen die de link van de ruimte weet, behalve gasten", "Anyone who knows the room's link, including guests": "Iedereen die link van de ruimte weet, inclusief gasten", @@ -24,7 +21,6 @@ "Are you sure you want to reject the invitation?": "Weet je zeker dat je de uitnodiging wilt weigeren?", "Attachment": "Bijlage", "Autoplay GIFs and videos": "Start GIFs en videos automatisch", - "%(senderName)s banned %(targetName)s.": "%(senderName)s heeft %(targetName)s verbannen.", "Ban": "Verban", "Banned users": "Verbannen gebruikers", "Bans user with given id": "Verbant de gebruiker met het gegeven ID", @@ -34,10 +30,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Kan niet met de thuisserver verbinden via HTTP wanneer er een HTTPS-URL in je browser balk staat. Gebruik HTTPS of <a>activeer onveilige scripts</a>.", "Can't load user settings": "Kan de gebruikersinstellingen niet laden", "Change Password": "Wachtwoord veranderen", - "%(senderName)s changed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto veranderd.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de ruimtenaam van %(roomName)s gewijzigd.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s heeft het onderwerp gewijzigd naar \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Veranderingen aan wie de geschiedenis kan lezen worden alleen maar toegepast op toekomstige berichten in deze ruimte", "Changes your display nickname": "Verandert jouw weergavenaam", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde gespreksgeschiedenis onleesbaar zou maken, behalve als je eerst je ruimtesleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.", @@ -122,7 +114,6 @@ "People": "Mensen", "Permissions": "Toestemmingen", "Phone": "Telefoonnummer", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s heeft een %(callType)s-gesprek gestart.", "Privacy warning": "Privacywaarschuwing", "Private Chat": "Privégesprek", "Privileged Users": "Gebruikers met rechten", @@ -133,7 +124,6 @@ "Revoke Moderator": "Beheerder terugtrekken", "Refer a friend to Riot:": "Laat een vriend weten over Riot:", "Register": "Registreer", - "%(targetName)s rejected the invitation.": "%(targetName)s heeft de uitnodiging geweigerd.", "Reject invitation": "Uitnodiging weigeren", "Rejoin": "Opnieuw toetreden", "Remote addresses for this room:": "Adres op afstand voor deze ruimte:", @@ -174,7 +164,6 @@ "Create an account": "Open een account", "Cryptography": "Cryptografie", "Current password": "Huidig wachtwoord", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s heeft de naam van de ruimte verwijderd.", "Create a new chat or reuse an existing one": "Maak een nieuw gesprek aan of hergebruik een al bestaand gesprek", "Create Room": "Maak een ruimte aan", "Curve25519 identity key": "Curve25519-identiteitssleutel", @@ -220,7 +209,6 @@ "Encrypted room": "Versleutelde ruimte", "Encryption is enabled in this room": "Versleuteling is ingeschakeld in deze ruimte", "Encryption is not enabled in this room": "Versleuteling is niet ingeschakeld in deze ruimte", - "%(senderName)s ended the call.": "%(senderName)s heeft opgehangen.", "End-to-end encryption information": "end-to-endbeveiligingsinformatie", "End-to-end encryption is in beta and may not be reliable": "End-to-endbeveiliging is nog in bèta en kan onbetrouwbaar zijn", "Enter Code": "Voer code in", @@ -259,7 +247,6 @@ "Forgot your password?": "Wachtwoord vergeten?", "For security, this session has been signed out. Please sign in again.": "Voor veiligheidsredenen is deze sessie uitgelogd. Log alsjeblieft opnieuw in.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "In verband met veiligheidsredenen zullen alle end-to-endbeveiligingsleutels van deze browser verwijderd worden. Als je je gespreksgeschiedenis van toekomstige Riot sessies wilt kunnen ontsleutelen, exporteer en bewaar dan de ruimte sleutels.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s naar %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Gasttoegang is uitgeschakeld op deze thuisserver.", "Guests cannot join this room even if explicitly invited.": "Gasten kunnen niet tot deze ruimte toetreden, zelfs als ze expliciet uitgenodigd zijn.", "Hangup": "Ophangen", @@ -282,7 +269,6 @@ "Invalid address format": "Ongeldig adresformaat", "Invalid Email Address": "Ongeldig e-mailadres", "Invalid file%(extra)s": "Ongeldig bestand%(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s heeft %(targetName)s uitgenodigd.", "Invite new room members": "Nieuwe ruimte leden uitnodigen", "Invited": "Uitgenodigd", "Invites": "Uitnodigingen", @@ -293,23 +279,16 @@ "Sign in with": "Inloggen met", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Toetreden als <voiceText>spraak</voiceText> of <videoText>video</videoText>.", "Join Room": "Ruimte toetreden", - "%(targetName)s joined the room.": "%(targetName)s is tot de ruimte toegetreden.", "Joins room with given alias": "Treed de ruimte toe met een gegeven naam", "Jump to first unread message.": "Spring naar het eerste ongelezen bericht.", "Labs": "Labs", "Last seen": "Laatst gezien", "Leave room": "Ruimte verlaten", - "%(targetName)s left the room.": "%(targetName)s heeft de ruimte verlaten.", "Level:": "Niveau:", "Local addresses for this room:": "Lokale adressen voor deze ruimte:", "Logged in as:": "Ingelogd als:", "Logout": "Uitloggen", "Low priority": "Lage prioriteit", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze uitgenodigd zijn.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze toegetreden zijn.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor iedereen.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor onbekend (%(visibility)s).", "Manage Integrations": "Integraties beheren", "Markdown is disabled": "Markdown is uitgeschakeld", "Markdown is enabled": "Markdown ingeschakeld", @@ -328,12 +307,9 @@ "Only people who have been invited": "Alleen personen die zijn uitgenodigd", "Please check your email and click on the link it contains. Once this is done, click continue.": "Bekijk je e-mail en klik op de link die het bevat. Zodra dit klaar is, klik op verder gaan.", "Power level must be positive integer.": "Machtsniveau moet een positief geheel getal zijn.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s heeft zijn of haar weergavenaam (%(oldDisplayName)s) verwijderd.", - "%(senderName)s removed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto verwijderd.", "Failed to kick": "Niet gelukt om te er uit te zetten", "Press <StartChatButton> to start a chat with someone": "Druk op <StartChatButton> om een gesprek met iemand te starten", "Remove %(threePid)s?": "%(threePid)s verwijderen?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-gesprek aangevraagd.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het wachtwoord veranderen betekent momenteel dat alle end-to-endbeveiligingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.", "Results from DuckDuckGo": "Resultaten van DuckDuckGo", "Return to login screen": "Naar het inlogscherm terugkeren", @@ -357,7 +333,6 @@ "Sender device information": "Afzenderapparaatinformatie", "Send Reset Email": "Stuur Reset-E-mail", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s stuurde een afbeelding.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s stuurde een uitnodiging naar %(targetDisplayName)s om tot de ruimte toe te treden.", "Server error": "Serverfout", "Server may be unavailable or overloaded": "De server kan onbereikbaar of overbelast zijn", "Server may be unavailable, overloaded, or search timed out :(": "De server is misschien onbereikbaar, overbelast of het zoeken duurde te lang :(", @@ -365,11 +340,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "De server is misschien onbereikbaar, overbelast of je bent tegen een fout aangelopen.", "Server unavailable, overloaded, or something else went wrong.": "De server is onbereikbaar, overbelast of iets anders ging fout.", "Session ID": "Sessie-ID", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s heeft %(targetName)s de ruimte uitgestuurd.", "Kick": "Er uit sturen", "Kicks user with given id": "Stuurt de gebruiker met het gegeven ID er uit", - "%(senderName)s set a profile picture.": "%(senderName)s heeft een profielfoto ingesteld.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s heeft zijn of haar weergavenaam naar %(displayName)s veranderd.", "Show panel": "Paneel weergeven", "Show Text Formatting Toolbar": "Tekstopmaakwerkbalk Weergeven", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Laat de tijd in twaalf uur formaat zien (bijv. 2:30pm)", @@ -407,12 +379,10 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Het is niet gelukt om een specifiek punt in de tijdlijn van deze ruimte te laden.", "Turn Markdown off": "Zet Markdown uit", "Turn Markdown on": "Zet Markdown aan", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s heeft end-to-endbeveiliging aangezet (algoritme %(algorithm)s).", "Unable to add email address": "Niet mogelijk om e-mailadres toe te voegen", "Unable to remove contact information": "Niet mogelijk om contactinformatie te verwijderen", "Unable to verify email address.": "Niet mogelijk om het e-mailadres te verifiëren.", "Unban": "Ontbannen", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ontbande %(targetName)s.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Niet mogelijk om vast te stellen dat het adres waar deze uitnodiging naartoe was verstuurd overeenkomt met het adres dat is geassocieerd met je account.", "Unable to capture screen": "Niet mogelijk om het scherm vast te leggen", "Unable to enable Notifications": "Niet mogelijk om notificaties aan te zetten", @@ -468,7 +438,6 @@ "Who can read history?": "Wie kan de geschiedenis lezen?", "Who would you like to add to this room?": "Wie wil je aan deze ruimte toevoegen?", "Who would you like to communicate with?": "Met wie zou je willen communiceren?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s trok %(targetName)s's uitnodiging terug.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Wil je deze uitnodiging <acceptText>accepteren</acceptText> of <declineText>afwijzen</declineText>?", "You already have existing direct chats with this user:": "Je hebt al bestaande privé-gesprekken met deze gebruiker:", "You are already in a call.": "Je bent al in gesprek.", @@ -609,9 +578,6 @@ "Start chatting": "Start met praten", "Start Chatting": "Start Met Praten", "Click on the button below to start chatting!": "Klik op de knop hieronder om te starten met praten!", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s heeft de ruimte avatar aangepast naar <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s heeft de ruimte avatar verwijderd.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s veranderde de avatar voor %(roomName)s", "Username available": "Gebruikersnaam beschikbaar", "Username not available": "Gebruikersnaam niet beschikbaar", "Something went wrong!": "Iets ging niet goed!", @@ -664,10 +630,7 @@ "Automatically replace plain text Emoji": "Automatisch normale tekst vervangen met Emoji", "Failed to upload image": "Het is niet gelukt om de afbeelding te uploaden", "Hide avatars in user and room mentions": "Avatars in gebruiker- en ruimte-vermeldingen verbergen", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget toegevoegd door %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-widget verwijderd door %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot-check is momenteel niet beschikbaar op de desktop - gebruik in plaats daarvan een <a>webbrowser</a>", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget aangepast door %(senderName)s", "Copied!": "Gekopieerd!", "Failed to copy": "Kopiëren mislukt", "Unpin Message": "Maak pin los", @@ -700,7 +663,6 @@ "You are now ignoring %(userId)s": "Je bent nu %(userId)s aan het negeren", "Unignored user": "Niet genegeerde gebruiker", "You are no longer ignoring %(userId)s": "Je bent %(userId)s niet meer aan het negeren", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s heeft de gepinde boodschappen voor de ruimte gewijzigd.", "%(names)s and %(count)s others are typing|other": "%(names)s en %(count)s andere gebruikers zijn aan het typen", "%(names)s and %(count)s others are typing|one": "%(names)s en iemand anders is aan het typen", "Send": "Verstuur", @@ -956,7 +918,6 @@ "<a>In reply to</a> <pill>": "<a>Als antwoord op</a> <pill>", "This room is not public. You will not be able to rejoin without an invite.": "Deze ruimte is niet publiekelijk. Je zal niet opnieuw kunnen toetreden zonder een uitnodiging.", "were unbanned %(count)s times|one": "waren ontbant", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s heeft zijn/haar weergavenaam veranderd naar %(displayName)s.", "Disable Community Filter Panel": "Gemeenschapsfilterpaneel uitzetten", "Your key share request has been sent - please check your other devices for key share requests.": "Je verzoek om sleutels te delen is verzonden - controleer je andere apparaten voor het verzoek.", "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Verzoeken om sleutels te delen worden automatisch naar andere apparaten verstuurd. Als je het verzoek hebt afgewezen of weg hebt geklikt, klik dan hier voor een nieuwe verzoek voor de sleutels van deze sessie.", @@ -1180,5 +1141,44 @@ "This room is used for important messages from the Homeserver, so you cannot leave it.": "Deze ruimte wordt gebruikt voor belangrijke berichten van de thuisserver, dus je kan het niet verlaten.", "Terms and Conditions": "Voorwaarden", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Om de %(homeserverDomain)s thuisserver te blijven gebruiken zal je de voorwaarden moeten lezen en ermee akkoord moeten gaan.", - "Review terms and conditions": "Voorwaarden lezen" + "Review terms and conditions": "Voorwaarden lezen", + "<target> accepted the invitation for %(displayName)s.": "<target> heeft de uitnodiging voor %(displayName)s geaccepteerd.", + "<target> accepted an invitation.": "<target> heeft een uitnodiging geaccepteerd.", + "<sender> requested a VoIP conference.": "<sender> heeft een VoIP-gesprek aangevraagd.", + "<sender> invited <target>.": "<sender> heeft <target> uitgenodigd.", + "<sender> banned <target>.": "<sender> heeft <target> verbannen.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> heeft zijn/haar weergavenaam veranderd naar <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> heeft zijn of haar weergavenaam naar <displayName> veranderd.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> heeft zijn of haar weergavenaam (<oldDisplayName>) verwijderd.", + "<sender> removed their profile picture.": "<sender> heeft zijn of haar profielfoto verwijderd.", + "<sender> changed their profile picture.": "<sender> heeft zijn of haar profielfoto veranderd.", + "<sender> set a profile picture.": "<sender> heeft een profielfoto ingesteld.", + "<target> joined the room.": "<target> is tot de ruimte toegetreden.", + "<target> rejected the invitation.": "<target> heeft de uitnodiging geweigerd.", + "<target> left the room.": "<target> heeft de ruimte verlaten.", + "<sender> unbanned <target>.": "<sender> ontbande <target>.", + "<sender> kicked <target>.": "<sender> heeft <target> de ruimte uitgestuurd.", + "<sender> withdrew <target>'s invitation.": "<sender> trok <target>'s uitnodiging terug.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> heeft het onderwerp gewijzigd naar \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> heeft de ruimtenaam van %(roomName)s gewijzigd.", + "<sender> changed the room avatar to <img/>": "<sender> heeft de ruimte avatar aangepast naar <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> veranderde de avatar voor %(roomName)s", + "<sender> removed the room name.": "<sender> heeft de naam van de ruimte verwijderd.", + "<sender> removed the room avatar.": "<sender> heeft de ruimte avatar verwijderd.", + "<sender> answered the call.": "<sender> heeft deelgenomen aan het audiogesprek.", + "<sender> ended the call.": "<sender> heeft opgehangen.", + "<sender> placed a %(callType)s call.": "<sender> heeft een %(callType)s-gesprek gestart.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> stuurde een uitnodiging naar %(targetDisplayName)s om tot de ruimte toe te treden.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze uitgenodigd zijn.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze toegetreden zijn.", + "<sender> made future room history visible to all room members.": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers.", + "<sender> made future room history visible to anyone.": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor iedereen.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor onbekend (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> heeft end-to-endbeveiliging aangezet (algoritme %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> van %(fromPowerLevel)s naar %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.", + "<sender> changed the pinned messages for the room.": "<sender> heeft de gepinde boodschappen voor de ruimte gewijzigd.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s-widget aangepast door <sender>", + "%(widgetName)s widget added by <sender>": "%(widgetName)s-widget toegevoegd door <sender>", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s-widget verwijderd door <sender>" } diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 0088028aed..c70f1c6e22 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -99,8 +99,6 @@ "Failed to change password. Is your password correct?": "Zmiana hasła nie powiodła się. Czy Twoje hasło jest poprawne?", "Add a topic": "Dodaj temat", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Wysłano wiadomość tekstową do +%(msisdn)s. Proszę wprowadzić kod w niej zawarty", - "%(targetName)s accepted an invitation.": "%(targetName)s zaakceptował(a) zaproszenie.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s zaakceptował(a) zaproszenie dla %(displayName)s.", "Access Token:": "Jednorazowy kod dostępu:", "Active call (%(roomName)s)": "Aktywne połączenie (%(roomName)s)", "Add email address": "Dodaj adres e-mail", @@ -119,7 +117,6 @@ "%(items)s and %(lastItem)s": "%(items)s i %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s i %(lastPerson)s piszą", "A new password must be entered.": "Musisz wprowadzić nowe hasło.", - "%(senderName)s answered the call.": "%(senderName)s odebrał połączenie.", "An error has occurred.": "Wystąpił błąd.", "Anyone": "Każdy", "Anyone who knows the room's link, apart from guests": "Każdy kto posiada łącze do pokoju, poza gośćmi", @@ -128,7 +125,6 @@ "Are you sure you want to reject the invitation?": "Czy na pewno chcesz odrzucić zaproszenie?", "Are you sure you want to upload the following files?": "Czy na pewno chcesz przesłać następujące pliki?", "Autoplay GIFs and videos": "Automatycznie odtwarzaj GIFy i filmiki", - "%(senderName)s banned %(targetName)s.": "%(senderName)s zbanował %(targetName)s.", "Ban": "Zbanuj", "Bans user with given id": "Blokuje użytkownika o podanym ID", "Blacklisted": "Umieszczono na czarnej liście", @@ -143,11 +139,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nie można nawiązać połączenia z serwerem przy użyciu HTTP podczas korzystania z HTTPS dla bieżącej strony. Użyj HTTPS lub <a>włącz niebezpieczne skrypty</a>.", "Can't load user settings": "Nie można załadować ustawień użytkownika", "Cannot add any more widgets": "Nie można dodać już więcej widżetów", - "%(senderName)s changed their profile picture.": "%(senderName)s zmienił swoje zdjęcie profilowe.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmienił poziom mocy %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmienił nazwę pokoju na %(roomName)s.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s usunął nazwę pokoju.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmienił temat na \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Zmiany w dostępie do historii będą dotyczyć tylko przyszłych wiadomości w tym pokoju", "Changes your display nickname": "Zmień swój pseudonim", "Changes colour scheme of current room": "Zmień schemat kolorystyczny bieżącego pokoju", @@ -214,7 +205,6 @@ "Encrypted room": "Pokój szyfrowany", "Encryption is enabled in this room": "Szyfrowanie jest włączone w tym pokoju", "Encryption is not enabled in this room": "Szyfrowanie nie jest włączone w tym pokoju", - "%(senderName)s ended the call.": "%(senderName)s zakończył połączenie.", "End-to-end encryption information": "Informacje o szyfrowaniu końcówka-do-końcówki", "End-to-end encryption is in beta and may not be reliable": "Szyfrowanie końcówka-do-końcówki jest w fazie beta i może nie być dopracowane", "Enter Code": "Wpisz kod", @@ -254,7 +244,6 @@ "Forgot your password?": "Zapomniałeś hasła?", "For security, this session has been signed out. Please sign in again.": "Ze względów bezpieczeństwa ta sesja została wylogowana. Zaloguj się jeszcze raz.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Ze względów bezpieczeństwa, wylogowanie skasuje z tej przeglądarki wszystkie klucze szyfrowania końcówka-do-końcówki. Jeśli chcesz móc odszyfrować swoje historie konwersacji z przyszłych sesji Riot-a, proszę wyeksportuj swoje klucze pokojów do bezpiecznego miejsca.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Dostęp dla gości jest wyłączony na tym serwerze.", "Deops user with given id": "Usuwa prawa administratora użytkownikowi o danym ID", "Guests cannot join this room even if explicitly invited.": "Goście nie mogą dołączać do tego pokoju, nawet jeśli zostali specjalnie zaproszeni.", @@ -277,7 +266,6 @@ "Invalid address format": "Nieprawidłowy format adresu", "Invalid Email Address": "Nieprawidłowy adres e-mail", "Invalid file%(extra)s": "Nieprawidłowy plik %(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s zaprosił %(targetName)s.", "Invite new room members": "Zaproś nowych członków do pokoju", "Invited": "Zaproszony", "Invites": "Zaproszenia", @@ -288,27 +276,19 @@ "Sign in with": "Zaloguj się używając", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Dołącz <voiceText>głosowo</voiceText> lub przez <videoText>wideo</videoText>.", "Join Room": "Dołącz do pokoju", - "%(targetName)s joined the room.": "%(targetName)s dołączył do pokoju.", "Joins room with given alias": "Dołącz do pokoju o podanym aliasie", "Jump to first unread message.": "Przeskocz do pierwszej nieprzeczytanej wiadomości.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s wyrzucił %(targetName)s.", "Kick": "Wyrzuć", "Kicks user with given id": "Wyrzuca użytkownika o danym ID", "Labs": "Laboratoria", "Last seen": "Ostatnio widziany", "Leave room": "Opuść pokój", - "%(targetName)s left the room.": "%(targetName)s opuścił pokój.", "Level:": "Poziom:", "Publish this room to the public in %(domain)s's room directory?": "Czy opublikować ten pokój dla ogółu w spisie pokojów domeny %(domain)s?", "Local addresses for this room:": "Lokalne adresy dla tego pokoju:", "Logged in as:": "Zalogowany jako:", "Logout": "Wyloguj", "Low priority": "Niski priorytet", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich zaproszenia.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich dołączenia.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla kazdego.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla nieznany (%(visibility)s).", "Manage Integrations": "Zarządzaj integracjami", "Markdown is disabled": "Markdown jest wyłączony", "Markdown is enabled": "Markdown jest włączony", @@ -350,7 +330,6 @@ "People": "Ludzie", "Permissions": "Uprawnienia", "Phone": "Telefon", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s rozpoczął połączenie %(callType)s.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Sprawdź swój e-mail i kliknij link w nim zawarty. Kiedy już to zrobisz, kliknij \"kontynuuj\".", "Power level must be positive integer.": "Poziom uprawnień musi być liczbą dodatnią.", "Press <StartChatButton> to start a chat with someone": "Naciśnij <StartChatButton>, by rozpocząć rozmowę z kimś", @@ -365,15 +344,11 @@ "Revoke widget access": "Usuń dostęp do widżetów", "Refer a friend to Riot:": "Zaproś znajomego do Riota:", "Register": "Rejestracja", - "%(targetName)s rejected the invitation.": "%(targetName)s odrzucił zaproszenie.", "Reject invitation": "Odrzuć zaproszenie", "Rejoin": "Dołącz ponownie", "Remote addresses for this room:": "Adresy zdalne dla tego pokoju:", "Remove Contact Information?": "Usunąć dane kontaktowe?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s usunął swoją nazwę ekranową (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s usunął swoje zdjęcie profilowe.", "Remove %(threePid)s?": "Usunąć %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s zażądał grupowego połączenia głosowego VoIP.", "Results from DuckDuckGo": "Wyniki z DuckDuckGo", "Return to login screen": "Wróć do ekranu logowania", "Riot does not have permission to send you notifications - please check your browser settings": "Riot nie ma uprawnień, by wysyłać ci powiadomienia - sprawdź ustawienia swojej przeglądarki", @@ -401,7 +376,6 @@ "Send Invites": "Wyślij zaproszenie", "Send Reset Email": "Wyślij e-mail resetujący hasło", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s wysłał obraz.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s wysłał zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.", "Server error": "Błąd serwera", "Server may be unavailable or overloaded": "Serwer może być niedostępny lub przeciążony", "Server may be unavailable, overloaded, or search timed out :(": "Serwer może być niedostępny, przeciążony, lub upłynął czas wyszukiwania :(", @@ -409,8 +383,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Serwer może być niedostępny, przeciążony, lub trafiłeś na błąd.", "Server unavailable, overloaded, or something else went wrong.": "Serwer może być niedostępny, przeciążony, lub coś innego poszło źle.", "Session ID": "Identyfikator sesji", - "%(senderName)s set a profile picture.": "%(senderName)s ustawił zdjęcie profilowe.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ustawił swoją nazwę na %(displayName)s.", "Sets the room topic": "Ustaw temat pokoju", "Show panel": "Pokaż panel", "Show Text Formatting Toolbar": "Pokaż pasek narzędzi formatowania tekstu", @@ -451,12 +423,10 @@ "To reset your password, enter the email address linked to your account": "Aby zresetować swoje hasło, wpisz adres e-mail powiązany z twoim kontem", "Turn Markdown off": "Wyłącz Markdown", "Turn Markdown on": "Włącz Markdown", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s włączył szyfrowanie użytkownik-użytkownik (algorithm %(algorithm)s).", "Unable to add email address": "Nie można dodać adresu e-mail", "Unable to create widget.": "Nie można utworzyć widżetu.", "Unable to remove contact information": "Nie można usunąć informacji kontaktowych", "Unable to verify email address.": "Weryfikacja adresu e-mail nie powiodła się.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s odblokował/a %(targetName)s.", "Unable to capture screen": "Nie można zrobić zrzutu ekranu", "Unable to enable Notifications": "Nie można włączyć powiadomień", "Unable to load device list": "Nie można załadować listy urządzeń", @@ -503,7 +473,6 @@ "Who can access this room?": "Kto może uzyskać dostęp do tego pokoju?", "Who would you like to add to this room?": "Kogo chciał(a)byś dodać do tego pokoju?", "Who would you like to communicate with?": "Z kim chciał(a)byś się komunikować?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s wycofał(a) zaproszenie %(targetName)s.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Czy chcesz <acceptText>zaakceptować</acceptText> czy <declineText>odrzucić</declineText> to zaproszenie?", "You already have existing direct chats with this user:": "Masz już istniejącą bezpośrednią konwersację z tym użytkownikiem:", "You are already in a call.": "Jesteś już w trakcie połączenia.", @@ -629,9 +598,6 @@ " (unsupported)": " (niewspierany)", "Idle": "Bezczynny", "Check for update": "Sprawdź aktualizacje", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s zmienił awatar pokoju na <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s usunął awatar pokoju.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmienił awatar %(roomName)s", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "To będzie twoja nazwa konta na <span></span> serwerze domowym; możesz też wybrać <a>inny serwer</a>.", "If you already have a Matrix account you can <a>log in</a> instead.": "Jeśli już posiadasz konto Matrix możesz się <a>zalogować</a>.", "Not a valid Riot keyfile": "Niepoprawny plik klucza Riot", @@ -664,9 +630,6 @@ "Featured Rooms:": "Wyróżnione pokoje:", "Featured Users:": "Wyróżnieni użytkownicy:", "Hide avatars in user and room mentions": "Ukryj awatary we wzmiankach użytkowników i pokoi", - "%(widgetName)s widget added by %(senderName)s": "Widżet %(widgetName)s został dodany przez %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Widżet %(widgetName)s został usunięty przez %(senderName)s", - "%(widgetName)s widget modified by %(senderName)s": "Widżet %(widgetName)s został zmodyfikowany przez %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Sprawdzanie człowieczeństwa jest obecnie niedostępne na aplikacji klienckiej desktop - proszę użyć <a>przeglądarki internetowej</a>", "Unpin Message": "Odepnij Wiadomość", "Add rooms to this community": "Dodaj pokoje do tej społeczności", @@ -700,8 +663,6 @@ "Ignored user": "Użytkownik ignorowany", "You are now ignoring %(userId)s": "Ignorujesz teraz %(userId)s", "You are no longer ignoring %(userId)s": "Nie ignorujesz już %(userId)s", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s zmienił swoją wyświetlaną nazwę na %(displayName)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmienił przypiętą wiadomość dla tego pokoju.", "Message Pinning": "Przypinanie wiadomości", "%(names)s and %(count)s others are typing|other": "%(names)s oraz %(count)s innych piszą", "%(names)s and %(count)s others are typing|one": "%(names)s oraz jedna inna osoba piszą", @@ -955,5 +916,44 @@ "Advanced options": "Opcje zaawansowane", "To continue, please enter your password:": "Aby kontynuować, proszę wprowadzić swoje hasło:", "password": "hasło", - "Refresh": "Odśwież" + "Refresh": "Odśwież", + "<target> accepted the invitation for %(displayName)s.": "<target> zaakceptował(a) zaproszenie dla %(displayName)s.", + "<target> accepted an invitation.": "<target> zaakceptował(a) zaproszenie.", + "<sender> requested a VoIP conference.": "<sender> zażądał grupowego połączenia głosowego VoIP.", + "<sender> invited <target>.": "<sender> zaprosił <target>.", + "<sender> banned <target>.": "<sender> zbanował <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> zmienił swoją wyświetlaną nazwę na <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> ustawił swoją nazwę na <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> usunął swoją nazwę ekranową (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> usunął swoje zdjęcie profilowe.", + "<sender> changed their profile picture.": "<sender> zmienił swoje zdjęcie profilowe.", + "<sender> set a profile picture.": "<sender> ustawił zdjęcie profilowe.", + "<target> joined the room.": "<target> dołączył do pokoju.", + "<target> rejected the invitation.": "<target> odrzucił zaproszenie.", + "<target> left the room.": "<target> opuścił pokój.", + "<sender> unbanned <target>.": "<sender> odblokował/a <target>.", + "<sender> kicked <target>.": "<sender> wyrzucił <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> wycofał(a) zaproszenie <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> zmienił temat na \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> zmienił nazwę pokoju na %(roomName)s.", + "<sender> changed the room avatar to <img/>": "<sender> zmienił awatar pokoju na <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> zmienił awatar %(roomName)s", + "<sender> removed the room name.": "<sender> usunął nazwę pokoju.", + "<sender> removed the room avatar.": "<sender> usunął awatar pokoju.", + "<sender> answered the call.": "<sender> odebrał połączenie.", + "<sender> ended the call.": "<sender> zakończył połączenie.", + "<sender> placed a %(callType)s call.": "<sender> rozpoczął połączenie %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> wysłał zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich zaproszenia.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich dołączenia.", + "<sender> made future room history visible to all room members.": "<sender> uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju.", + "<sender> made future room history visible to anyone.": "<sender> uczynił przyszłą historię pokoju widoczną dla kazdego.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> uczynił przyszłą historię pokoju widoczną dla nieznany (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> włączył szyfrowanie użytkownik-użytkownik (algorithm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> z %(fromPowerLevel)s na %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> zmienił poziom mocy %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> zmienił przypiętą wiadomość dla tego pokoju.", + "%(widgetName)s widget modified by <sender>": "Widżet %(widgetName)s został zmodyfikowany przez <sender>", + "%(widgetName)s widget added by <sender>": "Widżet %(widgetName)s został dodany przez <sender>", + "%(widgetName)s widget removed by <sender>": "Widżet %(widgetName)s został usunięty przez <sender>" } diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 7cc80cfc78..1f3e83c14c 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -16,7 +16,6 @@ "Blacklisted": "Bloqueado", "Bulk Options": "Opcões de Batelada", "Can't load user settings": "Não é possível carregar configurações de usuário", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala", "Changes your display nickname": "Troca o seu apelido", "Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519", @@ -198,15 +197,8 @@ "Dec": "Dez", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s de %(monthName)s às %(time)s", "%(weekDayName)s %(time)s": "%(weekDayName)s às %(time)s", - "%(targetName)s accepted an invitation.": "%(targetName)s aceitou um convite.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.", "%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s estão escrevendo", - "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", - "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "click to reveal": "clique para ver", "Conference call failed.": "Chamada de conferência falhou.", "Conference calling is in development and may not be reliable.": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar.", @@ -214,41 +206,22 @@ "Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador", "/ddg is not a command": "/ddg não é um comando", "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", - "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", "Failed to send email": "Falha ao enviar email", "Failed to send request.": "Não foi possível mandar requisição.", "Failed to set up conference call": "Não foi possível montar a chamada de conferência", "Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email", "Failure to create room": "Não foi possível criar a sala", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.", "%(displayName)s is typing": "%(displayName)s está escrevendo", - "%(targetName)s joined the room.": "%(targetName)s entrou na sala.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", - "%(targetName)s left the room.": "%(targetName)s saiu da sala.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s deixou o histórico futuro da sala visível para todas as pessoas da sala.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s deixou o histórico futuro da sala visível para qualquer pessoa.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", "Missing room_id in request": "Faltou o id da sala na requisição", "Missing user_id in request": "Faltou o id de usuário na requisição", "(not supported by this browser)": "(não é compatível com este navegador)", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.", "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", "Reason": "Razão", - "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s está solicitando uma conferência de voz.", "Riot does not have permission to send you notifications - please check your browser settings": "Riot não tem permissões para enviar notificações a você - por favor, verifique as configurações do seu navegador", "Riot was not given permission to send notifications - please try again": "Riot não tem permissões para enviar notificações a você - por favor, tente novamente", "Room %(roomId)s not visible": "A sala %(roomId)s não está visível", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou um convite para %(targetDisplayName)s entrar na sala.", - "%(senderName)s set a profile picture.": "%(senderName)s definiu uma imagem de perfil.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s definiu seu nome público para %(displayName)s.", "This email address is already in use": "Este endereço de email já está sendo usado", "This email address was not found": "Este endereço de email não foi encontrado", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "O arquivo '%(fileName)s' ultrapassa o limite de tamanho que nosso servidor permite enviar", @@ -258,15 +231,12 @@ "These are experimental features that may break in unexpected ways": "Estas são funcionalidades experimentais que podem apresentar falhas", "This phone number is already in use": "Este número de telefone já está sendo usado", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", "Unable to enable Notifications": "Não foi possível ativar as notificações", "Upload Failed": "O envio falhou", "Usage": "Uso", "Use with caution": "Use com cautela", "VoIP is unsupported": "Chamada de voz não permitida", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "You are already in a call.": "Você já está em uma chamada.", "You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.", "You cannot place a call with yourself.": "Você não pode iniciar uma chamada.", @@ -406,7 +376,6 @@ "Warning!": "Atenção!", "You need to enter a user name.": "Você precisa inserir um nome de usuária(o).", "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", @@ -501,9 +470,6 @@ "Verified key": "Chave verificada", "WARNING: Device already verified, but keys do NOT MATCH!": "ATENÇÃO: O dispositivo já foi verificado, mas as chaves NÃO SÃO IGUAIS!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: VERIFICAÇÃO DE CHAVE FALHOU! A chave de assinatura para a(o) usuária(o) %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\", que não é igual à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estão sendo interceptadas!", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a imagem da sala.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a imagem da sala %(roomName)s", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s alterou a imagem da sala para <img/>", "Missing Media Permissions, click here to request.": "Faltam permissões para uso de mídia no seu computador. Clique aqui para solicitá-las.", "No Microphones detected": "Não foi detetado nenhum microfone", "No Webcams detected": "Não foi detetada nenhuma Webcam", @@ -665,9 +631,6 @@ "Automatically replace plain text Emoji": "Substituir Emoji em texto automaticamente", "Failed to upload image": "Falha ao carregar imagem", "Hide avatars in user and room mentions": "Ocultar avatares nas menções de utilizadores e salas", - "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s adicionado por %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s removido por %(senderName)s", - "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificado por %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "A verificação através de robot está atualmente indisponível na versão desktop - utilize um <a>navegador web</a>", "Advanced options": "Opções avançadas", "This setting cannot be changed later!": "Esta definição não pode ser alterada mais tarde!", @@ -842,5 +805,42 @@ "Collapse panel": "Colapsar o painel", "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!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se quiser tentar de qualquer maneira pode continuar, mas está por sua conta com algum problema que possa encontrar!", "Checking for an update...": "A procurar uma atualização...", - "There are advanced notifications which are not shown here": "Existem notificações avançadas que não são exibidas aqui" + "There are advanced notifications which are not shown here": "Existem notificações avançadas que não são exibidas aqui", + "<target> accepted the invitation for %(displayName)s.": "<target> aceitou o convite para %(displayName)s.", + "<target> accepted an invitation.": "<target> aceitou um convite.", + "<sender> requested a VoIP conference.": "<sender> está solicitando uma conferência de voz.", + "<sender> invited <target>.": "<sender> convidou <target>.", + "<sender> banned <target>.": "<sender> removeu <target> da sala.", + "<sender> set their display name to <displayName>.": "<sender> definiu seu nome público para <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> removeu o seu nome público (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> removeu sua imagem de perfil.", + "<sender> changed their profile picture.": "<sender> alterou sua imagem de perfil.", + "<sender> set a profile picture.": "<sender> definiu uma imagem de perfil.", + "<target> joined the room.": "<target> entrou na sala.", + "<target> rejected the invitation.": "<target> recusou o convite.", + "<target> left the room.": "<target> saiu da sala.", + "<sender> unbanned <target>.": "<sender> desfez o banimento de <target>.", + "<sender> kicked <target>.": "<sender> removeu <target> da sala.", + "<sender> withdrew <target>'s invitation.": "<sender> desfez o convite a <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> mudou o tópico para \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> alterou o nome da sala para %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> alterou a imagem da sala %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> alterou a imagem da sala para <img/>", + "<sender> removed the room name.": "<sender> apagou o nome da sala.", + "<sender> removed the room avatar.": "<sender> removeu a imagem da sala.", + "<sender> answered the call.": "<sender> atendeu à chamada.", + "<sender> ended the call.": "<sender> finalizou a chamada.", + "<sender> placed a %(callType)s call.": "<sender> fez uma chamada de %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> enviou um convite para %(targetDisplayName)s entrar na sala.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", + "<sender> made future room history visible to all room members.": "<sender> deixou o histórico futuro da sala visível para todas as pessoas da sala.", + "<sender> made future room history visible to anyone.": "<sender> deixou o histórico futuro da sala visível para qualquer pessoa.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s para %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> alterou o nível de permissões de %(powerLevelDiffText)s.", + "%(widgetName)s widget modified by <sender>": "Widget %(widgetName)s modificado por <sender>", + "%(widgetName)s widget added by <sender>": "Widget %(widgetName)s adicionado por <sender>", + "%(widgetName)s widget removed by <sender>": "Widget %(widgetName)s removido por <sender>" } diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index c583e795cb..e07b51ea79 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -16,7 +16,6 @@ "Blacklisted": "Bloqueado", "Bulk Options": "Opcões de Batelada", "Can't load user settings": "Não é possível carregar configurações de usuário", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala", "Changes your display nickname": "Troca o seu apelido", "Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519", @@ -198,15 +197,8 @@ "Dec": "Dez", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s de %(monthName)s às %(time)s", "%(weekDayName)s %(time)s": "%(weekDayName)s às %(time)s", - "%(targetName)s accepted an invitation.": "%(targetName)s aceitou um convite.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.", "%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s estão escrevendo", - "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", - "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "click to reveal": "clique para ver", "Conference call failed.": "Chamada de conferência falhou.", "Conference calling is in development and may not be reliable.": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar.", @@ -214,42 +206,23 @@ "Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador", "/ddg is not a command": "/ddg não é um comando", "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", - "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", "Failed to send email": "Não foi possível enviar email", "Failed to send request.": "Não foi possível mandar requisição.", "Failed to set up conference call": "Não foi possível montar a chamada de conferência", "Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email", "Failure to create room": "Não foi possível criar a sala", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.", "%(displayName)s is typing": "%(displayName)s está escrevendo", - "%(targetName)s joined the room.": "%(targetName)s entrou na sala.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", - "%(targetName)s left the room.": "%(targetName)s saiu da sala.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s deixou o histórico futuro da sala visível para todas as pessoas da sala.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s deixou o histórico futuro da sala visível para qualquer pessoa.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", "Missing room_id in request": "Faltou o id da sala na requisição", "Missing user_id in request": "Faltou o id de usuário na requisição", "(not supported by this browser)": "(não é compatível com este navegador)", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.", "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", "Press <StartChatButton> to start a chat with someone": "Clique em <StartChatButton> para iniciar a conversa com alguém", "Reason": "Razão", - "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s está solicitando uma conferência de voz.", "Riot does not have permission to send you notifications - please check your browser settings": "Riot não tem permissões para enviar notificações a você - por favor, verifique as configurações do seu navegador", "Riot was not given permission to send notifications - please try again": "Riot não tem permissões para enviar notificações a você - por favor, tente novamente", "Room %(roomId)s not visible": "A sala %(roomId)s não está visível", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou um convite para %(targetDisplayName)s entrar na sala.", - "%(senderName)s set a profile picture.": "%(senderName)s definiu uma imagem de perfil.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s definiu seu nome público para %(displayName)s.", "This email address is already in use": "Este endereço de email já está sendo usado", "This email address was not found": "Este endereço de email não foi encontrado", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "O arquivo '%(fileName)s' ultrapassa o limite de tamanho que nosso servidor permite enviar", @@ -259,15 +232,12 @@ "These are experimental features that may break in unexpected ways": "Estas são funcionalidades experimentais que podem apresentar falhas", "This phone number is already in use": "Este número de telefone já está sendo usado", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", "Unable to enable Notifications": "Não foi possível ativar as notificações", "Upload Failed": "O envio falhou", "Usage": "Uso", "Use with caution": "Use com cautela", "VoIP is unsupported": "Chamada de voz não permitida", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "You are already in a call.": "Você já está em uma chamada.", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Você ainda não está em nenhuma sala! Clique em <CreateRoomButton> para criar uma sala ou em <RoomDirectoryButton> para navegar pela lista pública de salas", "You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.", @@ -408,7 +378,6 @@ "Warning!": "Atenção!", "You need to enter a user name.": "Você precisa inserir um nome de usuária(o).", "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", @@ -503,9 +472,6 @@ "Verified key": "Chave verificada", "WARNING: Device already verified, but keys do NOT MATCH!": "ATENÇÃO: O dispositivo já foi verificado, mas as chaves NÃO SÃO IGUAIS!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: VERIFICAÇÃO DE CHAVE FALHOU! A chave de assinatura para a(o) usuária(o) %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\", que não é igual à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estão sendo interceptadas!", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a imagem da sala.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a imagem da sala %(roomName)s", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s alterou a imagem da sala para <img/>", "Missing Media Permissions, click here to request.": "Faltam permissões para uso de mídia no seu computador. Clique aqui para solicitá-las.", "No Microphones detected": "Não foi detectado nenhum microfone", "No Webcams detected": "Não foi detectada nenhuma Webcam", @@ -673,11 +639,6 @@ "Unable to create widget.": "Não foi possível criar o widget.", "You are now ignoring %(userId)s": "Você está agora ignorando %(userId)s", "Unignored user": "Usuária/o não está sendo mais ignorada/o", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s alterou o seu nome público para %(displayName)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s alterou as mensagens fixas da sala.", - "%(widgetName)s widget modified by %(senderName)s": "O widget %(widgetName)s foi modificado por %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "O widget %(widgetName)s foi criado por %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "O widget %(widgetName)s foi removido por %(senderName)s", "%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras pessoas estão escrevendo", "%(names)s and %(count)s others are typing|one": "%(names)s e uma outra pessoa estão escrevendo", "Send": "Enviar", @@ -1114,5 +1075,44 @@ "Collapse panel": "Colapsar o painel", "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!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se você quiser tentar de qualquer maneira, pode continuar, mas aí vai ter que se virar sozinho(a) com os problemas que porventura encontrar!", "Checking for an update...": "Verificando se há atualizações...", - "There are advanced notifications which are not shown here": "Existem opções avançadas que não são exibidas aqui" + "There are advanced notifications which are not shown here": "Existem opções avançadas que não são exibidas aqui", + "<target> accepted the invitation for %(displayName)s.": "<target> aceitou o convite para %(displayName)s.", + "<target> accepted an invitation.": "<target> aceitou um convite.", + "<sender> requested a VoIP conference.": "<sender> está solicitando uma conferência de voz.", + "<sender> invited <target>.": "<sender> convidou <target>.", + "<sender> banned <target>.": "<sender> removeu <target> da sala.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> alterou o seu nome público para <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> definiu seu nome público para <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> removeu o seu nome público (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> removeu sua imagem de perfil.", + "<sender> changed their profile picture.": "<sender> alterou sua imagem de perfil.", + "<sender> set a profile picture.": "<sender> definiu uma imagem de perfil.", + "<target> joined the room.": "<target> entrou na sala.", + "<target> rejected the invitation.": "<target> recusou o convite.", + "<target> left the room.": "<target> saiu da sala.", + "<sender> unbanned <target>.": "<sender> desfez o banimento de <target>.", + "<sender> kicked <target>.": "<sender> removeu <target> da sala.", + "<sender> withdrew <target>'s invitation.": "<sender> desfez o convite a <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> mudou o tópico para \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> alterou o nome da sala para %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> alterou a imagem da sala %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> alterou a imagem da sala para <img/>", + "<sender> removed the room name.": "<sender> apagou o nome da sala.", + "<sender> removed the room avatar.": "<sender> removeu a imagem da sala.", + "<sender> answered the call.": "<sender> atendeu à chamada.", + "<sender> ended the call.": "<sender> finalizou a chamada.", + "<sender> placed a %(callType)s call.": "<sender> fez uma chamada de %(callType)s.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> enviou um convite para %(targetDisplayName)s entrar na sala.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", + "<sender> made future room history visible to all room members.": "<sender> deixou o histórico futuro da sala visível para todas as pessoas da sala.", + "<sender> made future room history visible to anyone.": "<sender> deixou o histórico futuro da sala visível para qualquer pessoa.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s para %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> alterou o nível de permissões de %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> alterou as mensagens fixas da sala.", + "%(widgetName)s widget modified by <sender>": "O widget %(widgetName)s foi modificado por <sender>", + "%(widgetName)s widget added by <sender>": "O widget %(widgetName)s foi criado por <sender>", + "%(widgetName)s widget removed by <sender>": "O widget %(widgetName)s foi removido por <sender>" } diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index ae889c5677..68483ab4ff 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -136,41 +136,22 @@ "Your password has been reset": "Ваш пароль был сброшен", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Пароль успешно изменен. До повторной авторизации вы не будете получать push-уведомления на других устройствах", "You should not yet trust it to secure data": "На данный момент не следует полагаться на то, что ваша переписка будет надежно зашифрована", - "%(targetName)s accepted an invitation.": "%(targetName)s принял приглашение.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s принял приглашение от %(displayName)s.", "Active call": "Активный вызов", "%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s печатают", - "%(senderName)s answered the call.": "%(senderName)s ответил(а) на звонок.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s заблокировал(а) %(targetName)s.", "Call Timeout": "Нет ответа", - "%(senderName)s changed their profile picture.": "%(senderName)s изменил(а) свой аватар.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s изменил(а) уровни прав %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s изменил(а) название комнаты на %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s изменил(а) тему комнаты на \"%(topic)s\".", "Conference call failed.": "Сбой конференц-звонка.", "Conference calling is in development and may not be reliable.": "Конференц-связь находится в разработке и может не работать.", "Conference calls are not supported in encrypted rooms": "Конференц-связь не поддерживается в зашифрованных комнатах", "Conference calls are not supported in this client": "Конференц-связь в этом клиенте не поддерживается", "/ddg is not a command": "/ddg — это не команда", "Drop here to tag %(section)s": "Перетащите сюда, чтобы пометить как %(section)s", - "%(senderName)s ended the call.": "%(senderName)s завершил(а) звонок.", "Existing Call": "Текущий вызов", "Failed to send request.": "Не удалось отправить запрос.", "Failed to set up conference call": "Не удалось сделать конференц-звонок", "Failed to verify email address: make sure you clicked the link in the email": "Не удалось проверить email: убедитесь, что вы перешли по ссылке в письме", "Failure to create room": "Не удалось создать комнату", - "%(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.", "%(displayName)s is typing": "%(displayName)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 сделал(а) историю разговора видимой для всех собеседников с момента их приглашения.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников с момента их входа в комнату.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s сделал(а) историю разговора видимой для всех.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s сделал(а) историю комнаты видимой в неизвестном режиме (%(visibility)s).", "Missing room_id in request": "Отсутствует room_id в запросе", "Missing user_id in request": "Отсутствует user_id в запросе", "(not supported by this browser)": "(не поддерживается этим браузером)", @@ -200,7 +181,6 @@ "You are already in a call.": "Идет разговор.", "You are trying to access %(roomName)s.": "Вы пытаетесь войти в %(roomName)s.", "You cannot place a call with yourself.": "Вы не можете позвонить самому себе.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отозвал(а) свое приглашение %(targetName)s.", "Sep": "Сен", "Jan": "Янв", "Feb": "Фев", @@ -223,8 +203,6 @@ "Sat": "Сб", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш email не связан ни с одним пользователем на этом сервере.", "To use it, just wait for autocomplete results to load and tab through them.": "Чтобы воспользоваться этой функцией, дождитесь загрузки результатов в окне автодополнения, а затем используйте Tab для прокрутки.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включил(а) в комнате сквозное шифрование (алгоритм %(algorithm)s).", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s разблокировал(а) %(targetName)s.", "Unable to capture screen": "Не удается сделать снимок экрана", "Unable to enable Notifications": "Не удалось включить уведомления", "Upload Failed": "Сбой отправки файла", @@ -298,17 +276,12 @@ "OK": "OK", "Only people who have been invited": "Только приглашенные участники", "Passwords can't be empty": "Пароли не могут быть пустыми", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s начал(а) %(callType)s-звонок.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Проверьте свою электронную почту и нажмите на содержащуюся ссылку. После этого нажмите кнопку Продолжить.", "Power level must be positive integer.": "Уровень прав должен быть положительным целым числом.", "Profile": "Профиль", "Reason": "Причина", - "%(targetName)s rejected the invitation.": "%(targetName)s отклонил(а) приглашение.", "Reject invitation": "Отклонить приглашение", "Remove Contact Information?": "Удалить контактную информацию?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s удалил(а) свое отображаемое имя (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s удалил(а) свой аватар.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s хочет начать конференц-звонок.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Сброс пароля на данный момент сбрасывает ключи шифрования на всех устройствах, делая зашифрованную историю чатов нечитаемой. Чтобы избежать этого, экспортируйте ключи комнат и импортируйте их после сброса пароля. В будущем это будет исправлено.", "Riot does not have permission to send you notifications - please check your browser settings": "У Riot нет разрешения на отправку уведомлений — проверьте настройки браузера", "Riot was not given permission to send notifications - please try again": "Riot не получил разрешение на отправку уведомлений, пожалуйста, попробуйте снова", @@ -324,7 +297,6 @@ "Sender device information": "Информация об устройстве отправителя", "Send Invites": "Отправить приглашения", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s отправил(а) изображение.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s пригласил(а) %(targetDisplayName)s в комнату.", "Show panel": "Показать панель", "Sign in": "Войти", "Sign out": "Выйти", @@ -393,7 +365,6 @@ "You may need to manually permit Riot to access your microphone/webcam": "Вам необходимо предоставить Riot доступ к микрофону или веб-камере вручную", "Anyone": "Все", "Are you sure you want to leave the room '%(roomName)s'?": "Вы уверены, что хотите покинуть '%(roomName)s'?", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s удалил(а) имя комнаты.", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Смена пароля на данный момент сбрасывает ключи сквозного шифрования на всех устройствах, делая историю зашифрованных чатов нечитаемой. Чтобы избежать этого, экспортируйте ключи сквозного шифрования и импортируйте их после смены пароля. В будущем это будет исправлено.", "Custom level": "Специальные права", "Device already verified!": "Устройство уже проверено!", @@ -430,8 +401,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Возможно, сервер недоступен, перегружен или случилась ошибка.", "Server unavailable, overloaded, or something else went wrong.": "Возможно, сервер недоступен, перегружен или что-то еще пошло не так.", "Session ID": "ID сессии", - "%(senderName)s set a profile picture.": "%(senderName)s установил(а) себе аватар.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s изменил(а) отображаемое имя на %(displayName)s.", "Signed Out": "Выполнен выход", "Tagged as: ": "Метки: ", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Предоставленный вами ключ совпадает с ключом, полученным от %(userId)s с устройства %(deviceId)s. Это устройство помечено как проверенное.", @@ -526,9 +495,6 @@ "Online": "Онлайн", "Idle": "Неактивен", "Offline": "Не в сети", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s сменил(а) аватар комнаты на <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s удалил(а) аватар комнаты.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s сменил(а) аватар %(roomName)s", "Create new room": "Создать комнату", "Room directory": "Каталог комнат", "Start chat": "Начать чат", @@ -663,11 +629,8 @@ "Automatically replace plain text Emoji": "Автоматически заменять текстовые смайлики на Emoji", "Failed to upload image": "Не удалось загрузить изображение", "Hide avatars in user and room mentions": "Скрывать аватары в упоминаниях пользователей и комнат", - "%(widgetName)s widget added by %(senderName)s": "Виджет %(widgetName)s был добавлен %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "Виджет %(widgetName)s был удален %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "CAPTCHA-тест в настоящее время недоступен в Desktop-клиенте - пожалуйста, используйте <a>браузер</a>", "Publish this room to the public in %(domain)s's room directory?": "Опубликовать эту комнату в каталоге комнат %(domain)s?", - "%(widgetName)s widget modified by %(senderName)s": "Виджет %(widgetName)s был изменен %(senderName)s", "Copied!": "Скопировано!", "Failed to copy": "Не удалось скопировать", "Advanced options": "Дополнительные параметры", @@ -722,7 +685,6 @@ "Which rooms would you like to add to this summary?": "Какие комнаты вы хотите добавить в эту сводку?", "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:", "Failed to remove the room from the summary of %(groupId)s": "Не удалось удалить комнату из сводки %(groupId)s", "The room '%(roomName)s' could not be removed from the summary.": "Комнату '%(roomName)s' не удалось удалить из сводки.", @@ -955,7 +917,6 @@ "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Показать устройства</showDevicesText>, <sendAnywayText>отправить в любом случае</sendAnywayText> или <cancelText>отменить</cancelText>.", "Community IDs cannot not be empty.": "ID сообществ не могут быть пустыми.", "<a>In reply to</a> <pill>": "<a>В ответ на</a> <pill>", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s изменил(а) отображаемое имя на %(displayName)s.", "Failed to set direct chat tag": "Не удалось установить тег прямого чата", "Failed to remove tag %(tagName)s from room": "Не удалось удалить тег %(tagName)s из комнаты", "Failed to add tag %(tagName)s to room": "Не удалось добавить тег %(tagName)s в комнату", @@ -1191,5 +1152,44 @@ "Share User": "Поделиться пользователем", "Share Community": "Поделиться сообществом", "Link to selected message": "Ссылка на выбранное сообщение", - "COPY": "КОПИРОВАТЬ" + "COPY": "КОПИРОВАТЬ", + "<target> accepted the invitation for %(displayName)s.": "<target> принял приглашение от %(displayName)s.", + "<target> accepted an invitation.": "<target> принял приглашение.", + "<sender> requested a VoIP conference.": "<sender> хочет начать конференц-звонок.", + "<sender> invited <target>.": "<sender> приглашает <target>.", + "<sender> banned <target>.": "<sender> заблокировал(а) <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> изменил(а) отображаемое имя на <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> изменил(а) отображаемое имя на <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> удалил(а) свое отображаемое имя (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> удалил(а) свой аватар.", + "<sender> changed their profile picture.": "<sender> изменил(а) свой аватар.", + "<sender> set a profile picture.": "<sender> установил(а) себе аватар.", + "<target> joined the room.": "<target> вошел(-ла) в комнату.", + "<target> rejected the invitation.": "<target> отклонил(а) приглашение.", + "<target> left the room.": "<target> покинул(а) комнату.", + "<sender> unbanned <target>.": "<sender> разблокировал(а) <target>.", + "<sender> kicked <target>.": "<sender> выгнал(а) <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> отозвал(а) свое приглашение <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> изменил(а) тему комнаты на \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> изменил(а) название комнаты на %(roomName)s.", + "<sender> changed the room avatar to <img/>": "<sender> сменил(а) аватар комнаты на <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> сменил(а) аватар %(roomName)s", + "<sender> removed the room name.": "<sender> удалил(а) имя комнаты.", + "<sender> removed the room avatar.": "<sender> удалил(а) аватар комнаты.", + "<sender> answered the call.": "<sender> ответил(а) на звонок.", + "<sender> ended the call.": "<sender> завершил(а) звонок.", + "<sender> placed a %(callType)s call.": "<sender> начал(а) %(callType)s-звонок.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> пригласил(а) %(targetDisplayName)s в комнату.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> сделал(а) историю разговора видимой для всех собеседников с момента их приглашения.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> сделал(а) историю разговора видимой для всех собеседников с момента их входа в комнату.", + "<sender> made future room history visible to all room members.": "<sender> сделал(а) историю разговора видимой для всех собеседников.", + "<sender> made future room history visible to anyone.": "<sender> сделал(а) историю разговора видимой для всех.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> сделал(а) историю комнаты видимой в неизвестном режиме (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> включил(а) в комнате сквозное шифрование (алгоритм %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "для <user> с %(fromPowerLevel)s на %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> изменил(а) уровни прав %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> изменил(а) закрепленные в этой комнате сообщения.", + "%(widgetName)s widget modified by <sender>": "Виджет %(widgetName)s был изменен <sender>", + "%(widgetName)s widget added by <sender>": "Виджет %(widgetName)s был добавлен <sender>", + "%(widgetName)s widget removed by <sender>": "Виджет %(widgetName)s был удален <sender>" } diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index b1f3f4260d..eae28ee1fa 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -102,49 +102,14 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Podpisovací kľúč, ktorý ste poskytli súhlasí s podpisovacím kľúčom, ktorý ste dostali zo zariadenia %(deviceId)s používateľa %(userId)s's. Zariadenie je považované za overené.", "Unrecognised command:": "Nerozpoznaný príkaz:", "Reason": "Dôvod", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s prijal pozvanie do %(displayName)s.", - "%(targetName)s accepted an invitation.": "%(targetName)s prijal pozvanie.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s požiadal o VoIP konferenciu.", - "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s zakázal vstup %(targetName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s si nastavil zobrazované meno %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s odstránil svoje zobrazované meno (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s si z profilu odstránil obrázok.", - "%(senderName)s changed their profile picture.": "%(senderName)s si zmenil obrázok v profile.", - "%(senderName)s set a profile picture.": "%(senderName)s si nastavil obrázok v profile.", "VoIP conference started.": "Začala VoIP konferencia.", - "%(targetName)s joined the room.": "%(targetName)s vstúpil do miestnosti.", "VoIP conference finished.": "Skončila VoIP konferencia.", - "%(targetName)s rejected the invitation.": "%(targetName)s odmietol pozvanie.", - "%(targetName)s left the room.": "%(targetName)s opustil miestnosť.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s povolil vstup %(targetName)s.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s vykopol %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s stiahol pozvanie %(targetName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmenil tému na \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s odstránil názov miestnosti.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmenil názov miestnosti na %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s poslal obrázok.", "Someone": "Niekto", "(not supported by this browser)": "(Nepodporované v tomto prehliadači)", - "%(senderName)s answered the call.": "%(senderName)s prijal hovor.", "(could not connect media)": "(nie je možné spojiť médiá)", "(no answer)": "(žiadna odpoveď)", "(unknown failure: %(reason)s)": "(neznáma chyba: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s ukončil hovor.", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s uskutočnil %(callType)s hovor.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s pozval %(targetDisplayName)s vstúpiť do miestnosti.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy boli pozvaní.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy vstúpili.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre každého.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s sprístupnil budúcu históriu miestnosti neznámym (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s povolil E2E šifrovanie (algoritmus %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmenil úroveň moci pre %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmenil pripnuté správy pre túto miestnosť.", - "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s zmenil widget %(widgetName)s", - "%(widgetName)s widget added by %(senderName)s": "%(senderName)s pridal widget %(widgetName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s odstránil widget %(widgetName)s", "Communities": "Komunity", "Message Pinning": "Pripnutie správ", "%(displayName)s is typing": "%(displayName)s píše", @@ -422,9 +387,6 @@ "Invalid file%(extra)s": "Neplatný súbor%(extra)s", "Error decrypting image": "Chyba pri dešifrovaní obrázka", "Error decrypting video": "Chyba pri dešifrovaní videa", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmenil obrázok miestnosti %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstránil obrázok miestnosti.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s zmenil obrázok miestnosti <img/>", "Copied!": "Skopírované!", "Failed to copy": "Nepodarilo sa skopírovať", "Add an Integration": "Pridať integráciu", @@ -952,7 +914,6 @@ "Your homeserver's URL": "URL adresa vami používaného domovského servera", "Your identity server's URL": "URL adresa vami používaného servera totožností", "This room is not public. You will not be able to rejoin without an invite.": "Toto nie je verejne dostupná miestnosť. Bez pozvánky nebudete do nej môcť vstúpiť znovu.", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s si zmenil zobrazované meno na %(displayName)s.", "Failed to set direct chat tag": "Nepodarilo sa nastaviť značku priama konverzácia", "Failed to remove tag %(tagName)s from room": "Z miestnosti sa nepodarilo odstrániť značku %(tagName)s", "Failed to add tag %(tagName)s to room": "Miestnosti sa nepodarilo pridať značku %(tagName)s", @@ -1180,5 +1141,44 @@ "Terms and Conditions": "Zmluvné podmienky", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Ak chcete aj naďalej používať domovský server %(homeserverDomain)s, mali by ste si prečítať a odsúhlasiť naše zmluvné podmienky.", "Review terms and conditions": "Prečítať zmluvné podmienky", - "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť" + "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť", + "<target> accepted the invitation for %(displayName)s.": "<target> prijal pozvanie do %(displayName)s.", + "<target> accepted an invitation.": "<target> prijal pozvanie.", + "<sender> requested a VoIP conference.": "<sender> požiadal o VoIP konferenciu.", + "<sender> invited <target>.": "<sender> pozval <target>.", + "<sender> banned <target>.": "<sender> zakázal vstup <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> si zmenil zobrazované meno na <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> si nastavil zobrazované meno <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> odstránil svoje zobrazované meno (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> si z profilu odstránil obrázok.", + "<sender> changed their profile picture.": "<sender> si zmenil obrázok v profile.", + "<sender> set a profile picture.": "<sender> si nastavil obrázok v profile.", + "<target> joined the room.": "<target> vstúpil do miestnosti.", + "<target> rejected the invitation.": "<target> odmietol pozvanie.", + "<target> left the room.": "<target> opustil miestnosť.", + "<sender> unbanned <target>.": "<sender> povolil vstup <target>.", + "<sender> kicked <target>.": "<sender> vykopol <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> stiahol pozvanie <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> zmenil tému na \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> zmenil názov miestnosti na %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> zmenil obrázok miestnosti %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> zmenil obrázok miestnosti <img/>", + "<sender> removed the room name.": "<sender> odstránil názov miestnosti.", + "<sender> removed the room avatar.": "<sender> odstránil obrázok miestnosti.", + "<sender> answered the call.": "<sender> prijal hovor.", + "<sender> ended the call.": "<sender> ukončil hovor.", + "<sender> placed a %(callType)s call.": "<sender> uskutočnil %(callType)s hovor.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> pozval %(targetDisplayName)s vstúpiť do miestnosti.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy boli pozvaní.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy vstúpili.", + "<sender> made future room history visible to all room members.": "<sender> sprístupnil budúcu históriu miestnosti pre všetkých členov.", + "<sender> made future room history visible to anyone.": "<sender> sprístupnil budúcu históriu miestnosti pre každého.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> sprístupnil budúcu históriu miestnosti neznámym (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> povolil E2E šifrovanie (algoritmus %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> z %(fromPowerLevel)s na %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> zmenil úroveň moci pre %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> zmenil pripnuté správy pre túto miestnosť.", + "%(widgetName)s widget modified by <sender>": "<sender> zmenil widget %(widgetName)s", + "%(widgetName)s widget added by <sender>": "<sender> pridal widget %(widgetName)s", + "%(widgetName)s widget removed by <sender>": "<sender> odstránil widget %(widgetName)s" } diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 6d217d5349..350338a908 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -110,51 +110,16 @@ "Verified key": "Проверени кључ", "Unrecognised command:": "Непрепозната наредба:", "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.", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(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 device %(deviceId)s. Device marked as verified.": "Кључ за потписивање који сте доставили се подудара са кључем за потписивање од корисника %(userId)s и уређаја %(deviceId)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 конференција је започета.", - "%(targetName)s joined the room.": "Корисник %(targetName)s је ушао у собу.", "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“.", - "%(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 је послао слику.", "Someone": "Неко", "(not supported by this browser)": "(није подржано од стране овог прегледача)", - "%(senderName)s answered the call.": "Корисник %(senderName)s се јавио.", "(could not connect media)": "(не могу да повежем медије)", "(no answer)": "(нема одговора)", "(unknown failure: %(reason)s)": "(непозната грешка: %(reason)s)", - "%(senderName)s ended the call.": "Корисник %(senderName)s је окончао позив.", - "%(senderName)s placed a %(callType)s call.": "Корисник %(senderName)s је направио %(callType)s позив.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "Корисник %(senderName)s је послао позивницу за приступ соби ка %(targetDisplayName)s.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе, од тренутка позивања у собу.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе, од тренутка приступања соби.", - "%(senderName)s made future room history visible to all room members.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе.", - "%(senderName)s made future room history visible to anyone.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свима.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Корисник %(senderName)s је учинио будући историјат собе непознатим (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Корисник %(senderName)s је укључио шифровање с краја на крај (алгоритам %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s са %(fromPowerLevel)s на %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Корисник %(senderName)s је променио ниво моћи од %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "Корисник %(senderName)s је променио закачене поруке у соби.", - "%(widgetName)s widget modified by %(senderName)s": "Корисник %(senderName)s је променио виџет %(widgetName)s", - "%(widgetName)s widget added by %(senderName)s": "Корисник %(senderName)s је додао виџет %(widgetName)s", - "%(widgetName)s widget removed by %(senderName)s": "Корисник %(senderName)s је уклонио виџет %(widgetName)s", "%(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 и још један куцају", @@ -476,9 +441,6 @@ "Invalid file%(extra)s": "Неисправна датотека %(extra)s", "Error decrypting image": "Грешка при дешифровању слике", "Error decrypting video": "Грешка при дешифровању видеа", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "Корисник %(senderDisplayName)s је променио аватара собе %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "Корисник %(senderDisplayName)s је уклонио аватара собе.", - "%(senderDisplayName)s changed the room avatar to <img/>": "Корисник %(senderDisplayName)s је променио аватара собе у <img/>", "Copied!": "Копирано!", "Failed to copy": "Нисам успео да ископирам", "Add an Integration": "Додај уградњу", @@ -762,7 +724,6 @@ "Analytics": "Аналитика", "The information being sent to us to help make Riot.im better includes:": "У податке које нам шаљете зарад побољшавања Riot.im-а спадају:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ако страница садржи поверљиве податке (као што је назив собе, корисника или ИБ-ја групе), ти подаци се уклањају пре слања на сервер.", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "Корисник %(oldDisplayName)s је променио приказно име у %(displayName)s.", "Failed to set direct chat tag": "Нисам успео да поставим ознаку директног ћаскања", "Failed to remove tag %(tagName)s from room": "Нисам успео да скинем ознаку %(tagName)s са собе", "Failed to add tag %(tagName)s to room": "Нисам успео да додам ознаку %(tagName)s на собу", @@ -1177,5 +1138,44 @@ "Terms and Conditions": "Услови коришћења", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Да бисте наставили са коришћењем Кућног сервера %(homeserverDomain)s морате погледати и пристати на наше услове коришћења.", "Review terms and conditions": "Погледај услове коришћења", - "Try the app first": "Пробајте прво апликацију" + "Try the app first": "Пробајте прво апликацију", + "<target> accepted the invitation for %(displayName)s.": "<target> је прихватио позивницу за %(displayName)s.", + "<target> accepted an invitation.": "<target> је прихватио позивницу.", + "<sender> requested a VoIP conference.": "<sender> је затражио VoIP конференцију.", + "<sender> invited <target>.": "<sender> је позвао <target>.", + "<sender> banned <target>.": "<sender> је бановао <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "Корисник <oldDisplayName> је променио приказно име у <displayName>.", + "<sender> set their display name to <displayName>.": "Корисник <sender> је себи поставио приказно име <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "Корисник <sender> је себи уклонио приказно име <oldDisplayName>.", + "<sender> removed their profile picture.": "Корисник <sender> је себи уклонио профилну слику.", + "<sender> changed their profile picture.": "Корисник <sender> је себи променио профилну слику.", + "<sender> set a profile picture.": "Корисник <sender> је себи поставио профилну слику.", + "<target> joined the room.": "Корисник <target> је ушао у собу.", + "<target> rejected the invitation.": "Корисник <target> је одбацио позивницу.", + "<target> left the room.": "Корисник <target> је напустио собу.", + "<sender> unbanned <target>.": "Корисник <sender> је скинуо забрану приступа са <target>.", + "<sender> kicked <target>.": "Корисник <sender> је избацио <target>.", + "<sender> withdrew <target>'s invitation.": "Пошиљалац <sender> је повукао позивницу за <target>.", + "<sender> changed the topic to \"%(topic)s\".": "Корисник <sender> је променио тему у „%(topic)s“.", + "<sender> changed the room name to %(roomName)s.": "Корисник <sender> је променио назив собе у %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "Корисник <sender> је променио аватара собе %(roomName)s", + "<sender> changed the room avatar to <img/>": "Корисник <sender> је променио аватара собе у <img/>", + "<sender> removed the room name.": "Корисник <sender> је уклонио назив собе.", + "<sender> removed the room avatar.": "Корисник <sender> је уклонио аватара собе.", + "<sender> answered the call.": "Корисник <sender> се јавио.", + "<sender> ended the call.": "Корисник <sender> је окончао позив.", + "<sender> placed a %(callType)s call.": "Корисник <sender> је направио %(callType)s позив.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "Корисник <sender> је послао позивницу за приступ соби ка %(targetDisplayName)s.", + "<sender> made future room history visible to all room members, from the point they are invited.": "Корисник <sender> је учинио будући историјат собе видљивим свим члановима собе, од тренутка позивања у собу.", + "<sender> made future room history visible to all room members, from the point they joined.": "Корисник <sender> је учинио будући историјат собе видљивим свим члановима собе, од тренутка приступања соби.", + "<sender> made future room history visible to all room members.": "Корисник <sender> је учинио будући историјат собе видљивим свим члановима собе.", + "<sender> made future room history visible to anyone.": "Корисник <sender> је учинио будући историјат собе видљивим свима.", + "<sender> made future room history visible to unknown (%(visibility)s).": "Корисник <sender> је учинио будући историјат собе непознатим (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "Корисник <sender> је укључио шифровање с краја на крај (алгоритам %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> са %(fromPowerLevel)s на %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "Корисник <sender> је променио ниво моћи од %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "Корисник <sender> је променио закачене поруке у соби.", + "%(widgetName)s widget modified by <sender>": "Корисник <sender> је променио виџет %(widgetName)s", + "%(widgetName)s widget added by <sender>": "Корисник <sender> је додао виџет %(widgetName)s", + "%(widgetName)s widget removed by <sender>": "Корисник <sender> је уклонио виџет %(widgetName)s" } diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 0e26125c30..986f48c81e 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1,7 +1,5 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ett SMS har skickats till +%(msisdn)s. Vänligen ange verifieringskoden ur meddelandet", - "%(targetName)s accepted an invitation.": "%(targetName)s accepterade en inbjudan.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepterade inbjudan för %(displayName)s.", "Account": "Konto", "Add a topic": "Lägg till ett ämne", "Add email address": "Lägg till en epostadress", @@ -26,7 +24,6 @@ "and %(count)s others...|one": "och en annan...", "%(names)s and %(lastPerson)s are typing": "%(names)s och %(lastPerson)s skriver", "A new password must be entered.": "Ett nytt lösenord måste anges.", - "%(senderName)s answered the call.": "%(senderName)s svarade på samtalet.", "Anyone who knows the room's link, including guests": "Alla som har rummets adress, inklusive gäster", "Anyone": "Vem som helst", "Anyone who knows the room's link, apart from guests": "Alla som har rummets adress, förutom gäster", @@ -38,7 +35,6 @@ "Are you sure you want to reject the invitation?": "Är du säker på att du vill avböja inbjudan?", "Bulk Options": "Volymhandlingar", "Blacklisted": "Svartlistad", - "%(senderName)s banned %(targetName)s.": "%(senderName)s bannade %(targetName)s.", "Banned users": "Bannade användare", "Bans user with given id": "Bannar användare med givet id", "Ban": "Banna", @@ -47,10 +43,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Det går inte att ansluta till en hemserver via HTTP då adressen i webbläsaren är HTTPS. Använd HTTPS, eller <a>sätt på osäkra skript</a>.", "Can't load user settings": "Det gick inte att ladda användarinställningar", "Change Password": "Byt lösenord", - "%(senderName)s changed their profile picture.": "%(senderName)s bytte sin profilbild.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s bytte rummets namn till %(roomName)s.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s tog bort rummets namn.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s bytte rummets ämne till \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Ändringar till vem som kan läsa meddelandehistorik tillämpas endast till framtida meddelanden i det här rummet", "Changes your display nickname": "Byter ditt synliga namn", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du byter lösenord kommer för tillfället alla krypteringsnycklar på alla enheter att nollställas, vilket gör all krypterad meddelandehistorik omöjligt att läsa, om du inte först exporterar rumsnycklarna och sedan importerar dem efteråt. I framtiden kommer det här att förbättras.", @@ -110,7 +102,6 @@ "Enable encryption": "Aktivera kryptering", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Krypterade meddelanden syns inte på klienter som inte ännu stöder kryptering", "Encrypted room": "Krypterat rum", - "%(senderName)s ended the call.": "%(senderName)s avslutade samtalet.", "End-to-end encryption information": "Krypteringsinformation", "End-to-end encryption is in beta and may not be reliable": "Kryptering är i beta och är inte nödvändigtvis pålitligt", "Enter Code": "Skriv in kod", @@ -149,7 +140,6 @@ "Admin Tools": "Admin-verktyg", "Alias (optional)": "Alias (valfri)", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till hemservern - kontrollera anslutningen, se till att <a>hemserverns SSL-certifikat</a> är betrott, och att inget webbläsartillägg blockerar förfrågningar.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade behörighetsnivå för %(powerLevelDiffText)s.", "<a>Click here</a> to join the discussion!": "<a>Klicka här</a> för att gå med i diskussionen!", "Close": "Stäng", "%(count)s new messages|one": "%(count)s nytt meddelande", @@ -176,7 +166,6 @@ "Forgot your password?": "Glömt lösenord?", "For security, this session has been signed out. Please sign in again.": "Av säkerhetsskäl har den här sessionen loggats ut. Vänligen logga in igen.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Av säkerhetsskäl kommer alla krypteringsnycklar att raderas från den här webbläsaren om du loggar ut. Om du vill läsa din krypterade meddelandehistorik från framtida Riot-sessioner, exportera nycklarna till förvar.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s från %(fromPowerLevel)s till %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Gäståtkomst är inte aktiverat på den här hemservern.", "Guests cannot join this room even if explicitly invited.": "Gäster kan inte gå med i det här rummet fastän de är uttryckligen inbjudna.", "Hangup": "Lägg på", @@ -199,7 +188,6 @@ "Invalid address format": "Fel adressformat", "Invalid Email Address": "Ogiltig epostadress", "Invalid file%(extra)s": "Fel fil%(extra)s", - "%(senderName)s invited %(targetName)s.": "%(senderName)s bjöd in %(targetName)s.", "Invite new room members": "Bjud in nya rumsmedlemmar", "Invited": "Inbjuden", "Invites": "Inbjudningar", @@ -210,25 +198,18 @@ "Sign in with": "Logga in med", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Gå med som <voiceText>röst</voiceText> eller <videoText>video</videoText>.", "Join Room": "Gå med i rum", - "%(targetName)s joined the room.": "%(targetName)s gick med i rummet.", "Joins room with given alias": "Går med i rummet med givet alias", "Jump to first unread message.": "Hoppa till första olästa meddelande.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s kickade %(targetName)s.", "Kick": "Kicka", "Kicks user with given id": "Kickar användaren med givet id", "Labs": "Labb", "Last seen": "Senast sedd", "Leave room": "Lämna rummet", - "%(targetName)s left the room.": "%(targetName)s lämnade rummet.", "Level:": "Nivå:", "Local addresses for this room:": "Lokala adresser för rummet:", "Logged in as:": "Inloggad som:", "Logout": "Logga ut", "Low priority": "Låg prioritet", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar från att de bjöds in.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar fr.o.m. att de gick med som medlem.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde framtida rumshistorik synligt för alla.", "Manage Integrations": "Hantera integrationer", "Markdown is disabled": "Markdown är inaktiverat", "Markdown is enabled": "Markdown är aktiverat", @@ -271,7 +252,6 @@ "People": "Personer", "Permissions": "Behörigheter", "Phone": "Telefon", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s startade ett %(callType)ssamtal.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Öppna meddelandet i din epost och klicka på länken i meddelandet. När du har gjort detta, klicka vidare.", "Power level must be positive integer.": "Behörighetsnivå måste vara ett positivt heltal.", "Press <StartChatButton> to start a chat with someone": "Tryck på <StartChatButton> för att starta en chatt med någon", @@ -285,16 +265,12 @@ "Revoke Moderator": "Degradera moderator", "Refer a friend to Riot:": "Hänvisa en vän till Riot:", "Register": "Registrera", - "%(targetName)s rejected the invitation.": "%(targetName)s avvisade inbjudan.", "Reject invitation": "Avböj inbjudan", "Rejoin": "Gå med igen", "Remote addresses for this room:": "Fjärradresser för det här rummet:", "Remove Contact Information?": "Ta bort kontaktuppgifter?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s tog bort sitt visningsnamn (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s tog bort sin profilbild.", "Remove": "Ta bort", "Remove %(threePid)s?": "Ta bort %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s begärde en VoIP-konferens.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du återställer ditt lösenord kommer alla krypteringsnycklar på alla enheter att återställas, vilket gör krypterad meddelandehistorik oläsbar om du inte först exporterar dina rumsnycklar och sedan importerar dem igen. I framtiden kommer det här att förbättras.", "Results from DuckDuckGo": "Resultat från DuckDuckGo", "Return to login screen": "Tillbaka till login-skärmen", @@ -320,7 +296,6 @@ "Send Invites": "Skicka inbjudningar", "Send Reset Email": "Skicka återställningsmeddelande", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s skickade en bild.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s bjöd in %(targetDisplayName)s med i rummet.", "Server error": "Serverfel", "Server may be unavailable or overloaded": "Servern kan vara otillgänglig eller överbelastad", "Server may be unavailable, overloaded, or search timed out :(": "Servern kan vara otillgänglig, överbelastad, eller så tog sökningen för lång tid :(", @@ -328,8 +303,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Servern kan vara otillgänglig, överbelastad, eller så stötte du på en bugg.", "Server unavailable, overloaded, or something else went wrong.": "Servern är otillgänglig, överbelastad, eller så gick något annat fel.", "Session ID": "Sessions-ID", - "%(senderName)s set a profile picture.": "%(senderName)s satte en profilbild.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s bytte sitt visningnamn till %(displayName)s.", "Settings": "Inställningar", "Show panel": "Visa panel", "Show Text Formatting Toolbar": "Visa textformatteringsverktygsfält", @@ -591,13 +564,7 @@ "You are now ignoring %(userId)s": "Du ignorerar nu %(userId)s", "Unignored user": "Oignorerad användare", "You are no longer ignoring %(userId)s": "Du ignorerar inte längre %(userId)s", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s bytte sitt visningsnamn till %(displayName)s.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s avbannade %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s drog tillbaka inbjudan för %(targetName)s.", "(no answer)": "(inget svar)", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget har modifierats av %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget har lagts till av %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-widget har tagits bort av %(senderName)s", "%(names)s and %(count)s others are typing|other": "%(names)s och %(count)s andra skriver", "%(names)s and %(count)s others are typing|one": "%(names)s och en till skriver", "Unnamed Room": "Namnlöst rum", @@ -763,9 +730,6 @@ "Always show encryption icons": "Visa alltid krypteringsikoner", "Disable big emoji in chat": "Inaktivera stor emoji i chatt", "Hide avatars in user and room mentions": "Dölj avatarer i användar- och rumsnämningar", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s bytte avatar för %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s tog bort rummets avatar.", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s ändrade rummets avatar till <img/>", "Automatically replace plain text Emoji": "Ersätt text-emojis automatiskt", "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s", @@ -949,7 +913,6 @@ "Verifies a user, device, and pubkey tuple": "Verifierar en användare, enhet och nycklar", "VoIP conference started.": "VoIP-konferens startad.", "VoIP conference finished.": "VoIP-konferens avslutad.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern.", "The remote side failed to pick up": "Mottagaren kunde inte svara", "Room name or alias": "Rumsnamn eller alias", @@ -969,7 +932,6 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Vänligen hjälp till att förbättra Riot.im genom att skicka <UsageDataLink>anonyma användardata</UsageDataLink>. Detta kommer att använda en cookie (se vår <PolicyLink>Cookiepolicy</PolicyLink>).", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Vänligen hjälp till att förbättra Riot.im genom att skicka <UsageDataLink>anonyma användardata</UsageDataLink>. Detta kommer att använda en cookie.", "Yes, I want to help!": "Ja, jag vill hjälpa till!", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s aktiverade kryptering (algoritm %(algorithm)s).", "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)slämnade och gick med igen %(count)s gånger", "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)slämnade och gick med igen", "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)slämnade och gick med igen %(count)s gånger", @@ -1166,7 +1128,6 @@ "Passphrases must match": "Passfraser måste matcha", "Passphrase must not be empty": "Lösenfras får inte vara tom", "Confirm passphrase": "Bekräfta lösenfrasen", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ändrade fastnålade meddelanden för rummet.", "Message Pinning": "Nåla fast meddelanden", "Unpin Message": "Ta bort fastnålning", "No pinned messages.": "Inga fastnålade meddelanden.", @@ -1180,5 +1141,44 @@ "This room is not showing flair for any communities": "Detta rum visar inte emblem för några communityn", "Flair will appear if enabled in room settings": "Emblem kommer visas om det är aktiverat i rumsinställningarna", "Flair will not appear": "Emblem kommer inte att visas", - "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det." + "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det.", + "<target> accepted the invitation for %(displayName)s.": "<target> accepterade inbjudan för %(displayName)s.", + "<target> accepted an invitation.": "<target> accepterade en inbjudan.", + "<sender> requested a VoIP conference.": "<sender> begärde en VoIP-konferens.", + "<sender> invited <target>.": "<sender> bjöd in <target>.", + "<sender> banned <target>.": "<sender> bannade <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> bytte sitt visningsnamn till <displayName>.", + "<sender> set their display name to <displayName>.": "<sender> bytte sitt visningnamn till <displayName>.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> tog bort sitt visningsnamn (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> tog bort sin profilbild.", + "<sender> changed their profile picture.": "<sender> bytte sin profilbild.", + "<sender> set a profile picture.": "<sender> satte en profilbild.", + "<target> joined the room.": "<target> gick med i rummet.", + "<target> rejected the invitation.": "<target> avvisade inbjudan.", + "<target> left the room.": "<target> lämnade rummet.", + "<sender> unbanned <target>.": "<sender> avbannade <target>.", + "<sender> kicked <target>.": "<sender> kickade <target>.", + "<sender> withdrew <target>'s invitation.": "<sender> drog tillbaka inbjudan för <target>.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> bytte rummets ämne till \"%(topic)s\".", + "<sender> changed the room name to %(roomName)s.": "<sender> bytte rummets namn till %(roomName)s.", + "<sender> changed the avatar for %(roomName)s": "<sender> bytte avatar för %(roomName)s", + "<sender> changed the room avatar to <img/>": "<sender> ändrade rummets avatar till <img/>", + "<sender> removed the room name.": "<sender> tog bort rummets namn.", + "<sender> removed the room avatar.": "<sender> tog bort rummets avatar.", + "<sender> answered the call.": "<sender> svarade på samtalet.", + "<sender> ended the call.": "<sender> avslutade samtalet.", + "<sender> placed a %(callType)s call.": "<sender> startade ett %(callType)ssamtal.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> bjöd in %(targetDisplayName)s med i rummet.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> gjorde framtida rumshistorik synligt för alla rumsmedlemmar från att de bjöds in.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> gjorde framtida rumshistorik synligt för alla rumsmedlemmar fr.o.m. att de gick med som medlem.", + "<sender> made future room history visible to all room members.": "<sender> gjorde framtida rumshistorik synligt för alla rumsmedlemmar.", + "<sender> made future room history visible to anyone.": "<sender> gjorde framtida rumshistorik synligt för alla.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> aktiverade kryptering (algoritm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> från %(fromPowerLevel)s till %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ändrade behörighetsnivå för %(powerLevelDiffText)s.", + "<sender> changed the pinned messages for the room.": "<sender> ändrade fastnålade meddelanden för rummet.", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s-widget har modifierats av <sender>", + "%(widgetName)s widget added by <sender>": "%(widgetName)s-widget har lagts till av <sender>", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s-widget har tagits bort av <sender>" } diff --git a/src/i18n/strings/te.json b/src/i18n/strings/te.json index b6102a5eb5..301651a13d 100644 --- a/src/i18n/strings/te.json +++ b/src/i18n/strings/te.json @@ -1,7 +1,6 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "ఒక టెక్స్ట్ సందేశం +%(msisdn)s కు పంపబడింది. దయచేసి దీనిలో ఉన్న ధృవీకరణ కోడ్ను నమోదు చేయండి", "Accept": "అంగీకరించు", - "%(targetName)s accepted an invitation.": "%(targetName)s ఆహ్వానాన్ని అంగీకరించింది.", "Account": "ఖాతా", "Access Token:": "యాక్సెస్ టోకెన్:", "Add": "చేర్చు", @@ -29,7 +28,6 @@ "You have been invited to join this room by %(inviterName)s": "%(inviterName)s ఈ గదిలో చేరడానికి మీరు ఆహ్వానించబడ్డారు", "Active call (%(roomName)s)": "క్రియాశీల కాల్ల్ (%(roomName)s)", "A new password must be entered.": "కొత్త పాస్ వర్డ్ ను తప్పక నమోదు చేయాలి.", - "%(senderName)s answered the call.": "%(senderName)s కు సమాధానం ఇచ్చారు.", "An error has occurred.": "ఒక లోపము సంభవించినది.", "Anyone": "ఎవరైనా", "Anyone who knows the room's link, apart from guests": "అతిథులు కాకుండా గది యొక్క లింక్ తెలిసిన వారు ఎవరైనా", @@ -49,8 +47,6 @@ "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "గృహనిర్వాహకులకు కనెక్ట్ చేయలేరు - దయచేసి మీ కనెక్టివిటీని తనిఖీ చేయండి, మీ <a> 1 హోమరుసు యొక్క ఎస్ఎస్ఎల్ సర్టిఫికేట్ </a> 2 ని విశ్వసనీయపరుచుకొని, బ్రౌజర్ పొడిగింపు అభ్యర్థనలను నిరోధించబడదని నిర్ధారించుకోండి.", "Can't load user settings": "వినియోగదారు సెట్టింగ్లను లోడ్ చేయలేరు", "Change Password": "పాస్వర్డ్ మార్చండి", - "%(senderName)s changed their profile picture.": "%(senderName)s వారి ప్రొఫైల్ చిత్రాన్ని మార్చారు.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s గది పేరు తొలగించబడింది.", "Changes to who can read history will only apply to future messages in this room": "చరిత్ర చదివేవారికి మార్పులు ఈ గదిలో భవిష్య సందేశాలకు మాత్రమే వర్తిస్తాయి", "Changes your display nickname": "మీ ప్రదర్శన మారుపేరుని మారుస్తుంది", "You cannot place a call with yourself.": "మీరు మీతో కాల్ చేయలేరు.", @@ -275,5 +271,9 @@ "#example": "#ఉదాహరణ", "Collapse panel": "ప్యానెల్ కుదించు", "Checking for an update...": "నవీకరణ కోసం చూస్తోంది...", - "Saturday": "శనివారం" + "Saturday": "శనివారం", + "<target> accepted an invitation.": "<target> ఆహ్వానాన్ని అంగీకరించింది.", + "<sender> changed their profile picture.": "<sender> వారి ప్రొఫైల్ చిత్రాన్ని మార్చారు.", + "<sender> removed the room name.": "<sender> గది పేరు తొలగించబడింది.", + "<sender> answered the call.": "<sender> కు సమాధానం ఇచ్చారు." } diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 3fe7bf8f98..878d5eaaee 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -11,8 +11,6 @@ "Delete": "ลบ", "Default": "ค่าเริ่มต้น", "Default Device": "อุปกรณ์เริ่มต้น", - "%(senderName)s banned %(targetName)s.": "%(senderName)s แบน %(targetName)s แล้ว", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s เปลี่ยนหัวข้อเป็น \"%(topic)s\"", "Decrypt %(text)s": "ถอดรหัส %(text)s", "Device ID": "ID อุปกรณ์", "Device ID:": "ID อุปกรณ์:", @@ -51,8 +49,6 @@ "Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง", "Favourite": "รายการโปรด", "Failed to forget room %(errCode)s": "การลืมห้องล้มเหลว %(errCode)s", - "%(targetName)s accepted an invitation.": "%(targetName)s ตอบรับคำเชิญแล้ว", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ตอบรับคำเชิญสำหรับ %(displayName)s แล้ว", "Add a topic": "เพิ่มหัวข้อ", "Add email address": "เพิ่มที่อยู่อีเมล", "Admin": "ผู้ดูแล", @@ -66,7 +62,6 @@ "and %(count)s others...|one": "และอีกหนึ่งผู้ใช้...", "and %(count)s others...|other": "และอีก %(count)s ผู้ใช้...", "%(names)s and %(lastPerson)s are typing": "%(names)s และ %(lastPerson)s กำลังพิมพ์", - "%(senderName)s answered the call.": "%(senderName)s รับสายแล้ว", "An error has occurred.": "เกิดข้อผิดพลาด", "Anyone": "ทุกคน", "Anyone who knows the room's link, apart from guests": "ทุกคนที่มีลิงก์ ยกเว้นแขก", @@ -81,9 +76,6 @@ "Bans user with given id": "ผู้ใช้และ id ที่ถูกแบน", "Blacklisted": "ขึ้นบัญชีดำ", "Can't load user settings": "ไม่สามารถโหลดการตั้งค่าผู้ใช้ได้", - "%(senderName)s changed their profile picture.": "%(senderName)s เปลี่ยนรูปโปรไฟล์ของเขา", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s เปลี่ยนชื่อห้องไปเป็น %(roomName)s", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ลบชื่อห้อง", "Changes your display nickname": "เปลี่ยนชื่อเล่นที่แสดงของคุณ", "Clear Cache and Reload": "ล้างแคชแล้วโหลดใหม่", "Clear Cache": "ล้างแคช", @@ -123,7 +115,6 @@ "Email address (optional)": "ที่อยู่อีเมล (ไม่ใส่ก็ได้)", "Email, name or matrix ID": "อีเมล ชื่อ หรือ ID matrix", "Encrypted room": "ห้องที่ถูกเข้ารหัส", - "%(senderName)s ended the call.": "%(senderName)s จบการโทร", "Enter Code": "กรอกรหัส", "Error decrypting attachment": "การถอดรหัสไฟล์แนบผิดพลาด", "Export": "ส่งออก", @@ -147,7 +138,6 @@ "Filter room members": "กรองสมาชิกห้อง", "Forget room": "ลืมห้อง", "Forgot your password?": "ลิมรหัสผ่าน?", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s จาก %(fromPowerLevel)s ไปเป็น %(toPowerLevel)s", "Hangup": "วางสาย", "Historical": "ประวัติแชทเก่า", "Homeserver is": "เซิร์ฟเวอร์บ้านคือ", @@ -161,7 +151,6 @@ "Invalid address format": "รูปแบบที่อยู่ไม่ถูกต้อง", "Invalid Email Address": "ที่อยู่อีเมลไม่ถูกต้อง", "Invalid file%(extra)s": "ไฟล์ %(extra)s ไม่ถูกต้อง", - "%(senderName)s invited %(targetName)s.": "%(senderName)s เชิญ %(targetName)s แล้ว", "Invite new room members": "เชิญสมาชิกใหม่", "Invited": "เชิญแล้ว", "Invites": "คำเชิญ", @@ -170,12 +159,9 @@ "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ไม่ใช่รูปแบบที่ถูกต้องสำหรับนามแฝง", "Sign in with": "เข้าสู่ระบบด้วย", "Join Room": "เข้าร่วมห้อง", - "%(targetName)s joined the room.": "%(targetName)s เข้าร่วมห้องแล้ว", "Jump to first unread message.": "ข้ามไปยังข้อความแรกที่ยังไม่ได้อ่าน", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s เตะ %(targetName)s แล้ว", "Labs": "ห้องทดลอง", "Leave room": "ออกจากห้อง", - "%(targetName)s left the room.": "%(targetName)s ออกจากห้องแล้ว", "Logged in as:": "เข้าสู่ระบบในชื่อ:", "Logout": "ออกจากระบบ", "Markdown is disabled": "ปิดใช้งาน Markdown แล้ว", @@ -198,16 +184,12 @@ "People": "บุคคล", "Permissions": "สิทธิ์", "Phone": "โทรศัพท์", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s ได้เริ่มการโทรแบบ%(callType)s", "Please check your email and click on the link it contains. Once this is done, click continue.": "กรุณาเช็คอีเมลและคลิกลิงก์ข้างใน หลังจากนั้น คลิกดำเนินการต่อ", "Privacy warning": "คำเตือนเกี่ยวกับความเป็นส่วนตัว", "Privileged Users": "ผู้ใช้ที่มีสิทธิพิเศษ", "Revoke Moderator": "เพิกถอนผู้ช่วยดูแล", "Refer a friend to Riot:": "แนะนำเพื่อนให้รู้จัก Riot:", - "%(targetName)s rejected the invitation.": "%(targetName)s ปฏิเสธคำเชิญแล้ว", "Reject invitation": "ปฏิเสธคำเชิญ", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ลบชื่อที่แสดงแล้ว (%(oldDisplayName)s)", - "%(senderName)s removed their profile picture.": "%(senderName)s ลบรูปโปรไฟล์ของเขาแล้ว", "Remove %(threePid)s?": "ลบ %(threePid)s?", "Return to login screen": "กลับไปยังหน้าลงชื่อเข้าใช้", "Riot does not have permission to send you notifications - please check your browser settings": "Riot ไม่มีสิทธิ์ส่งการแจ้งเตือน - กรุณาตรวจสอบการตั้งค่าเบราว์เซอร์ของคุณ", @@ -222,15 +204,12 @@ "Searches DuckDuckGo for results": "ค้นหาบน DuckDuckGo", "Send Invites": "ส่งคำเชิญ", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ได้ส่งรูป", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ได้ส่งคำเชิญให้ %(targetDisplayName)s เข้าร่วมห้อง", "Server error": "เซิร์ฟเวอร์ผิดพลาด", "Server may be unavailable or overloaded": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งานหรือทำงานหนักเกินไป", "Server may be unavailable, overloaded, or search timed out :(": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือการค้นหาหมดเวลา :(", "Server may be unavailable, overloaded, or the file too big": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือไฟล์ใหญ่เกินไป", "Server may be unavailable, overloaded, or you hit a bug.": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือเจอจุดบกพร่อง", "Server unavailable, overloaded, or something else went wrong.": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือบางอย่างผิดปกติ", - "%(senderName)s set a profile picture.": "%(senderName)s ตั้งรูปโปรไฟล์", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ตั้งชื่อที่แสดงเป็น %(displayName)s", "Show panel": "แสดงหน้าต่าง", "Signed Out": "ออกจากระบบแล้ว", "Sign in": "เข้าสู่ระบบ", @@ -269,11 +248,9 @@ "The file '%(fileName)s' exceeds this home server's size limit for uploads": "ไฟล์ '%(fileName)s' มีขนาดใหญ่เกินจำกัดของเซิร์ฟเวอร์บ้าน", "Turn Markdown off": "ปิด markdown", "Turn Markdown on": "เปิด markdown", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ได้เปิดใช้งานการเข้ารหัสจากปลายทางถึงปลายทาง (อัลกอริทึม%(algorithm)s).", "Unable to add email address": "ไมาสามารถเพิ่มที่อยู่อีเมล", "Unable to verify email address.": "ไม่สามารถยืนยันที่อยู่อีเมล", "Unban": "ปลดแบน", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ปลดแบน %(targetName)s แล้ว", "Unable to capture screen": "ไม่สามารถจับภาพหน้าจอ", "Unable to enable Notifications": "ไม่สามารถเปิดใช้งานการแจ้งเตือน", "Unable to load device list": "ไม่สามารถโหลดรายชื่ออุปกรณ์", @@ -558,5 +535,28 @@ "Collapse panel": "ซ่อนหน้าต่าง", "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": "มีการแจ้งเตือนขั้นสูงที่ไม่ได้แสดงที่นี่", + "<target> accepted the invitation for %(displayName)s.": "<target> ตอบรับคำเชิญสำหรับ %(displayName)s แล้ว", + "<target> accepted an invitation.": "<target> ตอบรับคำเชิญแล้ว", + "<sender> invited <target>.": "<sender> เชิญ <target> แล้ว", + "<sender> banned <target>.": "<sender> แบน <target> แล้ว", + "<sender> set their display name to <displayName>.": "<sender> ตั้งชื่อที่แสดงเป็น <displayName>", + "<sender> removed their display name (<oldDisplayName>).": "<sender> ลบชื่อที่แสดงแล้ว (<oldDisplayName>)", + "<sender> removed their profile picture.": "<sender> ลบรูปโปรไฟล์ของเขาแล้ว", + "<sender> changed their profile picture.": "<sender> เปลี่ยนรูปโปรไฟล์ของเขา", + "<sender> set a profile picture.": "<sender> ตั้งรูปโปรไฟล์", + "<target> joined the room.": "<target> เข้าร่วมห้องแล้ว", + "<target> rejected the invitation.": "<target> ปฏิเสธคำเชิญแล้ว", + "<target> left the room.": "<target> ออกจากห้องแล้ว", + "<sender> unbanned <target>.": "<sender> ปลดแบน <target> แล้ว", + "<sender> kicked <target>.": "<sender> เตะ <target> แล้ว", + "<sender> changed the topic to \"%(topic)s\".": "<sender> เปลี่ยนหัวข้อเป็น \"%(topic)s\"", + "<sender> changed the room name to %(roomName)s.": "<sender> เปลี่ยนชื่อห้องไปเป็น %(roomName)s", + "<sender> removed the room name.": "<sender> ลบชื่อห้อง", + "<sender> answered the call.": "<sender> รับสายแล้ว", + "<sender> ended the call.": "<sender> จบการโทร", + "<sender> placed a %(callType)s call.": "<sender> ได้เริ่มการโทรแบบ%(callType)s", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> ได้ส่งคำเชิญให้ %(targetDisplayName)s เข้าร่วมห้อง", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ได้เปิดใช้งานการเข้ารหัสจากปลายทางถึงปลายทาง (อัลกอริทึม%(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> จาก %(fromPowerLevel)s ไปเป็น %(toPowerLevel)s" } diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 04f78dc1ee..9bedd16ccb 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1,8 +1,6 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "+%(msisdn)s 'ye bir kısa mesaj gönderildi . Lütfen içerdiği doğrulama kodunu girin", "Accept": "Kabul Et", - "%(targetName)s accepted an invitation.": "%(targetName)s bir davetiyeyi kabul etti.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s %(displayName)s için davetiyeyi kabul etti.", "Account": "Hesap", "Access Token:": "Erişim Anahtarı:", "Active call (%(roomName)s)": "Aktif çağrı (%(roomName)s)", @@ -32,7 +30,6 @@ "and %(count)s others...|other": "ve %(count)s diğerleri...", "%(names)s and %(lastPerson)s are typing": "%(names)s ve %(lastPerson)s yazıyorlar", "A new password must be entered.": "Yeni bir şifre girilmelidir.", - "%(senderName)s answered the call.": "%(senderName)s aramayı cevapladı.", "An error has occurred.": "Bir hata oluştu.", "Anyone": "Kimse", "Anyone who knows the room's link, apart from guests": "Misafirler dışında odanın bağlantısını bilen herkes", @@ -43,7 +40,6 @@ "Are you sure you want to upload the following files?": "Aşağıdaki dosyaları yüklemek istediğinizden emin misiniz ?", "Attachment": "Ek Dosya", "Autoplay GIFs and videos": "GIF'leri ve Videoları otomatik olarak oynat", - "%(senderName)s banned %(targetName)s.": "%(senderName)s %(targetName)s'i banladı.", "Ban": "Yasak", "Banned users": "Yasaklanan(Banlanan) Kullanıcılar", "Bans user with given id": "Yasaklanan(Banlanan) Kullanıcılar , ID'leri ile birlikte", @@ -54,11 +50,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya <a> güvensiz komut dosyalarını</a> etkinleştirin.", "Can't load user settings": "Kullanıcı ayarları yüklenemiyor", "Change Password": "Şifre Değiştir", - "%(senderName)s changed their profile picture.": "%(senderName)s profil resmini değiştirdi.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s %(powerLevelDiffText)s'nin güç düzeyini değiştirdi.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s oda adını kaldırdı.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s konuyu \"%(topic)s\" olarak değiştirdi.", "Changes to who can read history will only apply to future messages in this room": "Geçmişi kimlerin okuyabileceğine ait değişiklikler yalnızca bu odada gelecekteki iletiler için geçerli olur", "Changes your display nickname": "Görünen takma adınızı değiştirir", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Şifre değiştirme eğer oda anahtarlarınızı dışa aktarmaz ve daha sonra tekrar içe aktarmazsanız , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayacak ve geçmişi okunamaz hale getirecek . Gelecekte bu geliştirilecek.", @@ -132,7 +123,6 @@ "Encrypted room": "Şifrelenmiş Oda", "Encryption is enabled in this room": "Şifreleme bu oda için etkin", "Encryption is not enabled in this room": "Şifreleme bu oda için etkin değil", - "%(senderName)s ended the call.": "%(senderName)s çağrıyı bitirdi.", "End-to-end encryption information": "Uçtan-uca şifreleme bilgileri", "End-to-end encryption is in beta and may not be reliable": "Uçtan uca şifreleme beta sürümünde ve güvenilir olmayabilir", "Enter Code": "Kodu Girin", @@ -176,7 +166,6 @@ "Forgot your password?": "Şifrenizi mi unuttunuz ?", "For security, this session has been signed out. Please sign in again.": "Güvenlik için , bu oturuma çıkış yapıldı . Lütfen tekrar oturum açın.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Güvenlik için , çıkış yaparsanız bu tarayıcıdan tüm uçtan uca şifreleme anahtarları silinecek . Konuşma geçmişinizi çözebilmek isterseniz gelecekteki Riot oturumlarında , lütfen Oda Anahtarlarını güvenlik amaçlı Dışa Aktarın.", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s den %(toPowerLevel)s ' ye", "Guest access is disabled on this Home Server.": "Misafir erişimi bu Ana Sunucu için devre dışı.", "Guests cannot join this room even if explicitly invited.": "Misafirler açıkca davet edilseler bile bu odaya katılamazlar.", "Hangup": "Sorun", @@ -199,7 +188,6 @@ "Invalid address format": "Geçersiz adres formatı", "Invalid Email Address": "Geçersiz E-posta Adresi", "Invalid file%(extra)s": "Geçersiz dosya %(extra)s'ı", - "%(senderName)s invited %(targetName)s.": "%(senderName)s %(targetName)s ' ı davet etti.", "Invite new room members": "Yeni oda üyelerini davet et", "Invited": "Davet Edildi", "Invites": "Davetler", @@ -210,26 +198,18 @@ "Sign in with": "Şununla giriş yap", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "<voiceText> ses </voiceText> veya <videoText> video </videoText> olarak katılın.", "Join Room": "Odaya Katıl", - "%(targetName)s joined the room.": "%(targetName)s odaya katıldı.", "Joins room with given alias": "Verilen takma ad (nick name) ile odaya katıl", "Jump to first unread message.": "İlk okunmamış iletiye atla.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s %(targetName)s' ı attı.", "Kick": "Atmak (Odadan atmak vs.)", "Kicks user with given id": "Verilen ID ' li kullanıcıyı at", "Labs": "Laboratuarlar", "Last seen": "Son görülme", "Leave room": "Odadan ayrıl", - "%(targetName)s left the room.": "%(targetName)s odadan ayrıldı.", "Level:": "Seviye :", "Local addresses for this room:": "Bu oda için yerel adresler :", "Logged in as:": "Olarak giriş yaptı :", "Logout": "Çıkış Yap", "Low priority": "Düşük öncelikli", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , davet edildiği noktadan.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , katıldıkları noktalardan.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s gelecekte oda geçmişini görünür yaptı herhangi biri.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gelecekte oda geçmişini görünür yaptı bilinmeyen (%(visibility)s).", "Manage Integrations": "Entegrasyonları Yönet", "Markdown is disabled": "Markdown devre dışı", "Markdown is enabled": "Markdown aktif", @@ -271,7 +251,6 @@ "People": "İnsanlar", "Permissions": "İzinler", "Phone": "Telefon", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s bir %(callType)s çağrısı yerleştirdi.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Lütfen e-postanızı kontrol edin ve içerdiği bağlantıya tıklayın . Bu işlem tamamlandıktan sonra , 'devam et' e tıklayın .", "Power level must be positive integer.": "Güç seviyesi pozitif tamsayı olmalıdır.", "Press <StartChatButton> to start a chat with someone": "Birisiyle sohbet başlatmak için <StartChatButton> tuşuna basın", @@ -285,16 +264,12 @@ "Revoke Moderator": "Moderatörü İptal Et", "Refer a friend to Riot:": "Riot'tan bir arkadaşa bakın :", "Register": "Kaydolun", - "%(targetName)s rejected the invitation.": "%(targetName)s daveti reddetti.", "Reject invitation": "Daveti Reddet", "Rejoin": "Yeniden Katıl", "Remote addresses for this room:": "Bu oda için uzak adresler:", "Remove Contact Information?": "İletişim Bilgilerini Kaldır ?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s görünen adı (%(oldDisplayName)s) kaldırdı.", - "%(senderName)s removed their profile picture.": "%(senderName)s profil resmini kaldırdı.", "Remove": "Kaldır", "Remove %(threePid)s?": "%(threePid)s 'i kaldır ?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s bir VoIP konferansı talep etti.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Şifrenizi sıfırlamak , eğer Oda Anahtarlarınızı dışa aktarmaz ve daha sonra içe aktarmaz iseniz , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayarak şifreli sohbetleri okunamaz hale getirecek . Gelecekte bu iyileştirilecek.", "Results from DuckDuckGo": "DuckDuckGo Sonuçları", "Return to login screen": "Giriş ekranına dön", @@ -320,7 +295,6 @@ "Send Invites": "Davetiye Gönder", "Send Reset Email": "E-posta Sıfırlama Gönder", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s bir resim gönderdi.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s %(targetDisplayName)s' a odaya katılması için bir davet gönderdi.", "Server error": "Sunucu Hatası", "Server may be unavailable or overloaded": "Sunucu kullanılamıyor veya aşırı yüklenmiş olabilir", "Server may be unavailable, overloaded, or search timed out :(": "Sunucu kullanılamıyor , aşırı yüklenmiş veya arama zaman aşımına uğramış olabilir :(", @@ -328,8 +302,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Sunucu kullanılamıyor , aşırı yüklenmiş , veya bir hatayla karşılaşmış olabilirsiniz.", "Server unavailable, overloaded, or something else went wrong.": "Sunucu kullanılamıyor , aşırı yüklenmiş veya başka bir şey ters gitmiş olabilir.", "Session ID": "Oturum ID", - "%(senderName)s set a profile picture.": "%(senderName)s bir profil resmi ayarladı.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s görünür ismini %(displayName)s ' a ayarladı.", "Settings": "Ayarlar", "Show panel": "Paneli göster", "Show Text Formatting Toolbar": "Metin Biçimlendirme Araç Çubuğunu Göster", @@ -374,12 +346,10 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Bu odanın akışında belirli bir noktaya yüklemeye çalışıldı , ancak bulunamadı.", "Turn Markdown off": "Markdown'u kapat", "Turn Markdown on": "Markdown'u Aç", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s uçtanuca şifrelemeyi açtı (algoritma -> %(algorithm)s).", "Unable to add email address": "E-posta adresi eklenemiyor", "Unable to remove contact information": "Kişi bilgileri kaldırılamıyor", "Unable to verify email address.": "E-posta adresi doğrulanamıyor.", "Unban": "Yasağı Kaldır", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s %(targetName)s 'in yasağını kaldırdı.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Bu davetiyenin gönderildiği adresin hesabınızla ilişkili bir adresle eşleştiğini tespit etmek mümkün değil.", "Unable to capture screen": "Ekran yakalanamadı", "Unable to enable Notifications": "Bildirimler aktif edilemedi", @@ -436,7 +406,6 @@ "Who can read history?": "Geçmişi kimler okuyabilir ?", "Who would you like to add to this room?": "Bu odaya kimi eklemek istersiniz ?", "Who would you like to communicate with?": "Kimlerle iletişim kurmak istersiniz ?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s %(targetName)s'nin davetinden çekildi.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Bu daveti <acceptText> kabul etmek </acceptText> veya <declineText> reddetmek </declineText> ister misiniz ?", "You already have existing direct chats with this user:": "Bu kullanıcıyla var olan doğrudan sohbetleriniz var :", "You are already in a call.": "Zaten bir çağrıdasınız.", @@ -606,9 +575,6 @@ "Start chatting": "Sohbeti başlat", "Start Chatting": "Sohbeti Başlat", "Click on the button below to start chatting!": "Sohbeti başlatmak için aşağıdaki butona tıklayın!", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s odanın avatarını <img/> olarak çevirdi", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odanın avatarını kaldırdı.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s %(roomName)s için avatarı değiştirdi", "Username available": "Kullanıcı ismi uygun", "Username not available": "Kullanıcı ismi uygun değil", "Something went wrong!": "Bir şeyler yanlış gitti!", @@ -751,5 +717,39 @@ "View Source": "Kaynağı Görüntüle", "Collapse panel": "Katlanır panel", "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!": "Geçerli tarayıcınız ile birlikte , uygulamanın görünüş ve kullanım hissi tamamen hatalı olabilir ve bazı ya da tüm özellikler çalışmayabilir. Yine de denemek isterseniz devam edebilirsiniz ancak karşılaşabileceğiniz sorunlar karşısında kendi başınasınız !", - "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var" + "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var", + "<target> accepted the invitation for %(displayName)s.": "<target> %(displayName)s için davetiyeyi kabul etti.", + "<target> accepted an invitation.": "<target> bir davetiyeyi kabul etti.", + "<sender> requested a VoIP conference.": "<sender> bir VoIP konferansı talep etti.", + "<sender> invited <target>.": "<sender> <target> ' ı davet etti.", + "<sender> banned <target>.": "<sender> <target>'i banladı.", + "<sender> set their display name to <displayName>.": "<sender> görünür ismini <displayName> ' a ayarladı.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> görünen adı (<oldDisplayName>) kaldırdı.", + "<sender> removed their profile picture.": "<sender> profil resmini kaldırdı.", + "<sender> changed their profile picture.": "<sender> profil resmini değiştirdi.", + "<sender> set a profile picture.": "<sender> bir profil resmi ayarladı.", + "<target> joined the room.": "<target> odaya katıldı.", + "<target> rejected the invitation.": "<target> daveti reddetti.", + "<target> left the room.": "<target> odadan ayrıldı.", + "<sender> unbanned <target>.": "<sender> <target> 'in yasağını kaldırdı.", + "<sender> kicked <target>.": "<sender> <target>' ı attı.", + "<sender> withdrew <target>'s invitation.": "<sender> <target>'nin davetinden çekildi.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> konuyu \"%(topic)s\" olarak değiştirdi.", + "<sender> changed the room name to %(roomName)s.": "<sender> odanın ismini %(roomName)s olarak değiştirdi.", + "<sender> changed the room avatar to <img/>": "<sender> odanın avatarını <img/> olarak çevirdi", + "<sender> changed the avatar for %(roomName)s": "<sender> %(roomName)s için avatarı değiştirdi", + "<sender> removed the room name.": "<sender> oda adını kaldırdı.", + "<sender> removed the room avatar.": "<sender> odanın avatarını kaldırdı.", + "<sender> answered the call.": "<sender> aramayı cevapladı.", + "<sender> ended the call.": "<sender> çağrıyı bitirdi.", + "<sender> placed a %(callType)s call.": "<sender> bir %(callType)s çağrısı yerleştirdi.", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> %(targetDisplayName)s' a odaya katılması için bir davet gönderdi.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , davet edildiği noktadan.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , katıldıkları noktalardan.", + "<sender> made future room history visible to all room members.": "<sender> gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri.", + "<sender> made future room history visible to anyone.": "<sender> gelecekte oda geçmişini görünür yaptı herhangi biri.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> gelecekte oda geçmişini görünür yaptı bilinmeyen (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> uçtanuca şifrelemeyi açtı (algoritma -> %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> %(fromPowerLevel)s den %(toPowerLevel)s ' ye", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> %(powerLevelDiffText)s'nin güç düzeyini değiştirdi." } diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 5e7cc75f8a..09158411fc 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -23,8 +23,6 @@ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Текстове повідомлення було надіслано +%(msisdn)s. Введіть, будь ласка, код підтвердження з цього повідомлення", "Accept": "Прийняти", "Account": "Обліковка", - "%(targetName)s accepted an invitation.": "%(targetName)s прийняв запрошення.", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s прийняв запрошення від %(displayName)s.", "Access Token:": "Токен доступу:", "Active call (%(roomName)s)": "Активний виклик (%(roomName)s)", "Add": "Додати", @@ -57,7 +55,6 @@ "A new password must be entered.": "Має бути введений новий пароль.", "Add a widget": "Добавити віджет", "Allow": "Принюти", - "%(senderName)s answered the call.": "%(senderName)s відповіла на дзвінок.", "An error has occurred.": "Трапилась помилка.", "Anyone": "Кожний", "Anyone who knows the room's link, apart from guests": "Кожний, хто знає посилання на кімнату, окрім гостей", @@ -68,7 +65,6 @@ "Are you sure you want to upload the following files?": "Ви впевнені, що ви хочете відправити наступний файл?", "Attachment": "Прикріплення", "Autoplay GIFs and videos": "Автовідтворення GIF і відео", - "%(senderName)s banned %(targetName)s.": "%(senderName)s заблокував(ла) %(targetName)s.", "Ban": "Заблокувати", "Banned users": "Заблоковані користувачі", "Bans user with given id": "Блокує користувача з заданим ID", @@ -79,11 +75,6 @@ "Can't load user settings": "Неможливо завантажити настройки користувача", "Cannot add any more widgets": "Неможливо додати більше віджетів", "Change Password": "Поміняти пароль", - "%(senderName)s changed their profile picture.": "%(senderName)s змінив зображення профіля.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s змінив(ла) рівень доступу для %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s змінив(ла) назву кімнати на %(roomName)s.", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s видалив ім'я кімнати.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s змінив тему на %(topic)s.", "Email": "е-пошта", "Email address": "Адреса е-почти", "Email address (optional)": "Адреса е-почти (не обов'язково)", @@ -279,5 +270,14 @@ "Your User Agent": "Ваш користувацький агент", "Your device resolution": "Роздільність вашого пристрою", "Analytics": "Аналітика", - "The information being sent to us to help make Riot.im better includes:": "Надсилана інформація, що допомагає нам покращити Riot.im, вміщує:" + "The information being sent to us to help make Riot.im better includes:": "Надсилана інформація, що допомагає нам покращити Riot.im, вміщує:", + "<target> accepted the invitation for %(displayName)s.": "<target> прийняв запрошення від %(displayName)s.", + "<target> accepted an invitation.": "<target> прийняв запрошення.", + "<sender> banned <target>.": "<sender> заблокував(ла) <target>.", + "<sender> changed their profile picture.": "<sender> змінив зображення профіля.", + "<sender> changed the topic to \"%(topic)s\".": "<sender> змінив тему на %(topic)s.", + "<sender> changed the room name to %(roomName)s.": "<sender> змінив(ла) назву кімнати на %(roomName)s.", + "<sender> removed the room name.": "<sender> видалив ім'я кімнати.", + "<sender> answered the call.": "<sender> відповіла на дзвінок.", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> змінив(ла) рівень доступу для %(powerLevelDiffText)s." } diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 56d5c1e4dc..e1c9dbe953 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -26,7 +26,6 @@ "Enable encryption": "启用加密", "Encrypted messages will not be visible on clients that do not yet implement encryption": "不支持加密的客户端将看不到加密的消息", "Encrypted room": "加密聊天室", - "%(senderName)s ended the call.": "%(senderName)s 结束了通话。.", "End-to-end encryption information": "端到端加密信息", "End-to-end encryption is in beta and may not be reliable": "端到端加密现为 beta 版,不一定可靠", "Enter Code": "输入验证码", @@ -64,7 +63,6 @@ "Forgot your password?": "忘记密码?", "For security, this session has been signed out. Please sign in again.": "出于安全考虑,此会话已被注销。请重新登录。.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "出于安全考虑,用户注销时会清除浏览器里的端到端加密密钥。如果你想要下次登录 Riot 时能解密过去的聊天记录,请导出你的聊天室密钥。", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。.", "Hangup": "挂断", "Hide read receipts": "隐藏已读回执", @@ -98,7 +96,6 @@ "Send Invites": "发送邀请", "Send Reset Email": "发送密码重设邮件", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 发了一张图片。.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 发了加入聊天室的邀请。.", "Server error": "服务器错误", "Server may be unavailable or overloaded": "服务器可能不可用或者超载", "Server may be unavailable, overloaded, or search timed out :(": "服务器可能不可用、超载,或者搜索超时 :(", @@ -106,8 +103,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "服务器可能不可用、超载,或者你遇到了一个 bug。", "Server unavailable, overloaded, or something else went wrong.": "服务器可能不可用、超载,或者其他东西出错了.", "Session ID": "会话 ID", - "%(senderName)s set a profile picture.": "%(senderName)s 设置了头像。.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 将昵称改为了 %(displayName)s。.", "Settings": "设置", "Show panel": "显示侧边栏", "Show timestamps in 12 hour format (e.g. 2:30pm)": "用12小时制显示时间戳 (如:下午 2:30)", @@ -134,11 +129,9 @@ "Always show message timestamps": "总是显示消息时间戳", "%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在输入", "A new password must be entered.": "一个新的密码必须被输入。.", - "%(senderName)s answered the call.": "%(senderName)s 接了通话。.", "An error has occurred.": "一个错误出现了。", "Attachment": "附件", "Autoplay GIFs and videos": "自动播放GIF和视频", - "%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s.", "Ban": "封禁", "Banned users": "被封禁的用户", "Click here to fix": "点击这里修复", @@ -148,9 +141,7 @@ "Ed25519 fingerprint": "Ed25519指纹", "Invite new room members": "邀请新的聊天室成员", "Join Room": "加入聊天室", - "%(targetName)s joined the room.": "%(targetName)s 已加入聊天室。", "Jump to first unread message.": "跳到第一条未读消息。", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", "Leave room": "退出聊天室", "New password": "新密码", "Add a topic": "添加一个主题", @@ -186,10 +177,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接主服务器。请使用 HTTPS 或者<a>允许不安全的脚本</a>。", "Can't load user settings": "无法加载用户设置", "Change Password": "修改密码", - "%(senderName)s changed their profile picture.": "%(senderName)s 修改了头像。", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 将聊天室名称改为 %(roomName)s。", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 移除了聊天室名称。", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 将话题修改为 “%(topic)s”。", "Changes to who can read history will only apply to future messages in this room": "修改阅读历史的权限仅对此聊天室以后的消息有效", "Changes your display nickname": "修改昵称", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前,修改密码会导致所有设备上的端到端密钥被重置,使得加密的聊天记录不再可读。除非你事先导出聊天室密钥,修改密码后再导入。这个问题未来会改善。", @@ -238,7 +225,6 @@ "Incoming video call from %(name)s": "来自 %(name)s 的视频通话", "Incoming voice call from %(name)s": "来自 %(name)s 的语音通话", "Incorrect username and/or password.": "用户名或密码错误。", - "%(senderName)s invited %(targetName)s.": "%(senderName)s 邀请了 %(targetName)s。", "Invited": "已邀请", "Invites": "邀请", "Invites user with given id to current room": "按照 ID 邀请指定用户加入当前聊天室", @@ -291,7 +277,6 @@ "Edit": "编辑", "Joins room with given alias": "以指定的别名加入聊天室", "Labs": "实验室", - "%(targetName)s left the room.": "%(targetName)s 退出了聊天室。", "Logged in as:": "登录为:", "Logout": "登出", "Low priority": "低优先级", @@ -306,7 +291,6 @@ "Privileged Users": "特权用户", "Reason": "理由", "Register": "注册", - "%(targetName)s rejected the invitation.": "%(targetName)s 拒绝了邀请。", "Reject invitation": "拒绝邀请", "Rejoin": "重新加入", "Users": "用户", @@ -445,32 +429,21 @@ "I already have an account": "我已经有一个帐号", "Unblacklist": "移出黑名单", "Not a valid Riot keyfile": "不是一个有效的 Riot 密钥文件", - "%(targetName)s accepted an invitation.": "%(targetName)s 已接受邀请。", "Do you want to load widget from URL:": "你想从此 URL 加载小组件吗:", "Hide join/leave messages (invites/kicks/bans unaffected)": "隐藏加入/退出消息(邀请/踢出/封禁不受影响)", "Integrations Error": "集成错误", "Publish this room to the public in %(domain)s's room directory?": "把这个聊天室发布到 %(domain)s 的聊天室目录吗?", "Manage Integrations": "管理集成", "No users have specific privileges in this room": "没有用户在这个聊天室有特殊权限", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s 发起了一个 %(callType)s 通话。", "Please check your email and click on the link it contains. Once this is done, click continue.": "请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。", "Press <StartChatButton> to start a chat with someone": "按下 <StartChatButton> 来开始和某个人聊天", - "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他们的头像。", - "%(senderName)s requested a VoIP conference.": "%(senderName)s 已请求发起 VoIP 会议。", "Seen by %(userName)s at %(dateTime)s": "在 %(dateTime)s 被 %(userName)s 看到", "Tagged as: ": "标记为: ", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送至 +%(msisdn)s,请输入收到的验证码", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 接受了 %(displayName)s 的邀请。", "Active call (%(roomName)s)": "当前通话 (来自聊天室 %(roomName)s)", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 将级别调整到%(powerLevelDiffText)s 。", "Changes colour scheme of current room": "修改了样式", "Deops user with given id": "按照 ID 取消特定用户的管理员权限", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "通过 <voiceText>语言</voiceText> 或者 <videoText>视频</videoText>加入.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员,从他们被邀请开始.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员,从他们加入开始.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s 设定历史浏览功能为 任何人.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s 设定历史浏览功能为 未知的 (%(visibility)s).", "AM": "上午", "PM": "下午", "NOTE: Apps are not end-to-end encrypted": "提示:APP不支持端到端加密", @@ -529,7 +502,6 @@ " (unsupported)": " (不支持)", "Updates": "更新", "Check for update": "检查更新", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s 移除了聊天室头像。", "Something went wrong!": "出了点问题!", "If you already have a Matrix account you can <a>log in</a> instead.": "如果你已经有一个 Matrix 帐号,你可以<a>登录</a>。", "Do you want to set an email address?": "你要设置一个邮箱地址吗?", @@ -540,7 +512,6 @@ "Verification Pending": "验证等待中", "(unknown failure: %(reason)s)": "(未知错误:%(reason)s)", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:密钥验证失败!%(userId)s 和 device %(deviceId)s 的签名密钥是 \"%(fprint)s\",和提供的咪呀 \"%(fingerprint)s\" 不匹配。这可能意味着你的通信正在被窃听!", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 收回了 %(targetName)s 的邀请。", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "你想要 <acceptText>接受</acceptText> 还是 <declineText>拒绝</declineText> 这个邀请?", "You already have existing direct chats with this user:": "你已经有和此用户的直接聊天:", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "你现在还不再任何聊天室!按下 <CreateRoomButton> 来创建一个聊天室或者 <RoomDirectoryButton> 来浏览目录", @@ -591,11 +562,9 @@ "Verifies a user, device, and pubkey tuple": "验证一个用户、设备和密钥元组", "Unknown devices": "未知设备", "Unknown Address": "未知地址", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 删除了他们的昵称 (%(oldDisplayName)s).", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "您提供的签名密钥和你从 %(userId)s 的设备 %(deviceId)s 收到的签名密钥匹配。设备被标记为已验证。", "These are experimental features that may break in unexpected ways": "这些是可能以意外的方式坏掉的实验性的特性", "The visibility of existing history will be unchanged": "现有历史记录的可见性不会改变", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 打开了端到端加密 (算法 %(algorithm)s).", "Unable to remove contact information": "无法移除联系人信息", "Riot collects anonymous analytics to allow us to improve the application.": "Riot 收集匿名的分析数据来允许我们改善这个应用。", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" 包含你以前没见过的设备。", @@ -609,7 +578,6 @@ "Add an Integration": "添加一个集成", "Removed or unknown message type": "被移除或未知的消息类型", "Ongoing conference call%(supportedText)s.": "正在进行的会议通话 %(supportedText)s.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s 修改了 %(roomName)s 的头像", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "这将会成为你在 <span></span> 主服务器上的账户名,或者你可以选择一个 <a>不同的服务器</a>。", "Your browser does not support the required cryptography extensions": "你的浏览器不支持 Riot 所需的密码学特性", "Authentication check failed: incorrect password?": "身份验证失败:密码错误?", @@ -619,9 +587,6 @@ "Your unverified device '%(displayName)s' is requesting encryption keys.": "你的未经验证的设备 '%(displayName)s' 正在请求加密密钥。", "Encryption key request": "加密密钥请求", "Autocomplete Delay (ms):": "自动补全延迟(毫秒):", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 添加", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 移除", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 修改", "Unpin Message": "取消置顶消息", "Add rooms to this community": "添加聊天室到此社区", "Call Failed": "呼叫失败", @@ -638,9 +603,7 @@ "You are now ignoring %(userId)s": "你正在忽视 %(userId)s", "Unignored user": "接触忽视用户", "You are no longer ignoring %(userId)s": "你不再忽视 %(userId)s", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s 解除了 %(targetName)s 的封禁。", "(could not connect media)": "(无法连接媒体)", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)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 和另一个人正在输入", "Send": "发送", @@ -794,7 +757,6 @@ "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "你似乎没有将此邮箱地址同在此主服务器上的任何一个 Matrix 账号绑定。", "Restricted": "受限用户", "To use it, just wait for autocomplete results to load and tab through them.": "若要使用自动补全,只要等待自动补全结果加载完成,按 Tab 键切换即可。", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 将他们的昵称修改成了 %(displayName)s 。", "Hide avatars in user and room mentions": "隐藏头像", "Disable Community Filter Panel": "停用社区面板", "Stickerpack": "贴图集", @@ -892,7 +854,6 @@ "New community ID (e.g. +foo:%(localDomain)s)": "新社区 ID(例子:+foo:%(localDomain)s)", "URL previews are enabled by default for participants in this room.": "此聊天室默认启用链接预览。", "URL previews are disabled by default for participants in this room.": "此聊天室默认禁用链接预览。", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s 将聊天室的头像更改为 <img/>", "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "您也可以自定义身份认证服务器,但这通常会阻止基于邮箱地址的与用户的交互。", "Please enter the code it contains:": "请输入它包含的代码:", "Flair will appear if enabled in room settings": "如果在聊天室设置中启用, flair 将会显示", @@ -1135,5 +1096,44 @@ "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "无法加载被回复的事件,它可能不存在,也可能是您没有权限查看它。", "And %(count)s more...|other": "和 %(count)s 个其他…", "Try using one of the following valid address types: %(validTypesList)s.": "请尝试使用以下的有效邮箱地址格式中的一种:%(validTypesList)s", - "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot 使用 GitHub 追踪 bug:<a>在 GitHub 上创建新 Issue</a>" + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot 使用 GitHub 追踪 bug:<a>在 GitHub 上创建新 Issue</a>", + "<target> accepted the invitation for %(displayName)s.": "<target> 接受了 %(displayName)s 的邀请。", + "<target> accepted an invitation.": "<target> 已接受邀请。", + "<sender> requested a VoIP conference.": "<sender> 已请求发起 VoIP 会议。", + "<sender> invited <target>.": "<sender> 邀请了 <target>。", + "<sender> banned <target>.": "<sender> 封禁了 <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> 将他们的昵称修改成了 <displayName> 。", + "<sender> set their display name to <displayName>.": "<sender> 将昵称改为了 <displayName>。.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> 删除了他们的昵称 (<oldDisplayName>).", + "<sender> removed their profile picture.": "<sender> 移除了他们的头像。", + "<sender> changed their profile picture.": "<sender> 修改了头像。", + "<sender> set a profile picture.": "<sender> 设置了头像。.", + "<target> joined the room.": "<target> 已加入聊天室。", + "<target> rejected the invitation.": "<target> 拒绝了邀请。", + "<target> left the room.": "<target> 退出了聊天室。", + "<sender> unbanned <target>.": "<sender> 解除了 <target> 的封禁。", + "<sender> kicked <target>.": "<sender> 把 <target> 踢出了聊天室。.", + "<sender> withdrew <target>'s invitation.": "<sender> 收回了 <target> 的邀请。", + "<sender> changed the topic to \"%(topic)s\".": "<sender> 将话题修改为 “%(topic)s”。", + "<sender> changed the room name to %(roomName)s.": "<sender> 将聊天室名称改为 %(roomName)s。", + "<sender> changed the avatar for %(roomName)s": "<sender> 修改了 %(roomName)s 的头像", + "<sender> changed the room avatar to <img/>": "<sender> 将聊天室的头像更改为 <img/>", + "<sender> removed the room name.": "<sender> 移除了聊天室名称。", + "<sender> removed the room avatar.": "<sender> 移除了聊天室头像。", + "<sender> answered the call.": "<sender> 接了通话。.", + "<sender> ended the call.": "<sender> 结束了通话。.", + "<sender> placed a %(callType)s call.": "<sender> 发起了一个 %(callType)s 通话。", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> 向 %(targetDisplayName)s 发了加入聊天室的邀请。.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> 设定历史浏览功能为 所有聊天室成员,从他们被邀请开始.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> 设定历史浏览功能为 所有聊天室成员,从他们加入开始.", + "<sender> made future room history visible to all room members.": "<sender> 设定历史浏览功能为 所有聊天室成员.", + "<sender> made future room history visible to anyone.": "<sender> 设定历史浏览功能为 任何人.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> 设定历史浏览功能为 未知的 (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> 打开了端到端加密 (算法 %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> 将级别调整到%(powerLevelDiffText)s 。", + "<sender> changed the pinned messages for the room.": "<sender> 更改了聊天室的置顶消息。", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s 小组建被 <sender> 修改", + "%(widgetName)s widget added by <sender>": "%(widgetName)s 小组建被 <sender> 添加", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s 小组建被 <sender> 移除" } diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index ebf329b45b..5ba9458c77 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -8,7 +8,6 @@ "Are you sure you want to upload the following files?": "您確認要上傳以下文件嗎?", "Attachment": "附件", "Autoplay GIFs and videos": "自動播放 GIF 和影片", - "%(senderName)s banned %(targetName)s.": "%(senderName)s 封鎖了 %(targetName)s.", "Ban": "封鎖", "Banned users": "被封鎖的用戶", "Blacklisted": "已列入黑名單", @@ -16,7 +15,6 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "當瀏覽器網址列裡有 HTTPS URL 時,不能使用 HTTP 連線到家伺服器。請採用 HTTPS 或者<a>允許不安全的指令稿</a>。", "Can't load user settings": "無法載入使用者設定", "Change Password": "變更密碼", - "%(targetName)s left the room.": "%(targetName)s 離開了聊天室。.", "Account": "帳號", "Access Token:": "取用令牌:", "Add email address": "添加郵件地址", @@ -28,7 +26,6 @@ "Authentication": "授權", "%(items)s and %(lastItem)s": "%(items)s 和 %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在打字", - "%(senderName)s answered the call.": "%(senderName)s 接了通話。.", "Clear Cache": "清理緩存", "Click here to fix": "點擊這里修復", "Confirm password": "確認密碼", @@ -62,7 +59,6 @@ "Enable encryption": "啟用加密", "Encrypted messages will not be visible on clients that do not yet implement encryption": "不支援加密的客戶端將看不到加密的訊息", "Encrypted room": "加密聊天室", - "%(senderName)s ended the call.": "%(senderName)s 結束了通話。.", "End-to-end encryption information": "端到端加密資訊", "End-to-end encryption is in beta and may not be reliable": "端到端加密現為測試版,不一定可靠", "Enter Code": "輸入代碼", @@ -100,7 +96,6 @@ "Forgot your password?": "忘記密碼?", "For security, this session has been signed out. Please sign in again.": "因為安全因素,此工作階段已被登出。請重新登入。", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "因為安全因素,登出將會從此瀏覽器刪除任何端到端加密的金鑰。若您想要在未來的 Riot 工作階段中解密您的對話紀錄,請將您的聊天室金鑰匯出並好好存放。", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 從 %(fromPowerLevel)s 變為 %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主動邀請。.", "Hangup": "掛斷", "Hide read receipts": "隱藏已讀回執", @@ -118,9 +113,7 @@ "Invalid file%(extra)s": "非法文件%(extra)s", "Invite new room members": "邀請新的聊天室成員", "Join Room": "加入聊天室", - "%(targetName)s joined the room.": "%(targetName)s 加入了聊天室。.", "Jump to first unread message.": "跳到第一則未讀訊息。", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", "Leave room": "離開聊天室", "New password": "新密碼", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "重設密碼目前會把所有裝置上的端到端加密金鑰重設,讓已加密的聊天歷史不可讀,除非您先匯出您的聊天室金鑰並在稍後重新匯入。這會在未來改進。", @@ -141,7 +134,6 @@ "Send Invites": "發送邀請", "Send Reset Email": "發送密碼重設郵件", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 發了一張圖片。.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 發了加入聊天室的邀請。.", "Server error": "伺服器錯誤", "Server may be unavailable or overloaded": "服務器可能不可用或者超載", "Server may be unavailable, overloaded, or search timed out :(": "服務器可能不可用、超載,或者搜索超時 :(", @@ -149,8 +141,6 @@ "Server may be unavailable, overloaded, or you hit a bug.": "服務器可能不可用、超載,或者你遇到了一個漏洞.", "Server unavailable, overloaded, or something else went wrong.": "伺服器可能不可用、超載,或者其他東西出錯了.", "Session ID": "會話 ID", - "%(senderName)s set a profile picture.": "%(senderName)s 設置了頭像。.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 將他的暱稱改成 %(displayName)s。.", "Settings": "設定", "Show panel": "顯示側邊欄", "Show timestamps in 12 hour format (e.g. 2:30pm)": "用12小時制顯示時間戳 (如:下午 2:30)", @@ -172,7 +162,6 @@ "The file '%(fileName)s' failed to upload": "文件 '%(fileName)s' 上傳失敗", "Turn Markdown off": "關閉Markdown 語法", "Turn Markdown on": "啟用Markdown 語法", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 啟用端對端加密 (algorithm %(algorithm)s).", "Unable to add email address": "無法加入電郵地址", "Unable to capture screen": "無法截取畫面", "Unable to enable Notifications": "無法啟用通知功能", @@ -186,9 +175,6 @@ "Online": "線上", "Idle": "閒置", "Offline": "下線", - "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s 更改了聊天室的圖像為 <img/>", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s 移除了聊天室圖片。", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s 更改了聊天室 %(roomName)s 圖像", "Cancel": "取消", "Custom Server Options": "自訂伺服器選項", "Dismiss": "關閉", @@ -233,8 +219,6 @@ "Start chat": "開始聊天", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "文字訊息將會傳送到 +%(msisdn)s。請輸入其中包含的驗證碼", "Accept": "接受", - "%(targetName)s accepted an invitation.": "%(targetName)s 已接受邀請。", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 已接受 %(displayName)s 的邀請。", "Active call (%(roomName)s)": "活躍的通話(%(roomName)s)", "Add": "新增", "Admin Tools": "管理員工具", @@ -248,11 +232,6 @@ "Are you sure you want to leave the room '%(roomName)s'?": "您確定您要想要離開房間 '%(roomName)s' 嗎?", "Bans user with given id": "禁止有指定 ID 的使用者", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "無法連線到家伺服器 - 請檢查您的連線,確保您的<a>家伺服器的 SSL 憑證</a>可被信任,而瀏覽器擴充套件也沒有阻擋請求。", - "%(senderName)s changed their profile picture.": "%(senderName)s 已經變更了他的基本資料圖片。", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 變更了 %(powerLevelDiffText)s 權限等級。", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 將房間名稱變更為 %(roomName)s。", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 已經移除了房間名稱。", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 已經變更主題為「%(topic)s」。", "Changes to who can read history will only apply to future messages in this room": "變更誰可以讀取歷史紀錄的設定僅套用於此房間未來的訊息", "Changes your display nickname": "變更您的顯示暱稱", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前變更密碼將會重設在所有裝置上的端對端加密金鑰,讓加密的聊天歷史無法讀取,除非您先匯出您的房間金鑰,並在稍後重新匯入它們。這會在未來改進。", @@ -301,7 +280,6 @@ "Incoming video call from %(name)s": "從 %(name)s 而來的視訊來電", "Incoming voice call from %(name)s": "從 %(name)s 而來的語音來電", "Incorrect username and/or password.": "不正確的使用者名稱和/或密碼。", - "%(senderName)s invited %(targetName)s.": "%(senderName)s 邀請了 %(targetName)s。", "Invited": "已邀請", "Invites": "邀請", "Invites user with given id to current room": "邀請指定 ID 的使用者到目前的房間", @@ -320,11 +298,6 @@ "Logged in as:": "登入為:", "Logout": "登出", "Low priority": "低優先度", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們被邀請開始.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們加入開始.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s 讓未來的房間歷史紀錄可見於 所有聊天室成員.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s 讓未來的房間歷史紀錄可見於 任何人.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s 讓未來的房間歷史紀錄可見於 未知 (%(visibility)s).", "Manage Integrations": "管裡整合", "Markdown is disabled": "Markdown 已停用", "Markdown is enabled": "Markdown 已啟用", @@ -361,7 +334,6 @@ "People": "夥伴", "Permissions": "權限", "Phone": "電話", - "%(senderName)s placed a %(callType)s call.": "%(senderName)s 打了 %(callType)s 通話。", "Please check your email and click on the link it contains. Once this is done, click continue.": "請檢查您的電子郵件並點選其中包含的連結。只要這個完成了,就點選選繼續。", "Power level must be positive integer.": "權限等級必需為正整數。", "Press <StartChatButton> to start a chat with someone": "按下 <StartChatButton> 以開始與某人聊天", @@ -373,15 +345,11 @@ "Reason: %(reasonText)s": "理由:%(reasonText)s", "Revoke Moderator": "撤回仲裁者", "Refer a friend to Riot:": "推薦 Riot 給朋友:", - "%(targetName)s rejected the invitation.": "%(targetName)s 拒絕了邀請。", "Reject invitation": "拒絕邀請", "Rejoin": "重新加入", "Remote addresses for this room:": "此房間的遠端地址:", "Remove Contact Information?": "移除聯絡人資訊?", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 移除了他的顯示名稱 (%(oldDisplayName)s)。", - "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他的基本資料圖片。", "Remove %(threePid)s?": "移除 %(threePid)s?", - "%(senderName)s requested a VoIP conference.": "%(senderName)s 請求了一次 VoIP 會議。", "Results from DuckDuckGo": "DuckDuckGo 的結果", "Room contains unknown devices": "包含了未知裝置的房間", "%(roomName)s does not exist.": "%(roomName)s 不存在。", @@ -415,7 +383,6 @@ "Unable to remove contact information": "無法移除聯絡人資訊", "Unable to verify email address.": "無法驗證電子郵件。", "Unban": "解除禁止", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s 解除禁止 %(targetName)s。", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "無法確定此邀請是傳送到與您的帳號相關聯的電子郵件地址。", "Unable to load device list": "無法載入裝置清單", "Undecryptable": "無法解密", @@ -469,7 +436,6 @@ "Who can read history?": "誰可以讀取歷史紀錄?", "Who would you like to add to this room?": "您想要新增誰到此房間?", "Who would you like to communicate with?": "您想與誰通訊?", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 撤回了 %(targetName)s 的邀請。", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "您想要<acceptText>接受</acceptText>或<declineText>拒絕</declineText>此邀請?", "You already have existing direct chats with this user:": "您已與此使用者直接聊天:", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "您尚未在任何房間!按下<CreateRoomButton> 來建立房間或 <RoomDirectoryButton> 來瀏覽目錄", @@ -663,10 +629,7 @@ "Automatically replace plain text Emoji": "自動取代純文字為顏文字", "Failed to upload image": "上傳圖片失敗", "Hide avatars in user and room mentions": "在使用者與聊天室提及中隱藏大頭貼", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 由 %(senderName)s 所新增", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 由 %(senderName)s 所移除", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "機器人檢查目前在桌面端不可用 ── 請使用<a>網路瀏覽器</a>", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小工具已被 %(senderName)s 修改", "Copied!": "已複製!", "Failed to copy": "複製失敗", "Add rooms to this community": "新增聊天室到此社群", @@ -696,7 +659,6 @@ "You are now ignoring %(userId)s": "您忽略了 %(userId)s", "Unignored user": "未忽略的使用者", "You are no longer ignoring %(userId)s": "您不再忽略 %(userId)s", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)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 與另一個人正在輸入", "Send": "傳送", @@ -955,7 +917,6 @@ "Community IDs cannot not be empty.": "社群 ID 不能為空。", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>顯示裝置</showDevicesText>、<sendAnywayText>無論如何都要傳送</sendAnywayText>或<cancelText>取消</cancelText>。", "<a>In reply to</a> <pill>": "<a>回覆給</a> <pill>", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 變更了他的顯示名稱為 %(displayName)s 。", "Failed to set direct chat tag": "設定直接聊天標籤失敗", "Failed to remove tag %(tagName)s from room": "從聊天室移除標籤 %(tagName)s 失敗", "Failed to add tag %(tagName)s to room": "新增標籤 %(tagName)s 到聊天室失敗", @@ -1195,5 +1156,44 @@ "Share Room Message": "分享聊天室訊息", "Link to selected message": "連結到選定的訊息", "COPY": "複製", - "Share Message": "分享訊息" + "Share Message": "分享訊息", + "<target> accepted the invitation for %(displayName)s.": "<target> 已接受 %(displayName)s 的邀請。", + "<target> accepted an invitation.": "<target> 已接受邀請。", + "<sender> requested a VoIP conference.": "<sender> 請求了一次 VoIP 會議。", + "<sender> invited <target>.": "<sender> 邀請了 <target>。", + "<sender> banned <target>.": "<sender> 封鎖了 <target>.", + "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> 變更了他的顯示名稱為 <displayName> 。", + "<sender> set their display name to <displayName>.": "<sender> 將他的暱稱改成 <displayName>。.", + "<sender> removed their display name (<oldDisplayName>).": "<sender> 移除了他的顯示名稱 (<oldDisplayName>)。", + "<sender> removed their profile picture.": "<sender> 移除了他的基本資料圖片。", + "<sender> changed their profile picture.": "<sender> 已經變更了他的基本資料圖片。", + "<sender> set a profile picture.": "<sender> 設置了頭像。.", + "<target> joined the room.": "<target> 加入了聊天室。.", + "<target> rejected the invitation.": "<target> 拒絕了邀請。", + "<target> left the room.": "<target> 離開了聊天室。.", + "<sender> unbanned <target>.": "<sender> 解除禁止 <target>。", + "<sender> kicked <target>.": "<sender> 把 <target> 踢出了聊天室。.", + "<sender> withdrew <target>'s invitation.": "<sender> 撤回了 <target> 的邀請。", + "<sender> changed the topic to \"%(topic)s\".": "<sender> 已經變更主題為「%(topic)s」。", + "<sender> changed the room avatar to <img/>": "<sender> 更改了聊天室的圖像為 <img/>", + "<sender> changed the avatar for %(roomName)s": "<sender> 更改了聊天室 %(roomName)s 圖像", + "<sender> changed the room name to %(roomName)s.": "<sender> 將房間名稱變更為 %(roomName)s。", + "<sender> removed the room avatar.": "<sender> 移除了聊天室圖片。", + "<sender> removed the room name.": "<sender> 已經移除了房間名稱。", + "<sender> answered the call.": "<sender> 接了通話。.", + "<sender> ended the call.": "<sender> 結束了通話。.", + "<sender> placed a %(callType)s call.": "<sender> 打了 %(callType)s 通話。", + "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> 向 %(targetDisplayName)s 發了加入聊天室的邀請。.", + "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們被邀請開始.", + "<sender> made future room history visible to all room members, from the point they joined.": "<sender> 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們加入開始.", + "<sender> made future room history visible to all room members.": "<sender> 讓未來的房間歷史紀錄可見於 所有聊天室成員.", + "<sender> made future room history visible to anyone.": "<sender> 讓未來的房間歷史紀錄可見於 任何人.", + "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> 讓未來的房間歷史紀錄可見於 未知 (%(visibility)s).", + "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> 啟用端對端加密 (algorithm %(algorithm)s).", + "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> 從 %(fromPowerLevel)s 變為 %(toPowerLevel)s", + "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> 變更了 %(powerLevelDiffText)s 權限等級。", + "<sender> changed the pinned messages for the room.": "<sender> 變更了聊天室的釘選訊息。", + "%(widgetName)s widget modified by <sender>": "%(widgetName)s 小工具已被 <sender> 修改", + "%(widgetName)s widget added by <sender>": "%(widgetName)s 由 <sender> 所新增", + "%(widgetName)s widget removed by <sender>": "%(widgetName)s 由 <sender> 所移除" } From 2c537a8dff16077635060e45c2f4589b1f86e45e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 29 Jun 2018 15:28:36 +0100 Subject: [PATCH 445/480] update styling Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/elements/_TextForEvent.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/res/css/views/elements/_TextForEvent.scss b/res/css/views/elements/_TextForEvent.scss index 8d46cbf84c..bb3aacfc88 100644 --- a/res/css/views/elements/_TextForEvent.scss +++ b/res/css/views/elements/_TextForEvent.scss @@ -17,3 +17,8 @@ limitations under the License. .mx_TextForEvent_username { cursor: pointer; } + +.mx_TextForEvent_username:hover { + text-decoration: none; + color: inherit; +} From 85a0736c78f62fb7f6947c57da1979d449972c1a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 29 Jun 2018 19:16:56 +0100 Subject: [PATCH 446/480] update wording as per D4ve's feedback Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/MemberInfo.js | 10 ++-- src/i18n/strings/en_EN.json | 69 ++++++++++++------------ 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 6680e7d02c..e8a7d14bae 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -336,16 +336,14 @@ module.exports = withMatrixClient(React.createClass({ const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); return new Promise((resolve) => { Modal.createTrackedDialog('Demoting Self', '', QuestionDialog, { - title: _t("Warning!"), + title: _t("Demote yourself?"), description: <div> { _t("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.") } - <br /> - { _t("Are you sure?") } </div>, - button: _t("Continue"), + button: _t("Demote"), onFinished: resolve, }); }); @@ -361,7 +359,7 @@ module.exports = withMatrixClient(React.createClass({ // if muting self, warn as it may be irreversible if (target === this.props.matrixClient.getUserId()) { try { - if (!await this._warnSelfDemote()) return; + if (!(await this._warnSelfDemote())) return; } catch (e) { console.error("Failed to warn about self demotion: ", e); return; @@ -485,7 +483,7 @@ module.exports = withMatrixClient(React.createClass({ // If we are changing our own PL it can only ever be decreasing, which we cannot reverse. if (myUserId === target) { try { - if (!await this._warnSelfDemote()) return; + if (!(await this._warnSelfDemote())) return; this._applyPowerChange(roomId, target, powerLevel, powerLevelEvent); } catch (e) { console.error("Failed to warn about self demotion: ", e); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f182ecdbad..c8aedfd493 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -42,6 +42,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -81,6 +85,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -104,7 +109,6 @@ "You need to be logged in.": "You need to be logged in.", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "Unable to create widget.": "Unable to create widget.", - "Reload widget": "Reload widget", "Missing roomId.": "Missing roomId.", "Failed to send request.": "Failed to send request.", "This room is not recognised.": "This room is not recognised.", @@ -180,11 +184,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -298,6 +297,29 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "URL Previews": "URL Previews", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -334,12 +356,14 @@ "Unban this user?": "Unban this user?", "Ban this user?": "Ban this user?", "Failed to ban user": "Failed to ban user", + "Demote yourself?": "Demote yourself?", + "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.": "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.", + "Demote": "Demote", "Failed to mute user": "Failed to mute user", "Failed to toggle moderator status": "Failed to toggle moderator status", "Failed to change power level": "Failed to change power level", - "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.": "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.", - "Are you sure?": "Are you sure?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.", + "Are you sure?": "Are you sure?", "No devices with registered encryption keys": "No devices with registered encryption keys", "Devices": "Devices", "Unignore": "Unignore", @@ -394,11 +418,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -531,29 +555,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "URL Previews": "URL Previews", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -664,6 +665,7 @@ "Delete widget": "Delete widget", "Revoke widget access": "Revoke widget access", "Minimize apps": "Minimize apps", + "Reload widget": "Reload widget", "Popout widget": "Popout widget", "Picture": "Picture", "Edit": "Edit", @@ -743,6 +745,7 @@ "Room directory": "Room directory", "Start chat": "Start chat", "And %(count)s more...|other": "And %(count)s more...", + "Share Link to User": "Share Link to User", "ex. @bob:example.com": "ex. @bob:example.com", "Add User": "Add User", "Matrix ID": "Matrix ID", From 12ed25534ad1fca840d4eb21f536a973bc2aa141 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Wed, 27 Jun 2018 05:52:57 +0000 Subject: [PATCH 447/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1208 of 1208 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 024166b37c..958d90b2b2 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1205,5 +1205,6 @@ "The email field must not be blank.": "Имейл полето не може да бъде празно.", "The user name field must not be blank.": "Полето за потребителско име не може да е празно.", "The phone number field must not be blank.": "Полето за телефонен номер не може да е празно.", - "The password field must not be blank.": "Полето за парола не може да е празно." + "The password field must not be blank.": "Полето за парола не може да е празно.", + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Не можете да изпращате съобщения докато не прегледате и се съгласите с <consentLink>нашите правила и условия</consentLink>." } From ca83f1e8c89ed1028bcac2c9c9ca267fae13fd7c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 30 Jun 2018 17:06:33 +0100 Subject: [PATCH 448/480] allow RoomSubList to use old behaviour of not hiding even if empty Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 63 +++++++++++++++--------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 0c78043a42..d798070659 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -27,6 +27,7 @@ import * as RoomNotifs from '../../RoomNotifs'; import * as FormattingUtils from '../../utils/FormattingUtils'; import { KeyCode } from '../../Keyboard'; import { Group } from 'matrix-js-sdk'; +import PropTypes from 'prop-types'; // turn this on for drop & drag console debugging galore @@ -40,27 +41,28 @@ const RoomSubList = React.createClass({ debug: debug, propTypes: { - list: React.PropTypes.arrayOf(React.PropTypes.object).isRequired, - label: React.PropTypes.string.isRequired, - tagName: React.PropTypes.string, - editable: React.PropTypes.bool, + list: PropTypes.arrayOf(PropTypes.object).isRequired, + label: PropTypes.string.isRequired, + tagName: PropTypes.string, + editable: PropTypes.bool, - order: React.PropTypes.string.isRequired, + order: PropTypes.string.isRequired, // passed through to RoomTile and used to highlight room with `!` regardless of notifications count - isInvite: React.PropTypes.bool, + isInvite: PropTypes.bool, - startAsHidden: React.PropTypes.bool, - showSpinner: React.PropTypes.bool, // true to show a spinner if 0 elements when expanded - collapsed: React.PropTypes.bool.isRequired, // is LeftPanel collapsed? - onHeaderClick: React.PropTypes.func, - alwaysShowHeader: React.PropTypes.bool, - incomingCall: React.PropTypes.object, - onShowMoreRooms: React.PropTypes.func, - searchFilter: React.PropTypes.string, - emptyContent: React.PropTypes.node, // content shown if the list is empty - headerItems: React.PropTypes.node, // content shown in the sublist header - extraTiles: React.PropTypes.arrayOf(React.PropTypes.node), // extra elements added beneath tiles + startAsHidden: PropTypes.bool, + showSpinner: PropTypes.bool, // true to show a spinner if 0 elements when expanded + collapsed: PropTypes.bool.isRequired, // is LeftPanel collapsed? + onHeaderClick: PropTypes.func, + alwaysShowHeader: PropTypes.bool, + incomingCall: PropTypes.object, + onShowMoreRooms: PropTypes.func, + searchFilter: PropTypes.string, + emptyContent: PropTypes.node, // content shown if the list is empty + headerItems: PropTypes.node, // content shown in the sublist header + extraTiles: PropTypes.arrayOf(PropTypes.node), // extra elements added beneath tiles + showEmpty: PropTypes.bool, }, getInitialState: function() { @@ -79,6 +81,7 @@ const RoomSubList = React.createClass({ }, // NOP extraTiles: [], isInvite: false, + showEmpty: true, }; }, @@ -392,17 +395,29 @@ const RoomSubList = React.createClass({ const TruncatedList = sdk.getComponent('elements.TruncatedList'); let content; - if (this.state.sortedList.length === 0 && this.props.extraTiles.length === 0) { - // if no search filter is applied and there is a placeholder defined then show it, otherwise show nothing - if (!this.props.searchFilter && this.props.emptyContent) { + + if (this.props.showEmpty) { + // this is new behaviour with still controversial UX in that in hiding RoomSubLists the drop zones for DnD + // are also gone so when filtering users can't DnD rooms to some tags but is a lot cleaner otherwise. + if (this.state.sortedList.length === 0 && !this.props.searchFilter && this.props.extraTiles.length === 0) { content = this.props.emptyContent; } else { - // don't show an empty sublist - return null; + content = this.makeRoomTiles(); + content.push(...this.props.extraTiles); } } else { - content = this.makeRoomTiles(); - content.push(...this.props.extraTiles); + if (this.state.sortedList.length === 0 && this.props.extraTiles.length === 0) { + // if no search filter is applied and there is a placeholder defined then show it, otherwise show nothing + if (!this.props.searchFilter && this.props.emptyContent) { + content = this.props.emptyContent; + } else { + // don't show an empty sublist + return null; + } + } else { + content = this.makeRoomTiles(); + content.push(...this.props.extraTiles); + } } if (this.state.sortedList.length > 0 || this.props.extraTiles.length > 0 || this.props.editable) { From 37a8e7f2e2ad96a4aa4377f85b384a07ac879bb0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 30 Jun 2018 17:07:28 +0100 Subject: [PATCH 449/480] add setting to throw new RoomSubList hide behaviour behind an opt-in Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/UserSettings.js | 1 + src/components/views/rooms/RoomList.js | 26 +++++++++++++++++------ src/settings/Settings.js | 5 +++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 6397e73434..d02d8b23e5 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -81,6 +81,7 @@ const SIMPLE_SETTINGS = [ { id: "VideoView.flipVideoHorizontally" }, { id: "TagPanel.disableTagPanel" }, { id: "enableWidgetScreenshots" }, + { id: "RoomSubList.showEmpty" }, ]; // These settings must be defined in SettingsStore diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 62ae96f47f..8533e3f61a 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -16,6 +16,8 @@ limitations under the License. */ 'use strict'; +import SettingsStore from "../../../settings/SettingsStore"; + const React = require("react"); const ReactDOM = require("react-dom"); import PropTypes from 'prop-types'; @@ -608,6 +610,10 @@ module.exports = React.createClass({ const RoomSubList = sdk.getComponent('structures.RoomSubList'); const GeminiScrollbarWrapper = sdk.getComponent("elements.GeminiScrollbarWrapper"); + // XXX: we can't detect device-level (localStorage) settings onChange as the SettingsStore does not notify + // so checking on every render is the sanest thing at this time. + const showEmpty = SettingsStore.getValue('RoomSubList.showEmpty'); + const self = this; return ( <GeminiScrollbarWrapper className="mx_RoomList_scrollbar" @@ -623,6 +629,7 @@ module.exports = React.createClass({ searchFilter={self.props.searchFilter} onHeaderClick={self.onSubListHeaderClick} onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} /> <RoomSubList list={self.state.lists['im.vector.fake.invite']} @@ -635,6 +642,7 @@ module.exports = React.createClass({ searchFilter={self.props.searchFilter} onHeaderClick={self.onSubListHeaderClick} onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} /> <RoomSubList list={self.state.lists['m.favourite']} @@ -647,7 +655,8 @@ module.exports = React.createClass({ collapsed={self.props.collapsed} searchFilter={self.props.searchFilter} onHeaderClick={self.onSubListHeaderClick} - onShowMoreRooms={self.onShowMoreRooms} /> + onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} /> <RoomSubList list={self.state.lists['im.vector.fake.direct']} label={_t('People')} @@ -661,7 +670,8 @@ module.exports = React.createClass({ alwaysShowHeader={true} searchFilter={self.props.searchFilter} onHeaderClick={self.onSubListHeaderClick} - onShowMoreRooms={self.onShowMoreRooms} /> + onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} /> <RoomSubList list={self.state.lists['im.vector.fake.recent']} label={_t('Rooms')} @@ -673,7 +683,8 @@ module.exports = React.createClass({ collapsed={self.props.collapsed} searchFilter={self.props.searchFilter} onHeaderClick={self.onSubListHeaderClick} - onShowMoreRooms={self.onShowMoreRooms} /> + onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} /> { Object.keys(self.state.lists).map((tagName) => { if (!tagName.match(STANDARD_TAGS_REGEX)) { @@ -688,7 +699,8 @@ module.exports = React.createClass({ collapsed={self.props.collapsed} searchFilter={self.props.searchFilter} onHeaderClick={self.onSubListHeaderClick} - onShowMoreRooms={self.onShowMoreRooms} />; + onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} />; } }) } @@ -702,7 +714,8 @@ module.exports = React.createClass({ collapsed={self.props.collapsed} searchFilter={self.props.searchFilter} onHeaderClick={self.onSubListHeaderClick} - onShowMoreRooms={self.onShowMoreRooms} /> + onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} /> <RoomSubList list={self.state.lists['im.vector.fake.archived']} emptyContent={self.props.collapsed ? null : @@ -722,7 +735,8 @@ module.exports = React.createClass({ onHeaderClick={self.onArchivedHeaderClick} incomingCall={self.state.incomingCall} searchFilter={self.props.searchFilter} - onShowMoreRooms={self.onShowMoreRooms} /> + onShowMoreRooms={self.onShowMoreRooms} + showEmpty={showEmpty} /> </div> </GeminiScrollbarWrapper> ); diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 84178e2673..022fabc739 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -284,4 +284,9 @@ export const SETTINGS = { supportedLevels: ['room-device'], default: false, }, + "RoomSubList.showEmpty": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td('Show empty room list headings'), + default: true, + }, }; From 1b003ca39f21b51d98e921390c2e78a12a631e04 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 30 Jun 2018 17:07:35 +0100 Subject: [PATCH 450/480] gen-i18n Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/i18n/strings/en_EN.json | 65 +++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 7717d45aa5..4c43f08e11 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -44,6 +44,10 @@ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads", "Upload Failed": "Upload Failed", + "Failure to create room": "Failure to create room", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", + "Send": "Send", "Sun": "Sun", "Mon": "Mon", "Tue": "Tue", @@ -83,6 +87,7 @@ "Failed to invite users to community": "Failed to invite users to community", "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", "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", @@ -196,11 +201,6 @@ "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", - "Failure to create room": "Failure to create room", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "Send anyway": "Send anyway", - "Send": "Send", - "Unnamed Room": "Unnamed Room", "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid Riot keyfile": "Not a valid Riot keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", @@ -234,6 +234,7 @@ "Enable URL previews by default for participants in this room": "Enable URL previews by default for participants in this room", "Room Colour": "Room Colour", "Enable widget screenshots on supported widgets": "Enable widget screenshots on supported widgets", + "Show empty room list headings": "Show empty room list headings", "Collecting app version information": "Collecting app version information", "Collecting logs": "Collecting logs", "Uploading report": "Uploading report", @@ -313,6 +314,31 @@ "Off": "Off", "On": "On", "Noisy": "Noisy", + "Invalid alias format": "Invalid alias format", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", + "Invalid address format": "Invalid address format", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", + "not specified": "not specified", + "not set": "not set", + "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", + "The main address for this room is": "The main address for this room is", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Flair": "Flair", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", + "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "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.", + "URL Previews": "URL Previews", + "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.", "Cannot add any more widgets": "Cannot add any more widgets", "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", "Add a widget": "Add a widget", @@ -412,11 +438,11 @@ "numbullet": "numbullet", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", "No pinned messages.": "No pinned messages.", "Loading...": "Loading...", "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -550,31 +576,6 @@ "Scroll to unread messages": "Scroll to unread messages", "Jump to first unread message.": "Jump to first unread message.", "Close": "Close", - "Invalid alias format": "Invalid alias format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", - "Invalid address format": "Invalid address format", - "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address", - "not specified": "not specified", - "not set": "not set", - "Remote addresses for this room:": "Remote addresses for this room:", - "Addresses": "Addresses", - "The main address for this room is": "The main address for this room is", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Flair": "Flair", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "You have <a>enabled</a> URL previews by default.": "You have <a>enabled</a> URL previews by default.", - "You have <a>disabled</a> URL previews by default.": "You have <a>disabled</a> URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "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.", - "URL Previews": "URL Previews", - "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.", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", From 0a638cd5458b17e81f210d5f2b50551b74953a55 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 1 Jul 2018 23:48:00 +0100 Subject: [PATCH 451/480] move nag bar clear statement to any desktop notif toggle not just 0->1 Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/Notifier.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Notifier.js b/src/Notifier.js index b823c4df05..80e8be1084 100644 --- a/src/Notifier.js +++ b/src/Notifier.js @@ -170,15 +170,15 @@ const Notifier = { value: true, }); }); - // clear the notifications_hidden flag, so that if notifications are - // disabled again in the future, we will show the banner again. - this.setToolbarHidden(true); } else { dis.dispatch({ action: "notifier_enabled", value: false, }); } + // set the notifications_hidden flag, as the user has knowingly interacted + // with the setting we shouldn't nag them any further + this.setToolbarHidden(true); }, isEnabled: function() { From 0dd3a774327d404359d35ae17df7f84f4b6a2b01 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Mon, 2 Jul 2018 09:45:32 +0100 Subject: [PATCH 452/480] Track an event name when tracking a decryption failure Otherwise piwik will not agregate the failures correctly for all views. --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 293b0130d0..9ea0cb42c8 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1306,7 +1306,7 @@ export default React.createClass({ const dft = new DecryptionFailureTracker((total) => { // TODO: Pass reason for failure as third argument to trackEvent - Analytics.trackEvent('E2E', 'Decryption failure', null, total); + Analytics.trackEvent('E2E', 'Decryption failure', 'unspecified_error', total); }); // Shelved for later date when we have time to think about persisting history of From 7225f7372c626d3d2d465e7a30a08022aef7d88f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@googlemail.com> Date: Tue, 3 Jul 2018 10:30:08 +0100 Subject: [PATCH 453/480] Revert " make click to insert nick work on join/parts, /me's etc" --- res/css/_components.scss | 1 - res/css/views/elements/_TextForEvent.scss | 24 --- scripts/map-i18n.js | 69 --------- src/TextForEvent.js | 172 ++++++++-------------- src/i18n/strings/bg.json | 80 +++++----- src/i18n/strings/ca.json | 80 +++++----- src/i18n/strings/cs.json | 78 +++++----- src/i18n/strings/da.json | 48 +++--- src/i18n/strings/de_DE.json | 80 +++++----- src/i18n/strings/el.json | 80 +++++----- src/i18n/strings/en_EN.json | 80 +++++----- src/i18n/strings/en_US.json | 76 +++++----- src/i18n/strings/eo.json | 80 +++++----- src/i18n/strings/es.json | 64 ++++---- src/i18n/strings/eu.json | 80 +++++----- src/i18n/strings/fi.json | 78 +++++----- src/i18n/strings/fr.json | 80 +++++----- src/i18n/strings/gl.json | 80 +++++----- src/i18n/strings/hu.json | 80 +++++----- src/i18n/strings/id.json | 20 +-- src/i18n/strings/is.json | 10 +- src/i18n/strings/it.json | 80 +++++----- src/i18n/strings/ja.json | 4 +- src/i18n/strings/ko.json | 70 ++++----- src/i18n/strings/lv.json | 80 +++++----- src/i18n/strings/nl.json | 80 +++++----- src/i18n/strings/pl.json | 80 +++++----- src/i18n/strings/pt.json | 76 +++++----- src/i18n/strings/pt_BR.json | 80 +++++----- src/i18n/strings/ru.json | 80 +++++----- src/i18n/strings/sk.json | 80 +++++----- src/i18n/strings/sr.json | 80 +++++----- src/i18n/strings/sv.json | 80 +++++----- src/i18n/strings/te.json | 10 +- src/i18n/strings/th.json | 48 +++--- src/i18n/strings/tr.json | 70 ++++----- src/i18n/strings/uk.json | 20 +-- src/i18n/strings/zh_Hans.json | 80 +++++----- src/i18n/strings/zh_Hant.json | 80 +++++----- 39 files changed, 1241 insertions(+), 1377 deletions(-) delete mode 100644 res/css/views/elements/_TextForEvent.scss delete mode 100644 scripts/map-i18n.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 8f290337e3..173939e143 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -60,7 +60,6 @@ @import "./views/elements/_RoleButton.scss"; @import "./views/elements/_Spinner.scss"; @import "./views/elements/_SyntaxHighlight.scss"; -@import "./views/elements/_TextForEvent.scss"; @import "./views/elements/_ToolTipButton.scss"; @import "./views/globals/_MatrixToolbar.scss"; @import "./views/groups/_GroupPublicityToggle.scss"; diff --git a/res/css/views/elements/_TextForEvent.scss b/res/css/views/elements/_TextForEvent.scss deleted file mode 100644 index bb3aacfc88..0000000000 --- a/res/css/views/elements/_TextForEvent.scss +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> - -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_TextForEvent_username { - cursor: pointer; -} - -.mx_TextForEvent_username:hover { - text-decoration: none; - color: inherit; -} diff --git a/scripts/map-i18n.js b/scripts/map-i18n.js deleted file mode 100644 index 32f81d5e82..0000000000 --- a/scripts/map-i18n.js +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env node - -/* -Copyright 2018 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. -*/ - -/* - * Looks through all the translation files and maps matches of fromRegex - * in both key and value of the i18n translation to toStr where i18nKeyRegex - * matches. Simplifies changing from text to react replacements. - * e.g: - * node scripts\map-i18n.js "%\(targetName\)s accepted the invitation for %\(displayName\)s\." "%\(targetName\)s" "<target>" - */ - -const fs = require('fs'); -const path = require('path'); - -const I18NDIR = 'src/i18n/strings'; - -if (process.argv.length !== 5) { - console.error("Required exactly 3 arguments"); - console.info("Usage: <i18n_key> <fromStr> <toStr>"); - return; -} - -const [, , i18nKey, fromStr, toStr] = process.argv; -const i18nKeyRegex = new RegExp(i18nKey, 'i'); -const fromRegex = new RegExp(fromStr, 'i'); - -console.info(`Replacing instances of "${fromRegex}" with "${toStr}" in keys and values where key matches "${i18nKey}"`); - -for (const filename of fs.readdirSync(I18NDIR)) { - if (!filename.endsWith('.json')) continue; - - let numChanged = 0; - - const trs = JSON.parse(fs.readFileSync(path.join(I18NDIR, filename))); - for (const tr of Object.keys(trs)) { - if (i18nKeyRegex.test(tr) && (fromRegex.test(tr) || fromRegex.test(tr))) { - const v = trs[tr]; - delete trs[tr]; - - trs[tr.replace(fromRegex, toStr)] = v.replace(fromRegex, toStr); - numChanged++; - } - } - - if (numChanged > 0) { - console.log(`${filename}: transformed ${numChanged} translations`); - // XXX: This is totally relying on the impl serialising the JSON object in the - // same order as they were parsed from the file. JSON.stringify() has a specific argument - // that can be used to control the order, but JSON.parse() lacks any kind of equivalent. - // Empirically this does maintain the order on my system, so I'm going to leave it like - // this for now. - fs.writeFileSync(path.join(I18NDIR, filename), JSON.stringify(trs, undefined, 4) + "\n"); - } -} diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 3d2e3c1fb5..712150af4d 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -17,42 +17,11 @@ import MatrixClientPeg from './MatrixClientPeg'; import CallHandler from './CallHandler'; import { _t } from './languageHandler'; import * as Roles from './Roles'; -import dis from "./dispatcher"; -import React from 'react'; -import PropTypes from 'prop-types'; - -class ClickableUsername extends React.PureComponent { - static propTypes = { - mxid: PropTypes.string.isRequired, - text: PropTypes.string.isRequired, - }; - - constructor(props) { - super(props); - this.onClick = this.onClick.bind(this); - } - - onClick() { - dis.dispatch({ - action: 'insert_mention', - user_id: this.props.mxid, - }); - } - - render() { - const {mxid, text} = this.props; - return <a className="mx_TextForEvent_username" dir="auto" onClick={this.onClick} data-mxid={mxid}>{ text }</a>; - } -} function textForMemberEvent(ev) { // XXX: SYJS-16 "sender is sometimes null for join messages" const senderName = ev.sender ? ev.sender.name : ev.getSender(); const targetName = ev.target ? ev.target.name : ev.getStateKey(); - - const sender = <ClickableUsername mxid={ev.getSender()} text={senderName} />; - const target = <ClickableUsername mxid={ev.getStateKey()} text={targetName} />; - const prevContent = ev.getPrevContent(); const content = ev.getContent(); @@ -63,48 +32,47 @@ function textForMemberEvent(ev) { const threePidContent = content.third_party_invite; if (threePidContent) { if (threePidContent.display_name) { - return _t('<target> accepted the invitation for %(displayName)s.', { + return _t('%(targetName)s accepted the invitation for %(displayName)s.', { + targetName, displayName: threePidContent.display_name, - }, { - target, }); } else { - return _t('<target> accepted an invitation.', {}, {target}); + return _t('%(targetName)s accepted an invitation.', {targetName}); } } else { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { - return _t('<sender> requested a VoIP conference.', {}, {sender}); + return _t('%(senderName)s requested a VoIP conference.', {senderName}); } else { - return _t('<sender> invited <target>.', {}, {sender, target}); + return _t('%(senderName)s invited %(targetName)s.', {senderName, targetName}); } } } case 'ban': - return _t('<sender> banned <target>.', {}, {sender, target}) + ' ' + reason; + return _t('%(senderName)s banned %(targetName)s.', {senderName, targetName}) + ' ' + reason; case 'join': if (prevContent && prevContent.membership === 'join') { if (prevContent.displayname && content.displayname && prevContent.displayname !== content.displayname) { - return _t('<oldDisplayName> changed their display name to <displayName>.', {}, { - oldDisplayName: <ClickableUsername mxid={ev.getStateKey()} text={prevContent.displayname} />, - displayName: <ClickableUsername mxid={ev.getStateKey()} text={content.displayname} />, + return _t('%(oldDisplayName)s changed their display name to %(displayName)s.', { + oldDisplayName: prevContent.displayname, + displayName: content.displayname, }); } else if (!prevContent.displayname && content.displayname) { - return _t('<sender> set their display name to <displayName>.', {}, { - sender, - displayName: <ClickableUsername mxid={ev.getSender()} text={content.displayname} />, + return _t('%(senderName)s set their display name to %(displayName)s.', { + senderName: ev.getSender(), + displayName: content.displayname, }); } else if (prevContent.displayname && !content.displayname) { - return _t('<sender> removed their display name (<oldDisplayName>).', { - sender, - oldDisplayName: <ClickableUsername mxid={ev.getSender()} text={prevContent.displayname} />, + return _t('%(senderName)s removed their display name (%(oldDisplayName)s).', { + senderName, + oldDisplayName: prevContent.displayname, }); } else if (prevContent.avatar_url && !content.avatar_url) { - return _t('<sender> removed their profile picture.', {}, {sender}); + return _t('%(senderName)s removed their profile picture.', {senderName}); } else if (prevContent.avatar_url && content.avatar_url && prevContent.avatar_url !== content.avatar_url) { - return _t('<sender> changed their profile picture.', {}, {sender}); + return _t('%(senderName)s changed their profile picture.', {senderName}); } else if (!prevContent.avatar_url && content.avatar_url) { - return _t('<sender> set a profile picture.', {}, {sender}); + return _t('%(senderName)s set a profile picture.', {senderName}); } else { // suppress null rejoins return ''; @@ -114,7 +82,7 @@ function textForMemberEvent(ev) { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { return _t('VoIP conference started.'); } else { - return _t('<target> joined the room.', {}, {target}); + return _t('%(targetName)s joined the room.', {targetName}); } } case 'leave': @@ -122,42 +90,42 @@ function textForMemberEvent(ev) { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { return _t('VoIP conference finished.'); } else if (prevContent.membership === "invite") { - return _t('<target> rejected the invitation.', {}, {target}); + return _t('%(targetName)s rejected the invitation.', {targetName}); } else { - return _t('<target> left the room.', {}, {target}); + return _t('%(targetName)s left the room.', {targetName}); } } else if (prevContent.membership === "ban") { - return _t('<sender> unbanned <target>.', {}, {sender, target}); + return _t('%(senderName)s unbanned %(targetName)s.', {senderName, targetName}); } else if (prevContent.membership === "join") { - return _t('<sender> kicked <target>.', {}, {sender, target}) + ' ' + reason; + return _t('%(senderName)s kicked %(targetName)s.', {senderName, targetName}) + ' ' + reason; } else if (prevContent.membership === "invite") { - return _t('<sender> withdrew <target>\'s invitation.', {}, {sender, target}) + ' ' + reason; + return _t('%(senderName)s withdrew %(targetName)s\'s invitation.', { + senderName, + targetName, + }) + ' ' + reason; } else { - return _t('<target> left the room.', {}, {target}); + return _t('%(targetName)s left the room.', {targetName}); } } } function textForTopicEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - return _t('<sender> changed the topic to "%(topic)s".', { + return _t('%(senderDisplayName)s changed the topic to "%(topic)s".', { + senderDisplayName, topic: ev.getContent().topic, - }, { - sender: <ClickableUsername mxid={ev.getSender()} text={senderDisplayName} />, }); } function textForRoomNameEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - const sender = <ClickableUsername mxid={ev.getSender()} text={senderDisplayName} />; if (!ev.getContent().name || ev.getContent().name.trim().length === 0) { - return _t('<sender> removed the room name.', {}, {sender}); + return _t('%(senderDisplayName)s removed the room name.', {senderDisplayName}); } - return _t('<sender> changed the room name to %(roomName)s.', { + return _t('%(senderDisplayName)s changed the room name to %(roomName)s.', { + senderDisplayName, roomName: ev.getContent().name, - }, { - sender, }); } @@ -167,9 +135,7 @@ function textForMessageEvent(ev) { if (ev.getContent().msgtype === "m.emote") { message = "* " + senderDisplayName + " " + message; } else if (ev.getContent().msgtype === "m.image") { - message = _t('<sender> sent an image.', {}, { - sender: <ClickableUsername mxid={ev.getSender()} text={senderDisplayName} />, - }); + message = _t('%(senderDisplayName)s sent an image.', {senderDisplayName}); } return message; } @@ -177,9 +143,7 @@ function textForMessageEvent(ev) { function textForCallAnswerEvent(event) { const senderName = event.sender ? event.sender.name : _t('Someone'); const supported = MatrixClientPeg.get().supportsVoip() ? '' : _t('(not supported by this browser)'); - return _t('<sender> answered the call.', {}, { - sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, - }) + ' ' + supported; + return _t('%(senderName)s answered the call.', {senderName}) + ' ' + supported; } function textForCallHangupEvent(event) { @@ -197,14 +161,11 @@ function textForCallHangupEvent(event) { reason = _t('(unknown failure: %(reason)s)', {reason: eventContent.reason}); } } - return _t('<sender> ended the call.', {}, { - sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, - }) + ' ' + reason; + return _t('%(senderName)s ended the call.', {senderName}) + ' ' + reason; } function textForCallInviteEvent(event) { const senderName = event.sender ? event.sender.name : _t('Someone'); - const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; // FIXME: Find a better way to determine this from the event? let callType = "voice"; if (event.getContent().offer && event.getContent().offer.sdp && @@ -212,47 +173,43 @@ function textForCallInviteEvent(event) { callType = "video"; } const supported = MatrixClientPeg.get().supportsVoip() ? "" : _t('(not supported by this browser)'); - return _t('<sender> placed a %(callType)s call.', {callType}, {sender}) + ' ' + supported; + return _t('%(senderName)s placed a %(callType)s call.', {senderName, callType}) + ' ' + supported; } function textForThreePidInviteEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - return _t('<sender> sent an invitation to %(targetDisplayName)s to join the room.', { + return _t('%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.', { + senderName, targetDisplayName: event.getContent().display_name, - }, { - sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }); } function textForHistoryVisibilityEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; switch (event.getContent().history_visibility) { case 'invited': - return _t('<sender> made future room history visible to all room members, ' - + 'from the point they are invited.', {}, {sender}); + return _t('%(senderName)s made future room history visible to all room members, ' + + 'from the point they are invited.', {senderName}); case 'joined': - return _t('<sender> made future room history visible to all room members, ' - + 'from the point they joined.', {}, {sender}); + return _t('%(senderName)s made future room history visible to all room members, ' + + 'from the point they joined.', {senderName}); case 'shared': - return _t('<sender> made future room history visible to all room members.', {}, {sender}); + return _t('%(senderName)s made future room history visible to all room members.', {senderName}); case 'world_readable': - return _t('<sender> made future room history visible to anyone.', {}, {sender}); + return _t('%(senderName)s made future room history visible to anyone.', {senderName}); default: - return _t('<sender> made future room history visible to unknown (%(visibility)s).', { + return _t('%(senderName)s made future room history visible to unknown (%(visibility)s).', { + senderName, visibility: event.getContent().history_visibility, - }, { - sender, }); } } function textForEncryptionEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - return _t('<sender> turned on end-to-end encryption (algorithm %(algorithm)s).', { + return _t('%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).', { + senderName, algorithm: event.getContent().algorithm, - }, { - sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }); } @@ -284,11 +241,10 @@ function textForPowerEvent(event) { const to = event.getContent().users[userId]; if (to !== from) { diff.push( - _t('<user> from %(fromPowerLevel)s to %(toPowerLevel)s', { + _t('%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s', { + userId, fromPowerLevel: Roles.textualPowerLevel(from, userDefault), toPowerLevel: Roles.textualPowerLevel(to, userDefault), - }, { - user: <ClickableUsername mxid={userId} text={userId} />, }), ); } @@ -296,23 +252,19 @@ function textForPowerEvent(event) { if (!diff.length) { return ''; } - return _t('<sender> changed the power level of %(powerLevelDiffText)s.', { + return _t('%(senderName)s changed the power level of %(powerLevelDiffText)s.', { + senderName, powerLevelDiffText: diff.join(", "), - }, { - sender: <ClickableUsername mxid={event.getSender()} text={senderName} />, }); } function textForPinnedEvent(event) { - const senderName = event.sender ? event.sender.name : event.getSender(); - const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; - return _t("<sender> changed the pinned messages for the room.", {}, {sender}); + const senderName = event.getSender(); + return _t("%(senderName)s changed the pinned messages for the room.", {senderName}); } function textForWidgetEvent(event) { - const senderName = event.sender ? event.sender.name : event.getSender(); - const sender = <ClickableUsername mxid={event.getSender()} text={senderName} />; - + const senderName = event.getSender(); const {name: prevName, type: prevType, url: prevUrl} = event.getPrevContent(); const {name, type, url} = event.getContent() || {}; @@ -326,12 +278,18 @@ function textForWidgetEvent(event) { // equivalent to that condition. if (url) { if (prevUrl) { - return _t('%(widgetName)s widget modified by <sender>', {widgetName}, {sender}); + return _t('%(widgetName)s widget modified by %(senderName)s', { + widgetName, senderName, + }); } else { - return _t('%(widgetName)s widget added by <sender>', {widgetName}, {sender}); + return _t('%(widgetName)s widget added by %(senderName)s', { + widgetName, senderName, + }); } } else { - return _t('%(widgetName)s widget removed by <sender>', {widgetName}, {sender}); + return _t('%(widgetName)s widget removed by %(senderName)s', { + widgetName, senderName, + }); } } diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index cd5cf5058e..5ec9a93bc5 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -148,13 +148,49 @@ "Verified key": "Потвърден ключ", "Unrecognised command:": "Неразпозната команда:", "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 зададе снимка на профила си.", "VoIP conference started.": "Започна VoIP групов разговор.", + "%(targetName)s joined the room.": "%(targetName)s се присъедини към стаята.", "VoIP conference finished.": "Груповият разговор приключи.", + "%(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 изпрати снимка.", "Someone": "Някой", "(not supported by this browser)": "(не се поддържа от този браузър)", + "%(senderName)s answered the call.": "%(senderName)s отговори на повикването.", "(no answer)": "(няма отговор)", "(unknown failure: %(reason)s)": "(неизвестна грешка: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s прекрати разговора.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s започна %(callType)s разговор.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s изпрати покана на %(targetDisplayName)s да се присъедини към стаята.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s направи бъдещата история на стаята видима за всички членове, от момента на поканването им в нея.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s направи бъдещата история на стаята видима за всички членове, от момента на присъединяването им в нея.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s направи бъдещата история на стаята видима за всички членове в нея.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s направи бъдещата история на стаята видима за всеки.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s направи бъдещата история на стаята видима по непознат начин (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включи шифроване от край до край (алгоритъм %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s от %(fromPowerLevel)s на %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s смени нивото на достъп на %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s смени закачените съобщения за стаята.", + "%(widgetName)s widget modified by %(senderName)s": "Приспособлението %(widgetName)s беше променено от %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "Приспособлението %(widgetName)s беше добавено от %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Приспособлението %(widgetName)s беше премахнато от %(senderName)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 и още един човек пишат", @@ -490,6 +526,9 @@ "Invalid file%(extra)s": "Невалиден файл%(extra)s", "Error decrypting image": "Грешка при разшифроване на снимка", "Error decrypting video": "Грешка при разшифроване на видео", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s промени аватара на %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s премахна аватара на стаята.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s промени аватара на стаята на <img/>", "Copied!": "Копирано!", "Failed to copy": "Неуспешно копиране", "Add an Integration": "Добавяне на интеграция", @@ -1142,44 +1181,5 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "За да продължите да ползвате %(homeserverDomain)s е необходимо да прегледате и да се съгласите с правилата и условията за ползване.", "Review terms and conditions": "Прегледай правилата и условията", "Failed to indicate account erasure": "Неуспешно указване на желанието за изтриване на акаунта", - "Try the app first": "Първо пробвайте приложението", - "<target> accepted the invitation for %(displayName)s.": "<target> прие поканата за %(displayName)s.", - "<target> accepted an invitation.": "<target> прие поканата.", - "<sender> requested a VoIP conference.": "<sender> заяви VoIP групов разговор.", - "<sender> invited <target>.": "<sender> покани <target>.", - "<sender> banned <target>.": "<sender> блокира <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> смени своето име на <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> си сложи име <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> премахна своето име (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> премахна своята профилна снимка.", - "<sender> changed their profile picture.": "<sender> промени своята профилна снимка.", - "<sender> set a profile picture.": "<sender> зададе снимка на профила си.", - "<target> joined the room.": "<target> се присъедини към стаята.", - "<target> rejected the invitation.": "<target> отхвърли поканата.", - "<target> left the room.": "<target> напусна стаята.", - "<sender> unbanned <target>.": "<sender> отблокира <target>.", - "<sender> kicked <target>.": "<sender> изгони <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> оттегли поканата си за <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> смени темата на \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> промени името на стаята на %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> промени аватара на %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> промени аватара на стаята на <img/>", - "<sender> removed the room name.": "<sender> премахна името на стаята.", - "<sender> removed the room avatar.": "<sender> премахна аватара на стаята.", - "<sender> answered the call.": "<sender> отговори на повикването.", - "<sender> ended the call.": "<sender> прекрати разговора.", - "<sender> placed a %(callType)s call.": "<sender> започна %(callType)s разговор.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> изпрати покана на %(targetDisplayName)s да се присъедини към стаята.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> направи бъдещата история на стаята видима за всички членове, от момента на поканването им в нея.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> направи бъдещата история на стаята видима за всички членове, от момента на присъединяването им в нея.", - "<sender> made future room history visible to all room members.": "<sender> направи бъдещата история на стаята видима за всички членове в нея.", - "<sender> made future room history visible to anyone.": "<sender> направи бъдещата история на стаята видима за всеки.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> направи бъдещата история на стаята видима по непознат начин (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> включи шифроване от край до край (алгоритъм %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> от %(fromPowerLevel)s на %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> смени нивото на достъп на %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> смени закачените съобщения за стаята.", - "%(widgetName)s widget modified by <sender>": "Приспособлението %(widgetName)s беше променено от <sender>", - "%(widgetName)s widget added by <sender>": "Приспособлението %(widgetName)s беше добавено от <sender>", - "%(widgetName)s widget removed by <sender>": "Приспособлението %(widgetName)s беше премахнато от <sender>" + "Try the app first": "Първо пробвайте приложението" } diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 2e84e60e4c..98d51e99ac 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -153,14 +153,49 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La clau de signatura que heu proporcionat coincideix amb la clau de signatura que heu rebut del dispositiu %(deviceId)s de l'usuari %(userId)s. S'ha marcat el dispositiu com a dispositiu verificat.", "Unrecognised command:": "Ordre no reconegut:", "Reason": "Raó", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha acceptat la invitació de %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s ha acceptat una invitació.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s ha sol·licitat una conferència VoIP.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s ha convidat a %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s ha expulsat a %(targetName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ha establert %(displayName)s com el seu nom visible.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha retirat el seu nom visible %(oldDisplayName)s.", + "%(senderName)s removed their profile picture.": "%(senderName)s ha retirat la seva foto de perfil.", + "%(senderName)s changed their profile picture.": "%(senderName)s ha canviat la seva foto de perfil.", + "%(senderName)s set a profile picture.": "%(senderName)s ha establert una foto de perfil.", "VoIP conference started.": "S'ha iniciat la conferència VoIP.", + "%(targetName)s joined the room.": "%(targetName)s ha entrat a la sala.", "VoIP conference finished.": "S'ha finalitzat la conferència VoIP.", + "%(targetName)s rejected the invitation.": "%(targetName)s ha rebutjat la invitació.", + "%(targetName)s left the room.": "%(targetName)s ha sortir de la sala.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha readmès a %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha fet fora a %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha retirat la invitació per a %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha canviat el tema a \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha eliminat el nom de la sala.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha canviat el nom de la sala a %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ha enviat una imatge.", "Someone": "Algú", "(not supported by this browser)": "(no és compatible amb aquest navegador)", + "%(senderName)s answered the call.": "%(senderName)s ha contestat la trucada.", "(could not connect media)": "(no s'ha pogut connectar el medi)", "(no answer)": "(sense resposta)", "(unknown failure: %(reason)s)": "(error desconegut: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s ha penjat.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha col·locat una trucada de %(callType)s.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ha enviat una invitació a %(targetDisplayName)s a entrar a aquesta sala.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha fet visible l'històric futur de la sala per a tots els membres, a partir de que hi són convidats.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha fet visible l'històric futur de la sala a tots els membres, des de que entren a la sala.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha fet visible l'històric futur de la sala a tots els membres de la sala.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha fet visible l´historial de la sala per a tothom.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha fet visible l'històric de la sala per a desconeguts (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activat l'encriptació d'extrem a extrem (algoritme %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s fins %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha canviat el nivell de potència de %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha canviat els missatges fixats de la sala.", + "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s ha modificat el giny %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "%(senderName)s ha afegit el giny %(widgetName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s ha eliminat el giny %(widgetName)s", "%(displayName)s is typing": "%(displayName)s està escrivint", "%(names)s and %(count)s others are typing|other": "%(names)s i %(count)s més estan escrivint", "%(names)s and %(count)s others are typing|one": "%(names)s i algú altre està escrivint", @@ -460,6 +495,9 @@ "Invalid file%(extra)s": "Fitxer invàlid%(extra)s", "Error decrypting image": "S'ha produït un error en desencriptar la imatge", "Error decrypting video": "S'ha produït un error en desencriptar el vídeo", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha canviat el seu avatar per a la sala %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha eliminat l'avatar de la sala.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s ha canviat l'avatar de la sala per aquest <img/>", "Copied!": "Copiat!", "Failed to copy": "No s'ha pogut copiar", "Add an Integration": "Afegeix una integració", @@ -813,6 +851,7 @@ "Your homeserver's URL": "URL del teu homeserver", "Your identity server's URL": "URL del teu servidor d'identitat", "Analytics": "Analítiques", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha canviat el seu nom visible a %(displayName)s.", "Server may be unavailable or overloaded": "El servidor pot estar inaccessible o sobrecarregat", "Display name": "Nom visible", "Identity Server is": "El servidor d'identitat es", @@ -977,44 +1016,5 @@ "Collapse panel": "Col·lapsa el tauler", "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!": "Amb el vostre navegador actual, l'aparença de l'aplicació pot ser completament incorrecta i algunes o totes les funcions poden no funcionar correctament. Si voleu provar-ho de totes maneres, podeu continuar, però esteu sols pel que fa als problemes que pugueu trobar!", "Checking for an update...": "Comprovant si hi ha actualitzacions...", - "There are advanced notifications which are not shown here": "Hi ha notificacions avançades que no es mostren aquí", - "<target> accepted the invitation for %(displayName)s.": "<target> ha acceptat la invitació de %(displayName)s.", - "<target> accepted an invitation.": "<target> ha acceptat una invitació.", - "<sender> requested a VoIP conference.": "<sender> ha sol·licitat una conferència VoIP.", - "<sender> invited <target>.": "<sender> ha convidat a <target>.", - "<sender> banned <target>.": "<sender> ha expulsat a <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> ha canviat el seu nom visible a <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> ha establert <displayName> com el seu nom visible.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> ha retirat el seu nom visible <oldDisplayName>.", - "<sender> removed their profile picture.": "<sender> ha retirat la seva foto de perfil.", - "<sender> changed their profile picture.": "<sender> ha canviat la seva foto de perfil.", - "<sender> set a profile picture.": "<sender> ha establert una foto de perfil.", - "<target> joined the room.": "<target> ha entrat a la sala.", - "<target> rejected the invitation.": "<target> ha rebutjat la invitació.", - "<target> left the room.": "<target> ha sortir de la sala.", - "<sender> unbanned <target>.": "<sender> ha readmès a <target>.", - "<sender> kicked <target>.": "<sender> ha fet fora a <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> ha retirat la invitació per a <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> ha canviat el tema a \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> ha canviat el nom de la sala a %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> ha canviat el seu avatar per a la sala %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> ha canviat l'avatar de la sala per aquest <img/>", - "<sender> removed the room name.": "<sender> ha eliminat el nom de la sala.", - "<sender> removed the room avatar.": "<sender> ha eliminat l'avatar de la sala.", - "<sender> answered the call.": "<sender> ha contestat la trucada.", - "<sender> ended the call.": "<sender> ha penjat.", - "<sender> placed a %(callType)s call.": "<sender> ha col·locat una trucada de %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> ha enviat una invitació a %(targetDisplayName)s a entrar a aquesta sala.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> ha fet visible l'històric futur de la sala per a tots els membres, a partir de que hi són convidats.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> ha fet visible l'històric futur de la sala a tots els membres, des de que entren a la sala.", - "<sender> made future room history visible to all room members.": "<sender> ha fet visible l'històric futur de la sala a tots els membres de la sala.", - "<sender> made future room history visible to anyone.": "<sender> ha fet visible l´historial de la sala per a tothom.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> ha fet visible l'històric de la sala per a desconeguts (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ha activat l'encriptació d'extrem a extrem (algoritme %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s fins %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ha canviat el nivell de potència de %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> ha canviat els missatges fixats de la sala.", - "%(widgetName)s widget modified by <sender>": "<sender> ha modificat el giny %(widgetName)s", - "%(widgetName)s widget added by <sender>": "<sender> ha afegit el giny %(widgetName)s", - "%(widgetName)s widget removed by <sender>": "<sender> ha eliminat el giny %(widgetName)s" + "There are advanced notifications which are not shown here": "Hi ha notificacions avançades que no es mostren aquí" } diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index a2646300a7..b7298f80ab 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -61,6 +61,7 @@ "Custom Server Options": "Vlastní serverové volby", "Add a widget": "Přidat widget", "Accept": "Přijmout", + "%(targetName)s accepted an invitation.": "%(targetName)s přijal/a pozvání.", "Account": "Účet", "Access Token:": "Přístupový žeton:", "Add": "Přidat", @@ -99,6 +100,10 @@ "Can't load user settings": "Nelze načíst uživatelské nastavení", "Cannot add any more widgets": "Nelze přidat žádné další widgety", "Change Password": "Změnit heslo", + "%(senderName)s changed their profile picture.": "%(senderName)s změnil/a svůj profilový obrázek.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s změnil/a název místnosti na %(roomName)s.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s odstranil/a název místnosti.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s změnil/a téma na „%(topic)s“.", "Changes to who can read history will only apply to future messages in this room": "Změny viditelnosti historie budou platné až pro budoucí zprávy v této místnosti", "Changes your display nickname": "Změní vaši zobrazovanou přezdívku", "Changes colour scheme of current room": "Změní barevné schéma aktuální místnosti", @@ -160,6 +165,7 @@ "Encrypted room": "Zašifrovaná místnost", "Encryption is enabled in this room": "V této místnosti je zapnuto šifrování", "Encryption is not enabled in this room": "V této místnosti není zapnuto šifrování", + "%(senderName)s ended the call.": "%(senderName)s ukončil/a hovor.", "End-to-end encryption information": "Informace o end-to-end šifrování", "End-to-end encryption is in beta and may not be reliable": "End-to-end šifrování je v raném vývoji a nemusí být spolehlivé", "Enter Code": "Zadejte kód", @@ -192,8 +198,12 @@ "For security, this session has been signed out. Please sign in again.": "Z bezpečnostních důvodů bylo toto přihlášení ukončeno. Přihlašte se prosím znovu.", "%(names)s and %(lastPerson)s are typing": "%(names)s a %(lastPerson)s píší", "and %(count)s others...|other": "a %(count)s další...", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget upravil/a %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget odstranil/a %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget přidal/a %(senderName)s", "Automatically replace plain text Emoji": "Automaticky nahrazovat textové emodži", "Failed to upload image": "Obrázek se nepodařilo nahrát", + "%(senderName)s answered the call.": "%(senderName)s přijal/a hovor.", "Click to mute audio": "Kliknutím ztlumíte zvuk", "Failed to verify email address: make sure you clicked the link in the email": "E-mailovou adresu se nepodařilo ověřit. Přesvědčte se, že jste kliknul/a na zaslaný odkaz", "Guest access is disabled on this Home Server.": "Na tomto domovském serveru je hostům vstup odepřen.", @@ -213,12 +223,15 @@ "Invalid alias format": "Neplaný formát aliasu", "Invalid address format": "Neplatný formát adresy", "Invalid Email Address": "Neplatná e-mailová adresa", + "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval/a %(targetName)s.", "Invite new room members": "Pozvat do místnosti nové členy", "Invites": "Pozvánky", "Invites user with given id to current room": "Pozve do aktuální místnosti uživatele s daným id", "'%(alias)s' is not a valid format for an address": "'%(alias)s' není platný formát adresy", "'%(alias)s' is not a valid format for an alias": "'%(alias)s' není platný formát aliasu", "Join Room": "Vstoupit do místnosti", + "%(targetName)s joined the room.": "%(targetName)s vstoupil/a do místnosti.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s vykopnul/a %(targetName)s.", "Kick": "Vykopnout", "Kicks user with given id": "Vykopne uživatele s daným id", "Last seen": "Naposledy viděn/a", @@ -253,6 +266,7 @@ "Passwords can't be empty": "Hesla nemohou být prázdná", "Permissions": "Oprávnění", "Phone": "Telefon", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s změnil/a úroveň moci o %(powerLevelDiffText)s.", "Define the power level of a user": "Stanovte úroveň moci uživatele", "Failed to change power level": "Nepodařilo se změnit úroveň moci", "Power level must be positive integer.": "Úroveň moci musí být kladné celé číslo.", @@ -276,6 +290,7 @@ "Sender device information": "Informace o odesilatelově zařízení", "Send Reset Email": "Poslat resetovací e-mail", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s poslal/a obrázek.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s poslal/a %(targetDisplayName)s pozvánku ke vstupu do místnosti.", "Server error": "Chyba serveru", "Server may be unavailable or overloaded": "Server může být nedostupný nebo přetížený", "Server may be unavailable, overloaded, or search timed out :(": "Server může být nedostupný, přetížený nebo vyhledávání vypršelo :(", @@ -283,6 +298,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Server může být nedostupný, přetížený nebo jste narazili na chybu.", "Server unavailable, overloaded, or something else went wrong.": "Server je nedostupný, přetížený nebo se pokazilo něco jiného.", "Session ID": "ID sezení", + "%(senderName)s set a profile picture.": "%(senderName)s si nastavil/a profilový obrázek.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s si změnil/a zobrazované jméno na %(displayName)s.", "Sets the room topic": "Nastavuje téma místnosti", "Show panel": "Zobrazit panel", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Zobrazovat časové značky v 12hodinovém formátu (např. 2:30 odp.)", @@ -332,7 +349,9 @@ "Start chatting": "Zahájit rozhovor", "Start Chatting": "Začít chatovat", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Textová zpráva byla odeslána na +%(msisdn)s. Prosím vložte ověřovací kód z dané zprávy", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s přijal/a pozvánku pro %(displayName)s.", "Active call (%(roomName)s)": "Probíhající hovor (%(roomName)s)", + "%(senderName)s banned %(targetName)s.": "%(senderName)s vykázal/a %(targetName)s.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nelze se připojit k domovskému serveru přes HTTP, pokud je v adresním řádku HTTPS. Buď použijte HTTPS, nebo <a>povolte nebezpečné scripty</a>.", "Click here to fix": "Klikněte zde pro opravu", "Click to mute video": "Klikněte pro zakázání videa", @@ -344,6 +363,7 @@ "Do you want to load widget from URL:": "Chcete načíst widget z URL:", "Ed25519 fingerprint": "Ed25519 otisk", "Fill screen": "Vyplnit obrazovku", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s", "This doesn't appear to be a valid email address": "Tato e-mailová adresa se zdá být neplatná", "This is a preview of this room. Room interactions have been disabled": "Toto je náhled místnosti. Interakce byly zakázány", "This phone number is already in use": "Toto číslo se již používá", @@ -355,12 +375,14 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Zpráva v daném časovém úseku nenalezena.", "Turn Markdown off": "Vypnout Markdown", "Turn Markdown on": "Zapnout Markdown", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s zapnul/a end-to-end šifrování (algoritmus %(algorithm)s).", "Unable to add email address": "Nepodařilo se přidat e-mailovou adresu", "Unable to create widget.": "Nepodařilo se vytvořit widget.", "Unable to remove contact information": "Nepodařilo se smazat kontaktní údaje", "Unable to verify email address.": "Nepodařilo se ověřit e-mailovou adresu.", "Unban": "Přijmout zpět", "Unbans user with given id": "Přijme zpět uživatele s daným id", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s přijal/a zpět %(targetName)s.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Nepodařilo se prokázat, že adresa, na kterou byla tato pozvánka odeslána, se shoduje s adresou přidruženou k vašemu účtu.", "Unable to capture screen": "Nepodařilo se zachytit obrazovku", "Unable to enable Notifications": "Nepodařilo se povolit upozornění", @@ -434,7 +456,11 @@ "Reason": "Důvod", "VoIP conference started.": "VoIP konference započata.", "VoIP conference finished.": "VoIP konference ukončena.", + "%(targetName)s left the room.": "%(targetName)s opustil/a místnost.", "You are already in a call.": "Již máte probíhající hovor.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s požádal/a o VoIP konferenci.", + "%(senderName)s removed their profile picture.": "%(senderName)s odstranil/a svůj profilový obrázek.", + "%(targetName)s rejected the invitation.": "%(targetName)s odmítl/a pozvání.", "Communities": "Skupiny", "Message Pinning": "Připíchnutí zprávy", "Your browser does not support the required cryptography extensions": "Váš prohlížeč nepodporuje požadovaná kryptografická rozšíření", @@ -454,12 +480,21 @@ "numbullet": "číselný seznam", "No pinned messages.": "Žádné připíchnuté zprávy.", "Pinned Messages": "Připíchnuté zprávy", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s odstranil/a svoje zobrazované jméno (%(oldDisplayName)s).", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s odvolal/a pozvánku pro %(targetName)s.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich pozvání.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich vstupu do místnosti.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou všem členům.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s učinil/a budoucí historii místnosti viditelnou komukoliv.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s změnil/a připíchnuté zprávy této místnosti.", "%(names)s and %(count)s others are typing|other": "%(names)s a %(count)s další píší", "Authentication check failed: incorrect password?": "Kontrola ověření selhala: špatné heslo?", "You need to be able to invite users to do that.": "Pro tuto akci musíte mít právo zvát uživatele.", "Delete Widget": "Smazat widget", "Error decrypting image": "Chyba při dešifrování obrázku", "Error decrypting video": "Chyba při dešifrování videa", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstranil/a avatar místnosti.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s změnil/a avatar místnosti na <img/>", "Copied!": "Zkopírováno!", "Failed to copy": "Nepodařilo se zkopírovat", "Removed or unknown message type": "Zpráva odstraněna nebo neznámého typu", @@ -579,6 +614,7 @@ "You have <a>disabled</a> URL previews by default.": "<a>Vypnul/a</a> jste automatické náhledy webových adres.", "You have <a>enabled</a> URL previews by default.": "<a>Zapnul/a</a> jste automatické náhledy webových adres.", "URL Previews": "Náhledy webových adres", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s změnil/a avatar místnosti %(roomName)s", "Add an Integration": "Přidat začlenění", "Message removed": "Zpráva odstraněna", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Ochrana před roboty není aktuálně na desktopu dostupná. Použijte prosím <a>webový prohlížeč</a>", @@ -598,6 +634,8 @@ "Missing room_id in request": "V zadání chybí room_id", "Missing user_id in request": "V zadání chybí user_id", "(could not connect media)": "(média se nepodařilo spojit)", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s uskutečnil %(callType)s hovor.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s zpřístupnil budoucí historii místnosti neznámým (%(visibility)s).", "Not a valid Riot keyfile": "Neplatný soubor s klíčem Riot", "Disable Emoji suggestions while typing": "Zakázat návrhy Emoji během psaní", "Hide avatar changes": "Skrýt změny avatara", @@ -1038,43 +1076,5 @@ "Collapse panel": "Sbalit panel", "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!": "Vzhled a chování aplikace může být ve vašem aktuální prohlížeči nesprávné a některé nebo všechny funkce mohou být chybné. Chcete-li i přes to pokračovat, nebudeme vám bránit, ale se všemi problémy, na které narazíte, si musíte poradit sami!", "Checking for an update...": "Kontrola aktualizací...", - "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena", - "<target> accepted the invitation for %(displayName)s.": "<target> přijal/a pozvánku pro %(displayName)s.", - "<target> accepted an invitation.": "<target> přijal/a pozvání.", - "<sender> requested a VoIP conference.": "<sender> požádal/a o VoIP konferenci.", - "<sender> invited <target>.": "<sender> pozval/a <target>.", - "<sender> banned <target>.": "<sender> vykázal/a <target>.", - "<sender> set their display name to <displayName>.": "<sender> si změnil/a zobrazované jméno na <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> odstranil/a svoje zobrazované jméno (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> odstranil/a svůj profilový obrázek.", - "<sender> changed their profile picture.": "<sender> změnil/a svůj profilový obrázek.", - "<sender> set a profile picture.": "<sender> si nastavil/a profilový obrázek.", - "<target> joined the room.": "<target> vstoupil/a do místnosti.", - "<target> rejected the invitation.": "<target> odmítl/a pozvání.", - "<target> left the room.": "<target> opustil/a místnost.", - "<sender> unbanned <target>.": "<sender> přijal/a zpět <target>.", - "<sender> kicked <target>.": "<sender> vykopnul/a <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> odvolal/a pozvánku pro <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> změnil/a téma na „%(topic)s“.", - "<sender> changed the room name to %(roomName)s.": "<sender> změnil/a název místnosti na %(roomName)s.", - "<sender> changed the room avatar to <img/>": "<sender> změnil/a avatar místnosti na <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> změnil/a avatar místnosti %(roomName)s", - "<sender> removed the room name.": "<sender> odstranil/a název místnosti.", - "<sender> removed the room avatar.": "<sender> odstranil/a avatar místnosti.", - "<sender> answered the call.": "<sender> přijal/a hovor.", - "<sender> ended the call.": "<sender> ukončil/a hovor.", - "<sender> placed a %(callType)s call.": "<sender> uskutečnil %(callType)s hovor.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> poslal/a %(targetDisplayName)s pozvánku ke vstupu do místnosti.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich pozvání.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> učinil/a budoucí historii místnosti viditelnou všem členům, a to od chvíle jejich vstupu do místnosti.", - "<sender> made future room history visible to all room members.": "<sender> učinil/a budoucí historii místnosti viditelnou všem členům.", - "<sender> made future room history visible to anyone.": "<sender> učinil/a budoucí historii místnosti viditelnou komukoliv.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> zpřístupnil budoucí historii místnosti neznámým (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> zapnul/a end-to-end šifrování (algoritmus %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> z %(fromPowerLevel)s na %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> změnil/a úroveň moci o %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> změnil/a připíchnuté zprávy této místnosti.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s widget upravil/a <sender>", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s widget odstranil/a <sender>", - "%(widgetName)s widget added by <sender>": "%(widgetName)s widget přidal/a <sender>" + "There are advanced notifications which are not shown here": "Jsou k dispozici pokročilá upozornění, která zde nejsou zobrazena" } diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 9f2e3f5b59..e90de5edfc 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -87,7 +87,10 @@ "Remove": "Fjern", "Settings": "Indstillinger", "unknown error code": "Ukendt fejlkode", + "%(targetName)s accepted an invitation.": "%(targetName)s accepterede en invitation.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepterede invitationen til %(displayName)s.", "%(names)s and %(lastPerson)s are typing": "%(names)s og %(lastPerson)s er ved at skrive", + "%(senderName)s answered the call.": "%(senderName)s besvarede opkaldet.", "Add a widget": "Tilføj en widget", "OK": "OK", "Search": "Søg", @@ -208,14 +211,34 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signaturnøglen du oplste passer med nøglen fra %(userId)ss enhed %(deviceId)s. Enheden er markeret som verificeret.", "Unrecognised command:": "Ukendt kommando:", "Reason": "Årsag", + "%(senderName)s requested a VoIP conference.": "%(senderName)s forespurgte en VoIP konference.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s inviterede %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s bannede %(targetName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s satte deres viste navn til %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s fjernede deres viste navn (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s fjernede deres profilbillede.", + "%(senderName)s changed their profile picture.": "%(senderName)s ændrede deres profilbillede.", + "%(senderName)s set a profile picture.": "%(senderName)s indstillede deres profilbillede.", "VoIP conference started.": "VoIP konference startet.", + "%(targetName)s joined the room.": "%(targetName)s forbandt til rummet.", "VoIP conference finished.": "VoIP konference afsluttet.", + "%(targetName)s rejected the invitation.": "%(targetName)s afviste invitationen.", + "%(targetName)s left the room.": "%(targetName)s forlod rummet.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbannede %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s kickede %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s trak %(targetName)ss invitation tilbage.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ændrede emnet til \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s fjernede rumnavnet.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ændrede rumnavnet til %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendte et billed.", "Someone": "Nogen", "(not supported by this browser)": "(Ikke understøttet af denne browser)", "(could not connect media)": "(kunne ikke forbinde til mediet)", "(no answer)": "(intet svar)", "(unknown failure: %(reason)s)": "(ukendt fejl: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s afsluttede opkaldet.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s startede et %(callType)s opkald.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s inviterede %(targetDisplayName)s til rummet.", "Submit debug logs": "Indsend debug-logfiler", "Online": "Online", "Fetching third party location failed": "Hentning af tredjeparts placering mislykkedes", @@ -374,28 +397,5 @@ "View Community": "Vis community", "%(count)s Members|one": "%(count)s medlem", "Notes:": "Noter:", - "Preparing to send logs": "Forbereder afsendelse af logfiler", - "<target> accepted the invitation for %(displayName)s.": "<target> accepterede invitationen til %(displayName)s.", - "<target> accepted an invitation.": "<target> accepterede en invitation.", - "<sender> requested a VoIP conference.": "<sender> forespurgte en VoIP konference.", - "<sender> invited <target>.": "<sender> inviterede <target>.", - "<sender> banned <target>.": "<sender> bannede <target>.", - "<sender> set their display name to <displayName>.": "<sender> satte deres viste navn til <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> fjernede deres viste navn (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> fjernede deres profilbillede.", - "<sender> changed their profile picture.": "<sender> ændrede deres profilbillede.", - "<sender> set a profile picture.": "<sender> indstillede deres profilbillede.", - "<target> joined the room.": "<target> forbandt til rummet.", - "<target> rejected the invitation.": "<target> afviste invitationen.", - "<target> left the room.": "<target> forlod rummet.", - "<sender> unbanned <target>.": "<sender> unbannede <target>.", - "<sender> kicked <target>.": "<sender> kickede <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> trak <target>s invitation tilbage.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> ændrede emnet til \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> ændrede rumnavnet til %(roomName)s.", - "<sender> removed the room name.": "<sender> fjernede rumnavnet.", - "<sender> answered the call.": "<sender> besvarede opkaldet.", - "<sender> ended the call.": "<sender> afsluttede opkaldet.", - "<sender> placed a %(callType)s call.": "<sender> startede et %(callType)s opkald.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> inviterede %(targetDisplayName)s til rummet." + "Preparing to send logs": "Forbereder afsendelse af logfiler" } diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 72d6570ec9..9b1c5acb8d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -239,21 +239,51 @@ "Share message history with new users": "Bisherigen Chatverlauf mit neuen Nutzern teilen", "Encrypt room": "Raum verschlüsseln", "%(names)s and %(lastPerson)s are typing": "%(names)s und %(lastPerson)s schreiben", + "%(targetName)s accepted an invitation.": "%(targetName)s hat eine Einladung angenommen.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s hat die Einladung für %(displayName)s akzeptiert.", + "%(senderName)s answered the call.": "%(senderName)s hat den Anruf angenommen.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s hat %(targetName)s verbannt.", + "%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".", "/ddg is not a command": "/ddg ist kein Kommando", + "%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.", "Failed to send request.": "Anfrage konnte nicht gesendet werden.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s hat %(targetName)s eingeladen.", "%(displayName)s is typing": "%(displayName)s schreibt", + "%(targetName)s joined the room.": "%(targetName)s hat den Raum betreten.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s hat %(targetName)s gekickt.", + "%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden).", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für: Alle Raum-Mitglieder.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für Alle.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).", "Missing room_id in request": "Fehlende room_id in Anfrage", "Missing user_id in request": "Fehlende user_id in Anfrage", "(not supported by this browser)": "(wird von diesem Browser nicht unterstützt)", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s startete einen %(callType)s-Anruf.", "Power level must be positive integer.": "Berechtigungslevel muss eine positive ganze Zahl sein.", "Reason": "Grund", + "%(targetName)s rejected the invitation.": "%(targetName)s hat die Einladung abgelehnt.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s hat den Anzeigenamen entfernt (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s hat das Profilbild gelöscht.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s möchte eine VoIP-Konferenz beginnen.", "Room %(roomId)s not visible": "Raum %(roomId)s ist nicht sichtbar", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s hat ein Bild gesendet.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s hat %(targetDisplayName)s in diesen Raum eingeladen.", + "%(senderName)s set a profile picture.": "%(senderName)s hat ein Profilbild gesetzt.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s hat den Anzeigenamen geändert in %(displayName)s.", "This room is not recognised.": "Dieser Raum wurde nicht erkannt.", "These are experimental features that may break in unexpected ways": "Dies sind experimentelle Funktionen, die in unerwarteter Weise Fehler verursachen können", "To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Autovervollständigungsergebnisse und benutze dann die TAB-Taste zum durchblättern.", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s hat die Ende-zu-Ende-Verschlüsselung aktiviert (Algorithmus: %(algorithm)s).", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s hat die Verbannung von %(targetName)s aufgehoben.", "Usage": "Verwendung", "Use with caution": "Mit Vorsicht zu verwenden", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen.", "You need to be able to invite users to do that.": "Du musst die Berechtigung haben, Benutzer einzuladen, um diese Aktion ausführen zu können.", "You need to be logged in.": "Du musst angemeldet sein.", "There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum", @@ -376,6 +406,7 @@ "Invalid file%(extra)s": "Ungültige Datei%(extra)s", "Remove %(threePid)s?": "%(threePid)s entfernen?", "Please select the destination room for this message": "Bitte den Raum auswählen, an den diese Nachricht gesendet werden soll", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s hat den Raum-Namen entfernt.", "Passphrases must match": "Passphrases müssen übereinstimmen", "Passphrase must not be empty": "Passphrase darf nicht leer sein", "Export room keys": "Raum-Schlüssel exportieren", @@ -455,6 +486,7 @@ "Jump to first unread message.": "Zur ersten ungelesenen Nachricht springen.", "Options": "Optionen", "Invited": "Eingeladen", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s hat das Raum-Bild entfernt.", "VoIP": "VoIP", "No Webcams detected": "Keine Webcam erkannt", "Missing Media Permissions, click here to request.": "Fehlende Medienberechtigungen. Hier klicken, um Berechtigungen zu beantragen.", @@ -496,6 +528,8 @@ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signatur-Schlüssel für %(userId)s und das Gerät %(deviceId)s ist \"%(fprint)s\", welcher nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Dies kann bedeuten, dass deine Kommunikation abgehört wird!", "You have <a>disabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>deaktiviert</a>.", "You have <a>enabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>aktiviert</a>.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s hat das Raum-Bild geändert zu <img/>", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s hat das Raum-Bild für %(roomName)s geändert", "Hide removed messages": "Gelöschte Nachrichten verbergen", "Start new chat": "Neuen Chat starten", "Add": "Hinzufügen", @@ -630,7 +664,10 @@ "Do you want to load widget from URL:": "Möchtest du das Widget von folgender URL laden:", "Integrations Error": "Integrations-Error", "NOTE: Apps are not end-to-end encrypted": "BEACHTE: Apps sind nicht Ende-zu-Ende-verschlüsselt", + "%(widgetName)s widget added by %(senderName)s": "%(senderName)s hat das Widget %(widgetName)s hinzugefügt", + "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s hat das Widget %(widgetName)s entfernt", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "In der Desktop-Version kann derzeit nicht geprüft werden, ob ein Benutzer ein Roboter ist. Bitte einen <a>Webbrowser</a> verwenden", + "%(widgetName)s widget modified by %(senderName)s": "Das Widget '%(widgetName)s' wurde von %(senderName)s bearbeitet", "Copied!": "Kopiert!", "Failed to copy": "Kopieren fehlgeschlagen", "Ignored Users": "Ignorierte Benutzer", @@ -697,6 +734,7 @@ "Remove avatar": "Profilbild entfernen", "Disable big emoji in chat": "Große Emojis im Chat deaktiveren", "Pinned Messages": "Angeheftete Nachrichten", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s hat die angehefteten Nachrichten für diesen Raum geändert.", "Jump to read receipt": "Zur Lesebestätigung springen", "Message Pinning": "Anheften von Nachrichten", "Long Description (HTML)": "Lange Beschreibung (HTML)", @@ -917,6 +955,7 @@ "Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn es der Fall ist", "<a>In reply to</a> <pill>": "<a>Antwort zu</a> <pill>", "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.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s änderte den Anzeigenamen auf %(displayName)s.", "Failed to set direct chat tag": "Fehler beim Setzen der Direkt-Chat-Markierung", "Failed to remove tag %(tagName)s from room": "Fehler beim Entfernen des \"%(tagName)s\"-Tags von dem Raum", "Failed to add tag %(tagName)s to room": "Fehler beim Hinzufügen des \"%(tagName)s\"-Tags an dem Raum", @@ -1156,44 +1195,5 @@ "Share Message": "Teile Nachricht", "No Audio Outputs detected": "Keine Ton-Ausgabe erkannt", "Audio Output": "Ton-Ausgabe", - "Try the app first": "App erst ausprobieren", - "<target> accepted the invitation for %(displayName)s.": "<target> hat die Einladung für %(displayName)s akzeptiert.", - "<target> accepted an invitation.": "<target> hat eine Einladung angenommen.", - "<sender> requested a VoIP conference.": "<sender> möchte eine VoIP-Konferenz beginnen.", - "<sender> invited <target>.": "<sender> hat <target> eingeladen.", - "<sender> banned <target>.": "<sender> hat <target> verbannt.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> änderte den Anzeigenamen auf <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> hat den Anzeigenamen geändert in <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> hat den Anzeigenamen entfernt (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> hat das Profilbild gelöscht.", - "<sender> changed their profile picture.": "<sender> hat das Profilbild geändert.", - "<sender> set a profile picture.": "<sender> hat ein Profilbild gesetzt.", - "<target> joined the room.": "<target> hat den Raum betreten.", - "<target> rejected the invitation.": "<target> hat die Einladung abgelehnt.", - "<target> left the room.": "<target> hat den Raum verlassen.", - "<sender> unbanned <target>.": "<sender> hat die Verbannung von <target> aufgehoben.", - "<sender> kicked <target>.": "<sender> hat <target> gekickt.", - "<sender> withdrew <target>'s invitation.": "<sender> hat die Einladung für <target> zurückgezogen.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> hat das Thema geändert in \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> hat den Raumnamen geändert zu %(roomName)s.", - "<sender> changed the room avatar to <img/>": "<sender> hat das Raum-Bild geändert zu <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> hat das Raum-Bild für %(roomName)s geändert", - "<sender> removed the room name.": "<sender> hat den Raum-Namen entfernt.", - "<sender> removed the room avatar.": "<sender> hat das Raum-Bild entfernt.", - "<sender> answered the call.": "<sender> hat den Anruf angenommen.", - "<sender> ended the call.": "<sender> hat den Anruf beendet.", - "<sender> placed a %(callType)s call.": "<sender> startete einen %(callType)s-Anruf.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> hat %(targetDisplayName)s in diesen Raum eingeladen.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden).", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für alle Raum-Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind).", - "<sender> made future room history visible to all room members.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für: Alle Raum-Mitglieder.", - "<sender> made future room history visible to anyone.": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für Alle.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> hat den zukünftigen Chatverlauf sichtbar gemacht für unbekannt (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> hat die Ende-zu-Ende-Verschlüsselung aktiviert (Algorithmus: %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> von %(fromPowerLevel)s zu %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", - "<sender> changed the pinned messages for the room.": "<sender> hat die angehefteten Nachrichten für diesen Raum geändert.", - "%(widgetName)s widget modified by <sender>": "Das Widget '%(widgetName)s' wurde von <sender> bearbeitet", - "%(widgetName)s widget added by <sender>": "<sender> hat das Widget %(widgetName)s hinzugefügt", - "%(widgetName)s widget removed by <sender>": "<sender> hat das Widget %(widgetName)s entfernt" + "Try the app first": "App erst ausprobieren" } diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 1bc4972dac..c4514f629b 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -8,6 +8,8 @@ "Search": "Αναζήτηση", "Settings": "Ρυθμίσεις", "unknown error code": "άγνωστος κωδικός σφάλματος", + "%(targetName)s accepted an invitation.": "%(targetName)s δέχτηκε την πρόσκληση.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s δέχτηκες την πρόσκληση για %(displayName)s.", "Account": "Λογαριασμός", "Add a topic": "Προσθήκη θέματος", "Add email address": "Προσθήκη διεύθυνσης ηλ. αλληλογραφίας", @@ -24,6 +26,7 @@ "Hide removed messages": "Απόκρυψη διαγραμμένων μηνυμάτων", "Authentication": "Πιστοποίηση", "A new password must be entered.": "Ο νέος κωδικός πρόσβασης πρέπει να εισαχθεί.", + "%(senderName)s answered the call.": "Ο χρήστης %(senderName)s απάντησε την κλήση.", "An error has occurred.": "Παρουσιάστηκε ένα σφάλμα.", "Anyone": "Oποιοσδήποτε", "Are you sure?": "Είστε σίγουροι;", @@ -31,6 +34,7 @@ "Are you sure you want to reject the invitation?": "Είστε σίγουροι ότι θέλετε να απορρίψετε την πρόσκληση;", "Are you sure you want to upload the following files?": "Είστε σίγουροι ότι θέλετε να αποστείλετε τα ακόλουθα αρχεία;", "Attachment": "Επισύναψη", + "%(senderName)s banned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "Autoplay GIFs and videos": "Αυτόματη αναπαραγωγή GIFs και βίντεο", "Anyone who knows the room's link, apart from guests": "Oποιοσδήποτε", "%(items)s and %(lastItem)s": "%(items)s %(lastItem)s", @@ -44,9 +48,13 @@ "Blacklisted": "Στη μαύρη λίστα", "Can't load user settings": "Δεν είναι δυνατή η φόρτωση των ρυθμίσεων χρήστη", "Change Password": "Αλλαγή κωδικού πρόσβασης", + "%(senderName)s changed their profile picture.": "Ο %(senderName)s άλλαξε τη φωτογραφία του προφίλ του.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "Ο %(senderDisplayName)s άλλαξε το όνομα του δωματίου σε %(roomName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "Ο %(senderDisplayName)s άλλαξε το θέμα σε \"%(topic)s\".", "Clear Cache and Reload": "Εκκαθάριση μνήμης και ανανέωση", "Clear Cache": "Εκκαθάριση μνήμης", "Bans user with given id": "Αποκλεισμός χρήστη με το συγκεκριμένο αναγνωριστικό", + "%(senderDisplayName)s removed the room name.": "Ο %(senderDisplayName)s διέγραψε το όνομα του δωματίου.", "Changes your display nickname": "Αλλάζει το ψευδώνυμο χρήστη", "Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.", "powered by Matrix": "βασισμένο στο Matrix", @@ -84,6 +92,7 @@ "Emoji": "Εικονίδια", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Τα κρυπτογραφημένα μηνύματα δεν θα είναι ορατά σε εφαρμογές που δεν παρέχουν τη δυνατότητα κρυπτογράφησης", "Encrypted room": "Κρυπτογραφημένο δωμάτιο", + "%(senderName)s ended the call.": "%(senderName)s τερμάτισε την κλήση.", "End-to-end encryption information": "Πληροφορίες σχετικά με τη κρυπτογράφηση από άκρο σε άκρο (End-to-end encryption)", "Error decrypting attachment": "Σφάλμα κατά την αποκρυπτογράφηση της επισύναψης", "Event information": "Πληροφορίες συμβάντος", @@ -123,11 +132,14 @@ "Invites": "Προσκλήσεις", "%(displayName)s is typing": "Ο χρήστης %(displayName)s γράφει", "Sign in with": "Συνδεθείτε με", + "%(targetName)s joined the room.": "ο %(targetName)s συνδέθηκε στο δωμάτιο.", "Jump to first unread message.": "Πηγαίνετε στο πρώτο μη αναγνωσμένο μήνυμα.", + "%(senderName)s kicked %(targetName)s.": "Ο %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "Kick": "Απομάκρυνση", "Kicks user with given id": "Διώχνει χρήστες με το συγκεκριμένο id", "Labs": "Πειραματικά", "Leave room": "Αποχώρηση από το δωμάτιο", + "%(targetName)s left the room.": "Ο χρήστης %(targetName)s έφυγε από το δωμάτιο.", "Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:", "Logged in as:": "Συνδεθήκατε ως:", "Logout": "Αποσύνδεση", @@ -242,6 +254,7 @@ "Reason": "Αιτία", "Reason: %(reasonText)s": "Αιτία: %(reasonText)s", "Revoke Moderator": "Ανάκληση συντονιστή", + "%(targetName)s rejected the invitation.": "Ο %(targetName)s απέρριψε την πρόσκληση.", "Reject invitation": "Απόρριψη πρόσκλησης", "Remote addresses for this room:": "Απομακρυσμένες διευθύνσεις για το δωμάτιο:", "Remove Contact Information?": "Αφαίρεση πληροφοριών επαφής;", @@ -258,6 +271,7 @@ "%(senderDisplayName)s sent an image.": "Ο %(senderDisplayName)s έστειλε μια φωτογραφία.", "Server may be unavailable or overloaded": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος ή υπερφορτωμένος", "Session ID": "Αναγνωριστικό συνεδρίας", + "%(senderName)s set a profile picture.": "Ο %(senderName)s όρισε τη φωτογραφία του προφίλ του.", "Start authentication": "Έναρξη πιστοποίησης", "Submit": "Υποβολή", "Tagged as: ": "Με ετικέτα: ", @@ -275,6 +289,7 @@ "Unable to remove contact information": "Αδυναμία αφαίρεσης πληροφοριών επαφής", "Unable to verify email address.": "Αδυναμία επιβεβαίωσης διεύθυνσης ηλεκτρονικής αλληλογραφίας.", "Unban": "Άρση αποκλεισμού", + "%(senderName)s unbanned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "Unable to enable Notifications": "Αδυναμία ενεργοποίησης των ειδοποιήσεων", "Unable to load device list": "Αδυναμία φόρτωσης της λίστας συσκευών", "Unencrypted room": "Μη κρυπτογραφημένο δωμάτιο", @@ -395,6 +410,8 @@ "Start chatting": "Έναρξη συνομιλίας", "Start Chatting": "Έναρξη συνομιλίας", "Click on the button below to start chatting!": "Κάντε κλικ στο κουμπί παρακάτω για να ξεκινήσετε μια συνομιλία!", + "%(senderDisplayName)s removed the room avatar.": "Ο %(senderDisplayName)s διέγραψε την προσωπική εικόνα του δωματίου.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "Ο %(senderDisplayName)s άλλαξε την προσωπική εικόνα του %(roomName)s", "Username available": "Διαθέσιμο όνομα χρήστη", "Username not available": "Μη διαθέσιμο όνομα χρήστη", "Something went wrong!": "Κάτι πήγε στραβά!", @@ -408,6 +425,7 @@ "Failed to change power level": "Δεν ήταν δυνατή η αλλαγή του επιπέδου δύναμης", "Failed to fetch avatar URL": "Δεν ήταν δυνατή η ανάκτηση της διεύθυνσης εικόνας", "Failed to unban": "Δεν ήταν δυνατή η άρση του αποκλεισμού", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s από %(fromPowerLevel)s σε %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Έχει απενεργοποιηθεί η πρόσβαση στους επισκέπτες σε αυτόν τον διακομιστή.", "Guests cannot join this room even if explicitly invited.": "Οι επισκέπτες δεν μπορούν να συνδεθούν στο δωμάτιο ακόμη και αν έχουν καλεστεί.", "Hide Text Formatting Toolbar": "Απόκρυψη εργαλειοθήκης μορφοποίησης κειμένου", @@ -417,9 +435,15 @@ "Invalid alias format": "Μη έγκυρη μορφή ψευδώνυμου", "Invalid address format": "Μη έγκυρη μορφή διεύθυνσης", "Invalid file%(extra)s": "Μη έγκυρο αρχείο %(extra)s", + "%(senderName)s invited %(targetName)s.": "Ο %(senderName)s προσκάλεσε τον %(targetName)s.", "Invites user with given id to current room": "Προσκαλεί τον χρήστη με το δοσμένο αναγνωριστικό στο τρέχον δωμάτιο", "'%(alias)s' is not a valid format for an address": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή διεύθυνσης", "'%(alias)s' is not a valid format for an alias": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή ψευδώνυμου", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που προσκλήθηκαν.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που συνδέθηκαν.", + "%(senderName)s made future room history visible to all room members.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη.", + "%(senderName)s made future room history visible to anyone.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο οποιοσδήποτε.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο άγνωστο (%(visibility)s).", "Missing user_id in request": "Λείπει το user_id στο αίτημα", "Mobile phone number (optional)": "Αριθμός κινητού τηλεφώνου (προαιρετικό)", "Never send encrypted messages to unverified devices from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές από αυτή τη συσκευή", @@ -432,9 +456,12 @@ "No users have specific privileges in this room": "Κανένας χρήστης δεν έχει συγκεκριμένα δικαιώματα σε αυτό το δωμάτιο", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Μόλις ενεργοποιηθεί η κρυπτογράφηση για ένα δωμάτιο, δεν μπορεί να απενεργοποιηθεί ξανά (για τώρα)", "Only people who have been invited": "Μόνο άτομα που έχουν προσκληθεί", + "%(senderName)s placed a %(callType)s call.": "Ο %(senderName)s πραγματοποίησε μια %(callType)s κλήση.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία και κάντε κλικ στον σύνδεσμο που περιέχει. Μόλις γίνει αυτό, κάντε κλίκ στο κουμπί συνέχεια.", "Refer a friend to Riot:": "Πείτε για το Riot σε έναν φίλο σας:", "Rejoin": "Επανασύνδεση", + "%(senderName)s removed their profile picture.": "Ο %(senderName)s αφαίρεσε τη φωτογραφία του προφίλ του.", + "%(senderName)s requested a VoIP conference.": "Ο %(senderName)s αιτήθηκε μια συνδιάσκεψη VoIP.", "Riot does not have permission to send you notifications - please check your browser settings": "Το Riot δεν έχει δικαιώματα για αποστολή ειδοποιήσεων - παρακαλούμε ελέγξτε τις ρυθμίσεις του περιηγητή σας", "Riot was not given permission to send notifications - please try again": "Δεν δόθηκαν δικαιώματα αποστολής ειδοποιήσεων στο Riot - παρακαλούμε προσπαθήστε ξανά", "Room contains unknown devices": "Το δωμάτιο περιέχει άγνωστες συσκευές", @@ -468,6 +495,7 @@ "Who can access this room?": "Ποιος μπορεί να προσπελάσει αυτό το δωμάτιο;", "Who can read history?": "Ποιος μπορεί να διαβάσει το ιστορικό;", "Who would you like to add to this room?": "Ποιον θέλετε να προσθέσετε σε αυτό το δωμάτιο;", + "%(senderName)s withdrew %(targetName)s's invitation.": "Ο %(senderName)s ανακάλεσε την πρόσκληση του %(targetName)s.", "You cannot place a call with yourself.": "Δεν μπορείτε να καλέσετε τον ευατό σας.", "You cannot place VoIP calls in this browser.": "Δεν μπορείτε να πραγματοποιήσετε κλήσεις VoIP με αυτόν τον περιηγητή.", "You do not have permission to post to this room": "Δεν έχετε δικαιώματα για να δημοσιεύσετε σε αυτό το δωμάτιο", @@ -494,14 +522,19 @@ "You are registering with %(SelectedTeamName)s": "Εγγραφείτε με %(SelectedTeamName)s", "Removed or unknown message type": "Αφαιρέθηκε ή άγνωστος τύπος μηνύματος", " (unsupported)": " (μη υποστηριζόμενο)", + "%(senderDisplayName)s changed the room avatar to <img/>": "Ο %(senderDisplayName)s άλλαξε την εικόνα του δωματίου σε <img/>", "Missing Media Permissions, click here to request.": "Λείπουν τα δικαιώματα πολύμεσων, κάντε κλικ για να ζητήσετε.", "You may need to manually permit Riot to access your microphone/webcam": "Μπορεί να χρειαστεί να ορίσετε χειροκίνητα την πρόσβαση του Riot στο μικρόφωνο/κάμερα", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή - παρακαλούμε ελέγξτε την συνδεσιμότητα, βεβαιωθείτε ότι το <a>πιστοποιητικό SSL</a> του διακομιστή είναι έμπιστο και ότι κάποιο πρόσθετο περιηγητή δεν αποτρέπει τα αιτήματα.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Δεν είναι δυνατή η σύνδεση στον διακομιστή μέσω HTTP όταν μια διεύθυνση HTTPS βρίσκεται στην μπάρα του περιηγητή. Είτε χρησιμοποιήστε HTTPS ή <a>ενεργοποιήστε τα μη ασφαλή σενάρια εντολών</a>.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Ο %(senderName)s άλλαξε το επίπεδο δύναμης του %(powerLevelDiffText)s.", "Changes to who can read history will only apply to future messages in this room": "Οι αλλαγές που αφορούν την ορατότητα του ιστορικού θα εφαρμοστούν μόνο στα μελλοντικά μηνύματα του δωματίου", "Conference calling is in development and may not be reliable.": "Η κλήση συνδιάσκεψης είναι υπό ανάπτυξη και μπορεί να μην είναι αξιόπιστη.", "Devices will not yet be able to decrypt history from before they joined the room": "Οι συσκευές δεν θα είναι σε θέση να αποκρυπτογραφήσουν το ιστορικό πριν από την είσοδο τους στο δωμάτιο", "End-to-end encryption is in beta and may not be reliable": "Η κρυπτογράφηση από άκρο σε άκρο είναι σε δοκιμαστικό στάδιο και μπορεί να μην είναι αξιόπιστη", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "Ο %(senderName)s αφαίρεσε το όνομα εμφάνισης του (%(oldDisplayName)s).", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "Ο %(senderName)s έστειλε μια πρόσκληση στον %(targetDisplayName)s για να συνδεθεί στο δωμάτιο.", + "%(senderName)s set their display name to %(displayName)s.": "Ο %(senderName)s όρισε το όνομα του σε %(displayName)s.", "The phone number entered looks invalid": "Ο αριθμός που καταχωρίσατε δεν είναι έγκυρος", "The email address linked to your account must be entered.": "Πρέπει να εισηχθεί η διεύθυνση ηλ. αλληλογραφίας που είναι συνδεδεμένη με τον λογαριασμό σας.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Το αρχείο '%(fileName)s' υπερβαίνει το όριο μεγέθους του διακομιστή για αποστολές", @@ -513,6 +546,7 @@ "This is a preview of this room. Room interactions have been disabled": "Αυτή είναι μια προεπισκόπηση του δωματίου. Οι αλληλεπιδράσεις δωματίου έχουν απενεργοποιηθεί", "This room is not accessible by remote Matrix servers": "Αυτό το δωμάτιο δεν είναι προσβάσιμο από απομακρυσμένους διακομιστές Matrix", "To reset your password, enter the email address linked to your account": "Για να επαναφέρετε τον κωδικό πρόσβασης σας, πληκτρολογήστε τη διεύθυνση ηλ. αλληλογραφίας όπου είναι συνδεδεμένη με τον λογαριασμό σας", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Ο %(senderName)s ενεργοποίησε την από άκρο σε άκρο κρυπτογράφηση (algorithm %(algorithm)s).", "Undecryptable": "Μη αποκρυπτογραφημένο", "Uploading %(filename)s and %(count)s others|one": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπα", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Θα θέλατε να <acceptText>δεχθείτε</acceptText> ή να <declineText>απορρίψετε</declineText> την πρόσκληση;", @@ -769,6 +803,11 @@ "You do not have permission to do that in this room.": "Δεν έχετε την άδεια να το κάνετε αυτό σε αυτό το δωμάτιο.", "You are now ignoring %(userId)s": "Τώρα αγνοείτε τον/την %(userId)s", "You are no longer ignoring %(userId)s": "Δεν αγνοείτε πια τον/την %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "Ο/Η %(oldDisplayName)s άλλαξε το εμφανιζόμενο όνομά του/της σε %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "Ο/Η %(senderName)s άλλαξε τα καρφιτσωμένα μηνύματα του δωματίου.", + "%(widgetName)s widget modified by %(senderName)s": "Έγινε αλλαγή στο widget %(widgetName)s από τον/την %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "Προστέθηκε το widget %(widgetName)s από τον/την %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Το widget %(widgetName)s αφαιρέθηκε από τον/την %(senderName)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 και άλλος ένας πληκτρολογούν", "Message Pinning": "Καρφίτσωμα Μηνυμάτων", @@ -810,44 +849,5 @@ "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Διαβάστηκε από τον/την %(displayName)s (%(userName)s) στις %(dateTime)s", "Room Notification": "Ειδοποίηση Δωματίου", "Notify the whole room": "Ειδοποιήστε όλο το δωμάτιο", - "Sets the room topic": "Ορίζει το θέμα του δωματίου", - "<target> accepted the invitation for %(displayName)s.": "<target> δέχτηκες την πρόσκληση για %(displayName)s.", - "<target> accepted an invitation.": "<target> δέχτηκε την πρόσκληση.", - "<sender> requested a VoIP conference.": "Ο <sender> αιτήθηκε μια συνδιάσκεψη VoIP.", - "<sender> invited <target>.": "Ο <sender> προσκάλεσε τον <target>.", - "<sender> banned <target>.": "Ο χρήστης <sender> έδιωξε τον χρήστη <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "Ο/Η <oldDisplayName> άλλαξε το εμφανιζόμενο όνομά του/της σε <displayName>.", - "<sender> set their display name to <displayName>.": "Ο <sender> όρισε το όνομα του σε <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "Ο <sender> αφαίρεσε το όνομα εμφάνισης του (<oldDisplayName>).", - "<sender> removed their profile picture.": "Ο <sender> αφαίρεσε τη φωτογραφία του προφίλ του.", - "<sender> changed their profile picture.": "Ο <sender> άλλαξε τη φωτογραφία του προφίλ του.", - "<sender> set a profile picture.": "Ο <sender> όρισε τη φωτογραφία του προφίλ του.", - "<target> joined the room.": "ο <target> συνδέθηκε στο δωμάτιο.", - "<target> rejected the invitation.": "Ο <target> απέρριψε την πρόσκληση.", - "<target> left the room.": "Ο χρήστης <target> έφυγε από το δωμάτιο.", - "<sender> unbanned <target>.": "Ο χρήστης <sender> έδιωξε τον χρήστη <target>.", - "<sender> kicked <target>.": "Ο <sender> έδιωξε τον χρήστη <target>.", - "<sender> withdrew <target>'s invitation.": "Ο <sender> ανακάλεσε την πρόσκληση του <target>.", - "<sender> changed the topic to \"%(topic)s\".": "Ο <sender> άλλαξε το θέμα σε \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "Ο <sender> άλλαξε το όνομα του δωματίου σε %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "Ο <sender> άλλαξε την προσωπική εικόνα του %(roomName)s", - "<sender> changed the room avatar to <img/>": "Ο <sender> άλλαξε την εικόνα του δωματίου σε <img/>", - "<sender> removed the room name.": "Ο <sender> διέγραψε το όνομα του δωματίου.", - "<sender> removed the room avatar.": "Ο <sender> διέγραψε την προσωπική εικόνα του δωματίου.", - "<sender> answered the call.": "Ο χρήστης <sender> απάντησε την κλήση.", - "<sender> ended the call.": "<sender> τερμάτισε την κλήση.", - "<sender> placed a %(callType)s call.": "Ο <sender> πραγματοποίησε μια %(callType)s κλήση.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "Ο <sender> έστειλε μια πρόσκληση στον %(targetDisplayName)s για να συνδεθεί στο δωμάτιο.", - "<sender> made future room history visible to all room members, from the point they are invited.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που προσκλήθηκαν.", - "<sender> made future room history visible to all room members, from the point they joined.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που συνδέθηκαν.", - "<sender> made future room history visible to all room members.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη.", - "<sender> made future room history visible to anyone.": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο οποιοσδήποτε.", - "<sender> made future room history visible to unknown (%(visibility)s).": "Ο <sender> έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο άγνωστο (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "Ο <sender> ενεργοποίησε την από άκρο σε άκρο κρυπτογράφηση (algorithm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> από %(fromPowerLevel)s σε %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "Ο <sender> άλλαξε το επίπεδο δύναμης του %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "Ο/Η <sender> άλλαξε τα καρφιτσωμένα μηνύματα του δωματίου.", - "%(widgetName)s widget modified by <sender>": "Έγινε αλλαγή στο widget %(widgetName)s από τον/την <sender>", - "%(widgetName)s widget added by <sender>": "Προστέθηκε το widget %(widgetName)s από τον/την <sender>", - "%(widgetName)s widget removed by <sender>": "Το widget %(widgetName)s αφαιρέθηκε από τον/την <sender>" + "Sets the room topic": "Ορίζει το θέμα του δωματίου" } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d02ab8ff29..d697fbc7bd 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -153,14 +153,50 @@ "Displays action": "Displays action", "Unrecognised command:": "Unrecognised command:", "Reason": "Reason", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s changed their display name to %(displayName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", + "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", + "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", "VoIP conference started.": "VoIP conference started.", + "%(targetName)s joined the room.": "%(targetName)s joined the room.", "VoIP conference finished.": "VoIP conference finished.", + "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", + "%(targetName)s left the room.": "%(targetName)s left the room.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", "Someone": "Someone", "(not supported by this browser)": "(not supported by this browser)", + "%(senderName)s answered the call.": "%(senderName)s answered the call.", "(could not connect media)": "(could not connect media)", "(no answer)": "(no answer)", "(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s ended the call.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s placed a %(callType)s call.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s made future room history visible to all room members, from the point they are invited.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s made future room history visible to all room members, from the point they joined.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", "%(displayName)s is typing": "%(displayName)s is typing", "%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing", "%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing", @@ -580,6 +616,9 @@ "Invalid file%(extra)s": "Invalid file%(extra)s", "Error decrypting image": "Error decrypting image", "Error decrypting video": "Error decrypting video", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s changed the room avatar to <img/>", "Copied!": "Copied!", "Failed to copy": "Failed to copy", "Add an Integration": "Add an Integration", @@ -1193,44 +1232,5 @@ "Import": "Import", "Failed to set direct chat tag": "Failed to set direct chat tag", "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", - "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room", - "<target> accepted the invitation for %(displayName)s.": "<target> accepted the invitation for %(displayName)s.", - "<target> accepted an invitation.": "<target> accepted an invitation.", - "<sender> requested a VoIP conference.": "<sender> requested a VoIP conference.", - "<sender> invited <target>.": "<sender> invited <target>.", - "<sender> banned <target>.": "<sender> banned <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> changed their display name to <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> set their display name to <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> removed their display name (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> removed their profile picture.", - "<sender> changed their profile picture.": "<sender> changed their profile picture.", - "<sender> set a profile picture.": "<sender> set a profile picture.", - "<target> joined the room.": "<target> joined the room.", - "<target> rejected the invitation.": "<target> rejected the invitation.", - "<target> left the room.": "<target> left the room.", - "<sender> unbanned <target>.": "<sender> unbanned <target>.", - "<sender> kicked <target>.": "<sender> kicked <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> withdrew <target>'s invitation.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> changed the topic to \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> changed the room name to %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> changed the avatar for %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> changed the room avatar to <img/>", - "<sender> removed the room name.": "<sender> removed the room name.", - "<sender> removed the room avatar.": "<sender> removed the room avatar.", - "<sender> answered the call.": "<sender> answered the call.", - "<sender> ended the call.": "<sender> ended the call.", - "<sender> placed a %(callType)s call.": "<sender> placed a %(callType)s call.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> sent an invitation to %(targetDisplayName)s to join the room.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> made future room history visible to all room members, from the point they are invited.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> made future room history visible to all room members, from the point they joined.", - "<sender> made future room history visible to all room members.": "<sender> made future room history visible to all room members.", - "<sender> made future room history visible to anyone.": "<sender> made future room history visible to anyone.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> made future room history visible to unknown (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> from %(fromPowerLevel)s to %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> changed the power level of %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> changed the pinned messages for the room.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s widget modified by <sender>", - "%(widgetName)s widget added by <sender>": "%(widgetName)s widget added by <sender>", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s widget removed by <sender>" + "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" } diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index e1b91cfa81..6f0708f0c2 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -3,6 +3,8 @@ "AM": "AM", "PM": "PM", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains", + "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", "Account": "Account", "Access Token:": "Access Token:", "Add a topic": "Add a topic", @@ -28,6 +30,7 @@ "and %(count)s others...|one": "and one other...", "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing", "A new password must be entered.": "A new password must be entered.", + "%(senderName)s answered the call.": "%(senderName)s answered the call.", "An error has occurred.": "An error has occurred.", "Anyone": "Anyone", "Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests", @@ -38,6 +41,7 @@ "Are you sure you want to upload the following files?": "Are you sure you want to upload the following files?", "Attachment": "Attachment", "Autoplay GIFs and videos": "Autoplay GIFs and videos", + "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.", "Ban": "Ban", "Banned users": "Banned users", "Bans user with given id": "Bans user with given id", @@ -47,6 +51,11 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.", "Can't load user settings": "Can't load user settings", "Change Password": "Change Password", + "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room", "Changes your display nickname": "Changes your display nickname", "Changing password will currently reset any end-to-end encryption keys on all devices, 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 devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", @@ -108,6 +117,7 @@ "Enable encryption": "Enable encryption", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Encrypted messages will not be visible on clients that do not yet implement encryption", "Encrypted room": "Encrypted room", + "%(senderName)s ended the call.": "%(senderName)s ended the call.", "End-to-end encryption information": "End-to-end encryption information", "End-to-end encryption is in beta and may not be reliable": "End-to-end encryption is in beta and may not be reliable", "Enter Code": "Enter Code", @@ -147,6 +157,7 @@ "Forgot your password?": "Forgot your password?", "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.", "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "Hangup": "Hangup", @@ -165,6 +176,7 @@ "Invalid address format": "Invalid address format", "Invalid Email Address": "Invalid Email Address", "Invalid file%(extra)s": "Invalid file%(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", "Invite new room members": "Invite new room members", "Invited": "Invited", "Invites": "Invites", @@ -174,8 +186,10 @@ "%(displayName)s is typing": "%(displayName)s is typing", "Sign in with": "Sign in with", "Join Room": "Join Room", + "%(targetName)s joined the room.": "%(targetName)s joined the room.", "Joins room with given alias": "Joins room with given alias", "Jump to first unread message.": "Jump to first unread message.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.", "Kick": "Kick", "Kicks user with given id": "Kicks user with given id", "Labs": "Labs", @@ -190,11 +204,17 @@ "Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward", "Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you", "Leave room": "Leave room", + "%(targetName)s left the room.": "%(targetName)s left the room.", "Publish this room to the public in %(domain)s's room directory?": "Publish this room to the public in %(domain)s's room directory?", "Local addresses for this room:": "Local addresses for this room:", "Logged in as:": "Logged in as:", "Logout": "Logout", "Low priority": "Low priority", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s made future room history visible to all room members, from the point they are invited.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s made future room history visible to all room members, from the point they joined.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", "Manage Integrations": "Manage Integrations", "Markdown is disabled": "Markdown is disabled", "Markdown is enabled": "Markdown is enabled", @@ -236,6 +256,7 @@ "People": "People", "Permissions": "Permissions", "Phone": "Phone", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s placed a %(callType)s call.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.", "Power level must be positive integer.": "Power level must be positive integer.", "Privacy warning": "Privacy warning", @@ -246,11 +267,15 @@ "Revoke widget access": "Revoke widget access", "Refer a friend to Riot:": "Refer a friend to Riot:", "Register": "Register", + "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", "Reject invitation": "Reject invitation", "Remote addresses for this room:": "Remote addresses for this room:", "Remove Contact Information?": "Remove Contact Information?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", "Remove": "Remove", "Remove %(threePid)s?": "Remove %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", "Results from DuckDuckGo": "Results from DuckDuckGo", "Return to login screen": "Return to login screen", @@ -271,6 +296,7 @@ "Send Invites": "Send Invites", "Send Reset Email": "Send Reset Email", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", "Server error": "Server error", "Server may be unavailable or overloaded": "Server may be unavailable or overloaded", "Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(", @@ -278,6 +304,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.", "Session ID": "Session ID", + "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", "Settings": "Settings", "Show panel": "Show panel", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", @@ -316,10 +344,12 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.", "Turn Markdown off": "Turn Markdown off", "Turn Markdown on": "Turn Markdown on", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", "Unable to add email address": "Unable to add email address", "Unable to remove contact information": "Unable to remove contact information", "Unable to verify email address.": "Unable to verify email address.", "Unban": "Unban", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", "Unable to capture screen": "Unable to capture screen", "Unable to enable Notifications": "Unable to enable Notifications", "Unable to load device list": "Unable to load device list", @@ -363,6 +393,7 @@ "Who can read history?": "Who can read history?", "Who would you like to add to this room?": "Who would you like to add to this room?", "Who would you like to communicate with?": "Who would you like to communicate with?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", "You are already in a call.": "You are already in a call.", "You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.", "You cannot place a call with yourself.": "You cannot place a call with yourself.", @@ -530,6 +561,9 @@ "Online": "Online", "Idle": "Idle", "Offline": "Offline", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s changed the room avatar to <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", "Active call (%(roomName)s)": "Active call (%(roomName)s)", "Accept": "Accept", "Add": "Add", @@ -656,8 +690,11 @@ "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", "Failed to upload image": "Failed to upload image", "Hide avatars in user and room mentions": "Hide avatars in user and room mentions", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot check is currently unavailable on desktop - please use a <a>web browser</a>", "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "Fetching third party location failed": "Fetching third party location failed", "A new version of Riot is available.": "A new version of Riot is available.", "Couldn't load home page": "Couldn't load home page", @@ -791,42 +828,5 @@ "Collapse panel": "Collapse panel", "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!": "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...": "Checking for an update...", - "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here", - "<target> accepted the invitation for %(displayName)s.": "<target> accepted the invitation for %(displayName)s.", - "<target> accepted an invitation.": "<target> accepted an invitation.", - "<sender> requested a VoIP conference.": "<sender> requested a VoIP conference.", - "<sender> invited <target>.": "<sender> invited <target>.", - "<sender> banned <target>.": "<sender> banned <target>.", - "<sender> set their display name to <displayName>.": "<sender> set their display name to <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> removed their display name (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> removed their profile picture.", - "<sender> changed their profile picture.": "<sender> changed their profile picture.", - "<sender> set a profile picture.": "<sender> set a profile picture.", - "<target> joined the room.": "<target> joined the room.", - "<target> rejected the invitation.": "<target> rejected the invitation.", - "<target> left the room.": "<target> left the room.", - "<sender> unbanned <target>.": "<sender> unbanned <target>.", - "<sender> kicked <target>.": "<sender> kicked <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> withdrew <target>'s invitation.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> changed the topic to \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> changed the room name to %(roomName)s.", - "<sender> changed the room avatar to <img/>": "<sender> changed the room avatar to <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> changed the avatar for %(roomName)s", - "<sender> removed the room name.": "<sender> removed the room name.", - "<sender> removed the room avatar.": "<sender> removed the room avatar.", - "<sender> answered the call.": "<sender> answered the call.", - "<sender> ended the call.": "<sender> ended the call.", - "<sender> placed a %(callType)s call.": "<sender> placed a %(callType)s call.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> sent an invitation to %(targetDisplayName)s to join the room.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> made future room history visible to all room members, from the point they are invited.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> made future room history visible to all room members, from the point they joined.", - "<sender> made future room history visible to all room members.": "<sender> made future room history visible to all room members.", - "<sender> made future room history visible to anyone.": "<sender> made future room history visible to anyone.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> made future room history visible to unknown (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> from %(fromPowerLevel)s to %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> changed the power level of %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> changed the pinned messages for the room.", - "%(widgetName)s widget added by <sender>": "%(widgetName)s widget added by <sender>", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s widget removed by <sender>" + "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here" } diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 9e606ea90a..abcbcd636a 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -108,14 +108,49 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La donita subskriba ŝlosilo kongruas kun la ŝlosilo ricevita de %(userId)s por ĝia aparato %(deviceId)s. Aparato markita kiel kontrolita.", "Unrecognised command:": "Nerekonita komando:", "Reason": "Kialo", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s akceptis la inviton por %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s akceptis inviton.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s petis rettelefonan vokon.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s invitis uzanton %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s forbaris uzanton %(targetName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s agordis sian vidigan nomon al %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s forigis sian vidigan nomon (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s forigis sian profilbildon.", + "%(senderName)s changed their profile picture.": "%(senderName)s ŝanĝis sian profilbildon.", + "%(senderName)s set a profile picture.": "%(senderName)s agordis profilbildon.", "VoIP conference started.": "Rettelefona voko komenciĝis.", + "%(targetName)s joined the room.": "%(targetName)s venis en la ĉambron.", "VoIP conference finished.": "Rettelefona voko finiĝis.", + "%(targetName)s rejected the invitation.": "%(targetName)s rifuzis la inviton.", + "%(targetName)s left the room.": "%(targetName)s forlasis la ĉambron.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s malbaris uzanton %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s forpelis uzanton %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s nuligis inviton por %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ŝanĝis la temon al «%(topic)s».", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s forigis nomon de la ĉambro.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ŝanĝis nomon de la ĉambro al %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendis bildon.", "Someone": "Iu", "(not supported by this browser)": "(nesubtenata de tiu ĉi foliumilo)", + "%(senderName)s answered the call.": "%(senderName)s akceptis la vokon.", "(could not connect media)": "(aŭdvidaĵoj ne kunigeblis)", "(no answer)": "(sen respondo)", "(unknown failure: %(reason)s)": "(nekonata eraro: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s finis la vokon.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s faris vokon de speco: %(callType)s.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sendis ĉambran inviton al %(targetDisplayName)s.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de invito.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de aliĝo.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s videbligis estontan historion de la ĉambro al nekonatoj (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ŝaltis ĝiscelan ĉifradon (algoritmo: %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s al %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ŝanĝis la potencan nivelon de %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ŝanĝis la fiksitajn mesaĝojn de la ĉambro.", + "%(widgetName)s widget modified by %(senderName)s": "Fenestraĵon %(widgetName)s ŝanĝis %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "Fenestraĵon %(widgetName)s aldonis %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Fenestraĵon %(widgetName)s forigis %(senderName)s", "%(displayName)s is typing": "%(displayName)s tajpas", "%(names)s and %(count)s others are typing|other": "%(names)s kaj %(count)s aliaj tajpas", "%(names)s and %(count)s others are typing|one": "%(names)s kaj unu alia tajpas", @@ -241,6 +276,7 @@ "Unignore": "Reatenti", "Ignore": "Malatenti", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ŝanĝo de pasvorto nuntempe nuligos ĉiujn ĝiscele ĉifrajn ŝlosilojn sur ĉiuj viaj aparatoj. Tio faros ĉifritajn babilajn historiojn nelegeblaj, krom se vi unue elportos viajn ĉambrajn ŝlosilojn kaj reenportos ilin poste. Estontece ĉi tio pliboniĝos.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ŝanĝis la profilbildon de %(roomName)s", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Vi estas direktota al ekstera retejo por aŭtentigi vian konton por uzo kun %(integrationsUrl)s. Ĉu vi volas daŭrigi tion?", "Jump to read receipt": "Salti al legokonfirmo", "Mention": "Mencio", @@ -436,6 +472,8 @@ "Invalid file%(extra)s": "Malvalida dosiero%(extra)s", "Error decrypting image": "Eraro malĉifrante bildon", "Error decrypting video": "Eraro malĉifrante videon", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s forigis la ĉambran profilbildon.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s agordis la ĉambran profilbildon al <img/>", "Copied!": "Kopiita!", "Failed to copy": "Malsukcesis kopii", "Add an Integration": "Aldoni integron", @@ -887,6 +925,7 @@ "Whether or not you're logged in (we don't record your user name)": "Ĉu vi salutis aŭ ne (ni ne registras vian salutnomon)", "Your language of choice": "Via preferata lingvo", "The information being sent to us to help make Riot.im better includes:": "Informoj sendataj al ni por plibonigi la servon Riot.im inkluzivas:", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ŝanĝis sian vidigan nomon al %(displayName)s.", "Send an encrypted reply…": "Sendi ĉifritan respondon…", "Send a reply (unencrypted)…": "Sendi respondon (neĉifritan)…", "Send an encrypted message…": "Sendi ĉifritan mesaĝon…", @@ -1057,44 +1096,5 @@ "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.": "Sencimigaj protokoloj enhavas informojn pri uzo de aplikaĵo, inkluzive vian salutnomon, la identigilojn aŭ nomojn de la ĉambroj aŭ grupoj kiujn vi vizitis, kaj la salutnomojn de aliaj uzantoj. Ili ne enhavas mesaĝojn.", "Failed to send logs: ": "Malsukcesis sendi protokolon: ", "Notes:": "Rimarkoj:", - "Preparing to send logs": "Pretiganta sendon de protokolo", - "<target> accepted the invitation for %(displayName)s.": "<target> akceptis la inviton por %(displayName)s.", - "<target> accepted an invitation.": "<target> akceptis inviton.", - "<sender> requested a VoIP conference.": "<sender> petis rettelefonan vokon.", - "<sender> invited <target>.": "<sender> invitis uzanton <target>.", - "<sender> banned <target>.": "<sender> forbaris uzanton <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> ŝanĝis sian vidigan nomon al <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> agordis sian vidigan nomon al <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> forigis sian vidigan nomon (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> forigis sian profilbildon.", - "<sender> changed their profile picture.": "<sender> ŝanĝis sian profilbildon.", - "<sender> set a profile picture.": "<sender> agordis profilbildon.", - "<target> joined the room.": "<target> venis en la ĉambron.", - "<target> rejected the invitation.": "<target> rifuzis la inviton.", - "<target> left the room.": "<target> forlasis la ĉambron.", - "<sender> unbanned <target>.": "<sender> malbaris uzanton <target>.", - "<sender> kicked <target>.": "<sender> forpelis uzanton <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> nuligis inviton por <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> ŝanĝis la temon al «%(topic)s».", - "<sender> changed the room name to %(roomName)s.": "<sender> ŝanĝis nomon de la ĉambro al %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> ŝanĝis la profilbildon de %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> agordis la ĉambran profilbildon al <img/>", - "<sender> removed the room name.": "<sender> forigis nomon de la ĉambro.", - "<sender> removed the room avatar.": "<sender> forigis la ĉambran profilbildon.", - "<sender> answered the call.": "<sender> akceptis la vokon.", - "<sender> ended the call.": "<sender> finis la vokon.", - "<sender> placed a %(callType)s call.": "<sender> faris vokon de speco: %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> sendis ĉambran inviton al %(targetDisplayName)s.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de invito.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj, de la tempo de aliĝo.", - "<sender> made future room history visible to all room members.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj.", - "<sender> made future room history visible to anyone.": "<sender> videbligis estontan historion de la ĉambro al ĉiuj.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> videbligis estontan historion de la ĉambro al nekonatoj (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ŝaltis ĝiscelan ĉifradon (algoritmo: %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s al %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ŝanĝis la potencan nivelon de %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> ŝanĝis la fiksitajn mesaĝojn de la ĉambro.", - "%(widgetName)s widget modified by <sender>": "Fenestraĵon %(widgetName)s ŝanĝis <sender>", - "%(widgetName)s widget added by <sender>": "Fenestraĵon %(widgetName)s aldonis <sender>", - "%(widgetName)s widget removed by <sender>": "Fenestraĵon %(widgetName)s forigis <sender>" + "Preparing to send logs": "Pretiganta sendon de protokolo" } diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 8b010d70b3..5434c570f7 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1,5 +1,7 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un mensaje de texto ha sido enviado a +%(msisdn)s. Por favor ingrese el código de verificación que lo contiene", + "%(targetName)s accepted an invitation.": "%(targetName)s ha aceptado una invitación.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha aceptado la invitación para %(displayName)s.", "Account": "Cuenta", "Access Token:": "Token de Acceso:", "Add email address": "Agregar correo eléctronico", @@ -14,6 +16,7 @@ "and %(count)s others...|one": "y otro...", "%(names)s and %(lastPerson)s are typing": "%(names)s y %(lastPerson)s están escribiendo", "A new password must be entered.": "Una nueva clave debe ser ingresada.", + "%(senderName)s answered the call.": "%(senderName)s atendió la llamada.", "An error has occurred.": "Un error ha ocurrido.", "Anyone who knows the room's link, apart from guests": "Cualquiera que sepa el enlace de la sala, salvo invitados", "Anyone who knows the room's link, including guests": "Cualquiera que sepa del enlace de la sala, incluyendo los invitados", @@ -21,6 +24,7 @@ "Are you sure you want to reject the invitation?": "¿Estás seguro que quieres rechazar la invitación?", "Attachment": "Adjunto", "Autoplay GIFs and videos": "Reproducir automáticamente GIFs y videos", + "%(senderName)s banned %(targetName)s.": "%(senderName)s ha bloqueado a %(targetName)s.", "Ban": "Bloquear", "Banned users": "Usuarios bloqueados", "Bans user with given id": "Bloquear usuario por ID", @@ -30,6 +34,10 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "No se puede conectar al servidor via HTTP, cuando es necesario un enlace HTTPS en la barra de direcciones de tu navegador. Ya sea usando HTTPS o <a>habilitando los scripts inseguros</a>.", "Can't load user settings": "No se puede cargar las configuraciones del usuario", "Change Password": "Cambiar clave", + "%(senderName)s changed their profile picture.": "%(senderName)s ha cambiado su foto de perfil.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha cambiado el nivel de acceso de %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha cambiado el nombre de la sala a %(roomName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha cambiado el tema de la sala a \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Cambios para quien pueda leer el historial solo serán aplicados a futuros mensajes en la sala", "Changes your display nickname": "Cambia la visualización de tu apodo", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "El cambio de contraseña restablecerá actualmente todas las claves de cifrado de extremo a extremo de todos los dispositivos, haciendo que el historial de chat cifrado sea ilegible, a menos que primero exporte las claves de la habitación y vuelva a importarlas después. En el futuro esto será mejorado.", @@ -83,6 +91,7 @@ "Enable encryption": "Habilitar encriptación", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Los mensajes encriptados no serán visibles en navegadores que no han implementado aun la encriptación", "Encrypted room": "Sala encriptada", + "%(senderName)s ended the call.": "%(senderName)s terminó la llamada.", "End-to-end encryption information": "Información de encriptación de extremo a extremo", "End-to-end encryption is in beta and may not be reliable": "El cifrado de extremo a extremo está en pruebas, podría no ser fiable", "Enter Code": "Ingresar Código", @@ -121,6 +130,7 @@ "Forgot your password?": "¿Olvidaste tu clave?", "For security, this session has been signed out. Please sign in again.": "Por seguridad, esta sesión ha sido cerrada. Por favor inicia sesión nuevamente.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por seguridad, al cerrar la sesión borrará cualquier clave de encriptación de extremo a extremo en este navegador. Si quieres ser capaz de descifrar tu historial de conversación, para las futuras sesiones en Riot, por favor exporta las claves de la sala para protegerlas.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.", "Hangup": "Colgar", "Hide read receipts": "Ocultar mensajes leídos", @@ -136,6 +146,7 @@ "Invalid address format": "Formato de dirección inválida", "Invalid Email Address": "Dirección de correo electrónico inválida", "Invalid file%(extra)s": "Archivo inválido %(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s ha invitado a %(targetName)s.", "Invite new room members": "Invitar nuevos miembros a la sala", "Invites": "Invitar", "Invites user with given id to current room": "Invitar a usuario con ID dado a esta sala", @@ -144,11 +155,14 @@ "%(displayName)s is typing": "%(displayName)s está escribiendo", "Sign in with": "Quiero iniciar sesión con", "Join Room": "Unirte a la sala", + "%(targetName)s joined the room.": "%(targetName)s se ha unido a la sala.", "Joins room with given alias": "Unirse a la sala con el alias dado", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha expulsado a %(targetName)s.", "Kick": "Expulsar", "Kicks user with given id": "Expulsar usuario con ID dado", "Labs": "Laboratorios", "Leave room": "Dejar sala", + "%(targetName)s left the room.": "%(targetName)s ha dejado la sala.", "Local addresses for this room:": "Direcciones locales para esta sala:", "Logged in as:": "Sesión iniciada como:", "Logout": "Cerrar Sesión", @@ -198,6 +212,11 @@ "Jump to first unread message.": "Ir al primer mensaje sin leer.", "Last seen": "Visto por última vez", "Level:": "Nivel:", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que son invitados.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que se han unido.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha configurado el historial de la sala visible para Todos los miembros de la sala.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha configurado el historial de la sala visible para nadie.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha configurado el historial de la sala visible para desconocido (%(visibility)s).", "Something went wrong!": "¡Algo ha fallado!", "Please select the destination room for this message": "Por favor, seleccione la sala destino para este mensaje", "Create new room": "Crear nueva sala", @@ -244,12 +263,15 @@ "Send Invites": "Enviar invitaciones", "Send Reset Email": "Enviar e-mail de reinicio", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s envió una imagen.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s invitó a %(targetDisplayName)s a unirse a la sala.", "Server error": "Error del servidor", "Server may be unavailable, overloaded, or search timed out :(": "El servidor podría estar saturado o desconectado, o la búsqueda caducó :(", "Server may be unavailable, overloaded, or the file too big": "El servidor podría estar saturado o desconectado, o el fichero ser demasiado grande", "Server may be unavailable, overloaded, or you hit a bug.": "El servidor podría estar saturado o desconectado, o encontraste un fallo.", "Server unavailable, overloaded, or something else went wrong.": "Servidor saturado, desconectado, o alguien ha roto algo.", "Session ID": "ID de sesión", + "%(senderName)s set a profile picture.": "%(senderName)s puso una foto de perfil.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s cambió su nombre a %(displayName)s.", "Settings": "Configuración", "Show panel": "Mostrar panel", "Show Text Formatting Toolbar": "Mostrar la barra de formato de texto", @@ -275,6 +297,7 @@ "Are you sure you want to leave the room '%(roomName)s'?": "¿Está seguro de que desea abandonar la sala '%(roomName)s'?", "Are you sure you want to upload the following files?": "¿Está seguro que desea enviar los siguientes archivos?", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "No se puede conectar al servidor - compruebe su conexión, asegúrese de que el <a>certificado SSL del servidor</a> es de confiaza, y compruebe que no hay extensiones del navegador bloqueando las peticiones.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha quitado el nombre de la sala.", "Device key:": "Clave del dispositivo:", "Drop File Here": "Deje el fichero aquí", "Guest access is disabled on this Home Server.": "El acceso de invitados está desactivado en este servidor.", @@ -321,6 +344,7 @@ "People": "Gente", "Permissions": "Permisos", "Phone": "Teléfono", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha hecho una llamada de tipo %(callType)s.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, compruebe su e-mail y pulse el enlace que contiene. Una vez esté hecho, pulse continuar.", "Power level must be positive integer.": "El nivel debe ser un entero positivo.", "Privacy warning": "Alerta de privacidad", @@ -333,12 +357,16 @@ "Revoke Moderator": "Eliminar Moderador", "Refer a friend to Riot:": "Informar a un amigo sobre Riot:", "Register": "Registro", + "%(targetName)s rejected the invitation.": "%(targetName)s ha rechazado la invitación.", "Reject invitation": "Rechazar invitación", "Rejoin": "Volver a unirse", "Remote addresses for this room:": "Dirección remota de esta sala:", "Remove Contact Information?": "¿Eliminar información del contacto?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha suprimido su nombre para mostar (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s ha eliminado su foto de perfil.", "Remove": "Eliminar", "Remove %(threePid)s?": "¿Eliminar %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s ha solicitado una conferencia Voz-IP.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Reiniciar la contraseña también reiniciará las claves de cifrado extremo-a-extremo, haciendo ilegible el historial de las conversaciones, salvo que exporte previamente las claves de sala, y las importe posteriormente. Esto será mejorado en futuras versiones.", "Results from DuckDuckGo": "Resultados desde DuckDuckGo", "Return to login screen": "Volver a la pantalla de inicio de sesión", @@ -399,6 +427,7 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no se ha podido encontrarlo.", "Turn Markdown off": "Desactivar markdown", "Turn Markdown on": "Activar markdown", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activado el cifrado de extremo-a-extremo (algorithm %(algorithm)s).", "Unable to add email address": "No se ha podido añadir la dirección de correo electrónico", "Unable to create widget.": "No se ha podido crear el widget.", "Unable to remove contact information": "No se ha podido eliminar la información de contacto", @@ -454,6 +483,7 @@ "Who can read history?": "¿Quién puede leer el historial?", "Who would you like to add to this room?": "¿A quién quiere añadir a esta sala?", "Who would you like to communicate with?": "¿Con quién quiere comunicar?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha retirado la invitación de %(targetName)s.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "¿Quiere <acceptText>aceptar</acceptText> o <declineText>rechazar</declineText> esta invitación?", "You already have existing direct chats with this user:": "Ya tiene chats directos con este usuario:", "You are already in a call.": "Ya está participando en una llamada.", @@ -472,6 +502,7 @@ "Revoke widget access": "Revocar acceso del widget", "The maximum permitted number of widgets have already been added to this room.": "La cantidad máxima de widgets permitida ha sido alcanzada en esta sala.", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar, solo espere a que carguen los resultados de auto-completar y navegue entre ellos.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s levanto la suspensión de %(targetName)s.", "unencrypted": "no cifrado", "Unmute": "desactivar el silencio", "Unrecognised command:": "comando no reconocido:", @@ -705,36 +736,5 @@ "Collapse panel": "Colapsar panel", "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!": "En su navegador actual, la apariencia y comportamiento de la aplicación puede ser completamente incorrecta, y algunas de las características podrían no funcionar. Si aún desea probarlo puede continuar, pero ¡no podremos ofrecer soporte por cualquier problema que pudiese tener!", "Checking for an update...": "Comprobando actualizaciones...", - "There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí", - "<target> accepted the invitation for %(displayName)s.": "<target> ha aceptado la invitación para %(displayName)s.", - "<target> accepted an invitation.": "<target> ha aceptado una invitación.", - "<sender> requested a VoIP conference.": "<sender> ha solicitado una conferencia Voz-IP.", - "<sender> invited <target>.": "<sender> ha invitado a <target>.", - "<sender> banned <target>.": "<sender> ha bloqueado a <target>.", - "<sender> set their display name to <displayName>.": "<sender> cambió su nombre a <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> ha suprimido su nombre para mostar (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> ha eliminado su foto de perfil.", - "<sender> changed their profile picture.": "<sender> ha cambiado su foto de perfil.", - "<sender> set a profile picture.": "<sender> puso una foto de perfil.", - "<target> joined the room.": "<target> se ha unido a la sala.", - "<target> rejected the invitation.": "<target> ha rechazado la invitación.", - "<target> left the room.": "<target> ha dejado la sala.", - "<sender> unbanned <target>.": "<sender> levanto la suspensión de <target>.", - "<sender> kicked <target>.": "<sender> ha expulsado a <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> ha retirado la invitación de <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> ha cambiado el tema de la sala a \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> ha cambiado el nombre de la sala a %(roomName)s.", - "<sender> removed the room name.": "<sender> ha quitado el nombre de la sala.", - "<sender> answered the call.": "<sender> atendió la llamada.", - "<sender> ended the call.": "<sender> terminó la llamada.", - "<sender> placed a %(callType)s call.": "<sender> ha hecho una llamada de tipo %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> invitó a %(targetDisplayName)s a unirse a la sala.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que son invitados.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> ha configurado el historial de la sala visible para Todos los miembros de la sala, desde el momento en que se han unido.", - "<sender> made future room history visible to all room members.": "<sender> ha configurado el historial de la sala visible para Todos los miembros de la sala.", - "<sender> made future room history visible to anyone.": "<sender> ha configurado el historial de la sala visible para nadie.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> ha configurado el historial de la sala visible para desconocido (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ha activado el cifrado de extremo-a-extremo (algorithm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s a %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ha cambiado el nivel de acceso de %(powerLevelDiffText)s." + "There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí" } diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index d48798c222..1abaec65c7 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1,6 +1,7 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Mezu bat bidali da +%(msisdn)s zenbakira. Sartu hemen mezuko egiaztaketa kodea", "Accept": "Onartu", + "%(targetName)s accepted an invitation.": "%(targetName)s erabiltzaileak gonbidapena onartu du.", "Close": "Itxi", "Create new room": "Sortu gela berria", "Continue": "Jarraitu", @@ -165,6 +166,7 @@ "Are you sure you want to upload the following files?": "Ziur hurrengo fitxategiak igo nahi dituzula?", "Attachment": "Eranskina", "Autoplay GIFs and videos": "Automatikoki erreproduzitu GIFak eta bideoa", + "%(senderName)s banned %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s debekatu du.", "Bans user with given id": "Debekatu ID zehatz bat duen erabiltzailea", "Call Timeout": "Deiaren denbora-muga", "Change Password": "Aldatu pasahitza", @@ -208,7 +210,10 @@ "Displays action": "Ekintza bistaratzen du", "Drop File Here": "Jaregin fitxategia hona", "%(items)s and %(lastItem)s": "%(items)s eta %(lastItem)s", + "%(senderName)s answered the call.": "%(senderName)s erabiltzaileak deia erantzun du.", "Can't load user settings": "Ezin izan dira erabiltzailearen ezarpenak kargatu", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s erabiltzaileak gelaren izena kendu du.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s erabiltzaileak mintzagaia aldatu du beste honetara: \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Historiala irakurtzeko baimenen aldaketak gela honetara hemendik aurrera heldutako mezuei aplikatuko zaizkie", "Clear Cache and Reload": "Garbitu cachea eta birkargatu", "Devices will not yet be able to decrypt history from before they joined the room": "Gailuek ezin izango dute taldera elkartu aurretiko historiala deszifratu", @@ -224,6 +229,7 @@ "Encrypted room": "Zifratutako gela", "Encryption is enabled in this room": "Zifratzea gaitu da gela honetan", "Encryption is not enabled in this room": "Ez da zifratzea gaitu gela honetan", + "%(senderName)s ended the call.": "%(senderName)s erabiltzaileak deia amaitu du.", "End-to-end encryption is in beta and may not be reliable": "Muturretik muturrerako zifratzea beta egoeran dago eta agian ez dabil guztiz ondo", "Enter Code": "Sartu kodea", "Error decrypting attachment": "Errorea eranskina deszifratzean", @@ -253,13 +259,18 @@ "Fill screen": "Bete pantaila", "Forget room": "Ahaztu gela", "Forgot your password?": "Pasahitza ahaztu duzu?", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s mailatik %(toPowerLevel)s mailara", "Guest access is disabled on this Home Server.": "Bisitarien sarbidea desgaituta dago hasiera zerbitzari honetan.", "Hide Text Formatting Toolbar": "Ezkutatu testu-formatuaren tresna-barra", "Incoming call from %(name)s": "%(name)s erabiltzailearen deia jasotzen", "Incoming video call from %(name)s": "%(name)s erabiltzailearen bideo deia jasotzen", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s erabiltzaileak %(displayName)s erabiltzailearen gonbidapena onartu du.", "Bulk Options": "Aukera masiboak", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Ezin da hasiera zerbitzarira konektatu, egiaztatu zure konexioa, ziurtatu zure <a>hasiera zerbitzariaren SSL ziurtagiria</a> fidagarritzat jotzen duela zure gailuak, eta nabigatzailearen pluginen batek ez dituela eskaerak blokeatzen.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Ezin zara hasiera zerbitzarira HTTP bidez konektatu zure nabigatzailearen barran dagoen URLa HTTS bada. Erabili HTTPS edo <a>gaitu script ez seguruak</a>.", + "%(senderName)s changed their profile picture.": "%(senderName)s erabiltzaileak bere profileko argazkia aldatu du.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s erabiltzaileak botere mailaz aldatu du %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s erabiltzaileak gelaren izena aldatu du, orain %(roomName)s da.", "Drop here to tag %(section)s": "Jaregin hona %(section)s atalari etiketa jartzeko", "Incoming voice call from %(name)s": "%(name)s erabiltzailearen deia jasotzen", "Incorrect username and/or password.": "Erabiltzaile-izen edo pasahitz okerra.", @@ -267,6 +278,7 @@ "Invalid address format": "Helbide formatu baliogabea", "Invalid Email Address": "E-mail helbide baliogabea", "Invalid file%(extra)s": "Fitxategi %(extra)s baliogabea", + "%(senderName)s invited %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s gonbidatu du.", "Invite new room members": "Gonbidatu kide berriak gelara", "Invited": "Gonbidatuta", "Invites user with given id to current room": "Emandako ID-a duen erabiltzailea gonbidatzen du gelara", @@ -275,12 +287,20 @@ "%(displayName)s is typing": "%(displayName)s idazten ari da", "Sign in with": "Hasi saioa hau erabilita:", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Elkartu <voiceText>ahotsa</voiceText> edo <videoText>bideoa</videoText> erabiliz.", + "%(targetName)s joined the room.": "%(targetName)s erabiltzailea gelara elkartu da.", "Joins room with given alias": "Gelara emandako ezizenarekin elkartu da", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s kanporatu du.", "Kick": "Kanporatu", "Kicks user with given id": "Kanporatu emandako ID-a duen erabiltzailea", + "%(targetName)s left the room.": "%(targetName)s erabiltzailea gelatik atera da.", "Level:": "Maila:", "Local addresses for this room:": "Gela honen tokiko helbideak:", "Logged in as:": "Saioa hasteko erabiltzailea:", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, gonbidapena egiten zaienetik.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, elkartzen direnetik.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du edonorentzat.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du ezezagunentzat (%(visibility)s).", "Manage Integrations": "Kudeatu interakzioak", "Markdown is disabled": "Markdown desgaituta dago", "Markdown is enabled": "Markdown gaituta dago", @@ -309,6 +329,7 @@ "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Segurtasunagatik, saioa amaitzeak nabigatzaile honetako muturretik muturrerako zifratze gako guztiak ezabatuko ditu. Zure elkarrizketen historiala deszifratzeko gai izan nahi baduzu etorkizuneko Riot saioetan, esportatu zure gelako gakoen babes-kopia bat.", "Passwords can't be empty": "Pasahitzak ezin dira hutsik egon", "Permissions": "Baimenak", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s erabiltzaileak %(callType)s dei bat hasi du.", "Power level must be positive integer.": "Botere maila osoko zenbaki positibo bat izan behar da.", "Press <StartChatButton> to start a chat with someone": "Sakatu <StartChatButton> norbaitekin txat bat hasteko", "Privacy warning": "Pribatutasun abisua", @@ -320,12 +341,16 @@ "Reason: %(reasonText)s": "Arrazoia: %(reasonText)s", "Revoke Moderator": "Kendu moderatzaile baimena", "Refer a friend to Riot:": "Aipatu Riot lagun bati:", + "%(targetName)s rejected the invitation.": "%(targetName)s erabiltzaileak gonbidapena baztertu du.", "Reject invitation": "Baztertu gonbidapena", "Reject all %(invitedRooms)s invites": "Baztertu %(invitedRooms)s gelarako gonbidapen guztiak", "Rejoin": "Berriro elkartu", "Remote addresses for this room:": "Gela honen urruneko helbideak:", "Remove Contact Information?": "Kendu kontaktuaren informazioa?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s erabiltzaileak bere pantaila-izena kendu du (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s erabiltzaileak bere profileko argazkia kendu du.", "Remove %(threePid)s?": "Kendu %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s erabiltzaileak VoIP konferentzia bat eskatu du.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Oraingoz pasahitza aldatzeak gailu guztietako muturretik muturrerako zifratze-gakoak berrezarriko ditu, eta ezin izango dituzu zifratutako txatetako historialak irakurri ez badituzu aurretik zure gelako gakoak esportatzen eta aldaketa eta gero berriro inportatzen.", "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Une honetan egiaztatu gabeko gailuak blokeatzen ari zara, gailu hauetara mezuak bidali ahal izateko egiaztatu behar dituzu.", "Results from DuckDuckGo": "DuckDuckGo bilatzaileko emaitzak", @@ -345,11 +370,14 @@ "Send anyway": "Bidali hala ere", "Send Invites": "Bidali gonbidapenak", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s erabiltzaileak irudi bat bidali du.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %(targetDisplayName)s erbiltzaileari.", "Server error": "Zerbitzari-errorea", "Server may be unavailable or overloaded": "Zerbitzaria eskuraezin edo gainezka egon daiteke", "Server may be unavailable, overloaded, or search timed out :(": "Zerbitzaria eskuraezin edo gainezka egon daiteke, edo bilaketaren denbora muga gainditu da :(", "Server may be unavailable, overloaded, or the file too big": "Zerbitzaria eskuraezin edo gainezka egon daiteke edo fitxategia handiegia da", "Server unavailable, overloaded, or something else went wrong.": "Zerbitzaria eskuraezin edo gainezka egon daiteke edo zerbaitek huts egin du.", + "%(senderName)s set a profile picture.": "%(senderName)s erabiltzaileak profileko argazkia ezarri du.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s erabiltzaileak %(displayName)s ezarri du pantaila izen gisa.", "Show panel": "Erakutsi panela", "Show Text Formatting Toolbar": "Erakutsi testu-formatuaren tresna-barra", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Erakutsi denbora-zigiluak 12 ordutako formatuan (adib. 2:30pm)", @@ -382,9 +410,11 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Gela honen denbora-lerroko puntu zehatz bat kargatzen saiatu da, baina ezin izan da aurkitu.", "Turn Markdown off": "Desaktibatu Markdown", "Turn Markdown on": "Aktibatu Markdown", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s erabiltzaileak muturretik muturrerako (%(algorithm)s algoritmoa) zifratzea aktibatu du.", "Unable to add email address": "Ezin izan da e-mail helbidea gehitu", "Unable to remove contact information": "Ezin izan da kontaktuaren informazioa kendu", "Unable to verify email address.": "Ezin izan da e-mail helbidea egiaztatu.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s erabiltzaileak debekua kendu dio %(targetName)s erabiltzaileari.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Ezin izan da ziurtatu gonbidapen hau zure kontuarekin lotutako helbide batera bidali zela.", "Unable to capture screen": "Ezin izan da pantaila-argazkia atera", "Unable to enable Notifications": "Ezin izan dira jakinarazpenak gaitu", @@ -432,6 +462,7 @@ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ABISUA: GAKOEN EGIAZTAKETAK HUTS EGIN DU! %(userId)s erabiltzailearen %(deviceId)s gailuaren sinadura-gakoa \"%(fprint)s\" da, eta ez dator bat emandako \"%(fingerprint)s\" gakoarekin. Honek inor komunikazioa antzematen ari dela esan nahi lezake!", "Who would you like to add to this room?": "Nor gehitu nahi duzu gela honetara?", "Who would you like to communicate with?": "Norekin komunikatu nahi duzu?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s erabiltzaileak atzera bota du %(targetName)s erabiltzailearen gonbidapena.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Gonbidapen hau <acceptText>onartu</acceptText> ala <declineText>ukatu</declineText> nahi duzu?", "You already have existing direct chats with this user:": "Baduzu jada txat zuzen bat erabiltzaile honekin:", "You are already in a call.": "Bazaude dei batean.", @@ -572,6 +603,9 @@ "Start chatting": "Hasi txateatzen", "Start Chatting": "Hasi txateatzen", "Click on the button below to start chatting!": "Egin klik beheko botoian txateatzen hasteko!", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s erabiltzaileak gelaren abatarra aldatu du beste honetara: <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s erabiltzaileak gelaren abatarra ezabatu du.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s erabiltzaileak %(roomName)s gelaren abatarra aldatu du", "Username available": "Erabiltzaile-izena eskuragarri dago", "Username not available": "Erabiltzaile-izena ez dago eskuragarri", "Something went wrong!": "Zerk edo zerk huts egin du!", @@ -627,8 +661,11 @@ "Automatically replace plain text Emoji": "Automatikoki ordezkatu Emoji testu soila", "Failed to upload image": "Irudia igotzeak huts egin du", "Hide avatars in user and room mentions": "Ezkutatu abatarrak erabiltzaile eta gelen aipamenetan", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s trepeta gehitu du %(senderName)s erabiltzaileak", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s trepeta kendu du %(senderName)s erabiltzaileak", "Verifies a user, device, and pubkey tuple": "Erabiltzaile, gailu eta gako publiko multzoa egiaztatzen du", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot egiaztaketa orain ez dago eskuragarri mahaigainean - erabili <a>web nabigatzailea</a>", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s trepeta aldatu du %(senderName)s erabiltzaileak", "Copied!": "Kopiatuta!", "Failed to copy": "Kopiak huts egin du", "Cancel": "Utzi", @@ -678,6 +715,7 @@ "Failed to invite users to %(groupId)s": "Huts egin du erabiltzaileak %(groupId)s komunitatera gonbidatzean", "Failed to add the following rooms to %(groupId)s:": "Huts egin du honako gela hauek %(groupId)s komunitatera gehitzean:", "Restricted": "Mugatua", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s erabiltzaileak gelan finkatutako mezuak aldatu ditu.", "%(names)s and %(count)s others are typing|other": "%(names)s eta beste %(count)s idazten ari dira", "%(names)s and %(count)s others are typing|one": "%(names)s eta beste bat idazten ari dira", "Send": "Bidali", @@ -917,6 +955,7 @@ "Community IDs cannot not be empty.": "Komunitate ID-ak ezin dira hutsik egon.", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Erakutsi gailuak</showDevicesText>, <sendAnywayText>bidali hala ere</sendAnywayText> edo <cancelText>ezeztatu</cancelText>.", "<a>In reply to</a> <pill>": "<a>honi erantzunez:</a> <pill>", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s erabiltzaileak bere pantaila izena aldatu du %(displayName)s izatera.", "Failed to set direct chat tag": "Huts egin du txat zuzenarenaren etiketa jartzean", "Failed to remove tag %(tagName)s from room": "Huts egin du %(tagName)s etiketa gelatik kentzean", "Failed to add tag %(tagName)s to room": "Huts egin du %(tagName)s etiketa gelara gehitzean", @@ -1156,44 +1195,5 @@ "COPY": "KOPIATU", "Share Message": "Partekatu mezua", "No Audio Outputs detected": "Ez da audio irteerarik antzeman", - "Audio Output": "Audio irteera", - "<target> accepted the invitation for %(displayName)s.": "<target> erabiltzaileak %(displayName)s erabiltzailearen gonbidapena onartu du.", - "<target> accepted an invitation.": "<target> erabiltzaileak gonbidapena onartu du.", - "<sender> requested a VoIP conference.": "<sender> erabiltzaileak VoIP konferentzia bat eskatu du.", - "<sender> invited <target>.": "<sender> erabiltzaileak <target> gonbidatu du.", - "<sender> banned <target>.": "<sender> erabiltzaileak <target> debekatu du.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> erabiltzaileak bere pantaila izena aldatu du <displayName> izatera.", - "<sender> set their display name to <displayName>.": "<sender> erabiltzaileak <displayName> ezarri du pantaila izen gisa.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> erabiltzaileak bere pantaila-izena kendu du (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> erabiltzaileak bere profileko argazkia kendu du.", - "<sender> changed their profile picture.": "<sender> erabiltzaileak bere profileko argazkia aldatu du.", - "<sender> set a profile picture.": "<sender> erabiltzaileak profileko argazkia ezarri du.", - "<target> joined the room.": "<target> erabiltzailea gelara elkartu da.", - "<target> rejected the invitation.": "<target> erabiltzaileak gonbidapena baztertu du.", - "<target> left the room.": "<target> erabiltzailea gelatik atera da.", - "<sender> unbanned <target>.": "<sender> erabiltzaileak debekua kendu dio <target> erabiltzaileari.", - "<sender> kicked <target>.": "<sender> erabiltzaileak <target> kanporatu du.", - "<sender> withdrew <target>'s invitation.": "<sender> erabiltzaileak atzera bota du <target> erabiltzailearen gonbidapena.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> erabiltzaileak mintzagaia aldatu du beste honetara: \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> erabiltzaileak gelaren izena aldatu du, orain %(roomName)s da.", - "<sender> changed the room avatar to <img/>": "<sender> erabiltzaileak gelaren abatarra aldatu du beste honetara: <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> erabiltzaileak %(roomName)s gelaren abatarra aldatu du", - "<sender> removed the room name.": "<sender> erabiltzaileak gelaren izena kendu du.", - "<sender> removed the room avatar.": "<sender> erabiltzaileak gelaren abatarra ezabatu du.", - "<sender> answered the call.": "<sender> erabiltzaileak deia erantzun du.", - "<sender> ended the call.": "<sender> erabiltzaileak deia amaitu du.", - "<sender> placed a %(callType)s call.": "<sender> erabiltzaileak %(callType)s dei bat hasi du.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %(targetDisplayName)s erbiltzaileari.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, gonbidapena egiten zaienetik.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat, elkartzen direnetik.", - "<sender> made future room history visible to all room members.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du gelako kide guztientzat.", - "<sender> made future room history visible to anyone.": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du edonorentzat.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du ezezagunentzat (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> erabiltzaileak muturretik muturrerako (%(algorithm)s algoritmoa) zifratzea aktibatu du.", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> %(fromPowerLevel)s mailatik %(toPowerLevel)s mailara", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> erabiltzaileak botere mailaz aldatu du %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> erabiltzaileak gelan finkatutako mezuak aldatu ditu.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s trepeta aldatu du <sender> erabiltzaileak", - "%(widgetName)s widget added by <sender>": "%(widgetName)s trepeta gehitu du <sender> erabiltzaileak", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s trepeta kendu du <sender> erabiltzaileak" + "Audio Output": "Audio irteera" } diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 0c207bb505..d39091b619 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -46,6 +46,7 @@ "%(items)s and %(lastItem)s": "%(items)s ja %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s ja %(lastPerson)s kirjoittavat", "A new password must be entered.": "Sinun täytyy syöttää uusi salasana.", + "%(senderName)s answered the call.": "%(senderName)s vastasi puheluun.", "An error has occurred.": "Virhe.", "Anyone": "Kaikki", "Anyone who knows the room's link, apart from guests": "Kaikki jotka tietävät huoneen osoitteen, paitsi vieraat", @@ -56,10 +57,14 @@ "Are you sure you want to upload the following files?": "Oletko varma että haluat ladata seuraavat tiedostot?", "Attachment": "Liite", "Autoplay GIFs and videos": "Toista automaattisesti GIF-animaatiot ja videot", + "%(senderName)s banned %(targetName)s.": "%(senderName)s antoi porttikiellon käyttäjälle %(targetName)s.", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Yhdistäminen kotipalvelimeen epäonnistui. Ole hyvä ja tarkista verkkoyhteytesi ja varmista että <a>kotipalvelimen SSL-sertifikaatti</a> on luotettu, ja että jokin selaimen lisäosa ei estä pyyntöjen lähettämisen.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Yhdistäminen kotipalveluun HTTP:n avulla ei ole mahdollista kun selaimen osoitepalkissa on HTTPS URL. Käytä joko HTTPS tai <a>salli turvattomat skriptit</a>.", "Can't load user settings": "Käyttäjäasetusten lataaminen epäonnistui", "Change Password": "Muuta salasana", + "%(senderName)s changed their profile picture.": "%(senderName)s muutti profiilikuvansa.", + "%(targetName)s accepted an invitation.": "%(targetName)s hyväksyi kutsun.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s hyväksyi kutsun käyttäjän %(displayName)s puolesta.", "Account": "Tili", "and %(count)s others...|other": "ja %(count)s lisää...", "and %(count)s others...|one": "ja yksi lisää...", @@ -289,9 +294,11 @@ "Uploading %(filename)s and %(count)s others|zero": "Ladataan %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Ladataan %(filename)s ja %(count)s muuta", "Blacklisted": "Estetyt", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s muuti huoneen nimeksi %(roomName)s.", "Drop here to tag %(section)s": "Pudota tähän tägätäksesi %(section)s", "Enable automatic language detection for syntax highlighting": "Ota automaattinen kielentunnistus käyttöön koodin väritystä varten", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Salatut viestit eivät näy ohjelmissa joissa salaus ei ole vielä implementoitu", + "%(senderName)s ended the call.": "%(senderName)s lopetti puhelun.", "Guest access is disabled on this Home Server.": "Vierailijat on estetty tällä kotipalvelimella.", "Guests cannot join this room even if explicitly invited.": "Vierailijat eivät voi liittyä tähän huoneeseen vaikka heidät on eksplisiittisesti kutsuttu.", "Hangup": "Lopeta", @@ -299,11 +306,15 @@ "Historical": "Vanhat", "Home": "Etusivu", "Invalid file%(extra)s": "Virheellinen tiedosto%(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s kutsui käyttäjän %(targetName)s.", "%(displayName)s is typing": "%(displayName)s kirjoittaa", "none": "Ei mikään", "No devices with registered encryption keys": "Ei laitteita joilla rekisteröityjä salausavaimia", "No users have specific privileges in this room": "Kellään käyttäjällä ei ole erityisiä oikeuksia", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s soitti %(callType)spuhelun.", "Remove %(threePid)s?": "Poista %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s pyysi VoIP konferenssia.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s asetti näyttönimekseen %(displayName)s.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Tiedosto ‘%(fileName)s’ ylittää tämän kotipalvelimen maksimitiedostokoon", "The file '%(fileName)s' failed to upload": "Tiedoston ‘%(fileName)s’ lataaminen epäonnistui", "This Home Server does not support login using email address.": "Kotipalvelin ei tue kirjatumista sähköpostiosoitteen avulla.", @@ -316,6 +327,7 @@ "To link to a room it must have <a>an address</a>.": "Linkittääksesi tähän huoneseen sillä on oltava <a>osoite</a>.", "Turn Markdown off": "Ota Markdown pois käytöstä", "Turn Markdown on": "Ota Markdown käyttöön", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s otti päästä päähän-salauksen käyttöön (algoritmi %(algorithm)s).", "Username invalid: %(errMessage)s": "Virheellinen käyttäjänimi: %(errMessage)s", "Users": "Käyttäjät", "Verification": "Varmennus", @@ -425,6 +437,7 @@ "Verify device": "Varmenna laite", "I verify that the keys match": "Totean että avaimet vastaavat toisiaan", "Unable to restore session": "Istunnon palautus epäonnistui", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s poisti huoneen nimen.", "Changes to who can read history will only apply to future messages in this room": "Muutokset koskien ketkä voivat lukea historian koskevat vain uusia viestejä", "<a>Click here</a> to join the discussion!": "<a>Paina tästä</a> liittyäksesi keskusteluun", "%(count)s new messages|one": "%(count)s uusi viesti", @@ -438,6 +451,9 @@ "Error: Problem communicating with the given homeserver.": "Virhe: Ongelma yhteydenpidossa kotipalvelimeen.", "Existing Call": "Käynnissä oleva puhelu", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Liity käyttäen <voiceText>ääntä</voiceText> tai <videoText>videota</videoText>.", + "%(targetName)s joined the room.": "%(targetName)s liittyi huoneeseen.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s poisti käyttäjän %(targetName)s huoneesta.", + "%(targetName)s left the room.": "%(targetName)s poistui huoneesta.", "Publish this room to the public in %(domain)s's room directory?": "Julkaise tämä huone domainin %(domain)s huoneluettelossa?", "Missing room_id in request": "room_id puuttuu kyselystä", "Missing user_id in request": "user_id puuttuu kyselystä", @@ -447,7 +463,9 @@ "Press <StartChatButton> to start a chat with someone": "Paina <StartChatButton>", "Revoke Moderator": "Poista moderaattorioikeudet", "Refer a friend to Riot:": "Suosittele Riot ystävälle:", + "%(targetName)s rejected the invitation.": "%(targetName)s hylkäsi kutsun.", "Remote addresses for this room:": "Tämän huoneen etäosoitteet:", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s poisti näyttönimensä (%(oldDisplayName)s).", "Riot does not have permission to send you notifications - please check your browser settings": "Riotilla ei ole oikeuksia lähettää sinulle ilmoituksia. Ole hyvä ja tarkista selaimen asetukset", "Riot was not given permission to send notifications - please try again": "Riotilla ei saannut oikeuksia lähettää ilmoituksia. Ole hyvä ja yritä uudelleen", "Room %(roomId)s not visible": "Huone %(roomId)s ei ole näkyvissä", @@ -456,6 +474,7 @@ "Seen by %(userName)s at %(dateTime)s": "Käyttäjän %(userName)s näkemä %(dateTime)s", "Send Reset Email": "Lähetä salasanan palautusviesti", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s lähetti kuvan.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s lähetti kutsun käyttäjälle %(targetDisplayName)s liittyäkseen huoneeseen.", "Server may be unavailable or overloaded": "Palvelin saattaa olla saavuttamattomissa tai ylikuormitettu", "Show Text Formatting Toolbar": "Näytä tekstinmuotoilupalkki", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Näytä aikaleimat 12h muodossa (esim. 2:30pm)", @@ -471,6 +490,7 @@ "Unable to remove contact information": "Yhteystietojen poistaminen epäonnistui", "Unable to verify email address.": "Sähköpostin varmentaminen epäonnistui.", "Unbans user with given id": "Poistaa porttikiellon annetun ID:n omaavalta käyttäjältä", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s poisti porttikiellon käyttäjältä %(targetName)s.", "Unable to capture screen": "Ruudun kaappaus epäonnistui", "Unable to enable Notifications": "Ilmoitusten käyttöönotto epäonnistui", "Unable to load device list": "Laitelistan lataaminen epäonnistui", @@ -485,6 +505,7 @@ "User ID": "Käyttäjätunniste", "User Interface": "Käyttöliittymä", "User name": "Käyttäjänimi", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s asetti aiheeksi \"%(topic)s\".", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Salasanan muuttaminen uudelleenalustaa myös päästä päähän-salausavaimet kaikilla laitteilla, jolloin vanhojen viestien lukeminen ei ole enään mahdollista, ellet ensin vie huoneavaimet ja tuo ne takaisin jälkeenpäin. Tämä tulee muuttumaan tulevaisuudessa.", "Define the power level of a user": "Määritä käyttäjän oikeustaso", "Failed to change power level": "Oikeustason muuttaminen epäonnistui", @@ -510,6 +531,7 @@ "(could not connect media)": "(mediaa ei voitu yhdistää)", "WARNING: Device already verified, but keys do NOT MATCH!": "VAROITUS: Laite on jo varmennettu mutta avaimet eivät vastaa toisiaan!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VAROITUS: AVAIMEN VARMENNUS EPÄONNISTUI! Käyttäjän %(userId)s ja laitteen %(deviceId)s allekirjoitusavain on \"%(fprint)s\" joka ei vastaa annettua avainta \"%(fingerprint)s\". Tämä saattaa tarkoittaa että viestintäsi siepataan!", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s veti takaisin käyttäjän %(targetName)s kutsun.", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Et ole vielä missään huoneessa! Paina <CreateRoomButton> luodaksesi huoneen tai <RoomDirectoryButton> selatakseski hakemistoa", "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Sinut on kirjattu ulos kaikista laitteista etkä enää saa Push-ilmoituksia. Jotta saisit jälleen ilmoituksia pitää sinun jälleen kirjautua sisään jokaisella laitteella", "You may wish to login with a different account, or add this email to this account.": "Haluat ehkä kirjautua toiseen tiliin tai lisätä tämä sähköpostiosoite tähän tiliin.", @@ -608,6 +630,14 @@ "Restricted": "Rajoitettu", "You are now ignoring %(userId)s": "Et enää huomioi käyttäjää %(userId)s", "You are no longer ignoring %(userId)s": "Huomioit jälleen käyttäjän %(userId)s", + "%(senderName)s removed their profile picture.": "%(senderName)s poisti profiilikuvansa.", + "%(senderName)s set a profile picture.": "%(senderName)s asetti profiilikuvan.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s muutti tulevat viestit näkyviksi kaikille huoneen jäsenille, alkaen kutsusta huoneeseen.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille, liittymisestä asti.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s teki tulevan huonehistorian näkyväksi tuntemattomalle (%(visibility)s).", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s muutti tämän huoneen kiinnitetyt viestit.", "%(names)s and %(count)s others are typing|other": "%(names)s ja %(count)s muuta kirjoittavat", "%(names)s and %(count)s others are typing|one": "%(names)s ja yksi muu kirjoittvat", "Message Pinning": "Kiinnitetyt viestit", @@ -672,6 +702,9 @@ "Invalid community ID": "Virheellinen yhteistötunniste", "'%(groupId)s' is not a valid community ID": "'%(groupId)s' on virheellinen yhteisötunniste", "New community ID (e.g. +foo:%(localDomain)s)": "Uusi yhteisötunniste (esim. +foo:%(localDomain)s)", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s muutti huoneen %(roomName)s avatarin", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s poisti huoneen avatarin.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s vaihtoi huoneen kuvaksi <img/>", "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?": "Sinut ohjataan kolmannen osapuolen sivustolle jotta voit autentikoida tilisi käyttääksesi %(integrationsUrl)s. Haluatko jatkaa?", "Message removed by %(userId)s": "Käyttäjän %(userId)s poistama viesti", "Message removed": "Viesti poistettu", @@ -781,6 +814,11 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", "Ignored user": "Estetyt käyttäjät", "Unignored user": "Sallitut käyttäjät", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s tasolta %(fromPowerLevel)s tasolle %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s muutettiin tehotasoa %(powerLevelDiffText)s.", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s pienoisohjelmaa muokannut %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s pienoisohjelman lisännyt %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s pienoisohjelman poistanut %(senderName)s", "Send": "Lähetä", "Delete %(count)s devices|other": "Poista %(count)s laitetta", "Delete %(count)s devices|one": "Poista laite", @@ -1027,43 +1065,5 @@ "Collapse panel": "Piilota paneeli", "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!": "Nykyisellä selaimellasi ohjelman ulkonäkö voi olla aivan virheellinen, ja jotkut ominaisuudet eivät saata toimia. Voit jatkaa jos haluat kokeilla mutta et voi odottaa saavasi apua mahdollisesti ilmeneviin ongelmiin!", "Checking for an update...": "Tarkistetaan päivityksen saatavuutta...", - "There are advanced notifications which are not shown here": "On kehittyneitä ilmoituksia joita ei näytetä tässä", - "<target> accepted the invitation for %(displayName)s.": "<target> hyväksyi kutsun käyttäjän %(displayName)s puolesta.", - "<target> accepted an invitation.": "<target> hyväksyi kutsun.", - "<sender> requested a VoIP conference.": "<sender> pyysi VoIP konferenssia.", - "<sender> invited <target>.": "<sender> kutsui käyttäjän <target>.", - "<sender> banned <target>.": "<sender> antoi porttikiellon käyttäjälle <target>.", - "<sender> set their display name to <displayName>.": "<sender> asetti näyttönimekseen <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> poisti näyttönimensä (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> poisti profiilikuvansa.", - "<sender> changed their profile picture.": "<sender> muutti profiilikuvansa.", - "<sender> set a profile picture.": "<sender> asetti profiilikuvan.", - "<target> joined the room.": "<target> liittyi huoneeseen.", - "<target> rejected the invitation.": "<target> hylkäsi kutsun.", - "<target> left the room.": "<target> poistui huoneesta.", - "<sender> unbanned <target>.": "<sender> poisti porttikiellon käyttäjältä <target>.", - "<sender> kicked <target>.": "<sender> poisti käyttäjän <target> huoneesta.", - "<sender> withdrew <target>'s invitation.": "<sender> veti takaisin käyttäjän <target> kutsun.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> asetti aiheeksi \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> muuti huoneen nimeksi %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> muutti huoneen %(roomName)s avatarin", - "<sender> changed the room avatar to <img/>": "<sender> vaihtoi huoneen kuvaksi <img/>", - "<sender> removed the room name.": "<sender> poisti huoneen nimen.", - "<sender> removed the room avatar.": "<sender> poisti huoneen avatarin.", - "<sender> answered the call.": "<sender> vastasi puheluun.", - "<sender> ended the call.": "<sender> lopetti puhelun.", - "<sender> placed a %(callType)s call.": "<sender> soitti %(callType)spuhelun.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> lähetti kutsun käyttäjälle %(targetDisplayName)s liittyäkseen huoneeseen.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> muutti tulevat viestit näkyviksi kaikille huoneen jäsenille, alkaen kutsusta huoneeseen.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille, liittymisestä asti.", - "<sender> made future room history visible to all room members.": "<sender> teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille.", - "<sender> made future room history visible to anyone.": "<sender> teki tulevan huonehistorian näkyväksi kaikille.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> teki tulevan huonehistorian näkyväksi tuntemattomalle (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> otti päästä päähän-salauksen käyttöön (algoritmi %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> tasolta %(fromPowerLevel)s tasolle %(toPowerLevel)s", - "<sender> changed the pinned messages for the room.": "<sender> muutti tämän huoneen kiinnitetyt viestit.", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> muutettiin tehotasoa %(powerLevelDiffText)s.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s pienoisohjelmaa muokannut <sender>", - "%(widgetName)s widget added by <sender>": "%(widgetName)s pienoisohjelman lisännyt <sender>", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s pienoisohjelman poistanut <sender>" + "There are advanced notifications which are not shown here": "On kehittyneitä ilmoituksia joita ei näytetä tässä" } diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 8c6e6c2998..8843ad89ca 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -12,6 +12,7 @@ "Enable encryption": "Activer le chiffrement", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Les messages chiffrés ne seront pas visibles dans les clients qui n’implémentent pas encore le chiffrement", "Encrypted room": "Salon chiffré", + "%(senderName)s ended the call.": "%(senderName)s a terminé l’appel.", "End-to-end encryption information": "Informations sur le chiffrement de bout en bout", "End-to-end encryption is in beta and may not be reliable": "Le chiffrement de bout en bout est en bêta et risque de ne pas être fiable", "Enter Code": "Saisir le code", @@ -32,6 +33,7 @@ "Notifications": "Notifications", "Settings": "Paramètres", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un SMS a été envoyé à +%(msisdn)s. Merci de saisir le code de vérification qu'il contient", + "%(targetName)s accepted an invitation.": "%(targetName)s a accepté une invitation.", "Account": "Compte", "Add email address": "Ajouter une adresse e-mail", "Add phone number": "Ajouter un numéro de téléphone", @@ -50,6 +52,7 @@ "Are you sure you want to upload the following files?": "Voulez-vous vraiment envoyer les fichiers suivants ?", "Attachment": "Pièce jointe", "Autoplay GIFs and videos": "Jouer automatiquement les GIFs et les vidéos", + "%(senderName)s banned %(targetName)s.": "%(senderName)s a banni %(targetName)s.", "Ban": "Bannir", "Banned users": "Utilisateurs bannis", "Bans user with given id": "Bannit l'utilisateur à partir de son identifiant", @@ -58,6 +61,10 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Impossible de se connecter au serveur d'accueil en HTTP si l'URL dans la barre de votre explorateur est en HTTPS. Utilisez HTTPS ou <a>activez le support des scripts non-vérifiés</a>.", "Can't load user settings": "Impossible de charger les paramètres de l'utilisateur", "Change Password": "Changer le mot de passe", + "%(senderName)s changed their profile picture.": "%(senderName)s a changé son image de profil.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s a changé le rang de %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s a changé le nom du salon en %(roomName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s a changé le sujet du salon en \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Les changements de visibilité de l’historique de ce salon ne s’appliquent qu’aux futurs messages", "Changes your display nickname": "Change votre nom affiché", "Claimed Ed25519 fingerprint key": "Clé d'empreinte Ed25519 déclarée", @@ -107,9 +114,11 @@ "Failed to set display name": "Échec de l'enregistrement du nom affiché", "Failed to set up conference call": "Échec de l’établissement de la téléconférence", "Failed to toggle moderator status": "Échec de l’activation du statut de modérateur", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s a accepté l’invitation de %(displayName)s.", "Access Token:": "Jeton d’accès :", "Always show message timestamps": "Toujours afficher l'heure des messages", "Authentication": "Authentification", + "%(senderName)s answered the call.": "%(senderName)s a répondu à l’appel.", "An error has occurred.": "Une erreur est survenue.", "Email": "E-mail", "Failed to unban": "Échec de la révocation du bannissement", @@ -122,6 +131,7 @@ "Forget room": "Oublier le salon", "Forgot your password?": "Mot de passe oublié ?", "For security, this session has been signed out. Please sign in again.": "Par mesure de sécurité, la session a expiré. Merci de vous authentifier à nouveau.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s", "Hangup": "Raccrocher", "Hide read receipts": "Cacher les accusés de lecture", "Hide Text Formatting Toolbar": "Cacher la barre de formatage de texte", @@ -135,6 +145,7 @@ "Invalid alias format": "Format d'alias non valide", "Invalid address format": "Format d'adresse non valide", "Invalid Email Address": "Adresse e-mail non valide", + "%(senderName)s invited %(targetName)s.": "%(senderName)s a invité %(targetName)s.", "Invite new room members": "Inviter de nouveaux membres", "Invited": "Invités", "Invites": "Invitations", @@ -144,15 +155,23 @@ "%(displayName)s is typing": "%(displayName)s écrit", "Sign in with": "Se connecter avec", "Join Room": "Rejoindre le salon", + "%(targetName)s joined the room.": "%(targetName)s a rejoint le salon.", "Joins room with given alias": "Rejoint le salon avec l'alias renseigné", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s a exclu %(targetName)s.", "Kick": "Exclure", "Kicks user with given id": "Exclut l'utilisateur à partir de son identifiant", "Labs": "Laboratoire", "Leave room": "Quitter le salon", + "%(targetName)s left the room.": "%(targetName)s a quitté le salon.", "Local addresses for this room:": "Adresses locales pour ce salon :", "Logged in as:": "Identifié en tant que :", "Logout": "Se déconnecter", "Low priority": "Priorité basse", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont été invités.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont rejoint.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s a rendu l'historique visible à tous les membres du salon.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s a rendu l'historique visible à n'importe qui.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s a rendu l'historique visible à inconnu (%(visibility)s).", "Manage Integrations": "Gestion des intégrations", "Markdown is disabled": "Le formatage Markdown est désactivé", "Markdown is enabled": "Le formatage Markdown est activé", @@ -201,6 +220,7 @@ "Mute": "Mettre en sourdine", "No users have specific privileges in this room": "Aucun utilisateur n’a de privilège spécifique dans ce salon", "olm version:": "version de olm :", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s a passé un appel %(callType)s.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Veuillez vérifier vos e-mails et cliquer sur le lien que vous avez reçu. Puis cliquez sur continuer.", "Power level must be positive integer.": "Le niveau d'autorité doit être un entier positif.", "Privacy warning": "Alerte de confidentialité", @@ -209,9 +229,13 @@ "Reason": "Raison", "Revoke Moderator": "Révoquer le modérateur", "Refer a friend to Riot:": "Recommander Riot à un ami :", + "%(targetName)s rejected the invitation.": "%(targetName)s a rejeté l’invitation.", "Reject invitation": "Rejeter l'invitation", "Remove Contact Information?": "Supprimer les informations du contact ?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s a supprimé son nom affiché (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s a supprimé son image de profil.", "Remove %(threePid)s?": "Supprimer %(threePid)s ?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s a demandé une téléconférence audio.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Pour le moment, réinitialiser le mot de passe va réinitialiser les clés de chiffrement sur tous les appareils, rendant l’historique des salons chiffrés illisible, à moins que vous exportiez d'abord les clés de salon puis que vous les ré-importiez après. Cela sera amélioré prochainement.", "Return to login screen": "Retourner à l’écran de connexion", "Riot does not have permission to send you notifications - please check your browser settings": "Riot n’a pas la permission de vous envoyer des notifications - merci de vérifier les paramètres de votre navigateur", @@ -230,6 +254,7 @@ "Send Invites": "Envoyer des invitations", "Send Reset Email": "Envoyer l'e-mail de réinitialisation", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s a envoyé une image.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s a invité %(targetDisplayName)s à rejoindre le salon.", "Server error": "Erreur du serveur", "Server may be unavailable or overloaded": "Le serveur semble être inaccessible ou surchargé", "Server may be unavailable, overloaded, or search timed out :(": "Le serveur semble être inaccessible, surchargé ou la recherche a expiré :(", @@ -237,6 +262,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Le serveur semble être indisponible, surchargé ou vous avez rencontré un problème.", "Server unavailable, overloaded, or something else went wrong.": "Le serveur semble être inaccessible, surchargé ou quelque chose s'est mal passé.", "Session ID": "Identifiant de session", + "%(senderName)s set a profile picture.": "%(senderName)s a défini une image de profil.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a défini son nom affiché comme %(displayName)s.", "Show panel": "Dévoiler le panneau", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Afficher l’heure au format am/pm (par ex. 2:30pm)", "Signed Out": "Déconnecté", @@ -271,10 +298,12 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Un instant donné de la chronologie n’a pu être chargé car il n’a pas pu être trouvé.", "Turn Markdown off": "Désactiver le formatage ’Markdown’", "Turn Markdown on": "Activer le formatage ’Markdown’", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s a activé le chiffrement de bout-en-bout (algorithme %(algorithm)s).", "Unable to add email address": "Impossible d'ajouter l'adresse e-mail", "Unable to remove contact information": "Impossible de supprimer les informations du contact", "Unable to verify email address.": "Impossible de vérifier l’adresse e-mail.", "Unban": "Révoquer le bannissement", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s a révoqué le bannissement de %(targetName)s.", "Unable to capture screen": "Impossible de capturer l'écran", "Unable to enable Notifications": "Impossible d'activer les notifications", "Unable to load device list": "Impossible de charger la liste des appareils", @@ -307,6 +336,7 @@ "Who can read history?": "Qui peut lire l'historique ?", "Who would you like to add to this room?": "Qui voulez-vous ajouter à ce salon ?", "Who would you like to communicate with?": "Avec qui voulez-vous communiquer ?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s a annulé l’invitation de %(targetName)s.", "You are already in a call.": "Vous avez déjà un appel en cours.", "You are trying to access %(roomName)s.": "Vous essayez d'accéder à %(roomName)s.", "You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.", @@ -375,6 +405,7 @@ "bullet": "liste à puces", "numbullet": "liste numérotée", "Please select the destination room for this message": "Merci de sélectionner le salon de destination pour ce message", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s a supprimé le nom du salon.", "Analytics": "Collecte de données", "Riot collects anonymous analytics to allow us to improve the application.": "Riot collecte des données anonymes qui nous permettent d’améliorer l’application.", "Passphrases must match": "Les phrases de passe doivent être identiques", @@ -454,6 +485,9 @@ "Options": "Options", "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?": "Vous êtes sur le point d’accéder à un site tiers afin de pouvoir vous identifier pour utiliser %(integrationsUrl)s. Voulez-vous continuer ?", "Removed or unknown message type": "Type de message inconnu ou supprimé", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s a changé l’avatar du salon en <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s a supprimé l'avatar du salon.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s a changé l’avatar de %(roomName)s", "Device already verified!": "Appareil déjà vérifié !", "Export": "Exporter", "Guest access is disabled on this Home Server.": "L’accès en tant que visiteur est désactivé sur ce serveur d'accueil.", @@ -621,6 +655,8 @@ "Failed to upload image": "Impossible d'envoyer l'image", "Hide avatars in user and room mentions": "Masquer les avatars dans les mentions d'utilisateur et de salon", "Do you want to load widget from URL:": "Voulez-vous charger le widget depuis l’URL :", + "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s ajouté par %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s supprimé par %(senderName)s", "Publish this room to the public in %(domain)s's room directory?": "Publier ce salon dans le répertoire de salons public de %(domain)s ?", "Integrations Error": "Erreur d'intégration", "Cannot add any more widgets": "Impossible d'ajouter plus de widgets", @@ -631,6 +667,7 @@ "Copied!": "Copié !", "Failed to copy": "Échec de la copie", "Verifies a user, device, and pubkey tuple": "Vérifie un utilisateur, un appareil et une clé publique", + "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modifié par %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "La vérification robot n'est pas encore disponible pour le bureau - veuillez utiliser un <a>navigateur</a>", "Who would you like to add to this community?": "Qui souhaitez-vous ajouter à cette communauté ?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Attention : toute personne ajoutée à une communauté sera visible par tous ceux connaissant l'identifiant de la communauté", @@ -675,6 +712,7 @@ "To modify widgets in the room, you must be a": "Pour modifier les widgets, vous devez être un", "Banned by %(displayName)s": "Banni par %(displayName)s", "To send messages, you must be a": "Pour envoyer des messages, vous devez être un(e)", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s a changé les messages épinglés du salon.", "%(names)s and %(count)s others are typing|other": "%(names)s et %(count)s autres écrivent", "Jump to read receipt": "Aller à l'accusé de lecture", "World readable": "Lisible publiquement", @@ -917,6 +955,7 @@ "Community IDs cannot not be empty.": "Les identifiants de communauté ne peuvent pas être vides.", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Afficher les appareils</showDevicesText>, <sendAnywayText>envoyer quand même</sendAnywayText> ou <cancelText>annuler</cancelText>.", "<a>In reply to</a> <pill>": "<a>En réponse à</a> <pill>", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s a changé son nom affiché en %(displayName)s.", "Failed to set direct chat tag": "Échec de l'ajout de l'étiquette discussion directe", "Failed to remove tag %(tagName)s from room": "Échec de la suppression de l'étiquette %(tagName)s du salon", "Failed to add tag %(tagName)s to room": "Échec de l'ajout de l'étiquette %(tagName)s au salon", @@ -1156,44 +1195,5 @@ "Share Room Message": "Partager le message du salon", "Link to selected message": "Lien vers le message sélectionné", "COPY": "COPIER", - "Share Message": "Partager le message", - "<target> accepted the invitation for %(displayName)s.": "<target> a accepté l’invitation de %(displayName)s.", - "<target> accepted an invitation.": "<target> a accepté une invitation.", - "<sender> requested a VoIP conference.": "<sender> a demandé une téléconférence audio.", - "<sender> invited <target>.": "<sender> a invité <target>.", - "<sender> banned <target>.": "<sender> a banni <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> a changé son nom affiché en <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> a défini son nom affiché comme <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> a supprimé son nom affiché (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> a supprimé son image de profil.", - "<sender> changed their profile picture.": "<sender> a changé son image de profil.", - "<sender> set a profile picture.": "<sender> a défini une image de profil.", - "<target> joined the room.": "<target> a rejoint le salon.", - "<target> rejected the invitation.": "<target> a rejeté l’invitation.", - "<target> left the room.": "<target> a quitté le salon.", - "<sender> unbanned <target>.": "<sender> a révoqué le bannissement de <target>.", - "<sender> kicked <target>.": "<sender> a exclu <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> a annulé l’invitation de <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> a changé le sujet du salon en \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> a changé le nom du salon en %(roomName)s.", - "<sender> changed the room avatar to <img/>": "<sender> a changé l’avatar du salon en <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> a changé l’avatar de %(roomName)s", - "<sender> removed the room name.": "<sender> a supprimé le nom du salon.", - "<sender> removed the room avatar.": "<sender> a supprimé l'avatar du salon.", - "<sender> answered the call.": "<sender> a répondu à l’appel.", - "<sender> ended the call.": "<sender> a terminé l’appel.", - "<sender> placed a %(callType)s call.": "<sender> a passé un appel %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> a invité %(targetDisplayName)s à rejoindre le salon.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont été invités.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> a rendu l'historique visible à tous les membres du salon, depuis le moment où ils ont rejoint.", - "<sender> made future room history visible to all room members.": "<sender> a rendu l'historique visible à tous les membres du salon.", - "<sender> made future room history visible to anyone.": "<sender> a rendu l'historique visible à n'importe qui.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> a rendu l'historique visible à inconnu (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> a activé le chiffrement de bout-en-bout (algorithme %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s à %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> a changé le rang de %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> a changé les messages épinglés du salon.", - "%(widgetName)s widget modified by <sender>": "Widget %(widgetName)s modifié par <sender>", - "%(widgetName)s widget added by <sender>": "Widget %(widgetName)s ajouté par <sender>", - "%(widgetName)s widget removed by <sender>": "Widget %(widgetName)s supprimé par <sender>" + "Share Message": "Partager le message" } diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index f61389ad9b..57d8301df6 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -111,14 +111,49 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "A chave de firma que proporcionou concorda coa chave de firma que recibiu do dispositivo %(deviceId)s de %(userId)s. Dispositivo marcado como verificado.", "Unrecognised command:": "Orde non recoñecida:", "Reason": "Razón", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceptou o convite para %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s aceptou o convite.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s solicitou unha conferencia VoIP.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou a %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s bloqueou a %(targetName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s estableceu o seu nome público a %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s eliminou o seu nome público (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s eliminou a súa imaxe de perfil.", + "%(senderName)s changed their profile picture.": "%(senderName)s cambiou a súa imaxe de perfil.", + "%(senderName)s set a profile picture.": "%(senderName)s estableceu a imaxe de perfil.", "VoIP conference started.": "Comezou a conferencia VoIP.", + "%(targetName)s joined the room.": "%(targetName)s uniuse a sala.", "VoIP conference finished.": "Rematou a conferencia VoIP.", + "%(targetName)s rejected the invitation.": "%(targetName)s rexeitou a invitación.", + "%(targetName)s left the room.": "%(targetName)s deixou a sala.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desbloqueou a %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s expulsou a %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s rexeitou o convite de %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s cambiou o asunto a \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s eliminou o nome da sala.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s cambiou o nome da sala a %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou unha imaxe.", "Someone": "Alguén", "(not supported by this browser)": "(non soportado por este navegador)", + "%(senderName)s answered the call.": "%(senderName)s respondeu a chamada.", "(could not connect media)": "(non puido conectar os medios)", "(no answer)": "(sen resposta)", "(unknown failure: %(reason)s)": "(fallo descoñecido: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s rematou a chamada.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s estableceu unha chamada %(callType)s.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou un convite a %(targetDisplayName)s para unirse a sala.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s fixo o historial da sala visible para todos os participantes, desde o punto en que foron convidadas.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s estableceu o historial futuro visible a todos os participantes, desde o punto en que se uniron.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s fixo visible para todos participantes o historial futuro da sala.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s fixo visible para calquera o historial futuro da sala.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s fixo visible o historial futuro da sala para descoñecidos (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s activou o cifrado de par-a-par (algoritmo %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s desde %(fromPowerLevel)s a %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s cambiou o nivel de autoridade a %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s cambiou as mensaxes fixadas para a sala.", + "%(widgetName)s widget modified by %(senderName)s": "O trebello %(widgetName)s modificado por %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "O trebello %(widgetName)s engadido por %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s eliminado por %(senderName)s", "%(displayName)s is typing": "%(displayName)s está a escribir", "%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras están a escribir", "%(names)s and %(count)s others are typing|one": "%(names)s e outra está a escribir", @@ -437,6 +472,9 @@ "Invalid file%(extra)s": "Ficheiro non válido %(extra)s", "Error decrypting image": "Fallo ao descifrar a imaxe", "Error decrypting video": "Fallo descifrando vídeo", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s cambiou o avatar para %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s eliminou o avatar da sala.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s cambiou o avatar da sala a <img/>", "Copied!": "Copiado!", "Failed to copy": "Fallo ao copiar", "Add an Integration": "Engadir unha integración", @@ -911,6 +949,7 @@ "<a>In reply to</a> <pill>": "<a>En resposta a</a> <pill>", "This room is not public. You will not be able to rejoin without an invite.": "Esta sala non é pública. Non poderá volver a ela sen un convite.", "This room is not showing flair for any communities": "Esta sala non mostra popularidade para as comunidades", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s cambiou o seu nome mostrado a %(displayName)s.", "Clear filter": "Quitar filtro", "Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo", "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", @@ -1156,44 +1195,5 @@ "Review terms and conditions": "Revise os termos e condicións", "No Audio Outputs detected": "Non se detectou unha saída de audio", "Audio Output": "Saída de audio", - "Try the app first": "Probe a aplicación primeiro", - "<target> accepted the invitation for %(displayName)s.": "<target> aceptou o convite para %(displayName)s.", - "<target> accepted an invitation.": "<target> aceptou o convite.", - "<sender> requested a VoIP conference.": "<sender> solicitou unha conferencia VoIP.", - "<sender> invited <target>.": "<sender> convidou a <target>.", - "<sender> banned <target>.": "<sender> bloqueou a <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> cambiou o seu nome mostrado a <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> estableceu o seu nome público a <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> eliminou o seu nome público (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> eliminou a súa imaxe de perfil.", - "<sender> changed their profile picture.": "<sender> cambiou a súa imaxe de perfil.", - "<sender> set a profile picture.": "<sender> estableceu a imaxe de perfil.", - "<target> joined the room.": "<target> uniuse a sala.", - "<target> rejected the invitation.": "<target> rexeitou a invitación.", - "<target> left the room.": "<target> deixou a sala.", - "<sender> unbanned <target>.": "<sender> desbloqueou a <target>.", - "<sender> kicked <target>.": "<sender> expulsou a <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> rexeitou o convite de <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> cambiou o asunto a \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> cambiou o nome da sala a %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> cambiou o avatar para %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> cambiou o avatar da sala a <img/>", - "<sender> removed the room name.": "<sender> eliminou o nome da sala.", - "<sender> removed the room avatar.": "<sender> eliminou o avatar da sala.", - "<sender> answered the call.": "<sender> respondeu a chamada.", - "<sender> ended the call.": "<sender> rematou a chamada.", - "<sender> placed a %(callType)s call.": "<sender> estableceu unha chamada %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> enviou un convite a %(targetDisplayName)s para unirse a sala.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> fixo o historial da sala visible para todos os participantes, desde o punto en que foron convidadas.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> estableceu o historial futuro visible a todos os participantes, desde o punto en que se uniron.", - "<sender> made future room history visible to all room members.": "<sender> fixo visible para todos participantes o historial futuro da sala.", - "<sender> made future room history visible to anyone.": "<sender> fixo visible para calquera o historial futuro da sala.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> fixo visible o historial futuro da sala para descoñecidos (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> activou o cifrado de par-a-par (algoritmo %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> desde %(fromPowerLevel)s a %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> cambiou o nivel de autoridade a %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> cambiou as mensaxes fixadas para a sala.", - "%(widgetName)s widget modified by <sender>": "O trebello %(widgetName)s modificado por <sender>", - "%(widgetName)s widget added by <sender>": "O trebello %(widgetName)s engadido por <sender>", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s eliminado por <sender>" + "Try the app first": "Probe a aplicación primeiro" } diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index d0a87414d1..2aea205a15 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -16,6 +16,8 @@ "unknown error code": "ismeretlen hibakód", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Elküldtük a szöveges üzenetet ide: +%(msisdn)s. Kérlek add meg az ellenőrző kódot ami benne van", "Accept": "Elfogad", + "%(targetName)s accepted an invitation.": "%(targetName)s elfogadta a meghívást.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s elfogadta a meghívást ide: %(displayName)s.", "Account": "Fiók", "Access Token:": "Elérési kulcs:", "Active call (%(roomName)s)": "Hívás folyamatban (%(roomName)s)", @@ -51,6 +53,7 @@ "and %(count)s others...|one": "és még egy...", "%(names)s and %(lastPerson)s are typing": "%(names)s és %(lastPerson)s írnak", "A new password must be entered.": "Új jelszót kell megadni.", + "%(senderName)s answered the call.": "%(senderName)s felvette a telefont.", "An error has occurred.": "Hiba történt.", "Anyone": "Bárki", "Anyone who knows the room's link, apart from guests": "A vendégeken kívül bárki aki ismeri a szoba link-jét", @@ -61,6 +64,7 @@ "Are you sure you want to upload the following files?": "Biztos feltöltöd ezeket a fájlokat?", "Attachment": "Csatolmány", "Autoplay GIFs and videos": "GIF-ek és videók automatikus lejátszása", + "%(senderName)s banned %(targetName)s.": "%(senderName)s kitiltotta őt: %(targetName)s.", "Ban": "Kitilt", "Banned users": "Kitiltott felhasználók", "Bans user with given id": "Kitiltja a felhasználót a megadott ID-vel", @@ -71,6 +75,11 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nem lehet csatlakozni a saját szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</a>.", "Can't load user settings": "A felhasználói beállítások nem tölthetők be", "Change Password": "Jelszó megváltoztatása", + "%(senderName)s changed their profile picture.": "%(senderName)s megváltoztatta a profil képét.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s megváltoztatta a hozzáférési szintjét erre: %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s megváltoztatta a szoba nevét erre: %(roomName)s.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s törölte a szoba nevét.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s megváltoztatta a témát erre \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Változtatások a napló olvasási jogosultságon csak a szoba új üzeneteire fog vonatkozni", "Changes your display nickname": "Becenév megváltoztatása", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Jelszó megváltoztatása jelenleg alaphelyzetbe állítja a titkosításnál használt kulcsokat minden készüléken, ezzel a régi titkosított üzenetek olvashatatlanok lesznek hacsak először nem mented ki a kulcsokat és újra betöltöd. A jövőben ezen javítunk.", @@ -141,6 +150,7 @@ "Encrypted room": "Titkosított szoba", "Encryption is enabled in this room": "Ebben a szobában a titkosítás be van kapcsolva", "Encryption is not enabled in this room": "Ebben a szobában a titkosítás nincs bekapcsolva", + "%(senderName)s ended the call.": "%(senderName)s befejezte a hívást.", "End-to-end encryption information": "Ponttól pontig való titkosítási információk", "End-to-end encryption is in beta and may not be reliable": "Ponttól pontig tartó titkosítás béta állapotú és lehet, hogy nem megbízható", "Enter Code": "Kód megadása", @@ -180,6 +190,7 @@ "Forgot your password?": "Elfelejtetted a jelszavad?", "For security, this session has been signed out. Please sign in again.": "A biztonság érdekében ez a kapcsolat le lesz bontva. Légy szíves jelentkezz be újra.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "A biztonság érdekében a kilépéskor a ponttól pontig való (E2E) titkosításhoz szükséges kulcsok törlésre kerülnek a böngészőből. Ha a régi üzeneteket továbbra is el szeretnéd olvasni, kérlek mentsed ki a szobákhoz tartozó kulcsot.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s : %(fromPowerLevel)s -> %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Vendég belépés tiltva van a Saját szerveren.", "Guests cannot join this room even if explicitly invited.": "Vendégek akkor sem csatlakozhatnak ehhez a szobához ha külön meghívók kaptak.", "Hangup": "Megszakít", @@ -202,6 +213,7 @@ "Invalid address format": "Hibás cím formátum", "Invalid Email Address": "Hibás e-mail cím", "Invalid file%(extra)s": "Hibás fájl%(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s meghívta: %(targetName)s.", "Invite new room members": "Új tagok meghívása", "Invited": "Meghívva", "Invites": "Meghívók", @@ -212,18 +224,26 @@ "Sign in with": "Belépés ezzel:", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Csatlakozás <voiceText>hang</voiceText>gal vagy <videoText>videó</videoText>val.", "Join Room": "Belépés a szobába", + "%(targetName)s joined the room.": "%(targetName)s belépett a szobába.", "Joins room with given alias": "A megadott becenévvel belépett a szobába", "Jump to first unread message.": "Ugrás az első olvasatlan üzenetre.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s kizárta: %(targetName)s.", "Kick": "Kirúg", "Kicks user with given id": "Az adott azonosítójú felhasználó kirúgása", "Labs": "Labor", "Last seen": "Utoljára láttuk", "Leave room": "Szoba elhagyása", + "%(targetName)s left the room.": "%(targetName)s elhagyta a szobát.", "Level:": "Szint:", "Local addresses for this room:": "A szoba helyi címe:", "Logged in as:": "Bejelentkezve mint:", "Logout": "Kilép", "Low priority": "Alacsony prioritás", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta meg van hívva.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta csatlakozott.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik minden szoba tagság.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik bárki.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik ismeretlen (%(visibility)s).", "Manage Integrations": "Integrációk kezelése", "Markdown is disabled": "Markdown kikapcsolva", "Markdown is enabled": "Markdown engedélyezett", @@ -262,6 +282,7 @@ "People": "Emberek", "Permissions": "Jogosultságok", "Phone": "Telefon", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s %(callType)s hívást kezdeményezett.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ellenőrizd az e-mail-edet és kattints a benne lévő linkre. Ha ez megvan, kattints a folytatásra.", "Power level must be positive integer.": "A szintnek pozitív egésznek kell lennie.", "Private Chat": "Privát csevegés", @@ -273,11 +294,15 @@ "Revoke Moderator": "Moderátor visszahívása", "Refer a friend to Riot:": "Ismerős meghívása a Riotba:", "Register": "Regisztráció", + "%(targetName)s rejected the invitation.": "%(targetName)s elutasította a meghívót.", "Reject invitation": "Meghívó elutasítása", "Rejoin": "Újracsatlakozás", "Remote addresses for this room:": "A szoba távoli címei:", "Remove Contact Information?": "Kapcsolat információk törlése?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s törölte a megjelenítési nevet (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s törölte a profil képét.", "Remove %(threePid)s?": "Töröl: %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s VoIP konferenciát kezdeményez.", "Results from DuckDuckGo": "Eredmények a DuckDuckGo-ból", "Return to login screen": "Vissza a bejelentkezési képernyőre", "Riot does not have permission to send you notifications - please check your browser settings": "Riotnak nincs jogosultsága értesítést küldeni neked - ellenőrizd a böngésző beállításait", @@ -301,6 +326,7 @@ "Send Invites": "Meghívók elküldése", "Send Reset Email": "Visszaállítási e-mail küldése", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s képet küldött.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.", "Server error": "Szerver hiba", "Server may be unavailable or overloaded": "A szerver elérhetetlen vagy túlterhelt", "Server may be unavailable, overloaded, or search timed out :(": "A szerver elérhetetlen, túlterhelt vagy a keresés túllépte az időkorlátot :(", @@ -308,6 +334,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "A szerver elérhetetlen, túlterhelt vagy hibára futott.", "Server unavailable, overloaded, or something else went wrong.": "A szerver elérhetetlen, túlterhelt vagy valami más probléma van.", "Session ID": "Kapcsolat azonosító", + "%(senderName)s set a profile picture.": "%(senderName)s profil képet állított be.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a megjelenítési nevét megváltoztatta erre: %(displayName)s.", "Show panel": "Panel megjelenítése", "Show Text Formatting Toolbar": "Szöveg formázási eszköztár megjelenítése", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Az időbélyegek 12 órás formátumban mutatása (pl.: 2:30pm)", @@ -353,10 +381,12 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő adatait, de nem találom.", "Turn Markdown off": "Markdown kikapcsolása", "Turn Markdown on": "Markdown bekapcsolása", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a titkosítást ponttól pontig (algoritmus %(algorithm)s).", "Unable to add email address": "Az e-mail címet nem sikerült hozzáadni", "Unable to remove contact information": "A névjegy információkat nem sikerült törölni", "Unable to verify email address.": "Az e-mail cím ellenőrzése sikertelen.", "Unban": "Kitiltás visszavonása", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s visszaengedte %(targetName)s felhasználót.", "Unable to capture screen": "A képernyő felvétele sikertelen", "Unable to enable Notifications": "Az értesítések engedélyezése sikertelen", "Unable to load device list": "Az eszközlista betöltése sikertelen", @@ -410,6 +440,7 @@ "Who can read history?": "Ki olvashatja a régi üzeneteket?", "Who would you like to add to this room?": "Kit szeretnél hozzáadni ehhez a szobához?", "Who would you like to communicate with?": "Kivel szeretnél beszélgetni?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s visszavonta %(targetName)s meghívóját.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Ezt a meghívót szeretnéd <acceptText>elfogadni</acceptText> vagy <declineText>elutasítani</declineText>?", "You already have existing direct chats with this user:": "Már van közvetlen csevegésed ezzel a felhasználóval:", "You are already in a call.": "Már hívásban vagy.", @@ -559,6 +590,9 @@ "Start chatting": "Csevegés indítása", "Start Chatting": "Csevegés indítása", "Click on the button below to start chatting!": "Csevegés indításához kattints a gombra alább!", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s megváltoztatta a szoba avatar képét: <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s törölte a szoba avatar képét.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s megváltoztatta %(roomName)s szoba avatar képét", "Username available": "Szabad felhasználói név", "Username not available": "A felhasználói név foglalt", "Something went wrong!": "Valami tönkrement!", @@ -630,7 +664,10 @@ "Publish this room to the public in %(domain)s's room directory?": "Publikálod a szobát a(z) %(domain)s szoba listájába?", "NOTE: Apps are not end-to-end encrypted": "Megjegyzés: Az alkalmazások nem végponttól végpontig titkosítottak", "The maximum permitted number of widgets have already been added to this room.": "A maximálisan megengedett számú kisalkalmazás már hozzá van adva a szobához.", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s hozzáadta", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s eltávolította", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot ellenőrzés az asztali verzióban nem érhető el - használd a <a>web böngészőt</a>", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s kisalkalmazást %(senderName)s módosította", "Copied!": "Lemásolva!", "Failed to copy": "Sikertelen másolás", "Advanced options": "További beállítások", @@ -699,6 +736,7 @@ "Message Pinning": "Üzenet kitűzése", "Remove avatar": "Avatar törlése", "Pinned Messages": "Kitűzött üzenetek", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s megváltoztatta a szoba kitűzött szövegeit.", "Who would you like to add to this community?": "Kit szeretnél hozzáadni ehhez a közösséghez?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Figyelem: minden személy akit hozzáadsz a közösséghez mindenki számára látható lesz aki ismeri a közösség azonosítóját", "Invite new community members": "Új tagok meghívása a közösségbe", @@ -917,6 +955,7 @@ "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Eszközök listája</showDevicesText>, <sendAnywayText>mindenképpen küld</sendAnywayText> vagy <cancelText>szakítsd meg</cancelText>.", "Community IDs cannot not be empty.": "A közösségi azonosító nem lehet üres.", "<a>In reply to</a> <pill>": "<a>Válaszolva neki</a> <pill>", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s megváltoztatta a nevét erre: %(displayName)s.", "Failed to set direct chat tag": "Nem sikerült a közvetlen beszélgetés jelzést beállítani", "Failed to remove tag %(tagName)s from room": "Nem sikerült a szobáról eltávolítani ezt: %(tagName)s", "Failed to add tag %(tagName)s to room": "Nem sikerült hozzáadni a szobához ezt: %(tagName)s", @@ -1156,44 +1195,5 @@ "Share Room Message": "Szoba üzenet megosztás", "Link to selected message": "Hivatkozás a kijelölt üzenetre", "COPY": "Másol", - "Share Message": "Üzenet megosztása", - "<target> accepted the invitation for %(displayName)s.": "<target> elfogadta a meghívást ide: %(displayName)s.", - "<target> accepted an invitation.": "<target> elfogadta a meghívást.", - "<sender> requested a VoIP conference.": "<sender> VoIP konferenciát kezdeményez.", - "<sender> invited <target>.": "<sender> meghívta: <target>.", - "<sender> banned <target>.": "<sender> kitiltotta őt: <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> megváltoztatta a nevét erre: <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> a megjelenítési nevét megváltoztatta erre: <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> törölte a megjelenítési nevet (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> törölte a profil képét.", - "<sender> changed their profile picture.": "<sender> megváltoztatta a profil képét.", - "<sender> set a profile picture.": "<sender> profil képet állított be.", - "<target> joined the room.": "<target> belépett a szobába.", - "<target> rejected the invitation.": "<target> elutasította a meghívót.", - "<target> left the room.": "<target> elhagyta a szobát.", - "<sender> unbanned <target>.": "<sender> visszaengedte <target> felhasználót.", - "<sender> kicked <target>.": "<sender> kizárta: <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> visszavonta <target> meghívóját.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> megváltoztatta a témát erre \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> megváltoztatta a szoba nevét erre: %(roomName)s.", - "<sender> changed the room avatar to <img/>": "<sender> megváltoztatta a szoba avatar képét: <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> megváltoztatta %(roomName)s szoba avatar képét", - "<sender> removed the room name.": "<sender> törölte a szoba nevét.", - "<sender> removed the room avatar.": "<sender> törölte a szoba avatar képét.", - "<sender> answered the call.": "<sender> felvette a telefont.", - "<sender> ended the call.": "<sender> befejezte a hívást.", - "<sender> placed a %(callType)s call.": "<sender> %(callType)s hívást kezdeményezett.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta meg van hívva.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> elérhetővé tette a szoba új üzeneteit nekik minden résztvevő a szobában, amióta csatlakozott.", - "<sender> made future room history visible to all room members.": "<sender> elérhetővé tette a szoba új üzeneteit nekik minden szoba tagság.", - "<sender> made future room history visible to anyone.": "<sender> elérhetővé tette a szoba új üzeneteit nekik bárki.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> elérhetővé tette a szoba új üzeneteit nekik ismeretlen (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> bekapcsolta a titkosítást ponttól pontig (algoritmus %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> : %(fromPowerLevel)s -> %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> megváltoztatta a hozzáférési szintjét erre: %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> megváltoztatta a szoba kitűzött szövegeit.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s kisalkalmazást <sender> módosította", - "%(widgetName)s widget added by <sender>": "%(widgetName)s kisalkalmazást <sender> hozzáadta", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s kisalkalmazást <sender> eltávolította" + "Share Message": "Üzenet megosztása" } diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index a57b337acf..86605c1d41 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -146,6 +146,8 @@ "Nov": "Nov", "Dec": "Des", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Sebuah pesan sudah dikirim ke +%(msisdn)s. Mohon masukkan kode verifikasi pada pesan tersebut", + "%(targetName)s accepted an invitation.": "%(targetName)s telah menerima undangan.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s menerima undangan untuk %(displayName)s.", "Access Token:": "Token Akses:", "Active call (%(roomName)s)": "Panggilan aktif (%(roomName)s)", "Admin": "Admin", @@ -163,15 +165,22 @@ "A new password must be entered.": "Password baru harus diisi.", "%(items)s and %(lastItem)s": "%(items)s dan %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s dan %(lastPerson)s sedang mengetik", + "%(senderName)s answered the call.": "%(senderName)s telah menjawab panggilan.", "Anyone who knows the room's link, including guests": "Siapa pun yang tahu tautan ruang, termasuk tamu", "Anyone who knows the room's link, apart from guests": "Siapa pun yang tahu tautan ruang, selain tamu", "Are you sure you want to upload the following files?": "Anda yakin akan mengunggah berkas-berkas berikut?", "Blacklisted": "Didaftarhitamkan", + "%(senderName)s banned %(targetName)s.": "%(senderName)s telah memblokir %(targetName)s.", "Banned users": "Pengguna yang diblokir", "Bulk Options": "Opsi Massal", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Tidak dapat terhubung ke server Home - harap cek koneksi anda, pastikan <a>sertifikat SSL server Home</a> Anda terpercaya, dan ekstensi dari browser tidak memblokir permintaan.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Tidak dapat terhubung ke server Home melalui HTTP ketika URL di browser berupa HTTPS. Pilih gunakan HTTPS atau <a>aktifkan skrip yang tidak aman</a>.", + "%(senderName)s changed their profile picture.": "%(senderName)s telah mengubah foto profilnya.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s telah mengubah tingkat kekuatan dari %(powerLevelDiffText)s.", "Changes your display nickname": "Ubah tampilan nama panggilan Anda", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s telah menghapus nama ruang.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s telah mengubah nama ruang menjadi %(roomName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s telah mengubah topik menjadi \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Pengubahan siapa yang dapat membaca sejarah akan berlaku untuk pesan selanjutnya di ruang ini", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Mengubah password saat ini akan mengatur ulang semua kunci enkripsi end-to-end di semua perangkat, menyebabkan sejarah obrolan yang terenkripsi menjadi tidak dapat dibaca, kecuali sebelumnya Anda ekspor dahulu kunci ruang lalu kemudian impor ulang setelahnya. Ke depan hal ini akan diperbaiki.", "<a>Click here</a> to join the discussion!": "<a>Klik di sini</a> untuk gabung diskusi!", @@ -332,14 +341,5 @@ "Collapse panel": "Lipat panel", "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!": "Dengan browser ini, tampilan dari aplikasi mungkin tidak sesuai, dan beberapa atau bahkan semua fitur mungkin tidak berjalan. Jika Anda ingin tetap mencobanya, Anda bisa melanjutkan, tapi Anda tanggung sendiri jika muncul masalah yang terjadi!", "Checking for an update...": "Cek pembaruan...", - "There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini", - "<target> accepted the invitation for %(displayName)s.": "<target> menerima undangan untuk %(displayName)s.", - "<target> accepted an invitation.": "<target> telah menerima undangan.", - "<sender> banned <target>.": "<sender> telah memblokir <target>.", - "<sender> changed their profile picture.": "<sender> telah mengubah foto profilnya.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> telah mengubah topik menjadi \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> telah mengubah nama ruang menjadi %(roomName)s.", - "<sender> removed the room name.": "<sender> telah menghapus nama ruang.", - "<sender> answered the call.": "<sender> telah menjawab panggilan.", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> telah mengubah tingkat kekuatan dari %(powerLevelDiffText)s." + "There are advanced notifications which are not shown here": "Ada notifikasi lanjutan yang tidak ditampilkan di sini" } diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 28d2faedf7..6770a0ea25 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -535,7 +535,11 @@ "Device already verified!": "Tæki er þegar sannreynt!", "Verified key": "Staðfestur dulritunarlykill", "Unrecognised command:": "Óþekkt skipun:", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s breytti umræðuefninu í \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s fjarlægði heiti spjallrásarinnar.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s breytti heiti spjallrásarinnar í %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sendi mynd.", + "%(senderName)s answered the call.": "%(senderName)s svaraði símtalinu.", "Disinvite": "Taka boð til baka", "Unknown Address": "Óþekkt vistfang", "Delete Widget": "Eyða viðmótshluta", @@ -637,9 +641,5 @@ "Notify the whole room": "Tilkynna öllum á spjallrásinni", "Room Notification": "Tilkynning á spjallrás", "Passphrases must match": "Lykilfrasar verða að stemma", - "Passphrase must not be empty": "Lykilfrasi má ekki vera auður", - "<sender> changed the topic to \"%(topic)s\".": "<sender> breytti umræðuefninu í \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> breytti heiti spjallrásarinnar í %(roomName)s.", - "<sender> removed the room name.": "<sender> fjarlægði heiti spjallrásarinnar.", - "<sender> answered the call.": "<sender> svaraði símtalinu." + "Passphrase must not be empty": "Lykilfrasi má ekki vera auður" } diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 4506b20f9f..0957bc156d 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -20,6 +20,8 @@ "OK": "OK", "Failed to change password. Is your password correct?": "Modifica password fallita. La tua password è corretta?", "Continue": "Continua", + "%(targetName)s accepted an invitation.": "%(targetName)s ha accettato un invito.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha accettato l'invito per %(displayName)s.", "Account": "Account", "Access Token:": "Token di Accesso:", "Add": "Aggiungi", @@ -111,6 +113,7 @@ "Conference calling is in development and may not be reliable.": "Le chiamate di gruppo sono in sviluppo e potrebbero essere inaffidabili.", "Failed to set up conference call": "Impostazione della chiamata di gruppo fallita", "Conference call failed.": "Chiamata di gruppo fallita.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s ha richiesto una conferenza VoIP.", "VoIP conference started.": "Conferenza VoIP iniziata.", "VoIP conference finished.": "Conferenza VoIP terminata.", "Ongoing conference call%(supportedText)s.": "Chiamata di gruppo in corso%(supportedText)s.", @@ -175,12 +178,44 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La chiave che hai fornito corrisponde alla chiave che hai ricevuto dal dispositivo %(deviceId)s di %(userId)s . Dispositivo segnato come verificato.", "Unrecognised command:": "Comando non riconosciuto:", "Reason": "Motivo", + "%(senderName)s invited %(targetName)s.": "%(senderName)s ha invitato %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s ha bandito %(targetName)s.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ha modificato il proprio nome in %(displayName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ha impostato il proprio nome a %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha rimosso il proprio nome visibile (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s ha rimosso la propria immagine del profilo.", + "%(senderName)s changed their profile picture.": "%(senderName)s ha cambiato la propria immagine del profilo.", + "%(senderName)s set a profile picture.": "%(senderName)s ha impostato un'immagine del profilo.", + "%(targetName)s joined the room.": "%(targetName)s è entrato nella stanza.", + "%(targetName)s rejected the invitation.": "%(targetName)s ha rifiutato l'invito.", + "%(targetName)s left the room.": "%(targetName)s è uscito dalla stanza.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ha rimosso il ban a %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s ha cacciato %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s ha revocato l'invito per %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s ha modificato l'argomento in \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha rimosso il nome della stanza.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s ha modificato il nome della stanza in %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ha inviato un'immagine.", "Someone": "Qualcuno", "(not supported by this browser)": "(non supportato da questo browser)", + "%(senderName)s answered the call.": "%(senderName)s ha risposto alla chiamata.", "(could not connect media)": "(connessione del media non riuscita)", "(no answer)": "(nessuna risposta)", "(unknown failure: %(reason)s)": "(errore sconosciuto: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s ha terminato la chiamata.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s ha avviato una chiamata %(callType)s .", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ha mandato un invito a %(targetDisplayName)s per unirsi alla stanza.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento del loro invito.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento in cui sono entrati.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha reso visibile la futura cronologia della stanza a (%(visibility)s) sconosciuto.", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha attivato la crottografia end-to-end (algoritmo %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s da %(fromPowerLevel)s a %(toPowerLevel)s", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha cambiato il messaggio ancorato della stanza.", + "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificato da %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s aggiunto da %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s rimosso da %(senderName)s", "%(displayName)s is typing": "%(displayName)s sta scrivendo", "%(names)s and %(count)s others are typing|other": "%(names)s e altri %(count)s stanno scrivendo", "%(names)s and %(count)s others are typing|one": "%(names)s e un altro stanno scrivendo", @@ -381,6 +416,7 @@ "Historical": "Cronologia", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Impossibile verificare che l'indirizzo al quale questo invito è stato inviato corrisponda a uno associato al tuo account.", "Power level must be positive integer.": "Il livello di poteri deve essere un intero positivo.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha modificato il livello di poteri di %(powerLevelDiffText)s.", "Jump to read receipt": "Salta alla ricevuta di lettura", "This invitation was sent to an email address which is not associated with this account:": "Questo invito è stato mandato a un indirizzo email non associato a questo account:", "You may wish to login with a different account, or add this email to this account.": "Dovresti accedere con un account diverso, o aggiungere questa email all'account.", @@ -482,6 +518,9 @@ "Invalid file%(extra)s": "File non valido %(extra)s", "Error decrypting image": "Errore decifratura immagine", "Error decrypting video": "Errore decifratura video", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ha cambiato l'avatar per %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s ha rimosso l'avatar della stanza.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s ha cambiato l'avatar della stanza a <img/>", "Copied!": "Copiato!", "Failed to copy": "Copia fallita", "Add an Integration": "Aggiungi un'integrazione", @@ -1141,44 +1180,5 @@ "Replying": "Rispondere", "Popout widget": "Oggetto a comparsa", "Failed to indicate account erasure": "Impossibile indicare la cancellazione dell'account", - "Bulk Options": "Opzioni applicate in massa", - "<target> accepted the invitation for %(displayName)s.": "<target> ha accettato l'invito per %(displayName)s.", - "<target> accepted an invitation.": "<target> ha accettato un invito.", - "<sender> requested a VoIP conference.": "<sender> ha richiesto una conferenza VoIP.", - "<sender> invited <target>.": "<sender> ha invitato <target>.", - "<sender> banned <target>.": "<sender> ha bandito <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> ha modificato il proprio nome in <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> ha impostato il proprio nome a <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> ha rimosso il proprio nome visibile (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> ha rimosso la propria immagine del profilo.", - "<sender> changed their profile picture.": "<sender> ha cambiato la propria immagine del profilo.", - "<sender> set a profile picture.": "<sender> ha impostato un'immagine del profilo.", - "<target> joined the room.": "<target> è entrato nella stanza.", - "<target> rejected the invitation.": "<target> ha rifiutato l'invito.", - "<target> left the room.": "<target> è uscito dalla stanza.", - "<sender> unbanned <target>.": "<sender> ha rimosso il ban a <target>.", - "<sender> kicked <target>.": "<sender> ha cacciato <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> ha revocato l'invito per <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> ha modificato l'argomento in \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> ha modificato il nome della stanza in %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> ha cambiato l'avatar per %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> ha cambiato l'avatar della stanza a <img/>", - "<sender> removed the room name.": "<sender> ha rimosso il nome della stanza.", - "<sender> removed the room avatar.": "<sender> ha rimosso l'avatar della stanza.", - "<sender> answered the call.": "<sender> ha risposto alla chiamata.", - "<sender> ended the call.": "<sender> ha terminato la chiamata.", - "<sender> placed a %(callType)s call.": "<sender> ha avviato una chiamata %(callType)s .", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> ha mandato un invito a %(targetDisplayName)s per unirsi alla stanza.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento del loro invito.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> ha reso visibile la futura cronologia della stanza a tutti i membri della stanza, dal momento in cui sono entrati.", - "<sender> made future room history visible to all room members.": "<sender> ha reso visibile la futura cronologia della stanza a tutti i membri della stanza.", - "<sender> made future room history visible to anyone.": "<sender> ha reso visibile la futura cronologia della stanza a tutti.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> ha reso visibile la futura cronologia della stanza a (%(visibility)s) sconosciuto.", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ha attivato la crottografia end-to-end (algoritmo %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> da %(fromPowerLevel)s a %(toPowerLevel)s", - "<sender> changed the pinned messages for the room.": "<sender> ha cambiato il messaggio ancorato della stanza.", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ha modificato il livello di poteri di %(powerLevelDiffText)s.", - "%(widgetName)s widget modified by <sender>": "Widget %(widgetName)s modificato da <sender>", - "%(widgetName)s widget added by <sender>": "Widget %(widgetName)s aggiunto da <sender>", - "%(widgetName)s widget removed by <sender>": "Widget %(widgetName)s rimosso da <sender>" + "Bulk Options": "Opzioni applicate in massa" } diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 233430978f..741de4b551 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -17,6 +17,7 @@ "Hide read receipts": "発言を読んでも既読状態にしない", "Invited": "招待中", "%(displayName)s is typing": "%(displayName)s 文字入力中", + "%(targetName)s joined the room.": "%(targetName)s 部屋に参加しました。", "Low priority": "低優先度", "Mute": "通知しない", "New password": "新しいパスワード", @@ -239,6 +240,5 @@ "Checking for an update...": "アップデートを確認しています…", "There are advanced notifications which are not shown here": "ここに表示されない詳細な通知があります", "Call": "通話", - "Answer": "応答", - "<target> joined the room.": "<target> 部屋に参加しました。" + "Answer": "応答" } diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 2fb6649f09..23b7efd97d 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -74,6 +74,8 @@ "Operation failed": "작업 실패", "Failed to change password. Is your password correct?": "비밀번호를 바꾸지 못했어요. 이 비밀번호가 정말 맞으세요?", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "+%(msisdn)s로 문자 메시지를 보냈어요. 인증 번호를 입력해주세요", + "%(targetName)s accepted an invitation.": "%(targetName)s님이 초대를 수락했어요.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s님이 %(displayName)s님에게서 초대를 수락했어요.", "Access Token:": "접근 토큰:", "Active call (%(roomName)s)": "(%(roomName)s)에서 전화를 걸고 받을 수 있어요", "Add a topic": "주제 추가", @@ -83,14 +85,21 @@ "and %(count)s others...|one": "그리고 다른 하나...", "and %(count)s others...|other": "그리고 %(count)s...", "%(names)s and %(lastPerson)s are typing": "%(names)s님과 %(lastPerson)s님이 입력중", + "%(senderName)s answered the call.": "%(senderName)s님이 전화를 받았어요.", "Anyone who knows the room's link, apart from guests": "손님을 제외하고, 방의 주소를 아는 누구나", "Anyone who knows the room's link, including guests": "손님을 포함하여, 방의 주소를 아는 누구나", "Are you sure you want to reject the invitation?": "초대를 거절하시겠어요?", + "%(senderName)s banned %(targetName)s.": "%(senderName)s님이 %(targetName)s님을 차단하셨어요.", "Bans user with given id": "받은 ID로 사용자 차단하기", "Bulk Options": "대규모 설정", "Call Timeout": "전화 대기 시간 초과", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "홈 서버에 연결할 수 없어요 - 연결을 확인해주시고, <a>홈 서버의 SSL 인증서</a>가 믿을 수 있는지 확인하시고, 브라우저 확장기능이 요청을 차단하고 있는지 확인해주세요.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "주소창에 HTTPS URL이 있을 때는 HTTP로 홈 서버를 연결할 수 없어요. HTTPS를 쓰거나 <a>안전하지 않은 스크립트를 허용해주세요</a>.", + "%(senderName)s changed their profile picture.": "%(senderName)s님이 자기 소개 사진을 바꾸셨어요.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s님이 %(powerLevelDiffText)s의 권한 등급을 바꾸셨어요.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s님이 방 이름을 %(roomName)s로 바꾸셨어요.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s님이 방 이름을 지우셨어요.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s님이 주제를 \"%(topic)s\"로 바꾸셨어요.", "Changes to who can read history will only apply to future messages in this room": "방의 이후 메시지부터 기록을 읽을 수 있는 조건의 변화가 적용되어요", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 바꾸면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.", "Claimed Ed25519 fingerprint key": "Ed25519 지문 키가 필요", @@ -142,6 +151,7 @@ "Encrypted room": "암호화한 방", "Encryption is enabled in this room": "이 방은 암호화중이에요", "Encryption is not enabled in this room": "이 방은 암호화하고 있지 않아요", + "%(senderName)s ended the call.": "%(senderName)s님이 전화를 끊었어요.", "End-to-end encryption information": "종단간 암호화 정보", "End-to-end encryption is in beta and may not be reliable": "종단간 암호화는 시험중이며 믿을 수 없어요", "Enter Code": "코드를 입력하세요", @@ -181,6 +191,7 @@ "Forgot your password?": "비밀번호를 잊어버리셨어요?", "For security, this session has been signed out. Please sign in again.": "보안을 위해서, 이 세션에서 로그아웃했어요. 다시 로그인해주세요.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "보안을 위해서, 로그아웃하면 이 브라우저에서 모든 종단간 암호화 키를 없앨 거에요. 이후 라이엇에서 이야기를 해독하고 싶으시면, 방 키를 내보내서 안전하게 보관하세요.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s를 %(fromPowerLevel)s에서 %(toPowerLevel)s로", "Guest access is disabled on this Home Server.": "손님은 이 홈 서버에 접근하실 수 없어요.", "Guests cannot join this room even if explicitly invited.": "손님은 분명하게 초대받았어도 이 방에 들어가실 수 없어요.", "Hangup": "전화 끊기", @@ -204,6 +215,7 @@ "Invalid address format": "주소 형식이 맞지 않아요", "Invalid Email Address": "이메일 주소가 맞지 않아요", "Invalid file%(extra)s": "파일%(extra)s이 맞지 않아요", + "%(senderName)s invited %(targetName)s.": "%(senderName)s님이 %(targetName)s님을 초대하셨어요.", "Invite new room members": "새 구성원 초대하기", "Invited": "초대받기", "Invites": "초대하기", @@ -214,18 +226,26 @@ "Sign in with": "로그인", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "<voiceText>음성</voiceText> 또는 <videoText>영상</videoText>으로 참여하세요.", "Join Room": "방에 들어가기", + "%(targetName)s joined the room.": "%(targetName)s님이 방에 들어오셨어요.", "Joins room with given alias": "받은 가명으로 방에 들어가기", "Jump to first unread message.": "읽지 않은 첫 메시지로 이동할래요.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s님이 %(targetName)s을 내쫓았어요.", "Kick": "내쫓기", "Kicks user with given id": "받은 ID로 사용자 내쫓기", "Labs": "실험실", "Last seen": "마지막으로 본 곳", "Leave room": "방 떠나기", + "%(targetName)s left the room.": "%(targetName)s님이 방을 떠나셨어요.", "Level:": "등급:", "Local addresses for this room:": "이 방의 로컬 주소:", "Logged in as:": "로그인:", "Logout": "로그아웃", "Low priority": "낮은 우선순위", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 초대받은 시점부터.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 방에 들어온 시점부터.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 누구나.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s님이 이후 방의 기록을 볼 수 있게 하셨어요 알 수 없음 (%(visibility)s).", "Manage Integrations": "통합 관리", "Markdown is disabled": "마크다운이 꺼져있어요", "Markdown is enabled": "마크다운이 켜져있어요", @@ -263,6 +283,7 @@ "Phone": "전화", "Once encryption is enabled for a room it cannot be turned off again (for now)": "방을 암호화하면 암호화를 도중에 끌 수 없어요. (현재로서는)", "Only people who have been invited": "초대받은 사람만", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s님이 %(callType)s 전화를 걸었어요.", "Please check your email and click on the link it contains. Once this is done, click continue.": "이메일을 확인하시고 그 안에 있는 주소를 누르세요. 이 일을 하고 나서, 계속하기를 누르세요.", "Power level must be positive integer.": "권한 등급은 양의 정수여야만 해요.", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (권한 %(powerLevelNumber)s)", @@ -271,17 +292,22 @@ "Private Chat": "비공개 이야기", "Privileged Users": "권한 있는 사용자", "Profile": "자기 소개", + "%(senderName)s removed their profile picture.": "%(senderName)s님이 자기 소개 사진을 지우셨어요.", + "%(senderName)s set a profile picture.": "%(senderName)s님이 자기 소개 사진을 설정하셨어요.", "Public Chat": "공개 이야기", "Reason": "이유", "Reason: %(reasonText)s": "이유: %(reasonText)s", "Revoke Moderator": "조정자 철회", "Refer a friend to Riot:": "라이엇을 친구에게 추천해주세요:", "Register": "등록", + "%(targetName)s rejected the invitation.": "%(targetName)s님이 초대를 거절하셨어요.", "Reject invitation": "초대 거절", "Rejoin": "다시 들어가기", "Remote addresses for this room:": "이 방의 원격 주소:", "Remove Contact Information?": "연락처를 지우시겠어요?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s님이 별명 (%(oldDisplayName)s)을 지우셨어요.", "Remove %(threePid)s?": "%(threePid)s 지우시겠어요?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s님이 인터넷전화 회의를 요청하셨어요.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 다시 설정하면 현재 모든 장치의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 이야기 기록을 읽을 수 없게 되어요. 앞으로는 이 기능을 더 좋게 만들 거에요.", "Results from DuckDuckGo": "덕덕고에서 검색한 결과", "Return to login screen": "로그인 화면으로 돌아가기", @@ -306,6 +332,7 @@ "Send Invites": "초대 보내기", "Send Reset Email": "재설정 이메일 보내기", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s님이 사진을 보냈어요.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s님이 %(targetDisplayName)s님에게 들어오라는 초대를 보냈어요.", "Server error": "서버 오류", "Server may be unavailable or overloaded": "서버를 쓸 수 없거나 과부하일 수 있어요", "Server may be unavailable, overloaded, or search timed out :(": "서버를 쓸 수 없거나 과부하거나, 검색 시간을 초과했어요 :(", @@ -313,6 +340,7 @@ "Server may be unavailable, overloaded, or you hit a bug.": "서버를 쓸 수 없거나 과부하거나, 오류에요.", "Server unavailable, overloaded, or something else went wrong.": "서버를 쓸 수 없거나 과부하거나, 다른 문제가 있어요.", "Session ID": "세션 ID", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s님이 별명을 %(displayName)s로 바꾸셨어요.", "Show panel": "패널 보이기", "Show Text Formatting Toolbar": "문자 서식 도구 보이기", "Show timestamps in 12 hour format (e.g. 2:30pm)": "시간을 12시간제로 보이기 (예. 오후 2:30)", @@ -356,10 +384,12 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 찾을 수 없었어요.", "Turn Markdown off": "마크다운 끄기", "Turn Markdown on": "마크다운 켜기", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s님이 종단간 암호화를 켜셨어요 (알고리즘 %(algorithm)s).", "Unable to add email address": "이메일 주소를 추가할 수 없어요", "Unable to remove contact information": "연락처를 지울 수 없어요", "Unable to verify email address.": "이메일 주소를 인증할 수 없어요.", "Unban": "차단풀기", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s님이 %(targetName)s님의 차단을 푸셨어요.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "이 이매알 주소가 초대를 받은 계정과 연결된 주소가 맞는지 확인할 수 없어요.", "Unable to capture screen": "화면을 찍을 수 없어요", "Unable to enable Notifications": "알림을 켤 수 없어요", @@ -413,6 +443,7 @@ "Who can read history?": "누가 기록을 읽을 수 있나요?", "Who would you like to add to this room?": "이 방에 누구를 초대하고 싶으세요?", "Who would you like to communicate with?": "누구와 이야기하고 싶으세요?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s님이 %(targetName)s니의 초대를 취소하셨어요.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "초대를 <acceptText>받아들이거나</acceptText> <declineText>거절</declineText>하시겠어요?", "You already have existing direct chats with this user:": "이미 이 사용자와 직접 이야기하는 중이에요:", "You are already in a call.": "이미 자신이 통화 중이네요.", @@ -577,6 +608,9 @@ "Start chatting": "이야기하기", "Start Chatting": "이야기하기", "Click on the button below to start chatting!": "이야기하려면 아래 버튼을 누르세요!", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s님이 방 아바타를 <img/>로 바꾸셨어요", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s님이 방 아바타를 지우셨어요.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s가 %(roomName)s 방의 아바타를 바꾸셨어요", "Username available": "쓸 수 있는 사용자 이름", "Username not available": "쓸 수 없는 사용자 이름", "Something went wrong!": "문제가 생겼어요!", @@ -733,39 +767,5 @@ "Collapse panel": "패널 접기", "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": "여기 보이지 않는 고급 알림이 있어요", - "<target> accepted the invitation for %(displayName)s.": "<target>님이 %(displayName)s님에게서 초대를 수락했어요.", - "<target> accepted an invitation.": "<target>님이 초대를 수락했어요.", - "<sender> requested a VoIP conference.": "<sender>님이 인터넷전화 회의를 요청하셨어요.", - "<sender> invited <target>.": "<sender>님이 <target>님을 초대하셨어요.", - "<sender> banned <target>.": "<sender>님이 <target>님을 차단하셨어요.", - "<sender> set their display name to <displayName>.": "<sender>님이 별명을 <displayName>로 바꾸셨어요.", - "<sender> removed their display name (<oldDisplayName>).": "<sender>님이 별명 (<oldDisplayName>)을 지우셨어요.", - "<sender> removed their profile picture.": "<sender>님이 자기 소개 사진을 지우셨어요.", - "<sender> changed their profile picture.": "<sender>님이 자기 소개 사진을 바꾸셨어요.", - "<sender> set a profile picture.": "<sender>님이 자기 소개 사진을 설정하셨어요.", - "<target> joined the room.": "<target>님이 방에 들어오셨어요.", - "<target> rejected the invitation.": "<target>님이 초대를 거절하셨어요.", - "<target> left the room.": "<target>님이 방을 떠나셨어요.", - "<sender> unbanned <target>.": "<sender>님이 <target>님의 차단을 푸셨어요.", - "<sender> kicked <target>.": "<sender>님이 <target>을 내쫓았어요.", - "<sender> withdrew <target>'s invitation.": "<sender>님이 <target>니의 초대를 취소하셨어요.", - "<sender> changed the topic to \"%(topic)s\".": "<sender>님이 주제를 \"%(topic)s\"로 바꾸셨어요.", - "<sender> changed the room name to %(roomName)s.": "<sender>님이 방 이름을 %(roomName)s로 바꾸셨어요.", - "<sender> changed the room avatar to <img/>": "<sender>님이 방 아바타를 <img/>로 바꾸셨어요", - "<sender> changed the avatar for %(roomName)s": "<sender>가 %(roomName)s 방의 아바타를 바꾸셨어요", - "<sender> removed the room name.": "<sender>님이 방 이름을 지우셨어요.", - "<sender> removed the room avatar.": "<sender>님이 방 아바타를 지우셨어요.", - "<sender> answered the call.": "<sender>님이 전화를 받았어요.", - "<sender> ended the call.": "<sender>님이 전화를 끊었어요.", - "<sender> placed a %(callType)s call.": "<sender>님이 %(callType)s 전화를 걸었어요.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender>님이 %(targetDisplayName)s님에게 들어오라는 초대를 보냈어요.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 초대받은 시점부터.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두, 방에 들어온 시점부터.", - "<sender> made future room history visible to all room members.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 방 구성원 모두.", - "<sender> made future room history visible to anyone.": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 누구나.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender>님이 이후 방의 기록을 볼 수 있게 하셨어요 알 수 없음 (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender>님이 종단간 암호화를 켜셨어요 (알고리즘 %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user>를 %(fromPowerLevel)s에서 %(toPowerLevel)s로", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender>님이 %(powerLevelDiffText)s의 권한 등급을 바꾸셨어요." + "There are advanced notifications which are not shown here": "여기 보이지 않는 고급 알림이 있어요" } diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index b1552f91e7..0c6bcb0977 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -1,6 +1,8 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Teksta ziņa tika nosūtīta +%(msisdn)s. Lūdzu ievadi tajā atrodamo verifikācijas kodu", "Accept": "Pieņemt", + "%(targetName)s accepted an invitation.": "%(targetName)s apstiprināja uzaicinājumu.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s apstiprināja uzaicinājumu no %(displayName)s.", "Account": "Konts", "Access Token:": "Pieejas tokens:", "Active call (%(roomName)s)": "Aktīvs zvans (%(roomName)s)", @@ -28,6 +30,7 @@ "%(items)s and %(lastItem)s": "%(items)s un %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s un %(lastPerson)s raksta", "A new password must be entered.": "Nepieciešams ievadīt jauno paroli.", + "%(senderName)s answered the call.": "%(senderName)s atbildēja zvanam.", "An error has occurred.": "Notikusi kļūda.", "Anyone": "Ikviens", "Anyone who knows the room's link, apart from guests": "Ikviens, kurš zina adreses saiti uz istabu, izņemot viesus", @@ -38,6 +41,7 @@ "Are you sure you want to upload the following files?": "Vai tiešām vēlies augšuplādēt sekojošos failus?", "Attachment": "Pielikums", "Autoplay GIFs and videos": "Automātiski rādīt GIF animācijas un video", + "%(senderName)s banned %(targetName)s.": "%(senderName)s liedza pieeju %(targetName)s.", "Ban": "Nobanot/liegt pieeju", "Banned users": "Banotie/bloķētie lietotāji (kuriem liegta pieeja)", "Bans user with given id": "Bloķē (liedz pieeju) lietotāju pēc uzdotā ID (nobano)", @@ -48,6 +52,11 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Neizdodas savienoties ar bāzes serveri izmantojot HTTP protokolu, kad Tava pārlūka adreses laukā norādīts HTTPS protokols. Tā vietā izmanto HTTPS vai <a>iespējo nedrošos skriptus</a>.", "Can't load user settings": "Neizdevās ielādēt lietotāja iestatījumus", "Change Password": "Paroles maiņa", + "%(senderName)s changed their profile picture.": "%(senderName)s nomainīja profila attēlu.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s nomainīja statusa līmeni %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s nomainīja istabas nosaukumu uz %(roomName)s.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s dzēsa istabas nosaukumu.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s nomainīja tēmas nosaukumu uz \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Izmaiņas attiecībā uz to, kurš varēs lasīt vēstures ziņas, stāsies spēkā tikai uz ziņām,kuras vēl tiks pievienotas šajā istabā", "Changes your display nickname": "Nomaina Tavu publisko segvārdu (niku)", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles maiņa dzēsīs pašreizējās šifrēšanas atslēgas visās savstarpēji saistītajās ierīcēs, padarot čata vēsturi neizlasāmu, ja vien vien istabas atslēgas nav tikušas iepriekš eksportētas un no jauna importētas atpakaļ. Nākotnē to plānojam uzlabot.", @@ -121,6 +130,7 @@ "Encrypted room": "Šifrēta istaba", "Encryption is enabled in this room": "Šajā istabā šifrēšana ir ieslēgta", "Encryption is not enabled in this room": "Šajā istabā šifrēšana ir izslēgta", + "%(senderName)s ended the call.": "%(senderName)s beidza zvanu.", "End-to-end encryption information": "\"End-to-End\" (ierīce-ierīce) šifrēšanas informācija", "End-to-end encryption is in beta and may not be reliable": "\"End-to-end\" (ierīce-ierīce) šifrēšana šobrīd ir beta stadijā, un var nebūt stabila", "Enter Code": "Ievadi kodu", @@ -166,6 +176,7 @@ "Forgot your password?": "Aizmirsi paroli?", "For security, this session has been signed out. Please sign in again.": "Drošības nolūkos, šī sesija ir beigusies. Lūdzu, pieraksties par jaunu.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Drošības nolūkos, izrakstīšanās dzēsīs jebkādas ierīce-ierīce šifrēšanas atslēgas no šī pārlūka. Ja Tu vēlies saglabāt iespēju atšifrēt tavu saziņas vēsturi no Riot nākotnes sesijām, lūdzu eksportē tavas istabas atslēgas, saglabājot tās drošā vietā.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s no %(fromPowerLevel)s uz %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Šajā Bāzes serverī viesu pierakstīšanās nav iespējama.", "Guests cannot join this room even if explicitly invited.": "Viesi nevar pievienoties šai istabai, pat ja ir uzaicināti.", "Hangup": "Beigt zvanu", @@ -188,6 +199,7 @@ "Invalid address format": "Nepareizs adreses formāts", "Invalid Email Address": "Nepareiza epasta adrese", "Invalid file%(extra)s": "Nederīgs fails %(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s uzaicināja %(targetName)s.", "Invite new room members": "Uzaicināt jaunus istabas biedrus", "Invited": "Uzaicināts/a", "Invites": "Uzaicinājumi", @@ -198,18 +210,26 @@ "Sign in with": "Pierakstīties ar", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Pievienoties kā <voiceText>AUDIO</voiceText> vai <videoText>VIDEO</videoText>.", "Join Room": "Pievienoties istabai", + "%(targetName)s joined the room.": "%(targetName)s pievienojās istabai.", "Joins room with given alias": "Pievienojas istabai ar minēto aliasi (pseidonīmu)", "Jump to first unread message.": "Pāriet uz pirmo neizlasīto ziņu.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s iespēra (kick) %(targetName)s.", "Kick": "Izspert/padzīt no istabas (kick)", "Kicks user with given id": "Padzen (kick) lietotāju ar norādīto Id", "Labs": "Izmēģinājumu lauciņš", "Last seen": "Pēdējo reizi redzēts/a", "Leave room": "Doties prom no istabas", + "%(targetName)s left the room.": "%(targetName)s devās prom no istabas.", "Level:": "Līmenis:", "Local addresses for this room:": "Šīs istabas lokālās adreses:", "Logged in as:": "Pierakstījās kā:", "Logout": "Izrakstīties", "Low priority": "Zemas prioritātes", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem no brīža, kad tie tika uzaicināti.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem ar brīdi, kad tie pievienojās.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu ikvienam.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu nepazīstamajiem (%(visibility)s).", "Manage Integrations": "Pārvaldīt integrācijas", "Markdown is disabled": "\"Markdown\" formatēšana izslēgta", "Markdown is enabled": "\"Markdown\" formatēšana ieslēgta", @@ -255,6 +275,7 @@ "People": "Cilvēki", "Permissions": "Atļaujas", "Phone": "Telefons", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s veica %(callType)s zvanu.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Lūdzu pārbaudi savu epastu un noklikšķini tajā esošo saiti. Tiklīdz tas ir izdarīts, klikšķini \"turpināt\".", "Press <StartChatButton> to start a chat with someone": "Nospied <StartChatButton>, lai ar kādu uzsāktu čalošanu", "Privacy warning": "Privātuma brīdinājums", @@ -267,12 +288,16 @@ "Revoke Moderator": "Atcelt moderatoru", "Refer a friend to Riot:": "Rekomendēt draugam Riot:", "Register": "Reģistrēties", + "%(targetName)s rejected the invitation.": "%(targetName)s noraidīja uzaicinājumu.", "Reject invitation": "Noraidīt uzaicinājumu", "Rejoin": "Pievienoties atkārtoti", "Remote addresses for this room:": "Attālinātā adrese šai istabai:", "Remove Contact Information?": "Dzēst kontaktinformāciju?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s dzēsa attēlojamo/redzamo vārdu (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s dzēsa profila attēlu.", "Remove": "Dzēst", "Remove %(threePid)s?": "Dzēst %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s vēlas VoIP konferenci.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles atiestatīšana atiestatīs visas ierīce-ierīce šifrēšanas atslēgas visās ierīcēs, padarot čata šifrēto ziņu vēsturi nelasāmu, ja vien Tu pirms tam neesi eksportējis savas istabas atslēgas un atkārtoti importējis tās atpakaļ. Nākotnē šo ir plānots uzlabot.", "Results from DuckDuckGo": "Rezultāti no DuckDuckGo", "Return to login screen": "Atgriezties uz pierakstīšanās lapu", @@ -289,9 +314,14 @@ "%(roomName)s is not accessible at this time.": "%(roomName)s šobrīd nav pieejama.", "Seen by %(userName)s at %(dateTime)s": "Redzējis %(userName)s %(dateTime)s", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s nosūtīja attēlu.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s nosūtīja uzaicinājumu %(targetDisplayName)s pievienoties istabai.", + "%(senderName)s set a profile picture.": "%(senderName)s uzstādīja profila attēlu.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s nomainīja attēlojamo/redzamo vārdu uz: %(displayName)s.", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Tevis uzdotā pierakstīšanās atslēga sakrīt ar atslēgu, kuru Tu saņēmi no %(userId)s ierīces %(deviceId)s. Ierīce tika atzīmēta kā verificēta.", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "Faila '%(fileName)s' izmērs pārsniedz šī Bāzes servera augšupielādes lieluma ierobežojumu", "The file '%(fileName)s' failed to upload": "Failu '%(fileName)s' neizdevās nosūtīt (augšuplādēt)", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ieslēdza \"end-to-end\" (ierīce-ierīce) šifrēšanu (algorithm %(algorithm)s).", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s atcēla pieejas ierobežojumu (atbanoja) %(targetName)s.", "Unknown room %(roomId)s": "Nezināma istaba %(roomId)s", "Uploading %(filename)s and %(count)s others|zero": "Tiek augšuplādēts %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Tiek augšuplādēts %(filename)s un %(count)s citi", @@ -300,6 +330,7 @@ "Username invalid: %(errMessage)s": "Neatbilstošs lietotājvārds: %(errMessage)s", "(unknown failure: %(reason)s)": "(nezināma kļūda: %(reason)s)", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "BRĪDINĀJUMS: NEIZDEVĀS VERIFICĒT ATSLĒGU! Pierakstīšanās atslēga priekš %(userId)s un ierīces %(deviceId)s ir \"%(fprint)s\", kura nesakrīt ar ievadīto atslēgu \"%(fingerprint)s\". Tas var nozīmēt, ka Tava saziņa var tikt pārtverta!", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s atsauca %(targetName)s uzaicinājumu.", "You are trying to access %(roomName)s.": "Tu mēģini piekļūt %(roomName)s.", "You have been banned from %(roomName)s by %(userName)s.": "Tev ir liegta pieeja istabai %(roomName)s no %(userName)s.", "You have been invited to join this room by %(inviterName)s": "%(inviterName)s Tevi uzaicināja pievienoties šai istabai", @@ -317,6 +348,8 @@ "You are registering with %(SelectedTeamName)s": "Tu reģistrējies ar %(SelectedTeamName)s", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Notiek Tevis novirzīšana uz ārēju trešās puses vietni. Tu vari atļaut savam kontam piekļuvi ar %(integrationsUrl)s. Vai vēlies turpināt?", "Ongoing conference call%(supportedText)s.": "Notiekošs konferences zvans %(supportedText)s.", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s dzēsa istabas avataru.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s nomainīja istabas avataru %(roomName)s", "You added a new device '%(displayName)s', which is requesting encryption keys.": "Tu pievienoji jaunu ierīci '%(displayName)s', kas prasa šifrēšanas atslēgas.", "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tava neverificētā ierīce '%(displayName)s' pieprasa šifrēšanas atslēgas.", "Room Colour": "Istabas krāsa", @@ -477,6 +510,7 @@ "Nov": "Nov.", "Dec": "Dec.", "Set a display name:": "Iestatīt attēloto vārdu:", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s nomainīja istabas avataru uz <img/>", "Upload an avatar:": "Augšuplādē avataru (profila attēlu):", "This server does not support authentication with a phone number.": "Šis serveris neatbalsta autentifikāciju pēc telefona numura.", "Missing password.": "Trūkst parole.", @@ -629,6 +663,8 @@ "Automatically replace plain text Emoji": "Automātiski aizvietot tekstu ar emocīšiem (emoji)", "Failed to upload image": "Neizdevās augšupielādēt attēlu", "Hide avatars in user and room mentions": "Slēpt profila attēlus lietotāja un istabas pieminējumos", + "%(widgetName)s widget added by %(senderName)s": "%(senderName)s pievienoja %(widgetName)s vidžetu", + "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s dzēsa vidžetu %(widgetName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robotu pārbaude šobrīd nav pieejama darbvirsmas versijā. Lūdzu izmanto <a>web pārlūku</a>", "Revoke widget access": "Atsaukt vidžeta piekļuvi", "Unpin Message": "Atkabināt ziņu", @@ -676,6 +712,9 @@ "You are now ignoring %(userId)s": "Tagad Tu ignorē %(userId)s", "Unignored user": "Atignorēts lietotājs", "You are no longer ignoring %(userId)s": "Tu vairāk neignorē %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s nomainīja savu attēlojamo/redzamo vārdu uz %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s šai istabai nomainīja piestiprinātās ziņas.", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s vidžets, kuru mainīja %(senderName)s", "%(names)s and %(count)s others are typing|other": "%(names)s un %(count)s citi raksta", "%(names)s and %(count)s others are typing|one": "%(names)s un vēl kāds raksta", "Message Pinning": "Ziņu piekabināšana", @@ -1087,44 +1126,5 @@ "Collapse panel": "Sakļaut (saritināt) paneli", "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!": "Tavā pašreizējā pārlūkā aplikācijas izskats un uzvedība var būt pilnīgi neatbilstoša, kā arī dažas no visām funkcijām var nedarboties. Ja vēlies turpināt izmantot šo pārlūku, Tu vari arī turpināt, apzinoties, ka šajā gadījumā esi viens/a ar iespējamo problēmu!", "Checking for an update...": "Lūkojos pēc aktualizācijas...", - "There are advanced notifications which are not shown here": "Pastāv papildus paziņojumi, kuri šeit netiek rādīti", - "<target> accepted the invitation for %(displayName)s.": "<target> apstiprināja uzaicinājumu no %(displayName)s.", - "<target> accepted an invitation.": "<target> apstiprināja uzaicinājumu.", - "<sender> requested a VoIP conference.": "<sender> vēlas VoIP konferenci.", - "<sender> invited <target>.": "<sender> uzaicināja <target>.", - "<sender> banned <target>.": "<sender> liedza pieeju <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> nomainīja savu attēlojamo/redzamo vārdu uz <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> nomainīja attēlojamo/redzamo vārdu uz: <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> dzēsa attēlojamo/redzamo vārdu (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> dzēsa profila attēlu.", - "<sender> changed their profile picture.": "<sender> nomainīja profila attēlu.", - "<sender> set a profile picture.": "<sender> uzstādīja profila attēlu.", - "<target> joined the room.": "<target> pievienojās istabai.", - "<target> rejected the invitation.": "<target> noraidīja uzaicinājumu.", - "<target> left the room.": "<target> devās prom no istabas.", - "<sender> unbanned <target>.": "<sender> atcēla pieejas ierobežojumu (atbanoja) <target>.", - "<sender> kicked <target>.": "<sender> iespēra (kick) <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> atsauca <target> uzaicinājumu.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> nomainīja tēmas nosaukumu uz \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> nomainīja istabas nosaukumu uz %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> nomainīja istabas avataru %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> nomainīja istabas avataru uz <img/>", - "<sender> removed the room name.": "<sender> dzēsa istabas nosaukumu.", - "<sender> removed the room avatar.": "<sender> dzēsa istabas avataru.", - "<sender> answered the call.": "<sender> atbildēja zvanam.", - "<sender> ended the call.": "<sender> beidza zvanu.", - "<sender> placed a %(callType)s call.": "<sender> veica %(callType)s zvanu.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> nosūtīja uzaicinājumu %(targetDisplayName)s pievienoties istabai.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem no brīža, kad tie tika uzaicināti.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem ar brīdi, kad tie pievienojās.", - "<sender> made future room history visible to all room members.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu visiem istabas biedriem.", - "<sender> made future room history visible to anyone.": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu ikvienam.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> padarīja istabas ziņu turpmāko vēsturi redzamu nepazīstamajiem (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ieslēdza \"end-to-end\" (ierīce-ierīce) šifrēšanu (algorithm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> no %(fromPowerLevel)s uz %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> nomainīja statusa līmeni %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> šai istabai nomainīja piestiprinātās ziņas.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s vidžets, kuru mainīja <sender>", - "%(widgetName)s widget added by <sender>": "<sender> pievienoja %(widgetName)s vidžetu", - "%(widgetName)s widget removed by <sender>": "<sender> dzēsa vidžetu %(widgetName)s" + "There are advanced notifications which are not shown here": "Pastāv papildus paziņojumi, kuri šeit netiek rādīti" } diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 90c9bf799e..1ba068daa0 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1,5 +1,7 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Voer alsjeblieft de verificatiecode in die is verstuurd naar +%(msisdn)s", + "%(targetName)s accepted an invitation.": "%(targetName)s heeft een uitnodiging geaccepteerd.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s heeft de uitnodiging voor %(displayName)s geaccepteerd.", "Account": "Account", "Access Token:": "Toegangstoken:", "Add email address": "Voeg een e-mailadres toe", @@ -14,6 +16,7 @@ "and %(count)s others...|one": "en één andere...", "%(names)s and %(lastPerson)s are typing": "%(names)s en %(lastPerson)s zijn aan het typen", "A new password must be entered.": "Er moet een nieuw wachtwoord worden ingevoerd.", + "%(senderName)s answered the call.": "%(senderName)s heeft deelgenomen aan het audiogesprek.", "An error has occurred.": "Er is een fout opgetreden.", "Anyone who knows the room's link, apart from guests": "Iedereen die de link van de ruimte weet, behalve gasten", "Anyone who knows the room's link, including guests": "Iedereen die link van de ruimte weet, inclusief gasten", @@ -21,6 +24,7 @@ "Are you sure you want to reject the invitation?": "Weet je zeker dat je de uitnodiging wilt weigeren?", "Attachment": "Bijlage", "Autoplay GIFs and videos": "Start GIFs en videos automatisch", + "%(senderName)s banned %(targetName)s.": "%(senderName)s heeft %(targetName)s verbannen.", "Ban": "Verban", "Banned users": "Verbannen gebruikers", "Bans user with given id": "Verbant de gebruiker met het gegeven ID", @@ -30,6 +34,10 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Kan niet met de thuisserver verbinden via HTTP wanneer er een HTTPS-URL in je browser balk staat. Gebruik HTTPS of <a>activeer onveilige scripts</a>.", "Can't load user settings": "Kan de gebruikersinstellingen niet laden", "Change Password": "Wachtwoord veranderen", + "%(senderName)s changed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto veranderd.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de ruimtenaam van %(roomName)s gewijzigd.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s heeft het onderwerp gewijzigd naar \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Veranderingen aan wie de geschiedenis kan lezen worden alleen maar toegepast op toekomstige berichten in deze ruimte", "Changes your display nickname": "Verandert jouw weergavenaam", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het veranderen van het wachtwoord zal op het moment alle eind-tot-eind encryptie sleutels resetten, wat alle versleutelde gespreksgeschiedenis onleesbaar zou maken, behalve als je eerst je ruimtesleutels exporteert en achteraf opnieuw importeert. Dit zal worden verbeterd in de toekomst.", @@ -114,6 +122,7 @@ "People": "Mensen", "Permissions": "Toestemmingen", "Phone": "Telefoonnummer", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s heeft een %(callType)s-gesprek gestart.", "Privacy warning": "Privacywaarschuwing", "Private Chat": "Privégesprek", "Privileged Users": "Gebruikers met rechten", @@ -124,6 +133,7 @@ "Revoke Moderator": "Beheerder terugtrekken", "Refer a friend to Riot:": "Laat een vriend weten over Riot:", "Register": "Registreer", + "%(targetName)s rejected the invitation.": "%(targetName)s heeft de uitnodiging geweigerd.", "Reject invitation": "Uitnodiging weigeren", "Rejoin": "Opnieuw toetreden", "Remote addresses for this room:": "Adres op afstand voor deze ruimte:", @@ -164,6 +174,7 @@ "Create an account": "Open een account", "Cryptography": "Cryptografie", "Current password": "Huidig wachtwoord", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s heeft de naam van de ruimte verwijderd.", "Create a new chat or reuse an existing one": "Maak een nieuw gesprek aan of hergebruik een al bestaand gesprek", "Create Room": "Maak een ruimte aan", "Curve25519 identity key": "Curve25519-identiteitssleutel", @@ -209,6 +220,7 @@ "Encrypted room": "Versleutelde ruimte", "Encryption is enabled in this room": "Versleuteling is ingeschakeld in deze ruimte", "Encryption is not enabled in this room": "Versleuteling is niet ingeschakeld in deze ruimte", + "%(senderName)s ended the call.": "%(senderName)s heeft opgehangen.", "End-to-end encryption information": "end-to-endbeveiligingsinformatie", "End-to-end encryption is in beta and may not be reliable": "End-to-endbeveiliging is nog in bèta en kan onbetrouwbaar zijn", "Enter Code": "Voer code in", @@ -247,6 +259,7 @@ "Forgot your password?": "Wachtwoord vergeten?", "For security, this session has been signed out. Please sign in again.": "Voor veiligheidsredenen is deze sessie uitgelogd. Log alsjeblieft opnieuw in.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "In verband met veiligheidsredenen zullen alle end-to-endbeveiligingsleutels van deze browser verwijderd worden. Als je je gespreksgeschiedenis van toekomstige Riot sessies wilt kunnen ontsleutelen, exporteer en bewaar dan de ruimte sleutels.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s naar %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Gasttoegang is uitgeschakeld op deze thuisserver.", "Guests cannot join this room even if explicitly invited.": "Gasten kunnen niet tot deze ruimte toetreden, zelfs als ze expliciet uitgenodigd zijn.", "Hangup": "Ophangen", @@ -269,6 +282,7 @@ "Invalid address format": "Ongeldig adresformaat", "Invalid Email Address": "Ongeldig e-mailadres", "Invalid file%(extra)s": "Ongeldig bestand%(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s heeft %(targetName)s uitgenodigd.", "Invite new room members": "Nieuwe ruimte leden uitnodigen", "Invited": "Uitgenodigd", "Invites": "Uitnodigingen", @@ -279,16 +293,23 @@ "Sign in with": "Inloggen met", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Toetreden als <voiceText>spraak</voiceText> of <videoText>video</videoText>.", "Join Room": "Ruimte toetreden", + "%(targetName)s joined the room.": "%(targetName)s is tot de ruimte toegetreden.", "Joins room with given alias": "Treed de ruimte toe met een gegeven naam", "Jump to first unread message.": "Spring naar het eerste ongelezen bericht.", "Labs": "Labs", "Last seen": "Laatst gezien", "Leave room": "Ruimte verlaten", + "%(targetName)s left the room.": "%(targetName)s heeft de ruimte verlaten.", "Level:": "Niveau:", "Local addresses for this room:": "Lokale adressen voor deze ruimte:", "Logged in as:": "Ingelogd als:", "Logout": "Uitloggen", "Low priority": "Lage prioriteit", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze uitgenodigd zijn.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze toegetreden zijn.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor iedereen.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor onbekend (%(visibility)s).", "Manage Integrations": "Integraties beheren", "Markdown is disabled": "Markdown is uitgeschakeld", "Markdown is enabled": "Markdown ingeschakeld", @@ -307,9 +328,12 @@ "Only people who have been invited": "Alleen personen die zijn uitgenodigd", "Please check your email and click on the link it contains. Once this is done, click continue.": "Bekijk je e-mail en klik op de link die het bevat. Zodra dit klaar is, klik op verder gaan.", "Power level must be positive integer.": "Machtsniveau moet een positief geheel getal zijn.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s heeft zijn of haar weergavenaam (%(oldDisplayName)s) verwijderd.", + "%(senderName)s removed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto verwijderd.", "Failed to kick": "Niet gelukt om te er uit te zetten", "Press <StartChatButton> to start a chat with someone": "Druk op <StartChatButton> om een gesprek met iemand te starten", "Remove %(threePid)s?": "%(threePid)s verwijderen?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP-gesprek aangevraagd.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het wachtwoord veranderen betekent momenteel dat alle end-to-endbeveiligingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.", "Results from DuckDuckGo": "Resultaten van DuckDuckGo", "Return to login screen": "Naar het inlogscherm terugkeren", @@ -333,6 +357,7 @@ "Sender device information": "Afzenderapparaatinformatie", "Send Reset Email": "Stuur Reset-E-mail", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s stuurde een afbeelding.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s stuurde een uitnodiging naar %(targetDisplayName)s om tot de ruimte toe te treden.", "Server error": "Serverfout", "Server may be unavailable or overloaded": "De server kan onbereikbaar of overbelast zijn", "Server may be unavailable, overloaded, or search timed out :(": "De server is misschien onbereikbaar, overbelast of het zoeken duurde te lang :(", @@ -340,8 +365,11 @@ "Server may be unavailable, overloaded, or you hit a bug.": "De server is misschien onbereikbaar, overbelast of je bent tegen een fout aangelopen.", "Server unavailable, overloaded, or something else went wrong.": "De server is onbereikbaar, overbelast of iets anders ging fout.", "Session ID": "Sessie-ID", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s heeft %(targetName)s de ruimte uitgestuurd.", "Kick": "Er uit sturen", "Kicks user with given id": "Stuurt de gebruiker met het gegeven ID er uit", + "%(senderName)s set a profile picture.": "%(senderName)s heeft een profielfoto ingesteld.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s heeft zijn of haar weergavenaam naar %(displayName)s veranderd.", "Show panel": "Paneel weergeven", "Show Text Formatting Toolbar": "Tekstopmaakwerkbalk Weergeven", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Laat de tijd in twaalf uur formaat zien (bijv. 2:30pm)", @@ -379,10 +407,12 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Het is niet gelukt om een specifiek punt in de tijdlijn van deze ruimte te laden.", "Turn Markdown off": "Zet Markdown uit", "Turn Markdown on": "Zet Markdown aan", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s heeft end-to-endbeveiliging aangezet (algoritme %(algorithm)s).", "Unable to add email address": "Niet mogelijk om e-mailadres toe te voegen", "Unable to remove contact information": "Niet mogelijk om contactinformatie te verwijderen", "Unable to verify email address.": "Niet mogelijk om het e-mailadres te verifiëren.", "Unban": "Ontbannen", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ontbande %(targetName)s.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Niet mogelijk om vast te stellen dat het adres waar deze uitnodiging naartoe was verstuurd overeenkomt met het adres dat is geassocieerd met je account.", "Unable to capture screen": "Niet mogelijk om het scherm vast te leggen", "Unable to enable Notifications": "Niet mogelijk om notificaties aan te zetten", @@ -438,6 +468,7 @@ "Who can read history?": "Wie kan de geschiedenis lezen?", "Who would you like to add to this room?": "Wie wil je aan deze ruimte toevoegen?", "Who would you like to communicate with?": "Met wie zou je willen communiceren?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s trok %(targetName)s's uitnodiging terug.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Wil je deze uitnodiging <acceptText>accepteren</acceptText> of <declineText>afwijzen</declineText>?", "You already have existing direct chats with this user:": "Je hebt al bestaande privé-gesprekken met deze gebruiker:", "You are already in a call.": "Je bent al in gesprek.", @@ -578,6 +609,9 @@ "Start chatting": "Start met praten", "Start Chatting": "Start Met Praten", "Click on the button below to start chatting!": "Klik op de knop hieronder om te starten met praten!", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s heeft de ruimte avatar aangepast naar <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s heeft de ruimte avatar verwijderd.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s veranderde de avatar voor %(roomName)s", "Username available": "Gebruikersnaam beschikbaar", "Username not available": "Gebruikersnaam niet beschikbaar", "Something went wrong!": "Iets ging niet goed!", @@ -630,7 +664,10 @@ "Automatically replace plain text Emoji": "Automatisch normale tekst vervangen met Emoji", "Failed to upload image": "Het is niet gelukt om de afbeelding te uploaden", "Hide avatars in user and room mentions": "Avatars in gebruiker- en ruimte-vermeldingen verbergen", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget toegevoegd door %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-widget verwijderd door %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Robot-check is momenteel niet beschikbaar op de desktop - gebruik in plaats daarvan een <a>webbrowser</a>", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget aangepast door %(senderName)s", "Copied!": "Gekopieerd!", "Failed to copy": "Kopiëren mislukt", "Unpin Message": "Maak pin los", @@ -663,6 +700,7 @@ "You are now ignoring %(userId)s": "Je bent nu %(userId)s aan het negeren", "Unignored user": "Niet genegeerde gebruiker", "You are no longer ignoring %(userId)s": "Je bent %(userId)s niet meer aan het negeren", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s heeft de gepinde boodschappen voor de ruimte gewijzigd.", "%(names)s and %(count)s others are typing|other": "%(names)s en %(count)s andere gebruikers zijn aan het typen", "%(names)s and %(count)s others are typing|one": "%(names)s en iemand anders is aan het typen", "Send": "Verstuur", @@ -918,6 +956,7 @@ "<a>In reply to</a> <pill>": "<a>Als antwoord op</a> <pill>", "This room is not public. You will not be able to rejoin without an invite.": "Deze ruimte is niet publiekelijk. Je zal niet opnieuw kunnen toetreden zonder een uitnodiging.", "were unbanned %(count)s times|one": "waren ontbant", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s heeft zijn/haar weergavenaam veranderd naar %(displayName)s.", "Disable Community Filter Panel": "Gemeenschapsfilterpaneel uitzetten", "Your key share request has been sent - please check your other devices for key share requests.": "Je verzoek om sleutels te delen is verzonden - controleer je andere apparaten voor het verzoek.", "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Verzoeken om sleutels te delen worden automatisch naar andere apparaten verstuurd. Als je het verzoek hebt afgewezen of weg hebt geklikt, klik dan hier voor een nieuwe verzoek voor de sleutels van deze sessie.", @@ -1141,44 +1180,5 @@ "This room is used for important messages from the Homeserver, so you cannot leave it.": "Deze ruimte wordt gebruikt voor belangrijke berichten van de thuisserver, dus je kan het niet verlaten.", "Terms and Conditions": "Voorwaarden", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Om de %(homeserverDomain)s thuisserver te blijven gebruiken zal je de voorwaarden moeten lezen en ermee akkoord moeten gaan.", - "Review terms and conditions": "Voorwaarden lezen", - "<target> accepted the invitation for %(displayName)s.": "<target> heeft de uitnodiging voor %(displayName)s geaccepteerd.", - "<target> accepted an invitation.": "<target> heeft een uitnodiging geaccepteerd.", - "<sender> requested a VoIP conference.": "<sender> heeft een VoIP-gesprek aangevraagd.", - "<sender> invited <target>.": "<sender> heeft <target> uitgenodigd.", - "<sender> banned <target>.": "<sender> heeft <target> verbannen.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> heeft zijn/haar weergavenaam veranderd naar <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> heeft zijn of haar weergavenaam naar <displayName> veranderd.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> heeft zijn of haar weergavenaam (<oldDisplayName>) verwijderd.", - "<sender> removed their profile picture.": "<sender> heeft zijn of haar profielfoto verwijderd.", - "<sender> changed their profile picture.": "<sender> heeft zijn of haar profielfoto veranderd.", - "<sender> set a profile picture.": "<sender> heeft een profielfoto ingesteld.", - "<target> joined the room.": "<target> is tot de ruimte toegetreden.", - "<target> rejected the invitation.": "<target> heeft de uitnodiging geweigerd.", - "<target> left the room.": "<target> heeft de ruimte verlaten.", - "<sender> unbanned <target>.": "<sender> ontbande <target>.", - "<sender> kicked <target>.": "<sender> heeft <target> de ruimte uitgestuurd.", - "<sender> withdrew <target>'s invitation.": "<sender> trok <target>'s uitnodiging terug.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> heeft het onderwerp gewijzigd naar \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> heeft de ruimtenaam van %(roomName)s gewijzigd.", - "<sender> changed the room avatar to <img/>": "<sender> heeft de ruimte avatar aangepast naar <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> veranderde de avatar voor %(roomName)s", - "<sender> removed the room name.": "<sender> heeft de naam van de ruimte verwijderd.", - "<sender> removed the room avatar.": "<sender> heeft de ruimte avatar verwijderd.", - "<sender> answered the call.": "<sender> heeft deelgenomen aan het audiogesprek.", - "<sender> ended the call.": "<sender> heeft opgehangen.", - "<sender> placed a %(callType)s call.": "<sender> heeft een %(callType)s-gesprek gestart.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> stuurde een uitnodiging naar %(targetDisplayName)s om tot de ruimte toe te treden.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> heeft de toekomstige ruimtegeschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze uitgenodigd zijn.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers, vanaf het moment dat ze toegetreden zijn.", - "<sender> made future room history visible to all room members.": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor alle ruimte deelnemers.", - "<sender> made future room history visible to anyone.": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor iedereen.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor onbekend (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> heeft end-to-endbeveiliging aangezet (algoritme %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> van %(fromPowerLevel)s naar %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.", - "<sender> changed the pinned messages for the room.": "<sender> heeft de gepinde boodschappen voor de ruimte gewijzigd.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s-widget aangepast door <sender>", - "%(widgetName)s widget added by <sender>": "%(widgetName)s-widget toegevoegd door <sender>", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s-widget verwijderd door <sender>" + "Review terms and conditions": "Voorwaarden lezen" } diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index c70f1c6e22..0088028aed 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -99,6 +99,8 @@ "Failed to change password. Is your password correct?": "Zmiana hasła nie powiodła się. Czy Twoje hasło jest poprawne?", "Add a topic": "Dodaj temat", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Wysłano wiadomość tekstową do +%(msisdn)s. Proszę wprowadzić kod w niej zawarty", + "%(targetName)s accepted an invitation.": "%(targetName)s zaakceptował(a) zaproszenie.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s zaakceptował(a) zaproszenie dla %(displayName)s.", "Access Token:": "Jednorazowy kod dostępu:", "Active call (%(roomName)s)": "Aktywne połączenie (%(roomName)s)", "Add email address": "Dodaj adres e-mail", @@ -117,6 +119,7 @@ "%(items)s and %(lastItem)s": "%(items)s i %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s i %(lastPerson)s piszą", "A new password must be entered.": "Musisz wprowadzić nowe hasło.", + "%(senderName)s answered the call.": "%(senderName)s odebrał połączenie.", "An error has occurred.": "Wystąpił błąd.", "Anyone": "Każdy", "Anyone who knows the room's link, apart from guests": "Każdy kto posiada łącze do pokoju, poza gośćmi", @@ -125,6 +128,7 @@ "Are you sure you want to reject the invitation?": "Czy na pewno chcesz odrzucić zaproszenie?", "Are you sure you want to upload the following files?": "Czy na pewno chcesz przesłać następujące pliki?", "Autoplay GIFs and videos": "Automatycznie odtwarzaj GIFy i filmiki", + "%(senderName)s banned %(targetName)s.": "%(senderName)s zbanował %(targetName)s.", "Ban": "Zbanuj", "Bans user with given id": "Blokuje użytkownika o podanym ID", "Blacklisted": "Umieszczono na czarnej liście", @@ -139,6 +143,11 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Nie można nawiązać połączenia z serwerem przy użyciu HTTP podczas korzystania z HTTPS dla bieżącej strony. Użyj HTTPS lub <a>włącz niebezpieczne skrypty</a>.", "Can't load user settings": "Nie można załadować ustawień użytkownika", "Cannot add any more widgets": "Nie można dodać już więcej widżetów", + "%(senderName)s changed their profile picture.": "%(senderName)s zmienił swoje zdjęcie profilowe.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmienił poziom mocy %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmienił nazwę pokoju na %(roomName)s.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s usunął nazwę pokoju.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmienił temat na \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Zmiany w dostępie do historii będą dotyczyć tylko przyszłych wiadomości w tym pokoju", "Changes your display nickname": "Zmień swój pseudonim", "Changes colour scheme of current room": "Zmień schemat kolorystyczny bieżącego pokoju", @@ -205,6 +214,7 @@ "Encrypted room": "Pokój szyfrowany", "Encryption is enabled in this room": "Szyfrowanie jest włączone w tym pokoju", "Encryption is not enabled in this room": "Szyfrowanie nie jest włączone w tym pokoju", + "%(senderName)s ended the call.": "%(senderName)s zakończył połączenie.", "End-to-end encryption information": "Informacje o szyfrowaniu końcówka-do-końcówki", "End-to-end encryption is in beta and may not be reliable": "Szyfrowanie końcówka-do-końcówki jest w fazie beta i może nie być dopracowane", "Enter Code": "Wpisz kod", @@ -244,6 +254,7 @@ "Forgot your password?": "Zapomniałeś hasła?", "For security, this session has been signed out. Please sign in again.": "Ze względów bezpieczeństwa ta sesja została wylogowana. Zaloguj się jeszcze raz.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Ze względów bezpieczeństwa, wylogowanie skasuje z tej przeglądarki wszystkie klucze szyfrowania końcówka-do-końcówki. Jeśli chcesz móc odszyfrować swoje historie konwersacji z przyszłych sesji Riot-a, proszę wyeksportuj swoje klucze pokojów do bezpiecznego miejsca.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Dostęp dla gości jest wyłączony na tym serwerze.", "Deops user with given id": "Usuwa prawa administratora użytkownikowi o danym ID", "Guests cannot join this room even if explicitly invited.": "Goście nie mogą dołączać do tego pokoju, nawet jeśli zostali specjalnie zaproszeni.", @@ -266,6 +277,7 @@ "Invalid address format": "Nieprawidłowy format adresu", "Invalid Email Address": "Nieprawidłowy adres e-mail", "Invalid file%(extra)s": "Nieprawidłowy plik %(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s zaprosił %(targetName)s.", "Invite new room members": "Zaproś nowych członków do pokoju", "Invited": "Zaproszony", "Invites": "Zaproszenia", @@ -276,19 +288,27 @@ "Sign in with": "Zaloguj się używając", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Dołącz <voiceText>głosowo</voiceText> lub przez <videoText>wideo</videoText>.", "Join Room": "Dołącz do pokoju", + "%(targetName)s joined the room.": "%(targetName)s dołączył do pokoju.", "Joins room with given alias": "Dołącz do pokoju o podanym aliasie", "Jump to first unread message.": "Przeskocz do pierwszej nieprzeczytanej wiadomości.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s wyrzucił %(targetName)s.", "Kick": "Wyrzuć", "Kicks user with given id": "Wyrzuca użytkownika o danym ID", "Labs": "Laboratoria", "Last seen": "Ostatnio widziany", "Leave room": "Opuść pokój", + "%(targetName)s left the room.": "%(targetName)s opuścił pokój.", "Level:": "Poziom:", "Publish this room to the public in %(domain)s's room directory?": "Czy opublikować ten pokój dla ogółu w spisie pokojów domeny %(domain)s?", "Local addresses for this room:": "Lokalne adresy dla tego pokoju:", "Logged in as:": "Zalogowany jako:", "Logout": "Wyloguj", "Low priority": "Niski priorytet", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich zaproszenia.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich dołączenia.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla kazdego.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla nieznany (%(visibility)s).", "Manage Integrations": "Zarządzaj integracjami", "Markdown is disabled": "Markdown jest wyłączony", "Markdown is enabled": "Markdown jest włączony", @@ -330,6 +350,7 @@ "People": "Ludzie", "Permissions": "Uprawnienia", "Phone": "Telefon", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s rozpoczął połączenie %(callType)s.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Sprawdź swój e-mail i kliknij link w nim zawarty. Kiedy już to zrobisz, kliknij \"kontynuuj\".", "Power level must be positive integer.": "Poziom uprawnień musi być liczbą dodatnią.", "Press <StartChatButton> to start a chat with someone": "Naciśnij <StartChatButton>, by rozpocząć rozmowę z kimś", @@ -344,11 +365,15 @@ "Revoke widget access": "Usuń dostęp do widżetów", "Refer a friend to Riot:": "Zaproś znajomego do Riota:", "Register": "Rejestracja", + "%(targetName)s rejected the invitation.": "%(targetName)s odrzucił zaproszenie.", "Reject invitation": "Odrzuć zaproszenie", "Rejoin": "Dołącz ponownie", "Remote addresses for this room:": "Adresy zdalne dla tego pokoju:", "Remove Contact Information?": "Usunąć dane kontaktowe?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s usunął swoją nazwę ekranową (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s usunął swoje zdjęcie profilowe.", "Remove %(threePid)s?": "Usunąć %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s zażądał grupowego połączenia głosowego VoIP.", "Results from DuckDuckGo": "Wyniki z DuckDuckGo", "Return to login screen": "Wróć do ekranu logowania", "Riot does not have permission to send you notifications - please check your browser settings": "Riot nie ma uprawnień, by wysyłać ci powiadomienia - sprawdź ustawienia swojej przeglądarki", @@ -376,6 +401,7 @@ "Send Invites": "Wyślij zaproszenie", "Send Reset Email": "Wyślij e-mail resetujący hasło", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s wysłał obraz.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s wysłał zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.", "Server error": "Błąd serwera", "Server may be unavailable or overloaded": "Serwer może być niedostępny lub przeciążony", "Server may be unavailable, overloaded, or search timed out :(": "Serwer może być niedostępny, przeciążony, lub upłynął czas wyszukiwania :(", @@ -383,6 +409,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Serwer może być niedostępny, przeciążony, lub trafiłeś na błąd.", "Server unavailable, overloaded, or something else went wrong.": "Serwer może być niedostępny, przeciążony, lub coś innego poszło źle.", "Session ID": "Identyfikator sesji", + "%(senderName)s set a profile picture.": "%(senderName)s ustawił zdjęcie profilowe.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ustawił swoją nazwę na %(displayName)s.", "Sets the room topic": "Ustaw temat pokoju", "Show panel": "Pokaż panel", "Show Text Formatting Toolbar": "Pokaż pasek narzędzi formatowania tekstu", @@ -423,10 +451,12 @@ "To reset your password, enter the email address linked to your account": "Aby zresetować swoje hasło, wpisz adres e-mail powiązany z twoim kontem", "Turn Markdown off": "Wyłącz Markdown", "Turn Markdown on": "Włącz Markdown", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s włączył szyfrowanie użytkownik-użytkownik (algorithm %(algorithm)s).", "Unable to add email address": "Nie można dodać adresu e-mail", "Unable to create widget.": "Nie można utworzyć widżetu.", "Unable to remove contact information": "Nie można usunąć informacji kontaktowych", "Unable to verify email address.": "Weryfikacja adresu e-mail nie powiodła się.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s odblokował/a %(targetName)s.", "Unable to capture screen": "Nie można zrobić zrzutu ekranu", "Unable to enable Notifications": "Nie można włączyć powiadomień", "Unable to load device list": "Nie można załadować listy urządzeń", @@ -473,6 +503,7 @@ "Who can access this room?": "Kto może uzyskać dostęp do tego pokoju?", "Who would you like to add to this room?": "Kogo chciał(a)byś dodać do tego pokoju?", "Who would you like to communicate with?": "Z kim chciał(a)byś się komunikować?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s wycofał(a) zaproszenie %(targetName)s.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Czy chcesz <acceptText>zaakceptować</acceptText> czy <declineText>odrzucić</declineText> to zaproszenie?", "You already have existing direct chats with this user:": "Masz już istniejącą bezpośrednią konwersację z tym użytkownikiem:", "You are already in a call.": "Jesteś już w trakcie połączenia.", @@ -598,6 +629,9 @@ " (unsupported)": " (niewspierany)", "Idle": "Bezczynny", "Check for update": "Sprawdź aktualizacje", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s zmienił awatar pokoju na <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s usunął awatar pokoju.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmienił awatar %(roomName)s", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "To będzie twoja nazwa konta na <span></span> serwerze domowym; możesz też wybrać <a>inny serwer</a>.", "If you already have a Matrix account you can <a>log in</a> instead.": "Jeśli już posiadasz konto Matrix możesz się <a>zalogować</a>.", "Not a valid Riot keyfile": "Niepoprawny plik klucza Riot", @@ -630,6 +664,9 @@ "Featured Rooms:": "Wyróżnione pokoje:", "Featured Users:": "Wyróżnieni użytkownicy:", "Hide avatars in user and room mentions": "Ukryj awatary we wzmiankach użytkowników i pokoi", + "%(widgetName)s widget added by %(senderName)s": "Widżet %(widgetName)s został dodany przez %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Widżet %(widgetName)s został usunięty przez %(senderName)s", + "%(widgetName)s widget modified by %(senderName)s": "Widżet %(widgetName)s został zmodyfikowany przez %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "Sprawdzanie człowieczeństwa jest obecnie niedostępne na aplikacji klienckiej desktop - proszę użyć <a>przeglądarki internetowej</a>", "Unpin Message": "Odepnij Wiadomość", "Add rooms to this community": "Dodaj pokoje do tej społeczności", @@ -663,6 +700,8 @@ "Ignored user": "Użytkownik ignorowany", "You are now ignoring %(userId)s": "Ignorujesz teraz %(userId)s", "You are no longer ignoring %(userId)s": "Nie ignorujesz już %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s zmienił swoją wyświetlaną nazwę na %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmienił przypiętą wiadomość dla tego pokoju.", "Message Pinning": "Przypinanie wiadomości", "%(names)s and %(count)s others are typing|other": "%(names)s oraz %(count)s innych piszą", "%(names)s and %(count)s others are typing|one": "%(names)s oraz jedna inna osoba piszą", @@ -916,44 +955,5 @@ "Advanced options": "Opcje zaawansowane", "To continue, please enter your password:": "Aby kontynuować, proszę wprowadzić swoje hasło:", "password": "hasło", - "Refresh": "Odśwież", - "<target> accepted the invitation for %(displayName)s.": "<target> zaakceptował(a) zaproszenie dla %(displayName)s.", - "<target> accepted an invitation.": "<target> zaakceptował(a) zaproszenie.", - "<sender> requested a VoIP conference.": "<sender> zażądał grupowego połączenia głosowego VoIP.", - "<sender> invited <target>.": "<sender> zaprosił <target>.", - "<sender> banned <target>.": "<sender> zbanował <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> zmienił swoją wyświetlaną nazwę na <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> ustawił swoją nazwę na <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> usunął swoją nazwę ekranową (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> usunął swoje zdjęcie profilowe.", - "<sender> changed their profile picture.": "<sender> zmienił swoje zdjęcie profilowe.", - "<sender> set a profile picture.": "<sender> ustawił zdjęcie profilowe.", - "<target> joined the room.": "<target> dołączył do pokoju.", - "<target> rejected the invitation.": "<target> odrzucił zaproszenie.", - "<target> left the room.": "<target> opuścił pokój.", - "<sender> unbanned <target>.": "<sender> odblokował/a <target>.", - "<sender> kicked <target>.": "<sender> wyrzucił <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> wycofał(a) zaproszenie <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> zmienił temat na \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> zmienił nazwę pokoju na %(roomName)s.", - "<sender> changed the room avatar to <img/>": "<sender> zmienił awatar pokoju na <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> zmienił awatar %(roomName)s", - "<sender> removed the room name.": "<sender> usunął nazwę pokoju.", - "<sender> removed the room avatar.": "<sender> usunął awatar pokoju.", - "<sender> answered the call.": "<sender> odebrał połączenie.", - "<sender> ended the call.": "<sender> zakończył połączenie.", - "<sender> placed a %(callType)s call.": "<sender> rozpoczął połączenie %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> wysłał zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich zaproszenia.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju, od momentu ich dołączenia.", - "<sender> made future room history visible to all room members.": "<sender> uczynił przyszłą historię pokoju widoczną dla wszyscy członkowie pokoju.", - "<sender> made future room history visible to anyone.": "<sender> uczynił przyszłą historię pokoju widoczną dla kazdego.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> uczynił przyszłą historię pokoju widoczną dla nieznany (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> włączył szyfrowanie użytkownik-użytkownik (algorithm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> z %(fromPowerLevel)s na %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> zmienił poziom mocy %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> zmienił przypiętą wiadomość dla tego pokoju.", - "%(widgetName)s widget modified by <sender>": "Widżet %(widgetName)s został zmodyfikowany przez <sender>", - "%(widgetName)s widget added by <sender>": "Widżet %(widgetName)s został dodany przez <sender>", - "%(widgetName)s widget removed by <sender>": "Widżet %(widgetName)s został usunięty przez <sender>" + "Refresh": "Odśwież" } diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 1f3e83c14c..7cc80cfc78 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -16,6 +16,7 @@ "Blacklisted": "Bloqueado", "Bulk Options": "Opcões de Batelada", "Can't load user settings": "Não é possível carregar configurações de usuário", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala", "Changes your display nickname": "Troca o seu apelido", "Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519", @@ -197,8 +198,15 @@ "Dec": "Dez", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s de %(monthName)s às %(time)s", "%(weekDayName)s %(time)s": "%(weekDayName)s às %(time)s", + "%(targetName)s accepted an invitation.": "%(targetName)s aceitou um convite.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.", "%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s estão escrevendo", + "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", + "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "click to reveal": "clique para ver", "Conference call failed.": "Chamada de conferência falhou.", "Conference calling is in development and may not be reliable.": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar.", @@ -206,22 +214,41 @@ "Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador", "/ddg is not a command": "/ddg não é um comando", "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", + "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", "Failed to send email": "Falha ao enviar email", "Failed to send request.": "Não foi possível mandar requisição.", "Failed to set up conference call": "Não foi possível montar a chamada de conferência", "Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email", "Failure to create room": "Não foi possível criar a sala", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.", "%(displayName)s is typing": "%(displayName)s está escrevendo", + "%(targetName)s joined the room.": "%(targetName)s entrou na sala.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", + "%(targetName)s left the room.": "%(targetName)s saiu da sala.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s deixou o histórico futuro da sala visível para todas as pessoas da sala.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s deixou o histórico futuro da sala visível para qualquer pessoa.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", "Missing room_id in request": "Faltou o id da sala na requisição", "Missing user_id in request": "Faltou o id de usuário na requisição", "(not supported by this browser)": "(não é compatível com este navegador)", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.", "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", "Reason": "Razão", + "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s está solicitando uma conferência de voz.", "Riot does not have permission to send you notifications - please check your browser settings": "Riot não tem permissões para enviar notificações a você - por favor, verifique as configurações do seu navegador", "Riot was not given permission to send notifications - please try again": "Riot não tem permissões para enviar notificações a você - por favor, tente novamente", "Room %(roomId)s not visible": "A sala %(roomId)s não está visível", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou um convite para %(targetDisplayName)s entrar na sala.", + "%(senderName)s set a profile picture.": "%(senderName)s definiu uma imagem de perfil.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s definiu seu nome público para %(displayName)s.", "This email address is already in use": "Este endereço de email já está sendo usado", "This email address was not found": "Este endereço de email não foi encontrado", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "O arquivo '%(fileName)s' ultrapassa o limite de tamanho que nosso servidor permite enviar", @@ -231,12 +258,15 @@ "These are experimental features that may break in unexpected ways": "Estas são funcionalidades experimentais que podem apresentar falhas", "This phone number is already in use": "Este número de telefone já está sendo usado", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", "Unable to enable Notifications": "Não foi possível ativar as notificações", "Upload Failed": "O envio falhou", "Usage": "Uso", "Use with caution": "Use com cautela", "VoIP is unsupported": "Chamada de voz não permitida", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "You are already in a call.": "Você já está em uma chamada.", "You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.", "You cannot place a call with yourself.": "Você não pode iniciar uma chamada.", @@ -376,6 +406,7 @@ "Warning!": "Atenção!", "You need to enter a user name.": "Você precisa inserir um nome de usuária(o).", "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", @@ -470,6 +501,9 @@ "Verified key": "Chave verificada", "WARNING: Device already verified, but keys do NOT MATCH!": "ATENÇÃO: O dispositivo já foi verificado, mas as chaves NÃO SÃO IGUAIS!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: VERIFICAÇÃO DE CHAVE FALHOU! A chave de assinatura para a(o) usuária(o) %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\", que não é igual à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estão sendo interceptadas!", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a imagem da sala.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a imagem da sala %(roomName)s", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s alterou a imagem da sala para <img/>", "Missing Media Permissions, click here to request.": "Faltam permissões para uso de mídia no seu computador. Clique aqui para solicitá-las.", "No Microphones detected": "Não foi detetado nenhum microfone", "No Webcams detected": "Não foi detetada nenhuma Webcam", @@ -631,6 +665,9 @@ "Automatically replace plain text Emoji": "Substituir Emoji em texto automaticamente", "Failed to upload image": "Falha ao carregar imagem", "Hide avatars in user and room mentions": "Ocultar avatares nas menções de utilizadores e salas", + "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s adicionado por %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s removido por %(senderName)s", + "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificado por %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "A verificação através de robot está atualmente indisponível na versão desktop - utilize um <a>navegador web</a>", "Advanced options": "Opções avançadas", "This setting cannot be changed later!": "Esta definição não pode ser alterada mais tarde!", @@ -805,42 +842,5 @@ "Collapse panel": "Colapsar o painel", "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!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se quiser tentar de qualquer maneira pode continuar, mas está por sua conta com algum problema que possa encontrar!", "Checking for an update...": "A procurar uma atualização...", - "There are advanced notifications which are not shown here": "Existem notificações avançadas que não são exibidas aqui", - "<target> accepted the invitation for %(displayName)s.": "<target> aceitou o convite para %(displayName)s.", - "<target> accepted an invitation.": "<target> aceitou um convite.", - "<sender> requested a VoIP conference.": "<sender> está solicitando uma conferência de voz.", - "<sender> invited <target>.": "<sender> convidou <target>.", - "<sender> banned <target>.": "<sender> removeu <target> da sala.", - "<sender> set their display name to <displayName>.": "<sender> definiu seu nome público para <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> removeu o seu nome público (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> removeu sua imagem de perfil.", - "<sender> changed their profile picture.": "<sender> alterou sua imagem de perfil.", - "<sender> set a profile picture.": "<sender> definiu uma imagem de perfil.", - "<target> joined the room.": "<target> entrou na sala.", - "<target> rejected the invitation.": "<target> recusou o convite.", - "<target> left the room.": "<target> saiu da sala.", - "<sender> unbanned <target>.": "<sender> desfez o banimento de <target>.", - "<sender> kicked <target>.": "<sender> removeu <target> da sala.", - "<sender> withdrew <target>'s invitation.": "<sender> desfez o convite a <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> mudou o tópico para \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> alterou o nome da sala para %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> alterou a imagem da sala %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> alterou a imagem da sala para <img/>", - "<sender> removed the room name.": "<sender> apagou o nome da sala.", - "<sender> removed the room avatar.": "<sender> removeu a imagem da sala.", - "<sender> answered the call.": "<sender> atendeu à chamada.", - "<sender> ended the call.": "<sender> finalizou a chamada.", - "<sender> placed a %(callType)s call.": "<sender> fez uma chamada de %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> enviou um convite para %(targetDisplayName)s entrar na sala.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", - "<sender> made future room history visible to all room members.": "<sender> deixou o histórico futuro da sala visível para todas as pessoas da sala.", - "<sender> made future room history visible to anyone.": "<sender> deixou o histórico futuro da sala visível para qualquer pessoa.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s para %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> alterou o nível de permissões de %(powerLevelDiffText)s.", - "%(widgetName)s widget modified by <sender>": "Widget %(widgetName)s modificado por <sender>", - "%(widgetName)s widget added by <sender>": "Widget %(widgetName)s adicionado por <sender>", - "%(widgetName)s widget removed by <sender>": "Widget %(widgetName)s removido por <sender>" + "There are advanced notifications which are not shown here": "Existem notificações avançadas que não são exibidas aqui" } diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index e07b51ea79..c583e795cb 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -16,6 +16,7 @@ "Blacklisted": "Bloqueado", "Bulk Options": "Opcões de Batelada", "Can't load user settings": "Não é possível carregar configurações de usuário", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala", "Changes your display nickname": "Troca o seu apelido", "Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519", @@ -197,8 +198,15 @@ "Dec": "Dez", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s de %(monthName)s às %(time)s", "%(weekDayName)s %(time)s": "%(weekDayName)s às %(time)s", + "%(targetName)s accepted an invitation.": "%(targetName)s aceitou um convite.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.", "%(names)s and %(lastPerson)s are typing": "%(names)s e %(lastPerson)s estão escrevendo", + "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", + "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "click to reveal": "clique para ver", "Conference call failed.": "Chamada de conferência falhou.", "Conference calling is in development and may not be reliable.": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar.", @@ -206,23 +214,42 @@ "Conference calls are not supported in this client": "Chamadas de conferência não são possíveis neste navegador", "/ddg is not a command": "/ddg não é um comando", "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", + "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", "Failed to send email": "Não foi possível enviar email", "Failed to send request.": "Não foi possível mandar requisição.", "Failed to set up conference call": "Não foi possível montar a chamada de conferência", "Failed to verify email address: make sure you clicked the link in the email": "Não foi possível verificar o endereço de email: verifique se você realmente clicou no link que está no seu email", "Failure to create room": "Não foi possível criar a sala", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s para %(toPowerLevel)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s convidou %(targetName)s.", "%(displayName)s is typing": "%(displayName)s está escrevendo", + "%(targetName)s joined the room.": "%(targetName)s entrou na sala.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", + "%(targetName)s left the room.": "%(targetName)s saiu da sala.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s deixou o histórico futuro da sala visível para todas as pessoas da sala.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s deixou o histórico futuro da sala visível para qualquer pessoa.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", "Missing room_id in request": "Faltou o id da sala na requisição", "Missing user_id in request": "Faltou o id de usuário na requisição", "(not supported by this browser)": "(não é compatível com este navegador)", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.", "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", "Press <StartChatButton> to start a chat with someone": "Clique em <StartChatButton> para iniciar a conversa com alguém", "Reason": "Razão", + "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s está solicitando uma conferência de voz.", "Riot does not have permission to send you notifications - please check your browser settings": "Riot não tem permissões para enviar notificações a você - por favor, verifique as configurações do seu navegador", "Riot was not given permission to send notifications - please try again": "Riot não tem permissões para enviar notificações a você - por favor, tente novamente", "Room %(roomId)s not visible": "A sala %(roomId)s não está visível", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou um convite para %(targetDisplayName)s entrar na sala.", + "%(senderName)s set a profile picture.": "%(senderName)s definiu uma imagem de perfil.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s definiu seu nome público para %(displayName)s.", "This email address is already in use": "Este endereço de email já está sendo usado", "This email address was not found": "Este endereço de email não foi encontrado", "The file '%(fileName)s' exceeds this home server's size limit for uploads": "O arquivo '%(fileName)s' ultrapassa o limite de tamanho que nosso servidor permite enviar", @@ -232,12 +259,15 @@ "These are experimental features that may break in unexpected ways": "Estas são funcionalidades experimentais que podem apresentar falhas", "This phone number is already in use": "Este número de telefone já está sendo usado", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", "Unable to enable Notifications": "Não foi possível ativar as notificações", "Upload Failed": "O envio falhou", "Usage": "Uso", "Use with caution": "Use com cautela", "VoIP is unsupported": "Chamada de voz não permitida", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "You are already in a call.": "Você já está em uma chamada.", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Você ainda não está em nenhuma sala! Clique em <CreateRoomButton> para criar uma sala ou em <RoomDirectoryButton> para navegar pela lista pública de salas", "You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.", @@ -378,6 +408,7 @@ "Warning!": "Atenção!", "You need to enter a user name.": "Você precisa inserir um nome de usuária(o).", "Please select the destination room for this message": "Por favor, escolha a sala para onde quer encaminhar esta mensagem", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", "Options": "Opções", "Riot collects anonymous analytics to allow us to improve the application.": "Riot coleta informações anônimas de uso para nos permitir melhorar o sistema.", @@ -472,6 +503,9 @@ "Verified key": "Chave verificada", "WARNING: Device already verified, but keys do NOT MATCH!": "ATENÇÃO: O dispositivo já foi verificado, mas as chaves NÃO SÃO IGUAIS!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: VERIFICAÇÃO DE CHAVE FALHOU! A chave de assinatura para a(o) usuária(o) %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\", que não é igual à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estão sendo interceptadas!", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a imagem da sala.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a imagem da sala %(roomName)s", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s alterou a imagem da sala para <img/>", "Missing Media Permissions, click here to request.": "Faltam permissões para uso de mídia no seu computador. Clique aqui para solicitá-las.", "No Microphones detected": "Não foi detectado nenhum microfone", "No Webcams detected": "Não foi detectada nenhuma Webcam", @@ -639,6 +673,11 @@ "Unable to create widget.": "Não foi possível criar o widget.", "You are now ignoring %(userId)s": "Você está agora ignorando %(userId)s", "Unignored user": "Usuária/o não está sendo mais ignorada/o", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s alterou o seu nome público para %(displayName)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s alterou as mensagens fixas da sala.", + "%(widgetName)s widget modified by %(senderName)s": "O widget %(widgetName)s foi modificado por %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "O widget %(widgetName)s foi criado por %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "O widget %(widgetName)s foi removido por %(senderName)s", "%(names)s and %(count)s others are typing|other": "%(names)s e %(count)s outras pessoas estão escrevendo", "%(names)s and %(count)s others are typing|one": "%(names)s e uma outra pessoa estão escrevendo", "Send": "Enviar", @@ -1075,44 +1114,5 @@ "Collapse panel": "Colapsar o painel", "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!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se você quiser tentar de qualquer maneira, pode continuar, mas aí vai ter que se virar sozinho(a) com os problemas que porventura encontrar!", "Checking for an update...": "Verificando se há atualizações...", - "There are advanced notifications which are not shown here": "Existem opções avançadas que não são exibidas aqui", - "<target> accepted the invitation for %(displayName)s.": "<target> aceitou o convite para %(displayName)s.", - "<target> accepted an invitation.": "<target> aceitou um convite.", - "<sender> requested a VoIP conference.": "<sender> está solicitando uma conferência de voz.", - "<sender> invited <target>.": "<sender> convidou <target>.", - "<sender> banned <target>.": "<sender> removeu <target> da sala.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> alterou o seu nome público para <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> definiu seu nome público para <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> removeu o seu nome público (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> removeu sua imagem de perfil.", - "<sender> changed their profile picture.": "<sender> alterou sua imagem de perfil.", - "<sender> set a profile picture.": "<sender> definiu uma imagem de perfil.", - "<target> joined the room.": "<target> entrou na sala.", - "<target> rejected the invitation.": "<target> recusou o convite.", - "<target> left the room.": "<target> saiu da sala.", - "<sender> unbanned <target>.": "<sender> desfez o banimento de <target>.", - "<sender> kicked <target>.": "<sender> removeu <target> da sala.", - "<sender> withdrew <target>'s invitation.": "<sender> desfez o convite a <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> mudou o tópico para \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> alterou o nome da sala para %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> alterou a imagem da sala %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> alterou a imagem da sala para <img/>", - "<sender> removed the room name.": "<sender> apagou o nome da sala.", - "<sender> removed the room avatar.": "<sender> removeu a imagem da sala.", - "<sender> answered the call.": "<sender> atendeu à chamada.", - "<sender> ended the call.": "<sender> finalizou a chamada.", - "<sender> placed a %(callType)s call.": "<sender> fez uma chamada de %(callType)s.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> enviou um convite para %(targetDisplayName)s entrar na sala.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando foram convidados.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> deixou o histórico futuro da sala visível para todos os membros da sala, a partir de quando entraram.", - "<sender> made future room history visible to all room members.": "<sender> deixou o histórico futuro da sala visível para todas as pessoas da sala.", - "<sender> made future room history visible to anyone.": "<sender> deixou o histórico futuro da sala visível para qualquer pessoa.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> deixou o histórico futuro da sala visível para desconhecido (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> de %(fromPowerLevel)s para %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> alterou o nível de permissões de %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> alterou as mensagens fixas da sala.", - "%(widgetName)s widget modified by <sender>": "O widget %(widgetName)s foi modificado por <sender>", - "%(widgetName)s widget added by <sender>": "O widget %(widgetName)s foi criado por <sender>", - "%(widgetName)s widget removed by <sender>": "O widget %(widgetName)s foi removido por <sender>" + "There are advanced notifications which are not shown here": "Existem opções avançadas que não são exibidas aqui" } diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 68483ab4ff..ae889c5677 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -136,22 +136,41 @@ "Your password has been reset": "Ваш пароль был сброшен", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Пароль успешно изменен. До повторной авторизации вы не будете получать push-уведомления на других устройствах", "You should not yet trust it to secure data": "На данный момент не следует полагаться на то, что ваша переписка будет надежно зашифрована", + "%(targetName)s accepted an invitation.": "%(targetName)s принял приглашение.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s принял приглашение от %(displayName)s.", "Active call": "Активный вызов", "%(names)s and %(lastPerson)s are typing": "%(names)s и %(lastPerson)s печатают", + "%(senderName)s answered the call.": "%(senderName)s ответил(а) на звонок.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s заблокировал(а) %(targetName)s.", "Call Timeout": "Нет ответа", + "%(senderName)s changed their profile picture.": "%(senderName)s изменил(а) свой аватар.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s изменил(а) уровни прав %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s изменил(а) название комнаты на %(roomName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s изменил(а) тему комнаты на \"%(topic)s\".", "Conference call failed.": "Сбой конференц-звонка.", "Conference calling is in development and may not be reliable.": "Конференц-связь находится в разработке и может не работать.", "Conference calls are not supported in encrypted rooms": "Конференц-связь не поддерживается в зашифрованных комнатах", "Conference calls are not supported in this client": "Конференц-связь в этом клиенте не поддерживается", "/ddg is not a command": "/ddg — это не команда", "Drop here to tag %(section)s": "Перетащите сюда, чтобы пометить как %(section)s", + "%(senderName)s ended the call.": "%(senderName)s завершил(а) звонок.", "Existing Call": "Текущий вызов", "Failed to send request.": "Не удалось отправить запрос.", "Failed to set up conference call": "Не удалось сделать конференц-звонок", "Failed to verify email address: make sure you clicked the link in the email": "Не удалось проверить email: убедитесь, что вы перешли по ссылке в письме", "Failure to create room": "Не удалось создать комнату", + "%(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.", "%(displayName)s is typing": "%(displayName)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 сделал(а) историю разговора видимой для всех собеседников с момента их приглашения.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников с момента их входа в комнату.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s сделал(а) историю разговора видимой для всех собеседников.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s сделал(а) историю разговора видимой для всех.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s сделал(а) историю комнаты видимой в неизвестном режиме (%(visibility)s).", "Missing room_id in request": "Отсутствует room_id в запросе", "Missing user_id in request": "Отсутствует user_id в запросе", "(not supported by this browser)": "(не поддерживается этим браузером)", @@ -181,6 +200,7 @@ "You are already in a call.": "Идет разговор.", "You are trying to access %(roomName)s.": "Вы пытаетесь войти в %(roomName)s.", "You cannot place a call with yourself.": "Вы не можете позвонить самому себе.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s отозвал(а) свое приглашение %(targetName)s.", "Sep": "Сен", "Jan": "Янв", "Feb": "Фев", @@ -203,6 +223,8 @@ "Sat": "Сб", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш email не связан ни с одним пользователем на этом сервере.", "To use it, just wait for autocomplete results to load and tab through them.": "Чтобы воспользоваться этой функцией, дождитесь загрузки результатов в окне автодополнения, а затем используйте Tab для прокрутки.", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включил(а) в комнате сквозное шифрование (алгоритм %(algorithm)s).", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s разблокировал(а) %(targetName)s.", "Unable to capture screen": "Не удается сделать снимок экрана", "Unable to enable Notifications": "Не удалось включить уведомления", "Upload Failed": "Сбой отправки файла", @@ -276,12 +298,17 @@ "OK": "OK", "Only people who have been invited": "Только приглашенные участники", "Passwords can't be empty": "Пароли не могут быть пустыми", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s начал(а) %(callType)s-звонок.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Проверьте свою электронную почту и нажмите на содержащуюся ссылку. После этого нажмите кнопку Продолжить.", "Power level must be positive integer.": "Уровень прав должен быть положительным целым числом.", "Profile": "Профиль", "Reason": "Причина", + "%(targetName)s rejected the invitation.": "%(targetName)s отклонил(а) приглашение.", "Reject invitation": "Отклонить приглашение", "Remove Contact Information?": "Удалить контактную информацию?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s удалил(а) свое отображаемое имя (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s удалил(а) свой аватар.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s хочет начать конференц-звонок.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Сброс пароля на данный момент сбрасывает ключи шифрования на всех устройствах, делая зашифрованную историю чатов нечитаемой. Чтобы избежать этого, экспортируйте ключи комнат и импортируйте их после сброса пароля. В будущем это будет исправлено.", "Riot does not have permission to send you notifications - please check your browser settings": "У Riot нет разрешения на отправку уведомлений — проверьте настройки браузера", "Riot was not given permission to send notifications - please try again": "Riot не получил разрешение на отправку уведомлений, пожалуйста, попробуйте снова", @@ -297,6 +324,7 @@ "Sender device information": "Информация об устройстве отправителя", "Send Invites": "Отправить приглашения", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s отправил(а) изображение.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s пригласил(а) %(targetDisplayName)s в комнату.", "Show panel": "Показать панель", "Sign in": "Войти", "Sign out": "Выйти", @@ -365,6 +393,7 @@ "You may need to manually permit Riot to access your microphone/webcam": "Вам необходимо предоставить Riot доступ к микрофону или веб-камере вручную", "Anyone": "Все", "Are you sure you want to leave the room '%(roomName)s'?": "Вы уверены, что хотите покинуть '%(roomName)s'?", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s удалил(а) имя комнаты.", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Смена пароля на данный момент сбрасывает ключи сквозного шифрования на всех устройствах, делая историю зашифрованных чатов нечитаемой. Чтобы избежать этого, экспортируйте ключи сквозного шифрования и импортируйте их после смены пароля. В будущем это будет исправлено.", "Custom level": "Специальные права", "Device already verified!": "Устройство уже проверено!", @@ -401,6 +430,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Возможно, сервер недоступен, перегружен или случилась ошибка.", "Server unavailable, overloaded, or something else went wrong.": "Возможно, сервер недоступен, перегружен или что-то еще пошло не так.", "Session ID": "ID сессии", + "%(senderName)s set a profile picture.": "%(senderName)s установил(а) себе аватар.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s изменил(а) отображаемое имя на %(displayName)s.", "Signed Out": "Выполнен выход", "Tagged as: ": "Метки: ", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Предоставленный вами ключ совпадает с ключом, полученным от %(userId)s с устройства %(deviceId)s. Это устройство помечено как проверенное.", @@ -495,6 +526,9 @@ "Online": "Онлайн", "Idle": "Неактивен", "Offline": "Не в сети", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s сменил(а) аватар комнаты на <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s удалил(а) аватар комнаты.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s сменил(а) аватар %(roomName)s", "Create new room": "Создать комнату", "Room directory": "Каталог комнат", "Start chat": "Начать чат", @@ -629,8 +663,11 @@ "Automatically replace plain text Emoji": "Автоматически заменять текстовые смайлики на Emoji", "Failed to upload image": "Не удалось загрузить изображение", "Hide avatars in user and room mentions": "Скрывать аватары в упоминаниях пользователей и комнат", + "%(widgetName)s widget added by %(senderName)s": "Виджет %(widgetName)s был добавлен %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "Виджет %(widgetName)s был удален %(senderName)s", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "CAPTCHA-тест в настоящее время недоступен в Desktop-клиенте - пожалуйста, используйте <a>браузер</a>", "Publish this room to the public in %(domain)s's room directory?": "Опубликовать эту комнату в каталоге комнат %(domain)s?", + "%(widgetName)s widget modified by %(senderName)s": "Виджет %(widgetName)s был изменен %(senderName)s", "Copied!": "Скопировано!", "Failed to copy": "Не удалось скопировать", "Advanced options": "Дополнительные параметры", @@ -685,6 +722,7 @@ "Which rooms would you like to add to this summary?": "Какие комнаты вы хотите добавить в эту сводку?", "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:", "Failed to remove the room from the summary of %(groupId)s": "Не удалось удалить комнату из сводки %(groupId)s", "The room '%(roomName)s' could not be removed from the summary.": "Комнату '%(roomName)s' не удалось удалить из сводки.", @@ -917,6 +955,7 @@ "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>Показать устройства</showDevicesText>, <sendAnywayText>отправить в любом случае</sendAnywayText> или <cancelText>отменить</cancelText>.", "Community IDs cannot not be empty.": "ID сообществ не могут быть пустыми.", "<a>In reply to</a> <pill>": "<a>В ответ на</a> <pill>", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s изменил(а) отображаемое имя на %(displayName)s.", "Failed to set direct chat tag": "Не удалось установить тег прямого чата", "Failed to remove tag %(tagName)s from room": "Не удалось удалить тег %(tagName)s из комнаты", "Failed to add tag %(tagName)s to room": "Не удалось добавить тег %(tagName)s в комнату", @@ -1152,44 +1191,5 @@ "Share User": "Поделиться пользователем", "Share Community": "Поделиться сообществом", "Link to selected message": "Ссылка на выбранное сообщение", - "COPY": "КОПИРОВАТЬ", - "<target> accepted the invitation for %(displayName)s.": "<target> принял приглашение от %(displayName)s.", - "<target> accepted an invitation.": "<target> принял приглашение.", - "<sender> requested a VoIP conference.": "<sender> хочет начать конференц-звонок.", - "<sender> invited <target>.": "<sender> приглашает <target>.", - "<sender> banned <target>.": "<sender> заблокировал(а) <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> изменил(а) отображаемое имя на <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> изменил(а) отображаемое имя на <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> удалил(а) свое отображаемое имя (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> удалил(а) свой аватар.", - "<sender> changed their profile picture.": "<sender> изменил(а) свой аватар.", - "<sender> set a profile picture.": "<sender> установил(а) себе аватар.", - "<target> joined the room.": "<target> вошел(-ла) в комнату.", - "<target> rejected the invitation.": "<target> отклонил(а) приглашение.", - "<target> left the room.": "<target> покинул(а) комнату.", - "<sender> unbanned <target>.": "<sender> разблокировал(а) <target>.", - "<sender> kicked <target>.": "<sender> выгнал(а) <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> отозвал(а) свое приглашение <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> изменил(а) тему комнаты на \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> изменил(а) название комнаты на %(roomName)s.", - "<sender> changed the room avatar to <img/>": "<sender> сменил(а) аватар комнаты на <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> сменил(а) аватар %(roomName)s", - "<sender> removed the room name.": "<sender> удалил(а) имя комнаты.", - "<sender> removed the room avatar.": "<sender> удалил(а) аватар комнаты.", - "<sender> answered the call.": "<sender> ответил(а) на звонок.", - "<sender> ended the call.": "<sender> завершил(а) звонок.", - "<sender> placed a %(callType)s call.": "<sender> начал(а) %(callType)s-звонок.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> пригласил(а) %(targetDisplayName)s в комнату.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> сделал(а) историю разговора видимой для всех собеседников с момента их приглашения.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> сделал(а) историю разговора видимой для всех собеседников с момента их входа в комнату.", - "<sender> made future room history visible to all room members.": "<sender> сделал(а) историю разговора видимой для всех собеседников.", - "<sender> made future room history visible to anyone.": "<sender> сделал(а) историю разговора видимой для всех.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> сделал(а) историю комнаты видимой в неизвестном режиме (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> включил(а) в комнате сквозное шифрование (алгоритм %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "для <user> с %(fromPowerLevel)s на %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> изменил(а) уровни прав %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> изменил(а) закрепленные в этой комнате сообщения.", - "%(widgetName)s widget modified by <sender>": "Виджет %(widgetName)s был изменен <sender>", - "%(widgetName)s widget added by <sender>": "Виджет %(widgetName)s был добавлен <sender>", - "%(widgetName)s widget removed by <sender>": "Виджет %(widgetName)s был удален <sender>" + "COPY": "КОПИРОВАТЬ" } diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index eae28ee1fa..b1f3f4260d 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -102,14 +102,49 @@ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Podpisovací kľúč, ktorý ste poskytli súhlasí s podpisovacím kľúčom, ktorý ste dostali zo zariadenia %(deviceId)s používateľa %(userId)s's. Zariadenie je považované za overené.", "Unrecognised command:": "Nerozpoznaný príkaz:", "Reason": "Dôvod", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s prijal pozvanie do %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s prijal pozvanie.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s požiadal o VoIP konferenciu.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s zakázal vstup %(targetName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s si nastavil zobrazované meno %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s odstránil svoje zobrazované meno (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s si z profilu odstránil obrázok.", + "%(senderName)s changed their profile picture.": "%(senderName)s si zmenil obrázok v profile.", + "%(senderName)s set a profile picture.": "%(senderName)s si nastavil obrázok v profile.", "VoIP conference started.": "Začala VoIP konferencia.", + "%(targetName)s joined the room.": "%(targetName)s vstúpil do miestnosti.", "VoIP conference finished.": "Skončila VoIP konferencia.", + "%(targetName)s rejected the invitation.": "%(targetName)s odmietol pozvanie.", + "%(targetName)s left the room.": "%(targetName)s opustil miestnosť.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s povolil vstup %(targetName)s.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s vykopol %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s stiahol pozvanie %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmenil tému na \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s odstránil názov miestnosti.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmenil názov miestnosti na %(roomName)s.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s poslal obrázok.", "Someone": "Niekto", "(not supported by this browser)": "(Nepodporované v tomto prehliadači)", + "%(senderName)s answered the call.": "%(senderName)s prijal hovor.", "(could not connect media)": "(nie je možné spojiť médiá)", "(no answer)": "(žiadna odpoveď)", "(unknown failure: %(reason)s)": "(neznáma chyba: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s ukončil hovor.", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s uskutočnil %(callType)s hovor.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s pozval %(targetDisplayName)s vstúpiť do miestnosti.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy boli pozvaní.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy vstúpili.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre každého.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s sprístupnil budúcu históriu miestnosti neznámym (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s povolil E2E šifrovanie (algoritmus %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmenil úroveň moci pre %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmenil pripnuté správy pre túto miestnosť.", + "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s zmenil widget %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "%(senderName)s pridal widget %(widgetName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s odstránil widget %(widgetName)s", "Communities": "Komunity", "Message Pinning": "Pripnutie správ", "%(displayName)s is typing": "%(displayName)s píše", @@ -387,6 +422,9 @@ "Invalid file%(extra)s": "Neplatný súbor%(extra)s", "Error decrypting image": "Chyba pri dešifrovaní obrázka", "Error decrypting video": "Chyba pri dešifrovaní videa", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmenil obrázok miestnosti %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odstránil obrázok miestnosti.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s zmenil obrázok miestnosti <img/>", "Copied!": "Skopírované!", "Failed to copy": "Nepodarilo sa skopírovať", "Add an Integration": "Pridať integráciu", @@ -914,6 +952,7 @@ "Your homeserver's URL": "URL adresa vami používaného domovského servera", "Your identity server's URL": "URL adresa vami používaného servera totožností", "This room is not public. You will not be able to rejoin without an invite.": "Toto nie je verejne dostupná miestnosť. Bez pozvánky nebudete do nej môcť vstúpiť znovu.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s si zmenil zobrazované meno na %(displayName)s.", "Failed to set direct chat tag": "Nepodarilo sa nastaviť značku priama konverzácia", "Failed to remove tag %(tagName)s from room": "Z miestnosti sa nepodarilo odstrániť značku %(tagName)s", "Failed to add tag %(tagName)s to room": "Miestnosti sa nepodarilo pridať značku %(tagName)s", @@ -1141,44 +1180,5 @@ "Terms and Conditions": "Zmluvné podmienky", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Ak chcete aj naďalej používať domovský server %(homeserverDomain)s, mali by ste si prečítať a odsúhlasiť naše zmluvné podmienky.", "Review terms and conditions": "Prečítať zmluvné podmienky", - "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť", - "<target> accepted the invitation for %(displayName)s.": "<target> prijal pozvanie do %(displayName)s.", - "<target> accepted an invitation.": "<target> prijal pozvanie.", - "<sender> requested a VoIP conference.": "<sender> požiadal o VoIP konferenciu.", - "<sender> invited <target>.": "<sender> pozval <target>.", - "<sender> banned <target>.": "<sender> zakázal vstup <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> si zmenil zobrazované meno na <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> si nastavil zobrazované meno <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> odstránil svoje zobrazované meno (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> si z profilu odstránil obrázok.", - "<sender> changed their profile picture.": "<sender> si zmenil obrázok v profile.", - "<sender> set a profile picture.": "<sender> si nastavil obrázok v profile.", - "<target> joined the room.": "<target> vstúpil do miestnosti.", - "<target> rejected the invitation.": "<target> odmietol pozvanie.", - "<target> left the room.": "<target> opustil miestnosť.", - "<sender> unbanned <target>.": "<sender> povolil vstup <target>.", - "<sender> kicked <target>.": "<sender> vykopol <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> stiahol pozvanie <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> zmenil tému na \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> zmenil názov miestnosti na %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> zmenil obrázok miestnosti %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> zmenil obrázok miestnosti <img/>", - "<sender> removed the room name.": "<sender> odstránil názov miestnosti.", - "<sender> removed the room avatar.": "<sender> odstránil obrázok miestnosti.", - "<sender> answered the call.": "<sender> prijal hovor.", - "<sender> ended the call.": "<sender> ukončil hovor.", - "<sender> placed a %(callType)s call.": "<sender> uskutočnil %(callType)s hovor.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> pozval %(targetDisplayName)s vstúpiť do miestnosti.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy boli pozvaní.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy vstúpili.", - "<sender> made future room history visible to all room members.": "<sender> sprístupnil budúcu históriu miestnosti pre všetkých členov.", - "<sender> made future room history visible to anyone.": "<sender> sprístupnil budúcu históriu miestnosti pre každého.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> sprístupnil budúcu históriu miestnosti neznámym (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> povolil E2E šifrovanie (algoritmus %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> z %(fromPowerLevel)s na %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> zmenil úroveň moci pre %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> zmenil pripnuté správy pre túto miestnosť.", - "%(widgetName)s widget modified by <sender>": "<sender> zmenil widget %(widgetName)s", - "%(widgetName)s widget added by <sender>": "<sender> pridal widget %(widgetName)s", - "%(widgetName)s widget removed by <sender>": "<sender> odstránil widget %(widgetName)s" + "To notify everyone in the room, you must be a": "Aby ste mohli upozorňovať všetkých členov v miestnosti, musíte byť" } diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 350338a908..6d217d5349 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -110,16 +110,51 @@ "Verified key": "Проверени кључ", "Unrecognised command:": "Непрепозната наредба:", "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.", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(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 device %(deviceId)s. Device marked as verified.": "Кључ за потписивање који сте доставили се подудара са кључем за потписивање од корисника %(userId)s и уређаја %(deviceId)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 конференција је започета.", + "%(targetName)s joined the room.": "Корисник %(targetName)s је ушао у собу.", "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“.", + "%(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 је послао слику.", "Someone": "Неко", "(not supported by this browser)": "(није подржано од стране овог прегледача)", + "%(senderName)s answered the call.": "Корисник %(senderName)s се јавио.", "(could not connect media)": "(не могу да повежем медије)", "(no answer)": "(нема одговора)", "(unknown failure: %(reason)s)": "(непозната грешка: %(reason)s)", + "%(senderName)s ended the call.": "Корисник %(senderName)s је окончао позив.", + "%(senderName)s placed a %(callType)s call.": "Корисник %(senderName)s је направио %(callType)s позив.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "Корисник %(senderName)s је послао позивницу за приступ соби ка %(targetDisplayName)s.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе, од тренутка позивања у собу.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе, од тренутка приступања соби.", + "%(senderName)s made future room history visible to all room members.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе.", + "%(senderName)s made future room history visible to anyone.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свима.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Корисник %(senderName)s је учинио будући историјат собе непознатим (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Корисник %(senderName)s је укључио шифровање с краја на крај (алгоритам %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s са %(fromPowerLevel)s на %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Корисник %(senderName)s је променио ниво моћи од %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "Корисник %(senderName)s је променио закачене поруке у соби.", + "%(widgetName)s widget modified by %(senderName)s": "Корисник %(senderName)s је променио виџет %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "Корисник %(senderName)s је додао виџет %(widgetName)s", + "%(widgetName)s widget removed by %(senderName)s": "Корисник %(senderName)s је уклонио виџет %(widgetName)s", "%(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 и још један куцају", @@ -441,6 +476,9 @@ "Invalid file%(extra)s": "Неисправна датотека %(extra)s", "Error decrypting image": "Грешка при дешифровању слике", "Error decrypting video": "Грешка при дешифровању видеа", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "Корисник %(senderDisplayName)s је променио аватара собе %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "Корисник %(senderDisplayName)s је уклонио аватара собе.", + "%(senderDisplayName)s changed the room avatar to <img/>": "Корисник %(senderDisplayName)s је променио аватара собе у <img/>", "Copied!": "Копирано!", "Failed to copy": "Нисам успео да ископирам", "Add an Integration": "Додај уградњу", @@ -724,6 +762,7 @@ "Analytics": "Аналитика", "The information being sent to us to help make Riot.im better includes:": "У податке које нам шаљете зарад побољшавања Riot.im-а спадају:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ако страница садржи поверљиве податке (као што је назив собе, корисника или ИБ-ја групе), ти подаци се уклањају пре слања на сервер.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "Корисник %(oldDisplayName)s је променио приказно име у %(displayName)s.", "Failed to set direct chat tag": "Нисам успео да поставим ознаку директног ћаскања", "Failed to remove tag %(tagName)s from room": "Нисам успео да скинем ознаку %(tagName)s са собе", "Failed to add tag %(tagName)s to room": "Нисам успео да додам ознаку %(tagName)s на собу", @@ -1138,44 +1177,5 @@ "Terms and Conditions": "Услови коришћења", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "Да бисте наставили са коришћењем Кућног сервера %(homeserverDomain)s морате погледати и пристати на наше услове коришћења.", "Review terms and conditions": "Погледај услове коришћења", - "Try the app first": "Пробајте прво апликацију", - "<target> accepted the invitation for %(displayName)s.": "<target> је прихватио позивницу за %(displayName)s.", - "<target> accepted an invitation.": "<target> је прихватио позивницу.", - "<sender> requested a VoIP conference.": "<sender> је затражио VoIP конференцију.", - "<sender> invited <target>.": "<sender> је позвао <target>.", - "<sender> banned <target>.": "<sender> је бановао <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "Корисник <oldDisplayName> је променио приказно име у <displayName>.", - "<sender> set their display name to <displayName>.": "Корисник <sender> је себи поставио приказно име <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "Корисник <sender> је себи уклонио приказно име <oldDisplayName>.", - "<sender> removed their profile picture.": "Корисник <sender> је себи уклонио профилну слику.", - "<sender> changed their profile picture.": "Корисник <sender> је себи променио профилну слику.", - "<sender> set a profile picture.": "Корисник <sender> је себи поставио профилну слику.", - "<target> joined the room.": "Корисник <target> је ушао у собу.", - "<target> rejected the invitation.": "Корисник <target> је одбацио позивницу.", - "<target> left the room.": "Корисник <target> је напустио собу.", - "<sender> unbanned <target>.": "Корисник <sender> је скинуо забрану приступа са <target>.", - "<sender> kicked <target>.": "Корисник <sender> је избацио <target>.", - "<sender> withdrew <target>'s invitation.": "Пошиљалац <sender> је повукао позивницу за <target>.", - "<sender> changed the topic to \"%(topic)s\".": "Корисник <sender> је променио тему у „%(topic)s“.", - "<sender> changed the room name to %(roomName)s.": "Корисник <sender> је променио назив собе у %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "Корисник <sender> је променио аватара собе %(roomName)s", - "<sender> changed the room avatar to <img/>": "Корисник <sender> је променио аватара собе у <img/>", - "<sender> removed the room name.": "Корисник <sender> је уклонио назив собе.", - "<sender> removed the room avatar.": "Корисник <sender> је уклонио аватара собе.", - "<sender> answered the call.": "Корисник <sender> се јавио.", - "<sender> ended the call.": "Корисник <sender> је окончао позив.", - "<sender> placed a %(callType)s call.": "Корисник <sender> је направио %(callType)s позив.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "Корисник <sender> је послао позивницу за приступ соби ка %(targetDisplayName)s.", - "<sender> made future room history visible to all room members, from the point they are invited.": "Корисник <sender> је учинио будући историјат собе видљивим свим члановима собе, од тренутка позивања у собу.", - "<sender> made future room history visible to all room members, from the point they joined.": "Корисник <sender> је учинио будући историјат собе видљивим свим члановима собе, од тренутка приступања соби.", - "<sender> made future room history visible to all room members.": "Корисник <sender> је учинио будући историјат собе видљивим свим члановима собе.", - "<sender> made future room history visible to anyone.": "Корисник <sender> је учинио будући историјат собе видљивим свима.", - "<sender> made future room history visible to unknown (%(visibility)s).": "Корисник <sender> је учинио будући историјат собе непознатим (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "Корисник <sender> је укључио шифровање с краја на крај (алгоритам %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> са %(fromPowerLevel)s на %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "Корисник <sender> је променио ниво моћи од %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "Корисник <sender> је променио закачене поруке у соби.", - "%(widgetName)s widget modified by <sender>": "Корисник <sender> је променио виџет %(widgetName)s", - "%(widgetName)s widget added by <sender>": "Корисник <sender> је додао виџет %(widgetName)s", - "%(widgetName)s widget removed by <sender>": "Корисник <sender> је уклонио виџет %(widgetName)s" + "Try the app first": "Пробајте прво апликацију" } diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 986f48c81e..0e26125c30 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1,5 +1,7 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Ett SMS har skickats till +%(msisdn)s. Vänligen ange verifieringskoden ur meddelandet", + "%(targetName)s accepted an invitation.": "%(targetName)s accepterade en inbjudan.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepterade inbjudan för %(displayName)s.", "Account": "Konto", "Add a topic": "Lägg till ett ämne", "Add email address": "Lägg till en epostadress", @@ -24,6 +26,7 @@ "and %(count)s others...|one": "och en annan...", "%(names)s and %(lastPerson)s are typing": "%(names)s och %(lastPerson)s skriver", "A new password must be entered.": "Ett nytt lösenord måste anges.", + "%(senderName)s answered the call.": "%(senderName)s svarade på samtalet.", "Anyone who knows the room's link, including guests": "Alla som har rummets adress, inklusive gäster", "Anyone": "Vem som helst", "Anyone who knows the room's link, apart from guests": "Alla som har rummets adress, förutom gäster", @@ -35,6 +38,7 @@ "Are you sure you want to reject the invitation?": "Är du säker på att du vill avböja inbjudan?", "Bulk Options": "Volymhandlingar", "Blacklisted": "Svartlistad", + "%(senderName)s banned %(targetName)s.": "%(senderName)s bannade %(targetName)s.", "Banned users": "Bannade användare", "Bans user with given id": "Bannar användare med givet id", "Ban": "Banna", @@ -43,6 +47,10 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Det går inte att ansluta till en hemserver via HTTP då adressen i webbläsaren är HTTPS. Använd HTTPS, eller <a>sätt på osäkra skript</a>.", "Can't load user settings": "Det gick inte att ladda användarinställningar", "Change Password": "Byt lösenord", + "%(senderName)s changed their profile picture.": "%(senderName)s bytte sin profilbild.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s bytte rummets namn till %(roomName)s.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s tog bort rummets namn.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s bytte rummets ämne till \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Ändringar till vem som kan läsa meddelandehistorik tillämpas endast till framtida meddelanden i det här rummet", "Changes your display nickname": "Byter ditt synliga namn", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du byter lösenord kommer för tillfället alla krypteringsnycklar på alla enheter att nollställas, vilket gör all krypterad meddelandehistorik omöjligt att läsa, om du inte först exporterar rumsnycklarna och sedan importerar dem efteråt. I framtiden kommer det här att förbättras.", @@ -102,6 +110,7 @@ "Enable encryption": "Aktivera kryptering", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Krypterade meddelanden syns inte på klienter som inte ännu stöder kryptering", "Encrypted room": "Krypterat rum", + "%(senderName)s ended the call.": "%(senderName)s avslutade samtalet.", "End-to-end encryption information": "Krypteringsinformation", "End-to-end encryption is in beta and may not be reliable": "Kryptering är i beta och är inte nödvändigtvis pålitligt", "Enter Code": "Skriv in kod", @@ -140,6 +149,7 @@ "Admin Tools": "Admin-verktyg", "Alias (optional)": "Alias (valfri)", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till hemservern - kontrollera anslutningen, se till att <a>hemserverns SSL-certifikat</a> är betrott, och att inget webbläsartillägg blockerar förfrågningar.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade behörighetsnivå för %(powerLevelDiffText)s.", "<a>Click here</a> to join the discussion!": "<a>Klicka här</a> för att gå med i diskussionen!", "Close": "Stäng", "%(count)s new messages|one": "%(count)s nytt meddelande", @@ -166,6 +176,7 @@ "Forgot your password?": "Glömt lösenord?", "For security, this session has been signed out. Please sign in again.": "Av säkerhetsskäl har den här sessionen loggats ut. Vänligen logga in igen.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Av säkerhetsskäl kommer alla krypteringsnycklar att raderas från den här webbläsaren om du loggar ut. Om du vill läsa din krypterade meddelandehistorik från framtida Riot-sessioner, exportera nycklarna till förvar.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s från %(fromPowerLevel)s till %(toPowerLevel)s", "Guest access is disabled on this Home Server.": "Gäståtkomst är inte aktiverat på den här hemservern.", "Guests cannot join this room even if explicitly invited.": "Gäster kan inte gå med i det här rummet fastän de är uttryckligen inbjudna.", "Hangup": "Lägg på", @@ -188,6 +199,7 @@ "Invalid address format": "Fel adressformat", "Invalid Email Address": "Ogiltig epostadress", "Invalid file%(extra)s": "Fel fil%(extra)s", + "%(senderName)s invited %(targetName)s.": "%(senderName)s bjöd in %(targetName)s.", "Invite new room members": "Bjud in nya rumsmedlemmar", "Invited": "Inbjuden", "Invites": "Inbjudningar", @@ -198,18 +210,25 @@ "Sign in with": "Logga in med", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Gå med som <voiceText>röst</voiceText> eller <videoText>video</videoText>.", "Join Room": "Gå med i rum", + "%(targetName)s joined the room.": "%(targetName)s gick med i rummet.", "Joins room with given alias": "Går med i rummet med givet alias", "Jump to first unread message.": "Hoppa till första olästa meddelande.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s kickade %(targetName)s.", "Kick": "Kicka", "Kicks user with given id": "Kickar användaren med givet id", "Labs": "Labb", "Last seen": "Senast sedd", "Leave room": "Lämna rummet", + "%(targetName)s left the room.": "%(targetName)s lämnade rummet.", "Level:": "Nivå:", "Local addresses for this room:": "Lokala adresser för rummet:", "Logged in as:": "Inloggad som:", "Logout": "Logga ut", "Low priority": "Låg prioritet", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar från att de bjöds in.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar fr.o.m. att de gick med som medlem.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde framtida rumshistorik synligt för alla.", "Manage Integrations": "Hantera integrationer", "Markdown is disabled": "Markdown är inaktiverat", "Markdown is enabled": "Markdown är aktiverat", @@ -252,6 +271,7 @@ "People": "Personer", "Permissions": "Behörigheter", "Phone": "Telefon", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s startade ett %(callType)ssamtal.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Öppna meddelandet i din epost och klicka på länken i meddelandet. När du har gjort detta, klicka vidare.", "Power level must be positive integer.": "Behörighetsnivå måste vara ett positivt heltal.", "Press <StartChatButton> to start a chat with someone": "Tryck på <StartChatButton> för att starta en chatt med någon", @@ -265,12 +285,16 @@ "Revoke Moderator": "Degradera moderator", "Refer a friend to Riot:": "Hänvisa en vän till Riot:", "Register": "Registrera", + "%(targetName)s rejected the invitation.": "%(targetName)s avvisade inbjudan.", "Reject invitation": "Avböj inbjudan", "Rejoin": "Gå med igen", "Remote addresses for this room:": "Fjärradresser för det här rummet:", "Remove Contact Information?": "Ta bort kontaktuppgifter?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s tog bort sitt visningsnamn (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s tog bort sin profilbild.", "Remove": "Ta bort", "Remove %(threePid)s?": "Ta bort %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s begärde en VoIP-konferens.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du återställer ditt lösenord kommer alla krypteringsnycklar på alla enheter att återställas, vilket gör krypterad meddelandehistorik oläsbar om du inte först exporterar dina rumsnycklar och sedan importerar dem igen. I framtiden kommer det här att förbättras.", "Results from DuckDuckGo": "Resultat från DuckDuckGo", "Return to login screen": "Tillbaka till login-skärmen", @@ -296,6 +320,7 @@ "Send Invites": "Skicka inbjudningar", "Send Reset Email": "Skicka återställningsmeddelande", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s skickade en bild.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s bjöd in %(targetDisplayName)s med i rummet.", "Server error": "Serverfel", "Server may be unavailable or overloaded": "Servern kan vara otillgänglig eller överbelastad", "Server may be unavailable, overloaded, or search timed out :(": "Servern kan vara otillgänglig, överbelastad, eller så tog sökningen för lång tid :(", @@ -303,6 +328,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Servern kan vara otillgänglig, överbelastad, eller så stötte du på en bugg.", "Server unavailable, overloaded, or something else went wrong.": "Servern är otillgänglig, överbelastad, eller så gick något annat fel.", "Session ID": "Sessions-ID", + "%(senderName)s set a profile picture.": "%(senderName)s satte en profilbild.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s bytte sitt visningnamn till %(displayName)s.", "Settings": "Inställningar", "Show panel": "Visa panel", "Show Text Formatting Toolbar": "Visa textformatteringsverktygsfält", @@ -564,7 +591,13 @@ "You are now ignoring %(userId)s": "Du ignorerar nu %(userId)s", "Unignored user": "Oignorerad användare", "You are no longer ignoring %(userId)s": "Du ignorerar inte längre %(userId)s", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s bytte sitt visningsnamn till %(displayName)s.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s avbannade %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s drog tillbaka inbjudan för %(targetName)s.", "(no answer)": "(inget svar)", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s-widget har modifierats av %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget har lagts till av %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s-widget har tagits bort av %(senderName)s", "%(names)s and %(count)s others are typing|other": "%(names)s och %(count)s andra skriver", "%(names)s and %(count)s others are typing|one": "%(names)s och en till skriver", "Unnamed Room": "Namnlöst rum", @@ -730,6 +763,9 @@ "Always show encryption icons": "Visa alltid krypteringsikoner", "Disable big emoji in chat": "Inaktivera stor emoji i chatt", "Hide avatars in user and room mentions": "Dölj avatarer i användar- och rumsnämningar", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s bytte avatar för %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s tog bort rummets avatar.", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s ändrade rummets avatar till <img/>", "Automatically replace plain text Emoji": "Ersätt text-emojis automatiskt", "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s", @@ -913,6 +949,7 @@ "Verifies a user, device, and pubkey tuple": "Verifierar en användare, enhet och nycklar", "VoIP conference started.": "VoIP-konferens startad.", "VoIP conference finished.": "VoIP-konferens avslutad.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Där denna sida innehåller identifierbar information, till exempel ett rums-, användar- eller grupp-ID, tas data bort innan den skickas till servern.", "The remote side failed to pick up": "Mottagaren kunde inte svara", "Room name or alias": "Rumsnamn eller alias", @@ -932,6 +969,7 @@ "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie (please see our <PolicyLink>Cookie Policy</PolicyLink>).": "Vänligen hjälp till att förbättra Riot.im genom att skicka <UsageDataLink>anonyma användardata</UsageDataLink>. Detta kommer att använda en cookie (se vår <PolicyLink>Cookiepolicy</PolicyLink>).", "Please help improve Riot.im by sending <UsageDataLink>anonymous usage data</UsageDataLink>. This will use a cookie.": "Vänligen hjälp till att förbättra Riot.im genom att skicka <UsageDataLink>anonyma användardata</UsageDataLink>. Detta kommer att använda en cookie.", "Yes, I want to help!": "Ja, jag vill hjälpa till!", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s aktiverade kryptering (algoritm %(algorithm)s).", "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)slämnade och gick med igen %(count)s gånger", "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)slämnade och gick med igen", "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)slämnade och gick med igen %(count)s gånger", @@ -1128,6 +1166,7 @@ "Passphrases must match": "Passfraser måste matcha", "Passphrase must not be empty": "Lösenfras får inte vara tom", "Confirm passphrase": "Bekräfta lösenfrasen", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ändrade fastnålade meddelanden för rummet.", "Message Pinning": "Nåla fast meddelanden", "Unpin Message": "Ta bort fastnålning", "No pinned messages.": "Inga fastnålade meddelanden.", @@ -1141,44 +1180,5 @@ "This room is not showing flair for any communities": "Detta rum visar inte emblem för några communityn", "Flair will appear if enabled in room settings": "Emblem kommer visas om det är aktiverat i rumsinställningarna", "Flair will not appear": "Emblem kommer inte att visas", - "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det.", - "<target> accepted the invitation for %(displayName)s.": "<target> accepterade inbjudan för %(displayName)s.", - "<target> accepted an invitation.": "<target> accepterade en inbjudan.", - "<sender> requested a VoIP conference.": "<sender> begärde en VoIP-konferens.", - "<sender> invited <target>.": "<sender> bjöd in <target>.", - "<sender> banned <target>.": "<sender> bannade <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> bytte sitt visningsnamn till <displayName>.", - "<sender> set their display name to <displayName>.": "<sender> bytte sitt visningnamn till <displayName>.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> tog bort sitt visningsnamn (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> tog bort sin profilbild.", - "<sender> changed their profile picture.": "<sender> bytte sin profilbild.", - "<sender> set a profile picture.": "<sender> satte en profilbild.", - "<target> joined the room.": "<target> gick med i rummet.", - "<target> rejected the invitation.": "<target> avvisade inbjudan.", - "<target> left the room.": "<target> lämnade rummet.", - "<sender> unbanned <target>.": "<sender> avbannade <target>.", - "<sender> kicked <target>.": "<sender> kickade <target>.", - "<sender> withdrew <target>'s invitation.": "<sender> drog tillbaka inbjudan för <target>.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> bytte rummets ämne till \"%(topic)s\".", - "<sender> changed the room name to %(roomName)s.": "<sender> bytte rummets namn till %(roomName)s.", - "<sender> changed the avatar for %(roomName)s": "<sender> bytte avatar för %(roomName)s", - "<sender> changed the room avatar to <img/>": "<sender> ändrade rummets avatar till <img/>", - "<sender> removed the room name.": "<sender> tog bort rummets namn.", - "<sender> removed the room avatar.": "<sender> tog bort rummets avatar.", - "<sender> answered the call.": "<sender> svarade på samtalet.", - "<sender> ended the call.": "<sender> avslutade samtalet.", - "<sender> placed a %(callType)s call.": "<sender> startade ett %(callType)ssamtal.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> bjöd in %(targetDisplayName)s med i rummet.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> gjorde framtida rumshistorik synligt för alla rumsmedlemmar från att de bjöds in.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> gjorde framtida rumshistorik synligt för alla rumsmedlemmar fr.o.m. att de gick med som medlem.", - "<sender> made future room history visible to all room members.": "<sender> gjorde framtida rumshistorik synligt för alla rumsmedlemmar.", - "<sender> made future room history visible to anyone.": "<sender> gjorde framtida rumshistorik synligt för alla.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> aktiverade kryptering (algoritm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> från %(fromPowerLevel)s till %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> ändrade behörighetsnivå för %(powerLevelDiffText)s.", - "<sender> changed the pinned messages for the room.": "<sender> ändrade fastnålade meddelanden för rummet.", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s-widget har modifierats av <sender>", - "%(widgetName)s widget added by <sender>": "%(widgetName)s-widget har lagts till av <sender>", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s-widget har tagits bort av <sender>" + "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det." } diff --git a/src/i18n/strings/te.json b/src/i18n/strings/te.json index 301651a13d..b6102a5eb5 100644 --- a/src/i18n/strings/te.json +++ b/src/i18n/strings/te.json @@ -1,6 +1,7 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "ఒక టెక్స్ట్ సందేశం +%(msisdn)s కు పంపబడింది. దయచేసి దీనిలో ఉన్న ధృవీకరణ కోడ్ను నమోదు చేయండి", "Accept": "అంగీకరించు", + "%(targetName)s accepted an invitation.": "%(targetName)s ఆహ్వానాన్ని అంగీకరించింది.", "Account": "ఖాతా", "Access Token:": "యాక్సెస్ టోకెన్:", "Add": "చేర్చు", @@ -28,6 +29,7 @@ "You have been invited to join this room by %(inviterName)s": "%(inviterName)s ఈ గదిలో చేరడానికి మీరు ఆహ్వానించబడ్డారు", "Active call (%(roomName)s)": "క్రియాశీల కాల్ల్ (%(roomName)s)", "A new password must be entered.": "కొత్త పాస్ వర్డ్ ను తప్పక నమోదు చేయాలి.", + "%(senderName)s answered the call.": "%(senderName)s కు సమాధానం ఇచ్చారు.", "An error has occurred.": "ఒక లోపము సంభవించినది.", "Anyone": "ఎవరైనా", "Anyone who knows the room's link, apart from guests": "అతిథులు కాకుండా గది యొక్క లింక్ తెలిసిన వారు ఎవరైనా", @@ -47,6 +49,8 @@ "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "గృహనిర్వాహకులకు కనెక్ట్ చేయలేరు - దయచేసి మీ కనెక్టివిటీని తనిఖీ చేయండి, మీ <a> 1 హోమరుసు యొక్క ఎస్ఎస్ఎల్ సర్టిఫికేట్ </a> 2 ని విశ్వసనీయపరుచుకొని, బ్రౌజర్ పొడిగింపు అభ్యర్థనలను నిరోధించబడదని నిర్ధారించుకోండి.", "Can't load user settings": "వినియోగదారు సెట్టింగ్లను లోడ్ చేయలేరు", "Change Password": "పాస్వర్డ్ మార్చండి", + "%(senderName)s changed their profile picture.": "%(senderName)s వారి ప్రొఫైల్ చిత్రాన్ని మార్చారు.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s గది పేరు తొలగించబడింది.", "Changes to who can read history will only apply to future messages in this room": "చరిత్ర చదివేవారికి మార్పులు ఈ గదిలో భవిష్య సందేశాలకు మాత్రమే వర్తిస్తాయి", "Changes your display nickname": "మీ ప్రదర్శన మారుపేరుని మారుస్తుంది", "You cannot place a call with yourself.": "మీరు మీతో కాల్ చేయలేరు.", @@ -271,9 +275,5 @@ "#example": "#ఉదాహరణ", "Collapse panel": "ప్యానెల్ కుదించు", "Checking for an update...": "నవీకరణ కోసం చూస్తోంది...", - "Saturday": "శనివారం", - "<target> accepted an invitation.": "<target> ఆహ్వానాన్ని అంగీకరించింది.", - "<sender> changed their profile picture.": "<sender> వారి ప్రొఫైల్ చిత్రాన్ని మార్చారు.", - "<sender> removed the room name.": "<sender> గది పేరు తొలగించబడింది.", - "<sender> answered the call.": "<sender> కు సమాధానం ఇచ్చారు." + "Saturday": "శనివారం" } diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 878d5eaaee..3fe7bf8f98 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -11,6 +11,8 @@ "Delete": "ลบ", "Default": "ค่าเริ่มต้น", "Default Device": "อุปกรณ์เริ่มต้น", + "%(senderName)s banned %(targetName)s.": "%(senderName)s แบน %(targetName)s แล้ว", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s เปลี่ยนหัวข้อเป็น \"%(topic)s\"", "Decrypt %(text)s": "ถอดรหัส %(text)s", "Device ID": "ID อุปกรณ์", "Device ID:": "ID อุปกรณ์:", @@ -49,6 +51,8 @@ "Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง", "Favourite": "รายการโปรด", "Failed to forget room %(errCode)s": "การลืมห้องล้มเหลว %(errCode)s", + "%(targetName)s accepted an invitation.": "%(targetName)s ตอบรับคำเชิญแล้ว", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ตอบรับคำเชิญสำหรับ %(displayName)s แล้ว", "Add a topic": "เพิ่มหัวข้อ", "Add email address": "เพิ่มที่อยู่อีเมล", "Admin": "ผู้ดูแล", @@ -62,6 +66,7 @@ "and %(count)s others...|one": "และอีกหนึ่งผู้ใช้...", "and %(count)s others...|other": "และอีก %(count)s ผู้ใช้...", "%(names)s and %(lastPerson)s are typing": "%(names)s และ %(lastPerson)s กำลังพิมพ์", + "%(senderName)s answered the call.": "%(senderName)s รับสายแล้ว", "An error has occurred.": "เกิดข้อผิดพลาด", "Anyone": "ทุกคน", "Anyone who knows the room's link, apart from guests": "ทุกคนที่มีลิงก์ ยกเว้นแขก", @@ -76,6 +81,9 @@ "Bans user with given id": "ผู้ใช้และ id ที่ถูกแบน", "Blacklisted": "ขึ้นบัญชีดำ", "Can't load user settings": "ไม่สามารถโหลดการตั้งค่าผู้ใช้ได้", + "%(senderName)s changed their profile picture.": "%(senderName)s เปลี่ยนรูปโปรไฟล์ของเขา", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s เปลี่ยนชื่อห้องไปเป็น %(roomName)s", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ลบชื่อห้อง", "Changes your display nickname": "เปลี่ยนชื่อเล่นที่แสดงของคุณ", "Clear Cache and Reload": "ล้างแคชแล้วโหลดใหม่", "Clear Cache": "ล้างแคช", @@ -115,6 +123,7 @@ "Email address (optional)": "ที่อยู่อีเมล (ไม่ใส่ก็ได้)", "Email, name or matrix ID": "อีเมล ชื่อ หรือ ID matrix", "Encrypted room": "ห้องที่ถูกเข้ารหัส", + "%(senderName)s ended the call.": "%(senderName)s จบการโทร", "Enter Code": "กรอกรหัส", "Error decrypting attachment": "การถอดรหัสไฟล์แนบผิดพลาด", "Export": "ส่งออก", @@ -138,6 +147,7 @@ "Filter room members": "กรองสมาชิกห้อง", "Forget room": "ลืมห้อง", "Forgot your password?": "ลิมรหัสผ่าน?", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s จาก %(fromPowerLevel)s ไปเป็น %(toPowerLevel)s", "Hangup": "วางสาย", "Historical": "ประวัติแชทเก่า", "Homeserver is": "เซิร์ฟเวอร์บ้านคือ", @@ -151,6 +161,7 @@ "Invalid address format": "รูปแบบที่อยู่ไม่ถูกต้อง", "Invalid Email Address": "ที่อยู่อีเมลไม่ถูกต้อง", "Invalid file%(extra)s": "ไฟล์ %(extra)s ไม่ถูกต้อง", + "%(senderName)s invited %(targetName)s.": "%(senderName)s เชิญ %(targetName)s แล้ว", "Invite new room members": "เชิญสมาชิกใหม่", "Invited": "เชิญแล้ว", "Invites": "คำเชิญ", @@ -159,9 +170,12 @@ "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ไม่ใช่รูปแบบที่ถูกต้องสำหรับนามแฝง", "Sign in with": "เข้าสู่ระบบด้วย", "Join Room": "เข้าร่วมห้อง", + "%(targetName)s joined the room.": "%(targetName)s เข้าร่วมห้องแล้ว", "Jump to first unread message.": "ข้ามไปยังข้อความแรกที่ยังไม่ได้อ่าน", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s เตะ %(targetName)s แล้ว", "Labs": "ห้องทดลอง", "Leave room": "ออกจากห้อง", + "%(targetName)s left the room.": "%(targetName)s ออกจากห้องแล้ว", "Logged in as:": "เข้าสู่ระบบในชื่อ:", "Logout": "ออกจากระบบ", "Markdown is disabled": "ปิดใช้งาน Markdown แล้ว", @@ -184,12 +198,16 @@ "People": "บุคคล", "Permissions": "สิทธิ์", "Phone": "โทรศัพท์", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s ได้เริ่มการโทรแบบ%(callType)s", "Please check your email and click on the link it contains. Once this is done, click continue.": "กรุณาเช็คอีเมลและคลิกลิงก์ข้างใน หลังจากนั้น คลิกดำเนินการต่อ", "Privacy warning": "คำเตือนเกี่ยวกับความเป็นส่วนตัว", "Privileged Users": "ผู้ใช้ที่มีสิทธิพิเศษ", "Revoke Moderator": "เพิกถอนผู้ช่วยดูแล", "Refer a friend to Riot:": "แนะนำเพื่อนให้รู้จัก Riot:", + "%(targetName)s rejected the invitation.": "%(targetName)s ปฏิเสธคำเชิญแล้ว", "Reject invitation": "ปฏิเสธคำเชิญ", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ลบชื่อที่แสดงแล้ว (%(oldDisplayName)s)", + "%(senderName)s removed their profile picture.": "%(senderName)s ลบรูปโปรไฟล์ของเขาแล้ว", "Remove %(threePid)s?": "ลบ %(threePid)s?", "Return to login screen": "กลับไปยังหน้าลงชื่อเข้าใช้", "Riot does not have permission to send you notifications - please check your browser settings": "Riot ไม่มีสิทธิ์ส่งการแจ้งเตือน - กรุณาตรวจสอบการตั้งค่าเบราว์เซอร์ของคุณ", @@ -204,12 +222,15 @@ "Searches DuckDuckGo for results": "ค้นหาบน DuckDuckGo", "Send Invites": "ส่งคำเชิญ", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ได้ส่งรูป", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ได้ส่งคำเชิญให้ %(targetDisplayName)s เข้าร่วมห้อง", "Server error": "เซิร์ฟเวอร์ผิดพลาด", "Server may be unavailable or overloaded": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งานหรือทำงานหนักเกินไป", "Server may be unavailable, overloaded, or search timed out :(": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือการค้นหาหมดเวลา :(", "Server may be unavailable, overloaded, or the file too big": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือไฟล์ใหญ่เกินไป", "Server may be unavailable, overloaded, or you hit a bug.": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือเจอจุดบกพร่อง", "Server unavailable, overloaded, or something else went wrong.": "เซิร์ฟเวอร์อาจไม่พร้อมใช้งาน ทำงานหนักเกินไป หรือบางอย่างผิดปกติ", + "%(senderName)s set a profile picture.": "%(senderName)s ตั้งรูปโปรไฟล์", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ตั้งชื่อที่แสดงเป็น %(displayName)s", "Show panel": "แสดงหน้าต่าง", "Signed Out": "ออกจากระบบแล้ว", "Sign in": "เข้าสู่ระบบ", @@ -248,9 +269,11 @@ "The file '%(fileName)s' exceeds this home server's size limit for uploads": "ไฟล์ '%(fileName)s' มีขนาดใหญ่เกินจำกัดของเซิร์ฟเวอร์บ้าน", "Turn Markdown off": "ปิด markdown", "Turn Markdown on": "เปิด markdown", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ได้เปิดใช้งานการเข้ารหัสจากปลายทางถึงปลายทาง (อัลกอริทึม%(algorithm)s).", "Unable to add email address": "ไมาสามารถเพิ่มที่อยู่อีเมล", "Unable to verify email address.": "ไม่สามารถยืนยันที่อยู่อีเมล", "Unban": "ปลดแบน", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ปลดแบน %(targetName)s แล้ว", "Unable to capture screen": "ไม่สามารถจับภาพหน้าจอ", "Unable to enable Notifications": "ไม่สามารถเปิดใช้งานการแจ้งเตือน", "Unable to load device list": "ไม่สามารถโหลดรายชื่ออุปกรณ์", @@ -535,28 +558,5 @@ "Collapse panel": "ซ่อนหน้าต่าง", "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": "มีการแจ้งเตือนขั้นสูงที่ไม่ได้แสดงที่นี่", - "<target> accepted the invitation for %(displayName)s.": "<target> ตอบรับคำเชิญสำหรับ %(displayName)s แล้ว", - "<target> accepted an invitation.": "<target> ตอบรับคำเชิญแล้ว", - "<sender> invited <target>.": "<sender> เชิญ <target> แล้ว", - "<sender> banned <target>.": "<sender> แบน <target> แล้ว", - "<sender> set their display name to <displayName>.": "<sender> ตั้งชื่อที่แสดงเป็น <displayName>", - "<sender> removed their display name (<oldDisplayName>).": "<sender> ลบชื่อที่แสดงแล้ว (<oldDisplayName>)", - "<sender> removed their profile picture.": "<sender> ลบรูปโปรไฟล์ของเขาแล้ว", - "<sender> changed their profile picture.": "<sender> เปลี่ยนรูปโปรไฟล์ของเขา", - "<sender> set a profile picture.": "<sender> ตั้งรูปโปรไฟล์", - "<target> joined the room.": "<target> เข้าร่วมห้องแล้ว", - "<target> rejected the invitation.": "<target> ปฏิเสธคำเชิญแล้ว", - "<target> left the room.": "<target> ออกจากห้องแล้ว", - "<sender> unbanned <target>.": "<sender> ปลดแบน <target> แล้ว", - "<sender> kicked <target>.": "<sender> เตะ <target> แล้ว", - "<sender> changed the topic to \"%(topic)s\".": "<sender> เปลี่ยนหัวข้อเป็น \"%(topic)s\"", - "<sender> changed the room name to %(roomName)s.": "<sender> เปลี่ยนชื่อห้องไปเป็น %(roomName)s", - "<sender> removed the room name.": "<sender> ลบชื่อห้อง", - "<sender> answered the call.": "<sender> รับสายแล้ว", - "<sender> ended the call.": "<sender> จบการโทร", - "<sender> placed a %(callType)s call.": "<sender> ได้เริ่มการโทรแบบ%(callType)s", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> ได้ส่งคำเชิญให้ %(targetDisplayName)s เข้าร่วมห้อง", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> ได้เปิดใช้งานการเข้ารหัสจากปลายทางถึงปลายทาง (อัลกอริทึม%(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> จาก %(fromPowerLevel)s ไปเป็น %(toPowerLevel)s" + "There are advanced notifications which are not shown here": "มีการแจ้งเตือนขั้นสูงที่ไม่ได้แสดงที่นี่" } diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 9bedd16ccb..04f78dc1ee 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1,6 +1,8 @@ { "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "+%(msisdn)s 'ye bir kısa mesaj gönderildi . Lütfen içerdiği doğrulama kodunu girin", "Accept": "Kabul Et", + "%(targetName)s accepted an invitation.": "%(targetName)s bir davetiyeyi kabul etti.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s %(displayName)s için davetiyeyi kabul etti.", "Account": "Hesap", "Access Token:": "Erişim Anahtarı:", "Active call (%(roomName)s)": "Aktif çağrı (%(roomName)s)", @@ -30,6 +32,7 @@ "and %(count)s others...|other": "ve %(count)s diğerleri...", "%(names)s and %(lastPerson)s are typing": "%(names)s ve %(lastPerson)s yazıyorlar", "A new password must be entered.": "Yeni bir şifre girilmelidir.", + "%(senderName)s answered the call.": "%(senderName)s aramayı cevapladı.", "An error has occurred.": "Bir hata oluştu.", "Anyone": "Kimse", "Anyone who knows the room's link, apart from guests": "Misafirler dışında odanın bağlantısını bilen herkes", @@ -40,6 +43,7 @@ "Are you sure you want to upload the following files?": "Aşağıdaki dosyaları yüklemek istediğinizden emin misiniz ?", "Attachment": "Ek Dosya", "Autoplay GIFs and videos": "GIF'leri ve Videoları otomatik olarak oynat", + "%(senderName)s banned %(targetName)s.": "%(senderName)s %(targetName)s'i banladı.", "Ban": "Yasak", "Banned users": "Yasaklanan(Banlanan) Kullanıcılar", "Bans user with given id": "Yasaklanan(Banlanan) Kullanıcılar , ID'leri ile birlikte", @@ -50,6 +54,11 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya <a> güvensiz komut dosyalarını</a> etkinleştirin.", "Can't load user settings": "Kullanıcı ayarları yüklenemiyor", "Change Password": "Şifre Değiştir", + "%(senderName)s changed their profile picture.": "%(senderName)s profil resmini değiştirdi.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s %(powerLevelDiffText)s'nin güç düzeyini değiştirdi.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s oda adını kaldırdı.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s konuyu \"%(topic)s\" olarak değiştirdi.", "Changes to who can read history will only apply to future messages in this room": "Geçmişi kimlerin okuyabileceğine ait değişiklikler yalnızca bu odada gelecekteki iletiler için geçerli olur", "Changes your display nickname": "Görünen takma adınızı değiştirir", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Şifre değiştirme eğer oda anahtarlarınızı dışa aktarmaz ve daha sonra tekrar içe aktarmazsanız , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayacak ve geçmişi okunamaz hale getirecek . Gelecekte bu geliştirilecek.", @@ -123,6 +132,7 @@ "Encrypted room": "Şifrelenmiş Oda", "Encryption is enabled in this room": "Şifreleme bu oda için etkin", "Encryption is not enabled in this room": "Şifreleme bu oda için etkin değil", + "%(senderName)s ended the call.": "%(senderName)s çağrıyı bitirdi.", "End-to-end encryption information": "Uçtan-uca şifreleme bilgileri", "End-to-end encryption is in beta and may not be reliable": "Uçtan uca şifreleme beta sürümünde ve güvenilir olmayabilir", "Enter Code": "Kodu Girin", @@ -166,6 +176,7 @@ "Forgot your password?": "Şifrenizi mi unuttunuz ?", "For security, this session has been signed out. Please sign in again.": "Güvenlik için , bu oturuma çıkış yapıldı . Lütfen tekrar oturum açın.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Güvenlik için , çıkış yaparsanız bu tarayıcıdan tüm uçtan uca şifreleme anahtarları silinecek . Konuşma geçmişinizi çözebilmek isterseniz gelecekteki Riot oturumlarında , lütfen Oda Anahtarlarını güvenlik amaçlı Dışa Aktarın.", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s den %(toPowerLevel)s ' ye", "Guest access is disabled on this Home Server.": "Misafir erişimi bu Ana Sunucu için devre dışı.", "Guests cannot join this room even if explicitly invited.": "Misafirler açıkca davet edilseler bile bu odaya katılamazlar.", "Hangup": "Sorun", @@ -188,6 +199,7 @@ "Invalid address format": "Geçersiz adres formatı", "Invalid Email Address": "Geçersiz E-posta Adresi", "Invalid file%(extra)s": "Geçersiz dosya %(extra)s'ı", + "%(senderName)s invited %(targetName)s.": "%(senderName)s %(targetName)s ' ı davet etti.", "Invite new room members": "Yeni oda üyelerini davet et", "Invited": "Davet Edildi", "Invites": "Davetler", @@ -198,18 +210,26 @@ "Sign in with": "Şununla giriş yap", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "<voiceText> ses </voiceText> veya <videoText> video </videoText> olarak katılın.", "Join Room": "Odaya Katıl", + "%(targetName)s joined the room.": "%(targetName)s odaya katıldı.", "Joins room with given alias": "Verilen takma ad (nick name) ile odaya katıl", "Jump to first unread message.": "İlk okunmamış iletiye atla.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s %(targetName)s' ı attı.", "Kick": "Atmak (Odadan atmak vs.)", "Kicks user with given id": "Verilen ID ' li kullanıcıyı at", "Labs": "Laboratuarlar", "Last seen": "Son görülme", "Leave room": "Odadan ayrıl", + "%(targetName)s left the room.": "%(targetName)s odadan ayrıldı.", "Level:": "Seviye :", "Local addresses for this room:": "Bu oda için yerel adresler :", "Logged in as:": "Olarak giriş yaptı :", "Logout": "Çıkış Yap", "Low priority": "Düşük öncelikli", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , davet edildiği noktadan.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , katıldıkları noktalardan.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s gelecekte oda geçmişini görünür yaptı herhangi biri.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gelecekte oda geçmişini görünür yaptı bilinmeyen (%(visibility)s).", "Manage Integrations": "Entegrasyonları Yönet", "Markdown is disabled": "Markdown devre dışı", "Markdown is enabled": "Markdown aktif", @@ -251,6 +271,7 @@ "People": "İnsanlar", "Permissions": "İzinler", "Phone": "Telefon", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s bir %(callType)s çağrısı yerleştirdi.", "Please check your email and click on the link it contains. Once this is done, click continue.": "Lütfen e-postanızı kontrol edin ve içerdiği bağlantıya tıklayın . Bu işlem tamamlandıktan sonra , 'devam et' e tıklayın .", "Power level must be positive integer.": "Güç seviyesi pozitif tamsayı olmalıdır.", "Press <StartChatButton> to start a chat with someone": "Birisiyle sohbet başlatmak için <StartChatButton> tuşuna basın", @@ -264,12 +285,16 @@ "Revoke Moderator": "Moderatörü İptal Et", "Refer a friend to Riot:": "Riot'tan bir arkadaşa bakın :", "Register": "Kaydolun", + "%(targetName)s rejected the invitation.": "%(targetName)s daveti reddetti.", "Reject invitation": "Daveti Reddet", "Rejoin": "Yeniden Katıl", "Remote addresses for this room:": "Bu oda için uzak adresler:", "Remove Contact Information?": "İletişim Bilgilerini Kaldır ?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s görünen adı (%(oldDisplayName)s) kaldırdı.", + "%(senderName)s removed their profile picture.": "%(senderName)s profil resmini kaldırdı.", "Remove": "Kaldır", "Remove %(threePid)s?": "%(threePid)s 'i kaldır ?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s bir VoIP konferansı talep etti.", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Şifrenizi sıfırlamak , eğer Oda Anahtarlarınızı dışa aktarmaz ve daha sonra içe aktarmaz iseniz , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayarak şifreli sohbetleri okunamaz hale getirecek . Gelecekte bu iyileştirilecek.", "Results from DuckDuckGo": "DuckDuckGo Sonuçları", "Return to login screen": "Giriş ekranına dön", @@ -295,6 +320,7 @@ "Send Invites": "Davetiye Gönder", "Send Reset Email": "E-posta Sıfırlama Gönder", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s bir resim gönderdi.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s %(targetDisplayName)s' a odaya katılması için bir davet gönderdi.", "Server error": "Sunucu Hatası", "Server may be unavailable or overloaded": "Sunucu kullanılamıyor veya aşırı yüklenmiş olabilir", "Server may be unavailable, overloaded, or search timed out :(": "Sunucu kullanılamıyor , aşırı yüklenmiş veya arama zaman aşımına uğramış olabilir :(", @@ -302,6 +328,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Sunucu kullanılamıyor , aşırı yüklenmiş , veya bir hatayla karşılaşmış olabilirsiniz.", "Server unavailable, overloaded, or something else went wrong.": "Sunucu kullanılamıyor , aşırı yüklenmiş veya başka bir şey ters gitmiş olabilir.", "Session ID": "Oturum ID", + "%(senderName)s set a profile picture.": "%(senderName)s bir profil resmi ayarladı.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s görünür ismini %(displayName)s ' a ayarladı.", "Settings": "Ayarlar", "Show panel": "Paneli göster", "Show Text Formatting Toolbar": "Metin Biçimlendirme Araç Çubuğunu Göster", @@ -346,10 +374,12 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Bu odanın akışında belirli bir noktaya yüklemeye çalışıldı , ancak bulunamadı.", "Turn Markdown off": "Markdown'u kapat", "Turn Markdown on": "Markdown'u Aç", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s uçtanuca şifrelemeyi açtı (algoritma -> %(algorithm)s).", "Unable to add email address": "E-posta adresi eklenemiyor", "Unable to remove contact information": "Kişi bilgileri kaldırılamıyor", "Unable to verify email address.": "E-posta adresi doğrulanamıyor.", "Unban": "Yasağı Kaldır", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s %(targetName)s 'in yasağını kaldırdı.", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Bu davetiyenin gönderildiği adresin hesabınızla ilişkili bir adresle eşleştiğini tespit etmek mümkün değil.", "Unable to capture screen": "Ekran yakalanamadı", "Unable to enable Notifications": "Bildirimler aktif edilemedi", @@ -406,6 +436,7 @@ "Who can read history?": "Geçmişi kimler okuyabilir ?", "Who would you like to add to this room?": "Bu odaya kimi eklemek istersiniz ?", "Who would you like to communicate with?": "Kimlerle iletişim kurmak istersiniz ?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s %(targetName)s'nin davetinden çekildi.", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Bu daveti <acceptText> kabul etmek </acceptText> veya <declineText> reddetmek </declineText> ister misiniz ?", "You already have existing direct chats with this user:": "Bu kullanıcıyla var olan doğrudan sohbetleriniz var :", "You are already in a call.": "Zaten bir çağrıdasınız.", @@ -575,6 +606,9 @@ "Start chatting": "Sohbeti başlat", "Start Chatting": "Sohbeti Başlat", "Click on the button below to start chatting!": "Sohbeti başlatmak için aşağıdaki butona tıklayın!", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s odanın avatarını <img/> olarak çevirdi", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odanın avatarını kaldırdı.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s %(roomName)s için avatarı değiştirdi", "Username available": "Kullanıcı ismi uygun", "Username not available": "Kullanıcı ismi uygun değil", "Something went wrong!": "Bir şeyler yanlış gitti!", @@ -717,39 +751,5 @@ "View Source": "Kaynağı Görüntüle", "Collapse panel": "Katlanır panel", "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!": "Geçerli tarayıcınız ile birlikte , uygulamanın görünüş ve kullanım hissi tamamen hatalı olabilir ve bazı ya da tüm özellikler çalışmayabilir. Yine de denemek isterseniz devam edebilirsiniz ancak karşılaşabileceğiniz sorunlar karşısında kendi başınasınız !", - "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var", - "<target> accepted the invitation for %(displayName)s.": "<target> %(displayName)s için davetiyeyi kabul etti.", - "<target> accepted an invitation.": "<target> bir davetiyeyi kabul etti.", - "<sender> requested a VoIP conference.": "<sender> bir VoIP konferansı talep etti.", - "<sender> invited <target>.": "<sender> <target> ' ı davet etti.", - "<sender> banned <target>.": "<sender> <target>'i banladı.", - "<sender> set their display name to <displayName>.": "<sender> görünür ismini <displayName> ' a ayarladı.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> görünen adı (<oldDisplayName>) kaldırdı.", - "<sender> removed their profile picture.": "<sender> profil resmini kaldırdı.", - "<sender> changed their profile picture.": "<sender> profil resmini değiştirdi.", - "<sender> set a profile picture.": "<sender> bir profil resmi ayarladı.", - "<target> joined the room.": "<target> odaya katıldı.", - "<target> rejected the invitation.": "<target> daveti reddetti.", - "<target> left the room.": "<target> odadan ayrıldı.", - "<sender> unbanned <target>.": "<sender> <target> 'in yasağını kaldırdı.", - "<sender> kicked <target>.": "<sender> <target>' ı attı.", - "<sender> withdrew <target>'s invitation.": "<sender> <target>'nin davetinden çekildi.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> konuyu \"%(topic)s\" olarak değiştirdi.", - "<sender> changed the room name to %(roomName)s.": "<sender> odanın ismini %(roomName)s olarak değiştirdi.", - "<sender> changed the room avatar to <img/>": "<sender> odanın avatarını <img/> olarak çevirdi", - "<sender> changed the avatar for %(roomName)s": "<sender> %(roomName)s için avatarı değiştirdi", - "<sender> removed the room name.": "<sender> oda adını kaldırdı.", - "<sender> removed the room avatar.": "<sender> odanın avatarını kaldırdı.", - "<sender> answered the call.": "<sender> aramayı cevapladı.", - "<sender> ended the call.": "<sender> çağrıyı bitirdi.", - "<sender> placed a %(callType)s call.": "<sender> bir %(callType)s çağrısı yerleştirdi.", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> %(targetDisplayName)s' a odaya katılması için bir davet gönderdi.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , davet edildiği noktadan.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri , katıldıkları noktalardan.", - "<sender> made future room history visible to all room members.": "<sender> gelecekte oda geçmişini görünür yaptı Tüm oda üyeleri.", - "<sender> made future room history visible to anyone.": "<sender> gelecekte oda geçmişini görünür yaptı herhangi biri.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> gelecekte oda geçmişini görünür yaptı bilinmeyen (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> uçtanuca şifrelemeyi açtı (algoritma -> %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> %(fromPowerLevel)s den %(toPowerLevel)s ' ye", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> %(powerLevelDiffText)s'nin güç düzeyini değiştirdi." + "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var" } diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 09158411fc..5e7cc75f8a 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -23,6 +23,8 @@ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Текстове повідомлення було надіслано +%(msisdn)s. Введіть, будь ласка, код підтвердження з цього повідомлення", "Accept": "Прийняти", "Account": "Обліковка", + "%(targetName)s accepted an invitation.": "%(targetName)s прийняв запрошення.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s прийняв запрошення від %(displayName)s.", "Access Token:": "Токен доступу:", "Active call (%(roomName)s)": "Активний виклик (%(roomName)s)", "Add": "Додати", @@ -55,6 +57,7 @@ "A new password must be entered.": "Має бути введений новий пароль.", "Add a widget": "Добавити віджет", "Allow": "Принюти", + "%(senderName)s answered the call.": "%(senderName)s відповіла на дзвінок.", "An error has occurred.": "Трапилась помилка.", "Anyone": "Кожний", "Anyone who knows the room's link, apart from guests": "Кожний, хто знає посилання на кімнату, окрім гостей", @@ -65,6 +68,7 @@ "Are you sure you want to upload the following files?": "Ви впевнені, що ви хочете відправити наступний файл?", "Attachment": "Прикріплення", "Autoplay GIFs and videos": "Автовідтворення GIF і відео", + "%(senderName)s banned %(targetName)s.": "%(senderName)s заблокував(ла) %(targetName)s.", "Ban": "Заблокувати", "Banned users": "Заблоковані користувачі", "Bans user with given id": "Блокує користувача з заданим ID", @@ -75,6 +79,11 @@ "Can't load user settings": "Неможливо завантажити настройки користувача", "Cannot add any more widgets": "Неможливо додати більше віджетів", "Change Password": "Поміняти пароль", + "%(senderName)s changed their profile picture.": "%(senderName)s змінив зображення профіля.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s змінив(ла) рівень доступу для %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s змінив(ла) назву кімнати на %(roomName)s.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s видалив ім'я кімнати.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s змінив тему на %(topic)s.", "Email": "е-пошта", "Email address": "Адреса е-почти", "Email address (optional)": "Адреса е-почти (не обов'язково)", @@ -270,14 +279,5 @@ "Your User Agent": "Ваш користувацький агент", "Your device resolution": "Роздільність вашого пристрою", "Analytics": "Аналітика", - "The information being sent to us to help make Riot.im better includes:": "Надсилана інформація, що допомагає нам покращити Riot.im, вміщує:", - "<target> accepted the invitation for %(displayName)s.": "<target> прийняв запрошення від %(displayName)s.", - "<target> accepted an invitation.": "<target> прийняв запрошення.", - "<sender> banned <target>.": "<sender> заблокував(ла) <target>.", - "<sender> changed their profile picture.": "<sender> змінив зображення профіля.", - "<sender> changed the topic to \"%(topic)s\".": "<sender> змінив тему на %(topic)s.", - "<sender> changed the room name to %(roomName)s.": "<sender> змінив(ла) назву кімнати на %(roomName)s.", - "<sender> removed the room name.": "<sender> видалив ім'я кімнати.", - "<sender> answered the call.": "<sender> відповіла на дзвінок.", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> змінив(ла) рівень доступу для %(powerLevelDiffText)s." + "The information being sent to us to help make Riot.im better includes:": "Надсилана інформація, що допомагає нам покращити Riot.im, вміщує:" } diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index e1c9dbe953..56d5c1e4dc 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -26,6 +26,7 @@ "Enable encryption": "启用加密", "Encrypted messages will not be visible on clients that do not yet implement encryption": "不支持加密的客户端将看不到加密的消息", "Encrypted room": "加密聊天室", + "%(senderName)s ended the call.": "%(senderName)s 结束了通话。.", "End-to-end encryption information": "端到端加密信息", "End-to-end encryption is in beta and may not be reliable": "端到端加密现为 beta 版,不一定可靠", "Enter Code": "输入验证码", @@ -63,6 +64,7 @@ "Forgot your password?": "忘记密码?", "For security, this session has been signed out. Please sign in again.": "出于安全考虑,此会话已被注销。请重新登录。.", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "出于安全考虑,用户注销时会清除浏览器里的端到端加密密钥。如果你想要下次登录 Riot 时能解密过去的聊天记录,请导出你的聊天室密钥。", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主动邀请。.", "Hangup": "挂断", "Hide read receipts": "隐藏已读回执", @@ -96,6 +98,7 @@ "Send Invites": "发送邀请", "Send Reset Email": "发送密码重设邮件", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 发了一张图片。.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 发了加入聊天室的邀请。.", "Server error": "服务器错误", "Server may be unavailable or overloaded": "服务器可能不可用或者超载", "Server may be unavailable, overloaded, or search timed out :(": "服务器可能不可用、超载,或者搜索超时 :(", @@ -103,6 +106,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "服务器可能不可用、超载,或者你遇到了一个 bug。", "Server unavailable, overloaded, or something else went wrong.": "服务器可能不可用、超载,或者其他东西出错了.", "Session ID": "会话 ID", + "%(senderName)s set a profile picture.": "%(senderName)s 设置了头像。.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 将昵称改为了 %(displayName)s。.", "Settings": "设置", "Show panel": "显示侧边栏", "Show timestamps in 12 hour format (e.g. 2:30pm)": "用12小时制显示时间戳 (如:下午 2:30)", @@ -129,9 +134,11 @@ "Always show message timestamps": "总是显示消息时间戳", "%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在输入", "A new password must be entered.": "一个新的密码必须被输入。.", + "%(senderName)s answered the call.": "%(senderName)s 接了通话。.", "An error has occurred.": "一个错误出现了。", "Attachment": "附件", "Autoplay GIFs and videos": "自动播放GIF和视频", + "%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s.", "Ban": "封禁", "Banned users": "被封禁的用户", "Click here to fix": "点击这里修复", @@ -141,7 +148,9 @@ "Ed25519 fingerprint": "Ed25519指纹", "Invite new room members": "邀请新的聊天室成员", "Join Room": "加入聊天室", + "%(targetName)s joined the room.": "%(targetName)s 已加入聊天室。", "Jump to first unread message.": "跳到第一条未读消息。", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", "Leave room": "退出聊天室", "New password": "新密码", "Add a topic": "添加一个主题", @@ -177,6 +186,10 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接主服务器。请使用 HTTPS 或者<a>允许不安全的脚本</a>。", "Can't load user settings": "无法加载用户设置", "Change Password": "修改密码", + "%(senderName)s changed their profile picture.": "%(senderName)s 修改了头像。", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 将聊天室名称改为 %(roomName)s。", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 移除了聊天室名称。", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 将话题修改为 “%(topic)s”。", "Changes to who can read history will only apply to future messages in this room": "修改阅读历史的权限仅对此聊天室以后的消息有效", "Changes your display nickname": "修改昵称", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前,修改密码会导致所有设备上的端到端密钥被重置,使得加密的聊天记录不再可读。除非你事先导出聊天室密钥,修改密码后再导入。这个问题未来会改善。", @@ -225,6 +238,7 @@ "Incoming video call from %(name)s": "来自 %(name)s 的视频通话", "Incoming voice call from %(name)s": "来自 %(name)s 的语音通话", "Incorrect username and/or password.": "用户名或密码错误。", + "%(senderName)s invited %(targetName)s.": "%(senderName)s 邀请了 %(targetName)s。", "Invited": "已邀请", "Invites": "邀请", "Invites user with given id to current room": "按照 ID 邀请指定用户加入当前聊天室", @@ -277,6 +291,7 @@ "Edit": "编辑", "Joins room with given alias": "以指定的别名加入聊天室", "Labs": "实验室", + "%(targetName)s left the room.": "%(targetName)s 退出了聊天室。", "Logged in as:": "登录为:", "Logout": "登出", "Low priority": "低优先级", @@ -291,6 +306,7 @@ "Privileged Users": "特权用户", "Reason": "理由", "Register": "注册", + "%(targetName)s rejected the invitation.": "%(targetName)s 拒绝了邀请。", "Reject invitation": "拒绝邀请", "Rejoin": "重新加入", "Users": "用户", @@ -429,21 +445,32 @@ "I already have an account": "我已经有一个帐号", "Unblacklist": "移出黑名单", "Not a valid Riot keyfile": "不是一个有效的 Riot 密钥文件", + "%(targetName)s accepted an invitation.": "%(targetName)s 已接受邀请。", "Do you want to load widget from URL:": "你想从此 URL 加载小组件吗:", "Hide join/leave messages (invites/kicks/bans unaffected)": "隐藏加入/退出消息(邀请/踢出/封禁不受影响)", "Integrations Error": "集成错误", "Publish this room to the public in %(domain)s's room directory?": "把这个聊天室发布到 %(domain)s 的聊天室目录吗?", "Manage Integrations": "管理集成", "No users have specific privileges in this room": "没有用户在这个聊天室有特殊权限", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s 发起了一个 %(callType)s 通话。", "Please check your email and click on the link it contains. Once this is done, click continue.": "请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。", "Press <StartChatButton> to start a chat with someone": "按下 <StartChatButton> 来开始和某个人聊天", + "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他们的头像。", + "%(senderName)s requested a VoIP conference.": "%(senderName)s 已请求发起 VoIP 会议。", "Seen by %(userName)s at %(dateTime)s": "在 %(dateTime)s 被 %(userName)s 看到", "Tagged as: ": "标记为: ", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "验证码将发送至 +%(msisdn)s,请输入收到的验证码", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 接受了 %(displayName)s 的邀请。", "Active call (%(roomName)s)": "当前通话 (来自聊天室 %(roomName)s)", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 将级别调整到%(powerLevelDiffText)s 。", "Changes colour scheme of current room": "修改了样式", "Deops user with given id": "按照 ID 取消特定用户的管理员权限", "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "通过 <voiceText>语言</voiceText> 或者 <videoText>视频</videoText>加入.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员,从他们被邀请开始.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员,从他们加入开始.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s 设定历史浏览功能为 所有聊天室成员.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s 设定历史浏览功能为 任何人.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s 设定历史浏览功能为 未知的 (%(visibility)s).", "AM": "上午", "PM": "下午", "NOTE: Apps are not end-to-end encrypted": "提示:APP不支持端到端加密", @@ -502,6 +529,7 @@ " (unsupported)": " (不支持)", "Updates": "更新", "Check for update": "检查更新", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s 移除了聊天室头像。", "Something went wrong!": "出了点问题!", "If you already have a Matrix account you can <a>log in</a> instead.": "如果你已经有一个 Matrix 帐号,你可以<a>登录</a>。", "Do you want to set an email address?": "你要设置一个邮箱地址吗?", @@ -512,6 +540,7 @@ "Verification Pending": "验证等待中", "(unknown failure: %(reason)s)": "(未知错误:%(reason)s)", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:密钥验证失败!%(userId)s 和 device %(deviceId)s 的签名密钥是 \"%(fprint)s\",和提供的咪呀 \"%(fingerprint)s\" 不匹配。这可能意味着你的通信正在被窃听!", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 收回了 %(targetName)s 的邀请。", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "你想要 <acceptText>接受</acceptText> 还是 <declineText>拒绝</declineText> 这个邀请?", "You already have existing direct chats with this user:": "你已经有和此用户的直接聊天:", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "你现在还不再任何聊天室!按下 <CreateRoomButton> 来创建一个聊天室或者 <RoomDirectoryButton> 来浏览目录", @@ -562,9 +591,11 @@ "Verifies a user, device, and pubkey tuple": "验证一个用户、设备和密钥元组", "Unknown devices": "未知设备", "Unknown Address": "未知地址", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 删除了他们的昵称 (%(oldDisplayName)s).", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "您提供的签名密钥和你从 %(userId)s 的设备 %(deviceId)s 收到的签名密钥匹配。设备被标记为已验证。", "These are experimental features that may break in unexpected ways": "这些是可能以意外的方式坏掉的实验性的特性", "The visibility of existing history will be unchanged": "现有历史记录的可见性不会改变", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 打开了端到端加密 (算法 %(algorithm)s).", "Unable to remove contact information": "无法移除联系人信息", "Riot collects anonymous analytics to allow us to improve the application.": "Riot 收集匿名的分析数据来允许我们改善这个应用。", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" 包含你以前没见过的设备。", @@ -578,6 +609,7 @@ "Add an Integration": "添加一个集成", "Removed or unknown message type": "被移除或未知的消息类型", "Ongoing conference call%(supportedText)s.": "正在进行的会议通话 %(supportedText)s.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s 修改了 %(roomName)s 的头像", "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "这将会成为你在 <span></span> 主服务器上的账户名,或者你可以选择一个 <a>不同的服务器</a>。", "Your browser does not support the required cryptography extensions": "你的浏览器不支持 Riot 所需的密码学特性", "Authentication check failed: incorrect password?": "身份验证失败:密码错误?", @@ -587,6 +619,9 @@ "Your unverified device '%(displayName)s' is requesting encryption keys.": "你的未经验证的设备 '%(displayName)s' 正在请求加密密钥。", "Encryption key request": "加密密钥请求", "Autocomplete Delay (ms):": "自动补全延迟(毫秒):", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 添加", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 移除", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 修改", "Unpin Message": "取消置顶消息", "Add rooms to this community": "添加聊天室到此社区", "Call Failed": "呼叫失败", @@ -603,7 +638,9 @@ "You are now ignoring %(userId)s": "你正在忽视 %(userId)s", "Unignored user": "接触忽视用户", "You are no longer ignoring %(userId)s": "你不再忽视 %(userId)s", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s 解除了 %(targetName)s 的封禁。", "(could not connect media)": "(无法连接媒体)", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)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 和另一个人正在输入", "Send": "发送", @@ -757,6 +794,7 @@ "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "你似乎没有将此邮箱地址同在此主服务器上的任何一个 Matrix 账号绑定。", "Restricted": "受限用户", "To use it, just wait for autocomplete results to load and tab through them.": "若要使用自动补全,只要等待自动补全结果加载完成,按 Tab 键切换即可。", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 将他们的昵称修改成了 %(displayName)s 。", "Hide avatars in user and room mentions": "隐藏头像", "Disable Community Filter Panel": "停用社区面板", "Stickerpack": "贴图集", @@ -854,6 +892,7 @@ "New community ID (e.g. +foo:%(localDomain)s)": "新社区 ID(例子:+foo:%(localDomain)s)", "URL previews are enabled by default for participants in this room.": "此聊天室默认启用链接预览。", "URL previews are disabled by default for participants in this room.": "此聊天室默认禁用链接预览。", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s 将聊天室的头像更改为 <img/>", "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "您也可以自定义身份认证服务器,但这通常会阻止基于邮箱地址的与用户的交互。", "Please enter the code it contains:": "请输入它包含的代码:", "Flair will appear if enabled in room settings": "如果在聊天室设置中启用, flair 将会显示", @@ -1096,44 +1135,5 @@ "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "无法加载被回复的事件,它可能不存在,也可能是您没有权限查看它。", "And %(count)s more...|other": "和 %(count)s 个其他…", "Try using one of the following valid address types: %(validTypesList)s.": "请尝试使用以下的有效邮箱地址格式中的一种:%(validTypesList)s", - "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot 使用 GitHub 追踪 bug:<a>在 GitHub 上创建新 Issue</a>", - "<target> accepted the invitation for %(displayName)s.": "<target> 接受了 %(displayName)s 的邀请。", - "<target> accepted an invitation.": "<target> 已接受邀请。", - "<sender> requested a VoIP conference.": "<sender> 已请求发起 VoIP 会议。", - "<sender> invited <target>.": "<sender> 邀请了 <target>。", - "<sender> banned <target>.": "<sender> 封禁了 <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> 将他们的昵称修改成了 <displayName> 。", - "<sender> set their display name to <displayName>.": "<sender> 将昵称改为了 <displayName>。.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> 删除了他们的昵称 (<oldDisplayName>).", - "<sender> removed their profile picture.": "<sender> 移除了他们的头像。", - "<sender> changed their profile picture.": "<sender> 修改了头像。", - "<sender> set a profile picture.": "<sender> 设置了头像。.", - "<target> joined the room.": "<target> 已加入聊天室。", - "<target> rejected the invitation.": "<target> 拒绝了邀请。", - "<target> left the room.": "<target> 退出了聊天室。", - "<sender> unbanned <target>.": "<sender> 解除了 <target> 的封禁。", - "<sender> kicked <target>.": "<sender> 把 <target> 踢出了聊天室。.", - "<sender> withdrew <target>'s invitation.": "<sender> 收回了 <target> 的邀请。", - "<sender> changed the topic to \"%(topic)s\".": "<sender> 将话题修改为 “%(topic)s”。", - "<sender> changed the room name to %(roomName)s.": "<sender> 将聊天室名称改为 %(roomName)s。", - "<sender> changed the avatar for %(roomName)s": "<sender> 修改了 %(roomName)s 的头像", - "<sender> changed the room avatar to <img/>": "<sender> 将聊天室的头像更改为 <img/>", - "<sender> removed the room name.": "<sender> 移除了聊天室名称。", - "<sender> removed the room avatar.": "<sender> 移除了聊天室头像。", - "<sender> answered the call.": "<sender> 接了通话。.", - "<sender> ended the call.": "<sender> 结束了通话。.", - "<sender> placed a %(callType)s call.": "<sender> 发起了一个 %(callType)s 通话。", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> 向 %(targetDisplayName)s 发了加入聊天室的邀请。.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> 设定历史浏览功能为 所有聊天室成员,从他们被邀请开始.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> 设定历史浏览功能为 所有聊天室成员,从他们加入开始.", - "<sender> made future room history visible to all room members.": "<sender> 设定历史浏览功能为 所有聊天室成员.", - "<sender> made future room history visible to anyone.": "<sender> 设定历史浏览功能为 任何人.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> 设定历史浏览功能为 未知的 (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> 打开了端到端加密 (算法 %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> 将级别调整到%(powerLevelDiffText)s 。", - "<sender> changed the pinned messages for the room.": "<sender> 更改了聊天室的置顶消息。", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s 小组建被 <sender> 修改", - "%(widgetName)s widget added by <sender>": "%(widgetName)s 小组建被 <sender> 添加", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s 小组建被 <sender> 移除" + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot 使用 GitHub 追踪 bug:<a>在 GitHub 上创建新 Issue</a>" } diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 5ba9458c77..ebf329b45b 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -8,6 +8,7 @@ "Are you sure you want to upload the following files?": "您確認要上傳以下文件嗎?", "Attachment": "附件", "Autoplay GIFs and videos": "自動播放 GIF 和影片", + "%(senderName)s banned %(targetName)s.": "%(senderName)s 封鎖了 %(targetName)s.", "Ban": "封鎖", "Banned users": "被封鎖的用戶", "Blacklisted": "已列入黑名單", @@ -15,6 +16,7 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "當瀏覽器網址列裡有 HTTPS URL 時,不能使用 HTTP 連線到家伺服器。請採用 HTTPS 或者<a>允許不安全的指令稿</a>。", "Can't load user settings": "無法載入使用者設定", "Change Password": "變更密碼", + "%(targetName)s left the room.": "%(targetName)s 離開了聊天室。.", "Account": "帳號", "Access Token:": "取用令牌:", "Add email address": "添加郵件地址", @@ -26,6 +28,7 @@ "Authentication": "授權", "%(items)s and %(lastItem)s": "%(items)s 和 %(lastItem)s", "%(names)s and %(lastPerson)s are typing": "%(names)s 和 %(lastPerson)s 正在打字", + "%(senderName)s answered the call.": "%(senderName)s 接了通話。.", "Clear Cache": "清理緩存", "Click here to fix": "點擊這里修復", "Confirm password": "確認密碼", @@ -59,6 +62,7 @@ "Enable encryption": "啟用加密", "Encrypted messages will not be visible on clients that do not yet implement encryption": "不支援加密的客戶端將看不到加密的訊息", "Encrypted room": "加密聊天室", + "%(senderName)s ended the call.": "%(senderName)s 結束了通話。.", "End-to-end encryption information": "端到端加密資訊", "End-to-end encryption is in beta and may not be reliable": "端到端加密現為測試版,不一定可靠", "Enter Code": "輸入代碼", @@ -96,6 +100,7 @@ "Forgot your password?": "忘記密碼?", "For security, this session has been signed out. Please sign in again.": "因為安全因素,此工作階段已被登出。請重新登入。", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "因為安全因素,登出將會從此瀏覽器刪除任何端到端加密的金鑰。若您想要在未來的 Riot 工作階段中解密您的對話紀錄,請將您的聊天室金鑰匯出並好好存放。", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 從 %(fromPowerLevel)s 變為 %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主動邀請。.", "Hangup": "掛斷", "Hide read receipts": "隱藏已讀回執", @@ -113,7 +118,9 @@ "Invalid file%(extra)s": "非法文件%(extra)s", "Invite new room members": "邀請新的聊天室成員", "Join Room": "加入聊天室", + "%(targetName)s joined the room.": "%(targetName)s 加入了聊天室。.", "Jump to first unread message.": "跳到第一則未讀訊息。", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s 把 %(targetName)s 踢出了聊天室。.", "Leave room": "離開聊天室", "New password": "新密碼", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "重設密碼目前會把所有裝置上的端到端加密金鑰重設,讓已加密的聊天歷史不可讀,除非您先匯出您的聊天室金鑰並在稍後重新匯入。這會在未來改進。", @@ -134,6 +141,7 @@ "Send Invites": "發送邀請", "Send Reset Email": "發送密碼重設郵件", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 發了一張圖片。.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 發了加入聊天室的邀請。.", "Server error": "伺服器錯誤", "Server may be unavailable or overloaded": "服務器可能不可用或者超載", "Server may be unavailable, overloaded, or search timed out :(": "服務器可能不可用、超載,或者搜索超時 :(", @@ -141,6 +149,8 @@ "Server may be unavailable, overloaded, or you hit a bug.": "服務器可能不可用、超載,或者你遇到了一個漏洞.", "Server unavailable, overloaded, or something else went wrong.": "伺服器可能不可用、超載,或者其他東西出錯了.", "Session ID": "會話 ID", + "%(senderName)s set a profile picture.": "%(senderName)s 設置了頭像。.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s 將他的暱稱改成 %(displayName)s。.", "Settings": "設定", "Show panel": "顯示側邊欄", "Show timestamps in 12 hour format (e.g. 2:30pm)": "用12小時制顯示時間戳 (如:下午 2:30)", @@ -162,6 +172,7 @@ "The file '%(fileName)s' failed to upload": "文件 '%(fileName)s' 上傳失敗", "Turn Markdown off": "關閉Markdown 語法", "Turn Markdown on": "啟用Markdown 語法", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 啟用端對端加密 (algorithm %(algorithm)s).", "Unable to add email address": "無法加入電郵地址", "Unable to capture screen": "無法截取畫面", "Unable to enable Notifications": "無法啟用通知功能", @@ -175,6 +186,9 @@ "Online": "線上", "Idle": "閒置", "Offline": "下線", + "%(senderDisplayName)s changed the room avatar to <img/>": "%(senderDisplayName)s 更改了聊天室的圖像為 <img/>", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s 移除了聊天室圖片。", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s 更改了聊天室 %(roomName)s 圖像", "Cancel": "取消", "Custom Server Options": "自訂伺服器選項", "Dismiss": "關閉", @@ -219,6 +233,8 @@ "Start chat": "開始聊天", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "文字訊息將會傳送到 +%(msisdn)s。請輸入其中包含的驗證碼", "Accept": "接受", + "%(targetName)s accepted an invitation.": "%(targetName)s 已接受邀請。", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s 已接受 %(displayName)s 的邀請。", "Active call (%(roomName)s)": "活躍的通話(%(roomName)s)", "Add": "新增", "Admin Tools": "管理員工具", @@ -232,6 +248,11 @@ "Are you sure you want to leave the room '%(roomName)s'?": "您確定您要想要離開房間 '%(roomName)s' 嗎?", "Bans user with given id": "禁止有指定 ID 的使用者", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "無法連線到家伺服器 - 請檢查您的連線,確保您的<a>家伺服器的 SSL 憑證</a>可被信任,而瀏覽器擴充套件也沒有阻擋請求。", + "%(senderName)s changed their profile picture.": "%(senderName)s 已經變更了他的基本資料圖片。", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s 變更了 %(powerLevelDiffText)s 權限等級。", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 將房間名稱變更為 %(roomName)s。", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 已經移除了房間名稱。", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 已經變更主題為「%(topic)s」。", "Changes to who can read history will only apply to future messages in this room": "變更誰可以讀取歷史紀錄的設定僅套用於此房間未來的訊息", "Changes your display nickname": "變更您的顯示暱稱", "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前變更密碼將會重設在所有裝置上的端對端加密金鑰,讓加密的聊天歷史無法讀取,除非您先匯出您的房間金鑰,並在稍後重新匯入它們。這會在未來改進。", @@ -280,6 +301,7 @@ "Incoming video call from %(name)s": "從 %(name)s 而來的視訊來電", "Incoming voice call from %(name)s": "從 %(name)s 而來的語音來電", "Incorrect username and/or password.": "不正確的使用者名稱和/或密碼。", + "%(senderName)s invited %(targetName)s.": "%(senderName)s 邀請了 %(targetName)s。", "Invited": "已邀請", "Invites": "邀請", "Invites user with given id to current room": "邀請指定 ID 的使用者到目前的房間", @@ -298,6 +320,11 @@ "Logged in as:": "登入為:", "Logout": "登出", "Low priority": "低優先度", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們被邀請開始.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們加入開始.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s 讓未來的房間歷史紀錄可見於 所有聊天室成員.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s 讓未來的房間歷史紀錄可見於 任何人.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s 讓未來的房間歷史紀錄可見於 未知 (%(visibility)s).", "Manage Integrations": "管裡整合", "Markdown is disabled": "Markdown 已停用", "Markdown is enabled": "Markdown 已啟用", @@ -334,6 +361,7 @@ "People": "夥伴", "Permissions": "權限", "Phone": "電話", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s 打了 %(callType)s 通話。", "Please check your email and click on the link it contains. Once this is done, click continue.": "請檢查您的電子郵件並點選其中包含的連結。只要這個完成了,就點選選繼續。", "Power level must be positive integer.": "權限等級必需為正整數。", "Press <StartChatButton> to start a chat with someone": "按下 <StartChatButton> 以開始與某人聊天", @@ -345,11 +373,15 @@ "Reason: %(reasonText)s": "理由:%(reasonText)s", "Revoke Moderator": "撤回仲裁者", "Refer a friend to Riot:": "推薦 Riot 給朋友:", + "%(targetName)s rejected the invitation.": "%(targetName)s 拒絕了邀請。", "Reject invitation": "拒絕邀請", "Rejoin": "重新加入", "Remote addresses for this room:": "此房間的遠端地址:", "Remove Contact Information?": "移除聯絡人資訊?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 移除了他的顯示名稱 (%(oldDisplayName)s)。", + "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他的基本資料圖片。", "Remove %(threePid)s?": "移除 %(threePid)s?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s 請求了一次 VoIP 會議。", "Results from DuckDuckGo": "DuckDuckGo 的結果", "Room contains unknown devices": "包含了未知裝置的房間", "%(roomName)s does not exist.": "%(roomName)s 不存在。", @@ -383,6 +415,7 @@ "Unable to remove contact information": "無法移除聯絡人資訊", "Unable to verify email address.": "無法驗證電子郵件。", "Unban": "解除禁止", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s 解除禁止 %(targetName)s。", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "無法確定此邀請是傳送到與您的帳號相關聯的電子郵件地址。", "Unable to load device list": "無法載入裝置清單", "Undecryptable": "無法解密", @@ -436,6 +469,7 @@ "Who can read history?": "誰可以讀取歷史紀錄?", "Who would you like to add to this room?": "您想要新增誰到此房間?", "Who would you like to communicate with?": "您想與誰通訊?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 撤回了 %(targetName)s 的邀請。", "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "您想要<acceptText>接受</acceptText>或<declineText>拒絕</declineText>此邀請?", "You already have existing direct chats with this user:": "您已與此使用者直接聊天:", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "您尚未在任何房間!按下<CreateRoomButton> 來建立房間或 <RoomDirectoryButton> 來瀏覽目錄", @@ -629,7 +663,10 @@ "Automatically replace plain text Emoji": "自動取代純文字為顏文字", "Failed to upload image": "上傳圖片失敗", "Hide avatars in user and room mentions": "在使用者與聊天室提及中隱藏大頭貼", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 由 %(senderName)s 所新增", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 由 %(senderName)s 所移除", "Robot check is currently unavailable on desktop - please use a <a>web browser</a>": "機器人檢查目前在桌面端不可用 ── 請使用<a>網路瀏覽器</a>", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小工具已被 %(senderName)s 修改", "Copied!": "已複製!", "Failed to copy": "複製失敗", "Add rooms to this community": "新增聊天室到此社群", @@ -659,6 +696,7 @@ "You are now ignoring %(userId)s": "您忽略了 %(userId)s", "Unignored user": "未忽略的使用者", "You are no longer ignoring %(userId)s": "您不再忽略 %(userId)s", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)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 與另一個人正在輸入", "Send": "傳送", @@ -917,6 +955,7 @@ "Community IDs cannot not be empty.": "社群 ID 不能為空。", "<showDevicesText>Show devices</showDevicesText>, <sendAnywayText>send anyway</sendAnywayText> or <cancelText>cancel</cancelText>.": "<showDevicesText>顯示裝置</showDevicesText>、<sendAnywayText>無論如何都要傳送</sendAnywayText>或<cancelText>取消</cancelText>。", "<a>In reply to</a> <pill>": "<a>回覆給</a> <pill>", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 變更了他的顯示名稱為 %(displayName)s 。", "Failed to set direct chat tag": "設定直接聊天標籤失敗", "Failed to remove tag %(tagName)s from room": "從聊天室移除標籤 %(tagName)s 失敗", "Failed to add tag %(tagName)s to room": "新增標籤 %(tagName)s 到聊天室失敗", @@ -1156,44 +1195,5 @@ "Share Room Message": "分享聊天室訊息", "Link to selected message": "連結到選定的訊息", "COPY": "複製", - "Share Message": "分享訊息", - "<target> accepted the invitation for %(displayName)s.": "<target> 已接受 %(displayName)s 的邀請。", - "<target> accepted an invitation.": "<target> 已接受邀請。", - "<sender> requested a VoIP conference.": "<sender> 請求了一次 VoIP 會議。", - "<sender> invited <target>.": "<sender> 邀請了 <target>。", - "<sender> banned <target>.": "<sender> 封鎖了 <target>.", - "<oldDisplayName> changed their display name to <displayName>.": "<oldDisplayName> 變更了他的顯示名稱為 <displayName> 。", - "<sender> set their display name to <displayName>.": "<sender> 將他的暱稱改成 <displayName>。.", - "<sender> removed their display name (<oldDisplayName>).": "<sender> 移除了他的顯示名稱 (<oldDisplayName>)。", - "<sender> removed their profile picture.": "<sender> 移除了他的基本資料圖片。", - "<sender> changed their profile picture.": "<sender> 已經變更了他的基本資料圖片。", - "<sender> set a profile picture.": "<sender> 設置了頭像。.", - "<target> joined the room.": "<target> 加入了聊天室。.", - "<target> rejected the invitation.": "<target> 拒絕了邀請。", - "<target> left the room.": "<target> 離開了聊天室。.", - "<sender> unbanned <target>.": "<sender> 解除禁止 <target>。", - "<sender> kicked <target>.": "<sender> 把 <target> 踢出了聊天室。.", - "<sender> withdrew <target>'s invitation.": "<sender> 撤回了 <target> 的邀請。", - "<sender> changed the topic to \"%(topic)s\".": "<sender> 已經變更主題為「%(topic)s」。", - "<sender> changed the room avatar to <img/>": "<sender> 更改了聊天室的圖像為 <img/>", - "<sender> changed the avatar for %(roomName)s": "<sender> 更改了聊天室 %(roomName)s 圖像", - "<sender> changed the room name to %(roomName)s.": "<sender> 將房間名稱變更為 %(roomName)s。", - "<sender> removed the room avatar.": "<sender> 移除了聊天室圖片。", - "<sender> removed the room name.": "<sender> 已經移除了房間名稱。", - "<sender> answered the call.": "<sender> 接了通話。.", - "<sender> ended the call.": "<sender> 結束了通話。.", - "<sender> placed a %(callType)s call.": "<sender> 打了 %(callType)s 通話。", - "<sender> sent an invitation to %(targetDisplayName)s to join the room.": "<sender> 向 %(targetDisplayName)s 發了加入聊天室的邀請。.", - "<sender> made future room history visible to all room members, from the point they are invited.": "<sender> 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們被邀請開始.", - "<sender> made future room history visible to all room members, from the point they joined.": "<sender> 讓未來的房間歷史紀錄可見於 所有聊天室成員,從他們加入開始.", - "<sender> made future room history visible to all room members.": "<sender> 讓未來的房間歷史紀錄可見於 所有聊天室成員.", - "<sender> made future room history visible to anyone.": "<sender> 讓未來的房間歷史紀錄可見於 任何人.", - "<sender> made future room history visible to unknown (%(visibility)s).": "<sender> 讓未來的房間歷史紀錄可見於 未知 (%(visibility)s).", - "<sender> turned on end-to-end encryption (algorithm %(algorithm)s).": "<sender> 啟用端對端加密 (algorithm %(algorithm)s).", - "<user> from %(fromPowerLevel)s to %(toPowerLevel)s": "<user> 從 %(fromPowerLevel)s 變為 %(toPowerLevel)s", - "<sender> changed the power level of %(powerLevelDiffText)s.": "<sender> 變更了 %(powerLevelDiffText)s 權限等級。", - "<sender> changed the pinned messages for the room.": "<sender> 變更了聊天室的釘選訊息。", - "%(widgetName)s widget modified by <sender>": "%(widgetName)s 小工具已被 <sender> 修改", - "%(widgetName)s widget added by <sender>": "%(widgetName)s 由 <sender> 所新增", - "%(widgetName)s widget removed by <sender>": "%(widgetName)s 由 <sender> 所移除" + "Share Message": "分享訊息" } From f7b84a412a863fea1ba25f6d875e5e1da494178d Mon Sep 17 00:00:00 2001 From: Szimszon <github@oregpreshaz.eu> Date: Tue, 3 Jul 2018 10:19:01 +0000 Subject: [PATCH 454/480] Translated using Weblate (Hungarian) Currently translated at 100.0% (1210 of 1210 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index f6bb85b0c7..72558c5873 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1206,5 +1206,7 @@ "Call in Progress": "Hívás folyamatban", "A call is already in progress!": "A hívás már folyamatban van!", "You have no historical rooms": "Nincsenek archív szobáid", - "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Nem tudsz üzenetet küldeni amíg nem olvasod el és nem fogadod el a <consentLink>felhasználási feltételeket</consentLink>." + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Nem tudsz üzenetet küldeni amíg nem olvasod el és nem fogadod el a <consentLink>felhasználási feltételeket</consentLink>.", + "Demote yourself?": "Lefokozod magad?", + "Demote": "Lefokozás" } From 0ad8d5ed79a0ae54d745fc9ff61712dacc63f682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= <zecakeh@posteo.net> Date: Tue, 3 Jul 2018 11:27:00 +0000 Subject: [PATCH 455/480] Translated using Weblate (French) Currently translated at 100.0% (1210 of 1210 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, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index b0062c0d90..ea4b9e37fd 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1206,5 +1206,7 @@ "Call in Progress": "Appel en cours", "A call is already in progress!": "Un appel est déjà en cours !", "You have no historical rooms": "Vous n'avez aucun salon historique", - "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Vous ne pouvez voir aucun message tant que vous ne lisez et n'acceptez pas nos <consentLink>conditions générales</consentLink>." + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Vous ne pouvez voir aucun message tant que vous ne lisez et n'acceptez pas nos <consentLink>conditions générales</consentLink>.", + "Demote yourself?": "Vous rétrograder ?", + "Demote": "Rétrograder" } From 3f88721bc1f36021a4a67bc788b50cf3fb071bd1 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 3 Jul 2018 14:43:27 +0100 Subject: [PATCH 456/480] Give PersistedElement a key So there can be more than one on a page --- .../views/elements/PersistedElement.js | 17 +++++++++++------ src/components/views/rooms/Stickerpicker.js | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js index 8115a36eeb..389a1458d2 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.js @@ -16,19 +16,18 @@ limitations under the License. const React = require('react'); const ReactDOM = require('react-dom'); +const PropTypes = require('prop-types'); // Shamelessly ripped off Modal.js. There's probably a better way // of doing reusable widgets like dialog boxes & menus where we go and // pass in a custom control as the actual body. -const ContainerId = "mx_PersistedElement"; - -function getOrCreateContainer() { - let container = document.getElementById(ContainerId); +function getOrCreateContainer(containerId) { + let container = document.getElementById(containerId); if (!container) { container = document.createElement("div"); - container.id = ContainerId; + container.id = containerId; document.body.appendChild(container); } @@ -106,9 +105,15 @@ export default class PersistedElement extends React.Component { {this.props.children} </div>; - ReactDOM.render(content, getOrCreateContainer()); + ReactDOM.render(content, getOrCreateContainer('mx_persistedElement_'+this.props.persistKey)); return <div ref={this.collectChildContainer}></div>; } } +PersistedElement.propTypes = { + // Unique identifier for this PersistedElement instance + // Any PersistedElements with the same persistKey will use + // the same DOM container. + persistKey: PropTypes.string.isRequired, +}; diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index 4cb7c59ce6..343d04d24b 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -211,7 +211,7 @@ export default class Stickerpicker extends React.Component { width: this.popoverWidth, }} > - <PersistedElement> + <PersistedElement persistKey="stickerPicker"> <AppTile collectWidgetMessaging={this._collectWidgetMessaging} id={stickerpickerWidget.id} From 74f2d0a36021cf22195a699d5190017fbb64fa91 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 3 Jul 2018 14:54:43 +0100 Subject: [PATCH 457/480] Use inline class field for PropTypes --- src/components/views/elements/PersistedElement.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js index 389a1458d2..23dea3499c 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.js @@ -49,6 +49,14 @@ const PE_Z_INDEX = 5000; * bounding rect as the parent of PE. */ export default class PersistedElement extends React.Component { + + static propTypes = { + // Unique identifier for this PersistedElement instance + // Any PersistedElements with the same persistKey will use + // the same DOM container. + persistKey: PropTypes.string.isRequired, + }; + constructor() { super(); this.collectChildContainer = this.collectChildContainer.bind(this); @@ -110,10 +118,3 @@ export default class PersistedElement extends React.Component { return <div ref={this.collectChildContainer}></div>; } } - -PersistedElement.propTypes = { - // Unique identifier for this PersistedElement instance - // Any PersistedElements with the same persistKey will use - // the same DOM container. - persistKey: PropTypes.string.isRequired, -}; From c0aa1f11967a29f7ba47e04fd1a4db6d1c5b03d3 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev <slavi@devture.com> Date: Tue, 3 Jul 2018 14:35:08 +0000 Subject: [PATCH 458/480] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1210 of 1210 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 958d90b2b2..58a7de93b5 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1206,5 +1206,7 @@ "The user name field must not be blank.": "Полето за потребителско име не може да е празно.", "The phone number field must not be blank.": "Полето за телефонен номер не може да е празно.", "The password field must not be blank.": "Полето за парола не може да е празно.", - "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Не можете да изпращате съобщения докато не прегледате и се съгласите с <consentLink>нашите правила и условия</consentLink>." + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Не можете да изпращате съобщения докато не прегледате и се съгласите с <consentLink>нашите правила и условия</consentLink>.", + "Demote yourself?": "Понижете себе си?", + "Demote": "Понижение" } From b69eb8fc8852b79b1f80a6923ff670eb9f782134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Kozio=C5=82?= <translate.riot.im@www.koziolek.biz> Date: Tue, 3 Jul 2018 17:15:28 +0000 Subject: [PATCH 459/480] Translated using Weblate (Polish) Currently translated at 92.8% (1124 of 1210 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 1fffff1b87..9fa51294ff 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -650,7 +650,7 @@ "Automatically replace plain text Emoji": "Automatycznie zastępuj tekstowe emotikony", "Failed to upload image": "Przesyłanie obrazka nie powiodło się", "%(count)s new messages|one": "%(count)s nowa wiadomość", - "%(count)s new messages|other": "%(count)s nowe wiadomości", + "%(count)s new messages|other": "%(count)s nowych wiadomości", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Zalecamy Ci przejście przez proces weryfikacyjny dla każdego urządzenia aby potwierdzić, że należy ono do ich prawdziwego właściciela. Możesz jednak wysłać tę wiadomość bez potwierdzania.", "Unblacklist": "Usuń z czarnej listy", "Blacklist": "Dodaj do czarnej listy", From ad35fbf208370940e0809c607809b15442955b36 Mon Sep 17 00:00:00 2001 From: David Baker <dave@matrix.org> Date: Tue, 3 Jul 2018 18:25:33 +0100 Subject: [PATCH 460/480] Pull out z-index to the sticker picker As it's not a thing that's necessary for other PersistedElements, only the sticker picker because it has to sit above the ContextMenu it sits in. --- src/components/views/elements/PersistedElement.js | 6 +----- src/components/views/rooms/Stickerpicker.js | 6 +++++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js index 23dea3499c..6816b4dab3 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.js @@ -34,9 +34,6 @@ function getOrCreateContainer(containerId) { return container; } -// Greater than that of the ContextualMenu -const PE_Z_INDEX = 5000; - /* * Class of component that renders its children in a separate ReactDOM virtual tree * in a container element appended to document.body. @@ -104,12 +101,11 @@ export default class PersistedElement extends React.Component { left: parentRect.left + 'px', width: parentRect.width + 'px', height: parentRect.height + 'px', - zIndex: PE_Z_INDEX, }); } render() { - const content = <div ref={this.collectChild}> + const content = <div ref={this.collectChild} style={this.props.style}> {this.props.children} </div>; diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index 343d04d24b..d6afc28dad 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -27,6 +27,10 @@ import WidgetUtils from '../../../utils/WidgetUtils'; const widgetType = 'm.stickerpicker'; +// We sit in a context menu, so the persisted element container needs to float +// above it, so it needs a greater z-index than the ContextMenu +const STICKERPICKER_Z_INDEX = 5000; + export default class Stickerpicker extends React.Component { constructor(props) { super(props); @@ -211,7 +215,7 @@ export default class Stickerpicker extends React.Component { width: this.popoverWidth, }} > - <PersistedElement persistKey="stickerPicker"> + <PersistedElement containerId="mx_persisted_stickerPicker" style={{zIndex: STICKERPICKER_Z_INDEX}}> <AppTile collectWidgetMessaging={this._collectWidgetMessaging} id={stickerpickerWidget.id} From 2ddcb83e8d7b8ab0976367b556c51e0d3e1ab421 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki <nekomanma@pixiv.co.jp> Date: Wed, 4 Jul 2018 10:55:56 +0900 Subject: [PATCH 461/480] Import react as React in src/GroupAddressPicker.js Signed-off-by: Akihiko Odaki <nekomanma@pixiv.co.jp> --- src/GroupAddressPicker.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/GroupAddressPicker.js b/src/GroupAddressPicker.js index 91380b6eed..532ee23c25 100644 --- a/src/GroupAddressPicker.js +++ b/src/GroupAddressPicker.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import React from 'react'; import Modal from './Modal'; import sdk from './'; import MultiInviter from './utils/MultiInviter'; From 537e8da553a2f0d51db4879c0310e0168688da0a Mon Sep 17 00:00:00 2001 From: RainSlide <RainSlide@outlook.com> Date: Wed, 4 Jul 2018 06:03:48 +0000 Subject: [PATCH 462/480] Translated using Weblate (Chinese (Simplified)) Currently translated at 94.5% (1144 of 1210 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 140 ++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 65 deletions(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 56d5c1e4dc..e2475e6f05 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -35,7 +35,7 @@ "Event information": "事件信息", "Existing Call": "当前通话", "Export E2E room keys": "导出聊天室的端到端加密密钥", - "Failed to ban user": "封禁用户失败", + "Failed to ban user": "封禁失败", "Failed to change password. Is your password correct?": "修改密码失败。确认原密码输入正确吗?", "Failed to forget room %(errCode)s": "忘记聊天室失败,错误代码: %(errCode)s", "Failed to join room": "无法加入聊天室", @@ -103,7 +103,7 @@ "Server may be unavailable or overloaded": "服务器可能不可用或者超载", "Server may be unavailable, overloaded, or search timed out :(": "服务器可能不可用、超载,或者搜索超时 :(", "Server may be unavailable, overloaded, or the file too big": "服务器可能不可用、超载,或者文件过大", - "Server may be unavailable, overloaded, or you hit a bug.": "服务器可能不可用、超载,或者你遇到了一个 bug。", + "Server may be unavailable, overloaded, or you hit a bug.": "当前服务器可能处于不可用或过载状态,或者您遇到了一个 bug。", "Server unavailable, overloaded, or something else went wrong.": "服务器可能不可用、超载,或者其他东西出错了.", "Session ID": "会话 ID", "%(senderName)s set a profile picture.": "%(senderName)s 设置了头像。.", @@ -179,7 +179,7 @@ "Are you sure you want to reject the invitation?": "你确定要拒绝邀请吗?", "Are you sure you want to upload the following files?": "你确定要上传这些文件吗?", "Bans user with given id": "按照 ID 封禁指定的用户", - "Blacklisted": "已列入黑名单", + "Blacklisted": "已拉黑", "Bulk Options": "批量操作", "Call Timeout": "通话超时", "Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "无法连接主服务器 - 请检查网络连接,确保你的<a>主服务器 SSL 证书</a>被信任,且没有浏览器插件拦截请求。", @@ -192,7 +192,7 @@ "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 将话题修改为 “%(topic)s”。", "Changes to who can read history will only apply to future messages in this room": "修改阅读历史的权限仅对此聊天室以后的消息有效", "Changes your display nickname": "修改昵称", - "Changing password will currently reset any end-to-end encryption keys on all devices, 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 devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前,修改密码会导致所有设备上的端到端密钥被重置,使得加密的聊天记录不再可读。除非事先导出你的密钥,并在密码修改后导入回去。此问题将会在未来得到改善。", "Clear Cache and Reload": "清除缓存并刷新", "Clear Cache": "清除缓存", "<a>Click here</a> to join the discussion!": "<a>点此</a> 加入讨论!", @@ -222,8 +222,8 @@ "Drop File Here": "把文件拖拽到这里", "Email address (optional)": "邮箱地址 (可选)", "Enable Notifications": "启用消息通知", - "Encrypted by a verified device": "由一个已验证的设备加密", - "Encrypted by an unverified device": "由一个未经验证的设备加密", + "Encrypted by a verified device": "由已验证设备加密", + "Encrypted by an unverified device": "由未验证设备加密", "Encryption is enabled in this room": "此聊天室启用了加密", "Encryption is not enabled in this room": "此聊天室未启用加密", "Enter passphrase": "输入密码", @@ -254,7 +254,7 @@ "Moderator": "协管员", "Mute": "静音", "Name": "姓名", - "Never send encrypted messages to unverified devices from this device": "在此设备上不向未经验证的设备发送消息", + "Never send encrypted messages to unverified devices from this device": "在此设备上,从不对未经验证的设备发送消息", "New passwords don't match": "两次输入的新密码不符", "none": "无", "not set": "未设置", @@ -320,7 +320,7 @@ "VoIP conference started.": "VoIP 会议开始。", "VoIP is unsupported": "不支持 VoIP", "Warning!": "警告!", - "You must <a>register</a> to use this functionality": "你必须<a>注册</a>以使用这个功能", + "You must <a>register</a> to use this functionality": "你必须 <a>注册</a> 以使用此功能", "You need to be logged in.": "你需要登录。", "You need to enter a user name.": "你需要输入一个用户名。", "Your password has been reset": "你的密码已被重置", @@ -394,29 +394,29 @@ "Kicks user with given id": "按照 ID 移除特定的用户", "Last seen": "最近一次上线", "Level:": "级别:", - "Local addresses for this room:": "这个聊天室的本地地址:", + "Local addresses for this room:": "此聊天室的本地地址:", "New passwords must match each other.": "新密码必须互相匹配。", "Power level must be positive integer.": "权限级别必须是正整数。", "Reason: %(reasonText)s": "理由: %(reasonText)s", "Revoke Moderator": "撤销主持人", "Revoke widget access": "撤销小部件的访问", - "Remote addresses for this room:": "这个聊天室的远程地址:", + "Remote addresses for this room:": "此聊天室的远程地址:", "Remove Contact Information?": "移除联系人信息?", "Remove %(threePid)s?": "移除 %(threePid)s?", "Results from DuckDuckGo": "来自 DuckDuckGo 的结果", "Room contains unknown devices": "聊天室包含未知设备", "%(roomName)s does not exist.": "%(roomName)s 不存在。", "Save": "保存", - "Send anyway": "无论任何都发送", + "Send anyway": "仍然发送", "Sets the room topic": "设置聊天室主题", "Show Text Formatting Toolbar": "显示文字格式工具栏", - "This room has no local addresses": "这个聊天室没有本地地址", + "This room has no local addresses": "此聊天室没有本地地址", "This doesn't appear to be a valid email address": "这看起来不是一个合法的邮箱地址", - "This is a preview of this room. Room interactions have been disabled": "这是这个聊天室的一个预览。聊天室交互已禁用", + "This is a preview of this room. Room interactions have been disabled": "这是此聊天室的预览。交互操作已被禁用", "This phone number is already in use": "此手机号码已被使用", - "This room": "这个聊天室", - "This room is not accessible by remote Matrix servers": "这个聊天室无法被远程 Matrix 服务器访问", - "This room's internal ID is": "这个聊天室的内部 ID 是", + "This room": "此聊天室", + "This room is not accessible by remote Matrix servers": "此聊天室无法被远程 Matrix 服务器访问", + "This room's internal ID is": "此聊天室的内部 ID 为", "Turn Markdown off": "禁用 Markdown", "Turn Markdown on": "启用 Markdown", "Unable to create widget.": "无法创建小部件。", @@ -427,7 +427,7 @@ "Undecryptable": "无法解密的", "Unencrypted room": "未加密的聊天室", "unencrypted": "未加密的", - "Unencrypted message": "未加密的消息", + "Unencrypted message": "未加密消息", "unknown caller": "未知呼叫者", "unknown device": "未知设备", "Unnamed Room": "未命名的聊天室", @@ -438,7 +438,7 @@ "Upload file": "上传文件", "Usage": "用法", "Who can read history?": "谁可以阅读历史消息?", - "You are not in this room.": "你不在这个聊天室。", + "You are not in this room.": "您不在此聊天室中。", "You have no visible notifications": "你没有可见的通知", "Missing password.": "缺少密码。", "Passwords don't match.": "密码不匹配。", @@ -449,9 +449,9 @@ "Do you want to load widget from URL:": "你想从此 URL 加载小组件吗:", "Hide join/leave messages (invites/kicks/bans unaffected)": "隐藏加入/退出消息(邀请/踢出/封禁不受影响)", "Integrations Error": "集成错误", - "Publish this room to the public in %(domain)s's room directory?": "把这个聊天室发布到 %(domain)s 的聊天室目录吗?", + "Publish this room to the public in %(domain)s's room directory?": "是否将此聊天室发布至 %(domain)s 的聊天室目录中?", "Manage Integrations": "管理集成", - "No users have specific privileges in this room": "没有用户在这个聊天室有特殊权限", + "No users have specific privileges in this room": "此聊天室中没有用户有特殊权限", "%(senderName)s placed a %(callType)s call.": "%(senderName)s 发起了一个 %(callType)s 通话。", "Please check your email and click on the link it contains. Once this is done, click continue.": "请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。", "Press <StartChatButton> to start a chat with someone": "按下 <StartChatButton> 来开始和某个人聊天", @@ -480,7 +480,7 @@ "Refer a friend to Riot:": "介绍朋友加入Riot:", "%(roomName)s is not accessible at this time.": "%(roomName)s 此时无法访问。", "Start authentication": "开始认证", - "The maximum permitted number of widgets have already been added to this room.": "小部件的最大允许数量已经添加到这个聊天室了。", + "The maximum permitted number of widgets have already been added to this room.": "此聊天室可拥有的小部件数量已达到上限。", "The phone number entered looks invalid": "输入的手机号码看起来无效", "The remote side failed to pick up": "对方未能接听", "This Home Server does not support login using email address.": "HS不支持使用邮箱地址登陆。", @@ -501,15 +501,15 @@ "(no answer)": "(没有回答)", "(warning: cannot be disabled again!)": "(警告:无法再被禁用!)", "WARNING: Device already verified, but keys do NOT MATCH!": "警告:设备已经验证,但密钥不匹配!", - "Who can access this room?": "谁可以访问这个聊天室?", - "Who would you like to add to this room?": "你想把谁加入这个聊天室?", + "Who can access this room?": "谁有权访问此聊天室?", + "Who would you like to add to this room?": "你想把谁添加到此聊天室?", "Who would you like to communicate with?": "你想和谁交流?", "You are already in a call.": "您正在通话。", - "You do not have permission to do that in this room.": "你没有权限在这个聊天室里面做那件事。", + "You do not have permission to do that in this room.": "您没有进行此操作的权限。", "You are trying to access %(roomName)s.": "你正在尝试访问 %(roomName)s.", - "You cannot place VoIP calls in this browser.": "你不能在这个浏览器中发起 VoIP 通话。", - "You do not have permission to post to this room": "你没有发送到这个聊天室的权限", - "You have been invited to join this room by %(inviterName)s": "您已被 %(inviterName)s 邀请加入这个聊天室", + "You cannot place VoIP calls in this browser.": "无法在此浏览器中发起 VoIP 通话。", + "You do not have permission to post to this room": "您没有在此聊天室发送消息的权限", + "You have been invited to join this room by %(inviterName)s": "您已被 %(inviterName)s 邀请加入此聊天室", "You seem to be in a call, are you sure you want to quit?": "您似乎正在进行通话,确定要退出吗?", "You seem to be uploading files, are you sure you want to quit?": "您似乎正在上传文件,确定要退出吗?", "You should not yet trust it to secure data": "你不应该相信它来保护你的数据", @@ -520,7 +520,7 @@ "An unknown error occurred.": "一个未知错误出现了。", "An error occurred: %(error_string)s": "一个错误出现了: %(error_string)s", "Encrypt room": "加密聊天室", - "There are no visible files in this room": "这个聊天室里面没有可见的文件", + "There are no visible files in this room": "此聊天室中没有可见的文件", "Active call": "当前通话", "Verify...": "验证...", "Error decrypting audio": "解密音频时出错", @@ -544,34 +544,34 @@ "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "你想要 <acceptText>接受</acceptText> 还是 <declineText>拒绝</declineText> 这个邀请?", "You already have existing direct chats with this user:": "你已经有和此用户的直接聊天:", "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "你现在还不再任何聊天室!按下 <CreateRoomButton> 来创建一个聊天室或者 <RoomDirectoryButton> 来浏览目录", - "You cannot place a call with yourself.": "你不能和你自己发起一个通话。", + "You cannot place a call with yourself.": "你怎么寂寞到要和自己打电话,不支持的啦。", "You have been kicked from %(roomName)s by %(userName)s.": "您已被 %(userName)s 从聊天室 %(roomName)s 中移除。", "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "你已经登出了所有的设备并不再接收推送通知。要重新启用通知,请再在每个设备上登录", "You have <a>disabled</a> URL previews by default.": "你已经默认 <a>禁用</a> 链接预览。", "You have <a>enabled</a> URL previews by default.": "你已经默认 <a>启用</a> 链接预览。", "Your home server does not support device management.": "你的 home server 不支持设备管理。", "Set a display name:": "设置一个昵称:", - "This server does not support authentication with a phone number.": "这个服务器不支持用手机号码认证。", + "This server does not support authentication with a phone number.": "此服务器不支持使用手机号码认证。", "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "密码过短(最短为 %(MIN_PASSWORD_LENGTH)s)。", - "Make this room private": "使这个聊天室私密", + "Make this room private": "将此聊天室转为私密聊天室", "Share message history with new users": "和新用户共享消息历史", "Copied!": "已复制!", "Failed to copy": "复制失败", "Sent messages will be stored until your connection has returned.": "已发送的消息会被保存直到你的连接回来。", "(~%(count)s results)|one": "(~%(count)s 个结果)", "(~%(count)s results)|other": "(~%(count)s 个结果)", - "Please select the destination room for this message": "请选择这条消息的目标聊天室", + "Please select the destination room for this message": "请选择此消息的目标聊天室", "Start automatically after system login": "在系统登录后自动启动", "Analytics": "统计分析服务", "Reject all %(invitedRooms)s invites": "拒绝所有 %(invitedRooms)s 邀请", - "You may wish to login with a different account, or add this email to this account.": "你可能希望用另外一个账户登录,或者添加这个电子邮件到这个账户上。", - "Sun": "星期日", - "Mon": "星期一", - "Tue": "星期二", - "Wed": "星期三", - "Thu": "星期四", - "Fri": "星期五", - "Sat": "星期六", + "You may wish to login with a different account, or add this email to this account.": "您可能是想要用另一个账户登录,或是将此电子邮件关联至当前账户。", + "Sun": "周日", + "Mon": "周一", + "Tue": "周二", + "Wed": "周三", + "Thu": "周四", + "Fri": "周五", + "Sat": "周六", "Jan": "一月", "Feb": "二月", "Mar": "三月", @@ -597,10 +597,10 @@ "The visibility of existing history will be unchanged": "现有历史记录的可见性不会改变", "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 打开了端到端加密 (算法 %(algorithm)s).", "Unable to remove contact information": "无法移除联系人信息", - "Riot collects anonymous analytics to allow us to improve the application.": "Riot 收集匿名的分析数据来允许我们改善这个应用。", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot 收集匿名的分析数据以允许我们改善它。", "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" 包含你以前没见过的设备。", "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "你可以使用自定义的服务器选项来通过指定一个不同的主服务器 URL 来登录其他 Matrix 服务器。", - "This allows you to use this app with an existing Matrix account on a different home server.": "这允许你用一个已有在不同主服务器的 Matrix 账户使用这个应用。", + "This allows you to use this app with an existing Matrix account on a different home server.": "这允许你使用其他主服务器上的 Matrix 帐号。", "Please check your email to continue registration.": "请查看你的电子邮件以继续注册。", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "如果你不指定一个邮箱地址,你将不能重置你的密码。你确定吗?", "Home server URL": "主服务器 URL", @@ -650,9 +650,9 @@ "Hide avatar changes": "隐藏头像修改", "Hide display name changes": "隐藏昵称修改", "Disable big emoji in chat": "禁用聊天中的大Emoji", - "Never send encrypted messages to unverified devices in this room from this device": "在此设备上,在此聊天室中不向未经验证的设备发送加密的消息", - "Enable URL previews for this room (only affects you)": "在此聊天室启用链接预览(只影响你)", - "Enable URL previews by default for participants in this room": "对这个聊天室的参与者默认启用 链接预览", + "Never send encrypted messages to unverified devices in this room from this device": "在此设备上、此聊天室中,从不对未经验证的设备发送加密的消息", + "Enable URL previews for this room (only affects you)": "在此聊天室中启用链接预览(仅影响你)", + "Enable URL previews by default for participants in this room": "对此聊天室的所有成员默认启用链接预览", "Delete %(count)s devices|other": "删除了 %(count)s 个设备", "Delete %(count)s devices|one": "删除设备", "Select devices": "选择设备", @@ -729,24 +729,24 @@ "Your homeserver's URL": "您的主服务器的链接", "Your identity server's URL": "您的身份认证服务器的链接", "The information being sent to us to help make Riot.im better includes:": "将要为帮助 Riot.im 发展而发送的信息包含:", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "这个页面中含有可能能用于识别您身份的信息,比如聊天室、用户或群组 ID,在它们发送到服务器上之前,这些数据会被移除。", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "此页面中含有可用于识别您身份的信息,比如聊天室、用户或群组 ID,这些数据会在发送到服务器前被移除。", "%(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", - "Who would you like to add to this community?": "您想把谁添加到这个社区内?", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(monthName)s %(day)s %(time)s, %(weekDayName)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s %(monthName)s %(day)s, %(weekDayName)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(fullYear)s %(monthName)s %(day)s %(time)s, %(weekDayName)s", + "Who would you like to add to this community?": "你想把谁添加到此社区中?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "警告:您添加的一切用户都将会对一切知道此社区的 ID 的人公开", "Name or matrix ID": "名称或 Matrix ID", - "Which rooms would you like to add to this community?": "您想把哪个聊天室添加到这个社区中?", + "Which rooms would you like to add to this community?": "您想把哪个聊天室添加到此社区中?", "Add rooms to the community": "添加聊天室到社区", "Add to community": "添加到社区", "Failed to invite users to community": "邀请用户到社区失败", "Disable Peer-to-Peer for 1:1 calls": "在一对一通话中禁用 P2P 对等网络", - "Enable inline URL previews by default": "默认启用网址预览", - "Disinvite this user?": "取消邀请此用户?", - "Kick this user?": "移除此用户?", - "Unban this user?": "解除此用户的封禁?", - "Ban this user?": "封紧此用户?", + "Enable inline URL previews by default": "默认启用链接预览", + "Disinvite this user?": "是否不再邀请此用户?", + "Kick this user?": "是否移除此用户?", + "Unban this user?": "是否解封此用户?", + "Ban this user?": "是否封禁此用户?", "Send an encrypted reply…": "发送加密的回复…", "Send a reply (unencrypted)…": "发送回复(未加密)…", "Send an encrypted message…": "发送加密消息…", @@ -766,7 +766,7 @@ "%(user)s is a %(userRole)s": "%(user)s 是一个 %(userRole)s", "To link to a room it must have <a>an address</a>.": "要链接一个聊天室,它必须有一个<a>地址</a>。", "To send events of type <eventType/>, you must be a": "要发送类型为 <eventType/> 的事件,你必须是", - "Members only (since the point in time of selecting this option)": "只有成员(从选择这个选项的时间开始)", + "Members only (since the point in time of selecting this option)": "仅成员(从选中此选项时开始)", "Members only (since they were invited)": "只有成员(从他们被邀请开始)", "Members only (since they joined)": "只有成员(从他们加入开始)", "Invalid community ID": "无效的社区 ID", @@ -803,8 +803,8 @@ "Your key share request has been sent - please check your other devices for key share requests.": "已请求共享密钥 - 请在您的其他设备上进行确认。", "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "密钥共享请求将会自动发送到您的其他设备上。如果您在其他设备上拒绝了请求,请点击此处以再次请求此会话的密钥。", "If your other devices do not have the key for this message you will not be able to decrypt them.": "如果您的其他设备上没有此消息的密钥,您将依然无法解密。", - "Key request sent.": "已请求共享密钥。", - "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "在您的其他设备上 <requestLink>重新请求加密密钥</requestLink>。", + "Key request sent.": "已发送密钥共享请求。", + "<requestLink>Re-request encryption keys</requestLink> from your other devices.": "从其他设备上 <requestLink>重新请求密钥</requestLink>。", "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.": "如果您是房间中最后一位有权限的用户,在您降低自己的权限等级后将无法撤回此修改,因为你将无法重新获得权限。", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "你将无法撤回此修改,因为您正在将此用户的权限提升至和你相同的级别。", "No devices with registered encryption keys": "没有设备有已注册的加密密钥", @@ -901,7 +901,7 @@ "Block users on other matrix homeservers from joining this room": "禁止其他 Matrix 主服务器上的用户加入此聊天室", "To verify that this device 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 device matches the key below:": "为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配:", "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "如果匹配,请点击下面的验证按钮。 如果不匹配,那么这可能说明其他人正在盗用此设备,而您应当点击黑名单按钮。", - "In future this verification process will be more sophisticated.": "未来,这个验证过程将会变得更加精致、巧妙一些。", + "In future this verification process will be more sophisticated.": "未来,此验证过程将更为精致、巧妙一些。", "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "我们建议您对每台设备进行验证以保证它们属于其合法所有者,但是您可以在不验证它们的情况下重新发送消息。", "<h1>HTML for your community's page</h1>\n<p>\n Use the long description to introduce new members to the community, or distribute\n some important <a href=\"foo\">links</a>\n</p>\n<p>\n You can even use 'img' tags\n</p>\n": "<h1>社区页面的 HTML 代码</h1>\n<p>\n 你可以给社区的新成员们写些长长的社区简介来引导他们,或者放置\n 一些重要的<a href=\"foo\">链接</a>\n</p>\n<p>\n 你甚至可以使用 <img> 标签\n</p>\n", "Add rooms to the community summary": "将聊天室添加到社区简介", @@ -946,13 +946,13 @@ "Opens the Developer Tools dialog": "打开开发者工具窗口", "Notify the whole room": "通知聊天室全体成员", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "此操作允许您将加密聊天室中收到的消息的密钥导出为本地文件。您可以将文件导入其他 Matrix 客户端,以便让别的客户端在未收到密钥的情况下解密这些消息。", - "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.": "导出的文件将允许任何可以读取它的人解密任何他们可以看到的加密消息,因此您应该小心以确保其安全。为了解决这个问题,您应该在下面输入一个密码,用于加密导出的数据。只有输入相同的密码才能导入数据。", + "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.": "导出的文件将允许任何可以读取它的人解密任何他们可以看到的加密消息,因此您应该小心以确保其安全。为解决此问题,您应该在下面输入密码以加密导出的数据。只有输入相同的密码才能导入数据。", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "导出文件有密码保护。你需要在此输入密码以解密此文件。", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "此操作允许您导入之前从另一个 Matrix 客户端中导出的加密密钥文件。导入完成后,您将能够解密那个客户端可以解密的加密消息。", "Ignores a user, hiding their messages from you": "忽略用户,隐藏他们的消息", "Stops ignoring a user, showing their messages going forward": "解除忽略用户,显示他们的消息", "To return to your account in future you need to set a password": "如果你想再次使用账号,您得为它设置一个密码", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "如果你在 GitHub 提交了一个 bug,调试日志可以帮助我们追踪这个问题。 调试日志包含应用程序使用数据,这包括您的用户名、您访问的房间或社区的 ID 或名称以及其他用户的用户名,不包扩聊天记录。", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "如果你在 GitHub 提交了一个 bug,调试日志可以帮助我们追踪这个问题。 调试日志包含应用程序使用数据,也就包括您的用户名、您访问的房间或社区的 ID 或名称,以及其他用户的用户名,但不包括聊天记录。", "Debug Logs Submission": "发送调试日志", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "密码修改成功。在您在其他设备上重新登录之前,其他设备不会收到推送通知", "Tried to load a specific point in this room's timeline, but was unable to find it.": "尝试加载此房间的时间线的特定时间点,但是无法找到。", @@ -960,7 +960,7 @@ "%(count)s <resendText>Resend all</resendText> or <cancelText>cancel all</cancelText> now. You can also select individual messages to resend or cancel.|other": "現在 <resendText>重新发送消息</resendText> 或 <cancelText>取消发送</cancelText> 。你也可以单独选择消息以重新发送或取消。", "Visibility in Room List": "是否在聊天室目录中可见", "Something went wrong when trying to get your communities.": "获取你加入的社区时发生错误。", - "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "删除小部件后,此聊天室中的所有用户的这个小部件都会被删除。你确定要删除这个小部件吗?", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "删除小部件时将为聊天室中的所有成员删除。您确定要删除此小部件吗?", "Fetching third party location failed": "获取第三方位置失败", "A new version of Riot is available.": "Riot 有更新可用。", "Couldn't load home page": "不能加载首页", @@ -990,7 +990,7 @@ "Forget": "忘记", "#example": "#例子", "Hide panel": "隐藏面板", - "You cannot delete this image. (%(code)s)": "您不能删除这个图片。(%(code)s)", + "You cannot delete this image. (%(code)s)": "无法删除此图片。(%(code)s)", "Cancel Sending": "取消发送", "This Room": "此聊天室", "The Home Server may be too old to support third party networks": "主服务器可能太老旧无法支持第三方网络", @@ -1135,5 +1135,15 @@ "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "无法加载被回复的事件,它可能不存在,也可能是您没有权限查看它。", "And %(count)s more...|other": "和 %(count)s 个其他…", "Try using one of the following valid address types: %(validTypesList)s.": "请尝试使用以下的有效邮箱地址格式中的一种:%(validTypesList)s", - "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot 使用 GitHub 追踪 bug:<a>在 GitHub 上创建新 Issue</a>" + "Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot 使用 GitHub 追踪 bug:<a>在 GitHub 上创建新 Issue</a>", + "e.g. %(exampleValue)s": "例如:%(exampleValue)s", + "Call in Progress": "正在通话", + "A call is already in progress!": "您已在通话中!", + "Jitsi Conference Calling": "Jitsi 电话会议", + "Send analytics data": "发送统计数据", + "Enable widget screenshots on supported widgets": "对支持的小部件启用小部件截图", + "Encrypting": "正在加密", + "Encrypted, not sent": "已加密,未发送", + "Demote yourself?": "是否降低您自己的权限?", + "Demote": "降权" } From 36d3c3952b2423cd4b4910c95a8570bb32c3eeec Mon Sep 17 00:00:00 2001 From: Andrey <andrey@mailbox.org> Date: Tue, 3 Jul 2018 11:52:23 +0000 Subject: [PATCH 463/480] Translated using Weblate (Russian) Currently translated at 99.8% (1208 of 1210 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, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 2b75f9c443..e3147ed809 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1204,5 +1204,7 @@ "You have no historical rooms": "У вас нет архивных комнат", "Share Room Message": "Обмен сообщениями в комнате", "Share Message": "Обмен сообщениями", - "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Вы не можете отправлять сообщения до тех пор, пока вы не примете <consentLink>наши правила и положения</consentLink>." + "You can't send any messages until you review and agree to <consentLink>our terms and conditions</consentLink>.": "Вы не можете отправлять сообщения до тех пор, пока вы не примете <consentLink>наши правила и положения</consentLink>.", + "Demote": "Понижение", + "Demote yourself?": "Понизить самого себя?" } From f941c93322b1fd27aca58af109175179fe22f786 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki <nekomanma@pixiv.co.jp> Date: Wed, 4 Jul 2018 18:27:03 +0900 Subject: [PATCH 464/480] Import react as React in src/components/views/messages/MStickerBody.js Signed-off-by: Akihiko Odaki <nekomanma@pixiv.co.jp> --- src/components/views/messages/MStickerBody.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/messages/MStickerBody.js b/src/components/views/messages/MStickerBody.js index d9ed668e42..82a530d503 100644 --- a/src/components/views/messages/MStickerBody.js +++ b/src/components/views/messages/MStickerBody.js @@ -16,6 +16,7 @@ limitations under the License. 'use strict'; +import React from 'react'; import MImageBody from './MImageBody'; import sdk from '../../../index'; From e5392e2c00e8968d0aba01ed975b19a73f474875 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 4 Jul 2018 12:57:22 +0100 Subject: [PATCH 465/480] use TruncatedList to prevent rendering hundreds/thousands of DOM nodes Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/DevtoolsDialog.js | 58 +++++++++++++++---- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js index 1566302e42..5e75d16455 100644 --- a/src/components/views/dialogs/DevtoolsDialog.js +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -242,6 +242,8 @@ class SendAccountData extends GenericEditor { } } +const INITIAL_LOAD_TILES = 20; + class FilteredList extends React.Component { static propTypes = { children: PropTypes.any, @@ -249,31 +251,65 @@ class FilteredList extends React.Component { onChange: PropTypes.func, }; + static filterChildren(children, query) { + if (!query) return children; + const lcQuery = query.toLowerCase(); + return children.filter((child) => child.key.toLowerCase().includes(lcQuery)); + } + constructor(props, context) { super(props, context); - this.onQuery = this.onQuery.bind(this); + + this.state = { + filteredChildren: FilteredList.filterChildren(this.props.children, this.props.query), + truncateAt: INITIAL_LOAD_TILES, + }; } - onQuery(ev) { + componentWillReceiveProps(nextProps) { + if (this.props.children === nextProps.children && this.props.query === nextProps.query) return; + this.setState({ + filteredChildren: FilteredList.filterChildren(nextProps.children, nextProps.query), + truncateAt: INITIAL_LOAD_TILES, + }); + } + + showAll = () => { + this.setState({ + truncateAt: -1, + }); + }; + + createOverflowElement = (overflowCount: number, totalCount: number) => { + return <button className="mx_DevTools_RoomStateExplorer_button" onClick={this.showAll}> + { _t("and %(count)s others...", { count: overflowCount }) } + </button>; + }; + + onQuery = (ev) => { if (this.props.onChange) this.props.onChange(ev.target.value); - } + }; - filterChildren() { - if (this.props.query) { - const lowerQuery = this.props.query.toLowerCase(); - return this.props.children.filter((child) => child.key.toLowerCase().includes(lowerQuery)); - } - return this.props.children; - } + getChildren = (start: number, end: number) => { + return this.state.filteredChildren.slice(start, end); + }; + + getChildCount = (): number => { + return this.state.filteredChildren.length; + }; render() { + const TruncatedList = sdk.getComponent("elements.TruncatedList"); return <div> <input size="64" onChange={this.onQuery} value={this.props.query} placeholder={_t('Filter results')} className="mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query" /> - { this.filterChildren() } + <TruncatedList getChildren={this.getChildren} + getChildCount={this.getChildCount} + truncateAt={this.state.truncateAt} + createOverflowElement={this.createOverflowElement} /> </div>; } } From dc6b3cb081e8819e80d0e82d6b926998ec9d5bdd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 4 Jul 2018 13:07:57 +0100 Subject: [PATCH 466/480] showing all is pretty slow, show an additional 50 instead Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/DevtoolsDialog.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js index 5e75d16455..3078944b62 100644 --- a/src/components/views/dialogs/DevtoolsDialog.js +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -243,6 +243,7 @@ class SendAccountData extends GenericEditor { } const INITIAL_LOAD_TILES = 20; +const LOAD_TILES_STEP_SIZE = 50; class FilteredList extends React.Component { static propTypes = { @@ -276,7 +277,7 @@ class FilteredList extends React.Component { showAll = () => { this.setState({ - truncateAt: -1, + truncateAt: this.state.truncateAt + LOAD_TILES_STEP_SIZE, }); }; From d53c836fd7740cc3a3035b294514ff4bf5383b58 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 5 Jul 2018 13:54:44 +0100 Subject: [PATCH 467/480] Implement aggregation by error type for tracked decryption failures --- src/DecryptionFailureTracker.js | 82 +++++++++++------ src/components/structures/MatrixChat.js | 19 +++- test/DecryptionFailureTracker-test.js | 115 +++++++++++++++++------- 3 files changed, 156 insertions(+), 60 deletions(-) diff --git a/src/DecryptionFailureTracker.js b/src/DecryptionFailureTracker.js index e7809d2f6c..b02a5e937b 100644 --- a/src/DecryptionFailureTracker.js +++ b/src/DecryptionFailureTracker.js @@ -14,22 +14,25 @@ See the License for the specific language governing permissions and limitations under the License. */ -class DecryptionFailure { - constructor(failedEventId) { +export class DecryptionFailure { + constructor(failedEventId, errorCode) { this.failedEventId = failedEventId; + this.errorCode = errorCode; this.ts = Date.now(); } } -export default class DecryptionFailureTracker { +export class DecryptionFailureTracker { // Array of items of type DecryptionFailure. Every `CHECK_INTERVAL_MS`, this list // is checked for failures that happened > `GRACE_PERIOD_MS` ago. Those that did - // are added to `failuresToTrack`. + // are accumulated in `failureCounts`. failures = []; - // Every TRACK_INTERVAL_MS (so as to spread the number of hits done on Analytics), - // one DecryptionFailure of this FIFO is removed and tracked. - failuresToTrack = []; + // A histogram of the number of failures that will be tracked at the next tracking + // interval, split by failure error code. + failureCounts = { + // [errorCode]: 42 + }; // Event IDs of failures that were tracked previously trackedEventHashMap = { @@ -46,16 +49,35 @@ export default class DecryptionFailureTracker { // Call `checkFailures` every `CHECK_INTERVAL_MS`. static CHECK_INTERVAL_MS = 5000; - // Give events a chance to be decrypted by waiting `GRACE_PERIOD_MS` before moving - // the failure to `failuresToTrack`. + // Give events a chance to be decrypted by waiting `GRACE_PERIOD_MS` before counting + // the failure in `failureCounts`. static GRACE_PERIOD_MS = 60000; - constructor(fn) { + /** + * Create a new DecryptionFailureTracker. + * + * Call `eventDecrypted(event, err)` on this instance when an event is decrypted. + * + * Call `start()` to start the tracker, and `stop()` to stop tracking. + * + * @param {function} fn The tracking function, which will be called when failures + * are tracked. The function should have a signature `(count, trackedErrorCode) => {...}`, + * where `count` is the number of failures and `errorCode` matches the `.code` of + * provided DecryptionError errors (by default, unless `errorCodeMapFn` is specified. + * @param {function?} errorCodeMapFn The function used to map error codes to the + * trackedErrorCode. If not provided, the `.code` of errors will be used. + */ + constructor(fn, errorCodeMapFn) { if (!fn || typeof fn !== 'function') { throw new Error('DecryptionFailureTracker requires tracking function'); } - this.trackDecryptionFailure = fn; + if (errorCodeMapFn && typeof errorCodeMapFn !== 'function') { + throw new Error('DecryptionFailureTracker second constructor argument should be a function'); + } + + this._trackDecryptionFailure = fn; + this._mapErrorCode = errorCodeMapFn; } // loadTrackedEventHashMap() { @@ -66,17 +88,17 @@ export default class DecryptionFailureTracker { // localStorage.setItem('mx-decryption-failure-event-id-hashes', JSON.stringify(this.trackedEventHashMap)); // } - eventDecrypted(e) { - if (e.isDecryptionFailure()) { - this.addDecryptionFailureForEvent(e); + eventDecrypted(e, err) { + if (err) { + this.addDecryptionFailure(new DecryptionFailure(e.getId(), err.code)); } else { // Could be an event in the failures, remove it this.removeDecryptionFailuresForEvent(e); } } - addDecryptionFailureForEvent(e) { - this.failures.push(new DecryptionFailure(e.getId())); + addDecryptionFailure(failure) { + this.failures.push(failure); } removeDecryptionFailuresForEvent(e) { @@ -93,7 +115,7 @@ export default class DecryptionFailureTracker { ); this.trackInterval = setInterval( - () => this.trackFailure(), + () => this.trackFailures(), DecryptionFailureTracker.TRACK_INTERVAL_MS, ); } @@ -106,7 +128,7 @@ export default class DecryptionFailureTracker { clearInterval(this.trackInterval); this.failures = []; - this.failuresToTrack = []; + this.failureCounts = {}; } /** @@ -153,20 +175,28 @@ export default class DecryptionFailureTracker { const dedupedFailures = dedupedFailuresMap.values(); - this.failuresToTrack = [...this.failuresToTrack, ...dedupedFailures]; + this._aggregateFailures(dedupedFailures); + } + + _aggregateFailures(failures) { + for (const failure of failures) { + const errorCode = failure.errorCode; + this.failureCounts[errorCode] = (this.failureCounts[errorCode] || 0) + 1; + } } /** * If there are failures that should be tracked, call the given trackDecryptionFailure * function with the number of failures that should be tracked. */ - trackFailure() { - if (this.failuresToTrack.length > 0) { - // Remove all failures, and expose the number of failures for now. - // - // TODO: Track a histogram of error types to cardinailty to allow for - // aggregation by error type. - this.trackDecryptionFailure(this.failuresToTrack.splice(0).length); + trackFailures() { + for (const errorCode of Object.keys(this.failureCounts)) { + if (this.failureCounts[errorCode] > 0) { + const trackedErrorCode = this._mapErrorCode ? this._mapErrorCode(errorCode) : errorCode; + + this._trackDecryptionFailure(this.failureCounts[errorCode], trackedErrorCode); + this.failureCounts[errorCode] = 0; + } } } } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 9ea0cb42c8..7150c661ed 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1304,9 +1304,20 @@ export default React.createClass({ } }); - const dft = new DecryptionFailureTracker((total) => { - // TODO: Pass reason for failure as third argument to trackEvent - Analytics.trackEvent('E2E', 'Decryption failure', 'unspecified_error', total); + const dft = new DecryptionFailureTracker((total, errorCode) => { + Analytics.trackEvent('E2E', 'Decryption failure', errorCode, total); + }, (errorCode) => { + // Map JS-SDK error codes to tracker codes for aggregation + switch (errorCode) { + case 'MEGOLM_UNKNOWN_INBOUND_SESSION_ID': + return 'olm_keys_not_sent_error'; + case 'OLM_UNKNOWN_MESSAGE_INDEX': + return 'olm_index_error'; + case undefined: + return 'unexpected_error'; + default: + return 'unspecified_error'; + } }); // Shelved for later date when we have time to think about persisting history of @@ -1317,7 +1328,7 @@ export default React.createClass({ // When logging out, stop tracking failures and destroy state cli.on("Session.logged_out", () => dft.stop()); - cli.on("Event.decrypted", (e) => dft.eventDecrypted(e)); + cli.on("Event.decrypted", (e, err) => dft.eventDecrypted(e, err)); const krh = new KeyRequestHandler(cli); cli.on("crypto.roomKeyRequest", (req) => { diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index 4979fb9bb4..99922276c5 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -16,10 +16,18 @@ limitations under the License. import expect from 'expect'; -import DecryptionFailureTracker from '../src/DecryptionFailureTracker'; +import { DecryptionFailure, DecryptionFailureTracker } from '../src/DecryptionFailureTracker'; import { MatrixEvent } from 'matrix-js-sdk'; +class MockDecryptionError extends Error { + constructor(code) { + super(); + + this.code = code || 'MOCK_DECRYPTION_ERROR'; + } +} + function createFailedDecryptionEvent() { const event = new MatrixEvent({ event_id: "event-id-" + Math.random().toString(16).slice(2), @@ -30,20 +38,21 @@ function createFailedDecryptionEvent() { return event; } -describe('DecryptionFailureTracker', function() { +describe.only('DecryptionFailureTracker', function() { it('tracks a failed decryption', function(done) { const failedDecryptionEvent = createFailedDecryptionEvent(); let count = 0; const tracker = new DecryptionFailureTracker((total) => count += total); - tracker.eventDecrypted(failedDecryptionEvent); + const err = new MockDecryptionError(); + tracker.eventDecrypted(failedDecryptionEvent, err); // Pretend "now" is Infinity tracker.checkFailures(Infinity); - // Immediately track the newest failure, if there is one - tracker.trackFailure(); + // Immediately track the newest failures + tracker.trackFailures(); expect(count).toNotBe(0, 'should track a failure for an event that failed decryption'); @@ -56,17 +65,18 @@ describe('DecryptionFailureTracker', function() { expect(true).toBe(false, 'should not track an event that has since been decrypted correctly'); }); - tracker.eventDecrypted(decryptedEvent); + const err = new MockDecryptionError(); + tracker.eventDecrypted(decryptedEvent, err); // Indicate successful decryption: clear data can be anything where the msgtype is not m.bad.encrypted decryptedEvent._setClearData({}); - tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent, null); // Pretend "now" is Infinity tracker.checkFailures(Infinity); - // Immediately track the newest failure, if there is one - tracker.trackFailure(); + // Immediately track the newest failures + tracker.trackFailures(); done(); }); @@ -78,23 +88,24 @@ describe('DecryptionFailureTracker', function() { const tracker = new DecryptionFailureTracker((total) => count += total); // Arbitrary number of failed decryptions for both events - tracker.eventDecrypted(decryptedEvent); - tracker.eventDecrypted(decryptedEvent); - tracker.eventDecrypted(decryptedEvent); - tracker.eventDecrypted(decryptedEvent); - tracker.eventDecrypted(decryptedEvent); - tracker.eventDecrypted(decryptedEvent2); - tracker.eventDecrypted(decryptedEvent2); - tracker.eventDecrypted(decryptedEvent2); + const err = new MockDecryptionError(); + tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent2, err); + tracker.eventDecrypted(decryptedEvent2, err); + tracker.eventDecrypted(decryptedEvent2, err); // Pretend "now" is Infinity tracker.checkFailures(Infinity); - // Simulated polling of `trackFailure`, an arbitrary number ( > 2 ) times - tracker.trackFailure(); - tracker.trackFailure(); - tracker.trackFailure(); - tracker.trackFailure(); + // Simulated polling of `trackFailures`, an arbitrary number ( > 2 ) times + tracker.trackFailures(); + tracker.trackFailures(); + tracker.trackFailures(); + tracker.trackFailures(); expect(count).toBe(2, count + ' failures tracked, should only track a single failure per event'); @@ -108,17 +119,18 @@ describe('DecryptionFailureTracker', function() { const tracker = new DecryptionFailureTracker((total) => count += total); // Indicate decryption - tracker.eventDecrypted(decryptedEvent); + const err = new MockDecryptionError(); + tracker.eventDecrypted(decryptedEvent, err); // Pretend "now" is Infinity tracker.checkFailures(Infinity); - tracker.trackFailure(); + tracker.trackFailures(); // Indicate a second decryption, after having tracked the failure - tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent, err); - tracker.trackFailure(); + tracker.trackFailures(); expect(count).toBe(1, 'should only track a single failure per event'); @@ -135,25 +147,68 @@ describe('DecryptionFailureTracker', function() { const tracker = new DecryptionFailureTracker((total) => count += total); // Indicate decryption - tracker.eventDecrypted(decryptedEvent); + const err = new MockDecryptionError(); + tracker.eventDecrypted(decryptedEvent, err); // Pretend "now" is Infinity // NB: This saves to localStorage specific to DFT tracker.checkFailures(Infinity); - tracker.trackFailure(); + tracker.trackFailures(); // Simulate the browser refreshing by destroying tracker and creating a new tracker const secondTracker = new DecryptionFailureTracker((total) => count += total); //secondTracker.loadTrackedEventHashMap(); - secondTracker.eventDecrypted(decryptedEvent); + secondTracker.eventDecrypted(decryptedEvent, err); secondTracker.checkFailures(Infinity); - secondTracker.trackFailure(); + secondTracker.trackFailures(); expect(count).toBe(1, count + ' failures tracked, should only track a single failure per event'); done(); }); + + it('should count different error codes separately for multiple failures with different error codes', () => { + const counts = {}; + const tracker = new DecryptionFailureTracker( + (total, errorCode) => counts[errorCode] = (counts[errorCode] || 0) + total, + ); + + // One failure of ERROR_CODE_1, and effectively two for ERROR_CODE_2 + tracker.addDecryptionFailure(new DecryptionFailure('$event_id1', 'ERROR_CODE_1')); + tracker.addDecryptionFailure(new DecryptionFailure('$event_id2', 'ERROR_CODE_2')); + tracker.addDecryptionFailure(new DecryptionFailure('$event_id2', 'ERROR_CODE_2')); + tracker.addDecryptionFailure(new DecryptionFailure('$event_id3', 'ERROR_CODE_2')); + + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); + + tracker.trackFailures(); + + expect(counts['ERROR_CODE_1']).toBe(1, 'should track one ERROR_CODE_1'); + expect(counts['ERROR_CODE_2']).toBe(2, 'should track two ERROR_CODE_2'); + }); + + it('should map error codes correctly', () => { + const counts = {}; + const tracker = new DecryptionFailureTracker( + (total, errorCode) => counts[errorCode] = (counts[errorCode] || 0) + total, + (errorCode) => 'MY_NEW_ERROR_CODE', + ); + + // One failure of ERROR_CODE_1, and effectively two for ERROR_CODE_2 + tracker.addDecryptionFailure(new DecryptionFailure('$event_id1', 'ERROR_CODE_1')); + tracker.addDecryptionFailure(new DecryptionFailure('$event_id2', 'ERROR_CODE_2')); + tracker.addDecryptionFailure(new DecryptionFailure('$event_id3', 'ERROR_CODE_3')); + + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); + + tracker.trackFailures(); + + expect(counts['MY_NEW_ERROR_CODE']) + .toBe(3, 'should track three MY_NEW_ERROR_CODE, got ' + counts['MY_NEW_ERROR_CODE']); + }); }); From 15bd2e157faa4128d78872a8a5fa15e5f9869f35 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Thu, 5 Jul 2018 14:55:29 +0100 Subject: [PATCH 468/480] Test everything --- test/DecryptionFailureTracker-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/DecryptionFailureTracker-test.js b/test/DecryptionFailureTracker-test.js index 99922276c5..617c9d5d68 100644 --- a/test/DecryptionFailureTracker-test.js +++ b/test/DecryptionFailureTracker-test.js @@ -38,7 +38,7 @@ function createFailedDecryptionEvent() { return event; } -describe.only('DecryptionFailureTracker', function() { +describe('DecryptionFailureTracker', function() { it('tracks a failed decryption', function(done) { const failedDecryptionEvent = createFailedDecryptionEvent(); From 5af8ddcf107b30ec1583648f4d2e5143aa8df3f1 Mon Sep 17 00:00:00 2001 From: Luke Barnard <luke@matrix.org> Date: Fri, 6 Jul 2018 11:00:39 +0100 Subject: [PATCH 469/480] Fix import --- src/components/structures/MatrixChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 7150c661ed..e0bbf50d5a 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -23,7 +23,7 @@ import PropTypes from 'prop-types'; import Matrix from "matrix-js-sdk"; import Analytics from "../../Analytics"; -import DecryptionFailureTracker from "../../DecryptionFailureTracker"; +import { DecryptionFailureTracker } from "../../DecryptionFailureTracker"; import MatrixClientPeg from "../../MatrixClientPeg"; import PlatformPeg from "../../PlatformPeg"; import SdkConfig from "../../SdkConfig"; From a6cff4a96923f99b132d700e9525097e3bbad994 Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 10:18:31 +0100 Subject: [PATCH 470/480] Show server bans in the timeline --- src/TextForEvent.js | 62 +++++++++++++++++++++++++ src/components/views/rooms/EventTile.js | 1 + 2 files changed, 63 insertions(+) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 712150af4d..9a7c1b58ff 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -129,6 +129,67 @@ function textForRoomNameEvent(ev) { }); } +function textForServerACLEvent(ev) { + var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); + let prev = ev.getPrevContent(); + let current = ev.getContent(); + let text = ""; + let changes = []; + if (prev == undefined) { + text = `${senderDisplayName} set server ACLs for this room:`; + prev = { + deny: [], + allow: [], + allow_ip_literals: true + } + } else { + text = `${senderDisplayName} changed the server ACLs for this room:` + if (!Array.isArray(prev.allow)){ + prev.allow = [] + } + + if (!Array.isArray(prev.deny)){ + prev.deny = [] + } + } + + if (!Array.isArray(current.allow)){ + current.allow = [] + } + + if (!Array.isArray(current.deny)){ + current.deny = [] + } + + const bannedServers = current.deny.filter((bannedSrv) => !prev.deny.includes(bannedSrv)); + const unbannedServers = prev.deny.filter((bannedSrv) => !current.deny.includes(bannedSrv)); + const allowedServers = current.allow.filter((bannedSrv) => !prev.allow.includes(bannedSrv)); + const unallowedServers = prev.allow.filter((bannedSrv) => !current.allow.includes(bannedSrv)); + + if (bannedServers.length > 0) { + changes.push(`servers matching ${bannedServers.join(",")} are now banned`); + } + + if (unbannedServers.length > 0) { + changes.push(`servers matching ${unbannedServers.join(",")} are no longer banned`); + } + + if (allowedServers.length > 0) { + changes.push(`servers matching ${allowedServers.join(",")} are now allowed`); + } + + if (unallowedServers.length > 0) { + changes.push(`servers matching ${unallowedServers.join(",")} are no longer allowed`); + } + + if (prev.allow_ip_literals !== current.allow_ip_literals) { + const allowban = current.allow_ip_literals ? "allowed" : "banned"; + changes.push(`Participating from a server using ip literals is now ${allowban}`); + } + + return text + changes.join("\n"); +} + function textForMessageEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); let message = senderDisplayName + ': ' + ev.getContent().body; @@ -309,6 +370,7 @@ const stateHandlers = { 'm.room.encryption': textForEncryptionEvent, 'm.room.power_levels': textForPowerEvent, 'm.room.pinned_events': textForPinnedEvent, + 'm.room.server_acl': textForServerACLEvent, 'im.vector.modular.widgets': textForWidgetEvent, }; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 7f376502d7..9ed73c39b1 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -56,6 +56,7 @@ const stateEventTileTypes = { 'm.room.topic': 'messages.TextualEvent', 'm.room.power_levels': 'messages.TextualEvent', 'm.room.pinned_events': 'messages.TextualEvent', + 'm.room.server_acl' : 'messages.TextualEvent', 'im.vector.modular.widgets': 'messages.TextualEvent', }; From 526459a9e06ce4e9beb90c1a4cd5489115ad627f Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 10:19:11 +0100 Subject: [PATCH 471/480] Capitalise --- src/TextForEvent.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 9a7c1b58ff..42e065be1c 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -167,19 +167,19 @@ function textForServerACLEvent(ev) { const unallowedServers = prev.allow.filter((bannedSrv) => !current.allow.includes(bannedSrv)); if (bannedServers.length > 0) { - changes.push(`servers matching ${bannedServers.join(",")} are now banned`); + changes.push(`Servers matching ${bannedServers.join(",")} are now banned`); } if (unbannedServers.length > 0) { - changes.push(`servers matching ${unbannedServers.join(",")} are no longer banned`); + changes.push(`Servers matching ${unbannedServers.join(",")} are no longer banned`); } if (allowedServers.length > 0) { - changes.push(`servers matching ${allowedServers.join(",")} are now allowed`); + changes.push(`Servers matching ${allowedServers.join(",")} are now allowed`); } if (unallowedServers.length > 0) { - changes.push(`servers matching ${unallowedServers.join(",")} are no longer allowed`); + changes.push(`Servers matching ${unallowedServers.join(",")} are no longer allowed`); } if (prev.allow_ip_literals !== current.allow_ip_literals) { From 8b9fd7ddcb230271cd8b97187a7578289319f131 Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 15:31:21 +0100 Subject: [PATCH 472/480] Clean up rules. --- src/TextForEvent.js | 49 ++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 42e065be1c..7368d0577b 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -131,26 +131,19 @@ function textForRoomNameEvent(ev) { function textForServerACLEvent(ev) { var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - let prev = ev.getPrevContent(); + let prev_content = ev.getPrevContent(); let current = ev.getContent(); let text = ""; let changes = []; - if (prev == undefined) { - text = `${senderDisplayName} set server ACLs for this room:`; - prev = { - deny: [], - allow: [], - allow_ip_literals: true - } + let prev = { + deny: Array.isArray(prev_content.deny) ? prev_content.deny : [], + allow: Array.isArray(prev_content.allow) ? prev_content.allow : [], + allow_ip_literals: !(prev_content.allow_ip_literals === false) + } + if (prev.deny.length === 0 && prev.allow.length === 0) { + text = `${senderDisplayName} set server ACLs for this room: `; } else { - text = `${senderDisplayName} changed the server ACLs for this room:` - if (!Array.isArray(prev.allow)){ - prev.allow = [] - } - - if (!Array.isArray(prev.deny)){ - prev.deny = [] - } + text = `${senderDisplayName} changed the server ACLs for this room: `; } if (!Array.isArray(current.allow)){ @@ -161,30 +154,36 @@ function textForServerACLEvent(ev) { current.deny = [] } - const bannedServers = current.deny.filter((bannedSrv) => !prev.deny.includes(bannedSrv)); - const unbannedServers = prev.deny.filter((bannedSrv) => !current.deny.includes(bannedSrv)); - const allowedServers = current.allow.filter((bannedSrv) => !prev.allow.includes(bannedSrv)); - const unallowedServers = prev.allow.filter((bannedSrv) => !current.allow.includes(bannedSrv)); + const bannedServers = current.deny.filter((srv) => typeof(srv) === 'string' && !prev.deny.includes(srv)); + const unbannedServers = prev.deny.filter((srv) => typeof(srv) === 'string' && !current.deny.includes(srv)); + const allowedServers = current.allow.filter((srv) => typeof(srv) === 'string' && !prev.allow.includes(srv)); + const unallowedServers = prev.allow.filter((srv) => typeof(srv) === 'string' && !current.allow.includes(srv)); + + console.log(bannedServers,unbannedServers,allowedServers,unallowedServers); if (bannedServers.length > 0) { - changes.push(`Servers matching ${bannedServers.join(",")} are now banned`); + changes.push(`Servers matching ${bannedServers.join(",")} are now banned.`); } if (unbannedServers.length > 0) { - changes.push(`Servers matching ${unbannedServers.join(",")} are no longer banned`); + changes.push(`Servers matching ${unbannedServers.join(",")} were removed from the ban list.`); } if (allowedServers.length > 0) { - changes.push(`Servers matching ${allowedServers.join(",")} are now allowed`); + changes.push(`Servers matching ${allowedServers.join(",")} are now allowed.`); } if (unallowedServers.length > 0) { - changes.push(`Servers matching ${unallowedServers.join(",")} are no longer allowed`); + changes.push(`Servers matching ${unallowedServers.join(",")} were removed from the allowed list.`); } if (prev.allow_ip_literals !== current.allow_ip_literals) { const allowban = current.allow_ip_literals ? "allowed" : "banned"; - changes.push(`Participating from a server using ip literals is now ${allowban}`); + changes.push(`Participating from a server using an IP literal hostname is now ${allowban}.`); + } + + if (current.allow.length === 0) { + changes = ["Everyone is banned! 🎉"]; } return text + changes.join("\n"); From 12ce7839f3efb7cceb13647304ba92a37d72d157 Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 16:36:26 +0100 Subject: [PATCH 473/480] Const things --- src/TextForEvent.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 7368d0577b..6fb9aa0d7b 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -130,11 +130,11 @@ function textForRoomNameEvent(ev) { } function textForServerACLEvent(ev) { - var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - let prev_content = ev.getPrevContent(); - let current = ev.getContent(); + const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); + const prev_content = ev.getPrevContent(); + const changes = []; let text = ""; - let changes = []; + let current = ev.getContent(); let prev = { deny: Array.isArray(prev_content.deny) ? prev_content.deny : [], allow: Array.isArray(prev_content.allow) ? prev_content.allow : [], From 1ca164f1a9699ebff180e39599fa05cf3b38f6bf Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 16:36:44 +0100 Subject: [PATCH 474/480] Change all ban message and move further up --- src/TextForEvent.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 6fb9aa0d7b..5d4c14d1b2 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -146,6 +146,11 @@ function textForServerACLEvent(ev) { text = `${senderDisplayName} changed the server ACLs for this room: `; } + /* If we know for sure everyone is banned, don't bother showing the diff view */ + if (current.allow.length === 0) { + return text + "🎉 All servers are banned from participating! This room can no longer be used."; + } + if (!Array.isArray(current.allow)){ current.allow = [] } @@ -182,11 +187,6 @@ function textForServerACLEvent(ev) { changes.push(`Participating from a server using an IP literal hostname is now ${allowban}.`); } - if (current.allow.length === 0) { - changes = ["Everyone is banned! 🎉"]; - } - - return text + changes.join("\n"); } function textForMessageEvent(ev) { From 1db803ccfcfe82be0c47fc0db216ae77864aa236 Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 16:37:40 +0100 Subject: [PATCH 475/480] "/n" -> " " --- src/TextForEvent.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 5d4c14d1b2..f2ddae0e0a 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -187,6 +187,7 @@ function textForServerACLEvent(ev) { changes.push(`Participating from a server using an IP literal hostname is now ${allowban}.`); } + return text + changes.join(" "); } function textForMessageEvent(ev) { From 52b1d946be0b599a2023f395c23a15eab00074b1 Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 16:37:52 +0100 Subject: [PATCH 476/480] Remove unused console.log --- src/TextForEvent.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index f2ddae0e0a..cc8f48b2e0 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -164,8 +164,6 @@ function textForServerACLEvent(ev) { const allowedServers = current.allow.filter((srv) => typeof(srv) === 'string' && !prev.allow.includes(srv)); const unallowedServers = prev.allow.filter((srv) => typeof(srv) === 'string' && !current.allow.includes(srv)); - console.log(bannedServers,unbannedServers,allowedServers,unallowedServers); - if (bannedServers.length > 0) { changes.push(`Servers matching ${bannedServers.join(",")} are now banned.`); } From 9a4075c6370f087394eb26383c3e4cbdef95ca00 Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 16:38:04 +0100 Subject: [PATCH 477/480] Semicolons --- src/TextForEvent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index cc8f48b2e0..bf8d09b06c 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -152,11 +152,11 @@ function textForServerACLEvent(ev) { } if (!Array.isArray(current.allow)){ - current.allow = [] + current.allow = []; } if (!Array.isArray(current.deny)){ - current.deny = [] + current.deny = []; } const bannedServers = current.deny.filter((srv) => typeof(srv) === 'string' && !prev.deny.includes(srv)); From 83221da7d7cdb5895519393f469a5d43ca5103da Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 16:54:28 +0100 Subject: [PATCH 478/480] Delint --- src/TextForEvent.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index bf8d09b06c..2be4e590ec 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -131,15 +131,15 @@ function textForRoomNameEvent(ev) { function textForServerACLEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - const prev_content = ev.getPrevContent(); + const prevContent = ev.getPrevContent(); const changes = []; + const current = ev.getContent(); + const prev = { + deny: Array.isArray(prevContent.deny) ? prevContent.deny : [], + allow: Array.isArray(prevContent.allow) ? prevContent.allow : [], + allow_ip_literals: !(prevContent.allow_ip_literals === false), + }; let text = ""; - let current = ev.getContent(); - let prev = { - deny: Array.isArray(prev_content.deny) ? prev_content.deny : [], - allow: Array.isArray(prev_content.allow) ? prev_content.allow : [], - allow_ip_literals: !(prev_content.allow_ip_literals === false) - } if (prev.deny.length === 0 && prev.allow.length === 0) { text = `${senderDisplayName} set server ACLs for this room: `; } else { @@ -147,15 +147,15 @@ function textForServerACLEvent(ev) { } /* If we know for sure everyone is banned, don't bother showing the diff view */ - if (current.allow.length === 0) { + if (current.allow.length === 0) { return text + "🎉 All servers are banned from participating! This room can no longer be used."; } - if (!Array.isArray(current.allow)){ + if (!Array.isArray(current.allow)) { current.allow = []; } - if (!Array.isArray(current.deny)){ + if (!Array.isArray(current.deny)) { current.deny = []; } From 4044185cddcc51e662e6bb4608e23106047c20ee Mon Sep 17 00:00:00 2001 From: Matthew Hodgson <matthew@arasphere.net> Date: Fri, 6 Jul 2018 19:17:01 +0100 Subject: [PATCH 479/480] add space after commas --- src/TextForEvent.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 2be4e590ec..1f4fc68b07 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -165,19 +165,19 @@ function textForServerACLEvent(ev) { const unallowedServers = prev.allow.filter((srv) => typeof(srv) === 'string' && !current.allow.includes(srv)); if (bannedServers.length > 0) { - changes.push(`Servers matching ${bannedServers.join(",")} are now banned.`); + changes.push(`Servers matching ${bannedServers.join(", ")} are now banned.`); } if (unbannedServers.length > 0) { - changes.push(`Servers matching ${unbannedServers.join(",")} were removed from the ban list.`); + changes.push(`Servers matching ${unbannedServers.join(", ")} were removed from the ban list.`); } if (allowedServers.length > 0) { - changes.push(`Servers matching ${allowedServers.join(",")} are now allowed.`); + changes.push(`Servers matching ${allowedServers.join(", ")} are now allowed.`); } if (unallowedServers.length > 0) { - changes.push(`Servers matching ${unallowedServers.join(",")} were removed from the allowed list.`); + changes.push(`Servers matching ${unallowedServers.join(", ")} were removed from the allowed list.`); } if (prev.allow_ip_literals !== current.allow_ip_literals) { From 6e1f62d16a4aa619f6ff842e6e71cb928dcd4be0 Mon Sep 17 00:00:00 2001 From: Will Hunt <will@half-shot.uk> Date: Fri, 6 Jul 2018 20:22:37 +0100 Subject: [PATCH 480/480] Fix stuff --- src/TextForEvent.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 1f4fc68b07..15c67526d9 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -146,15 +146,14 @@ function textForServerACLEvent(ev) { text = `${senderDisplayName} changed the server ACLs for this room: `; } + if (!Array.isArray(current.allow)) { + current.allow = []; + } /* If we know for sure everyone is banned, don't bother showing the diff view */ if (current.allow.length === 0) { return text + "🎉 All servers are banned from participating! This room can no longer be used."; } - if (!Array.isArray(current.allow)) { - current.allow = []; - } - if (!Array.isArray(current.deny)) { current.deny = []; }