From 835c72f6113cd36c70b8956b040da7523c49bfcd Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Thu, 13 Aug 2020 16:12:58 +0000 Subject: [PATCH 001/174] Translated using Weblate (Portuguese (Brazil)) Currently translated at 97.1% (2263 of 2331 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/pt_BR/ --- src/i18n/strings/pt_BR.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 4ed4ca1175..c82295e293 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2278,5 +2278,7 @@ "Enter a security phrase only you know, as it’s used to safeguard your data. To be secure, you shouldn’t re-use your account password.": "Digite uma frase de segurança que só você conheça, usada para proteger segredos em seu servidor.", "Use a different passphrase?": "Usar uma frase secreta diferente?", "Enter your recovery passphrase a second time to confirm it.": "Digite sua senha de recuperação uma segunda vez para confirmá-la.", - "Confirm your recovery passphrase": "Confirme a sua frase de recuperação" + "Confirm your recovery passphrase": "Confirme a sua frase de recuperação", + "Page Up": "Page Up", + "Page Down": "Page Down" } From 3e78f228d6097bad98e0a3d5946e8c2e88c42926 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Thu, 13 Aug 2020 21:46:56 +0000 Subject: [PATCH 002/174] Translated using Weblate (Ukrainian) Currently translated at 52.0% (1211 of 2331 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 115 +++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 35 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 3bae709451..7dcfe4eeee 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -67,7 +67,7 @@ "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.", + "%(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.", @@ -82,7 +82,7 @@ "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": "Повідомлення у чатах \"сам на сам\"", + "Messages in one-to-one chats": "Повідомлення у балачках віч-на-віч", "Send Account Data": "Надіслати дані облікового запису", "Advanced notification settings": "Додаткові налаштування сповіщень", "Uploading report": "Завантаження звіту", @@ -109,7 +109,7 @@ "Cancel Sending": "Скасувати надсилання", "Warning": "Попередження", "This Room": "Ця кімната", - "Noisy": "Шумний", + "Noisy": "Шумно", "Error saving email notification preferences": "Помилка при збереженні параметрів сповіщень е-поштою", "Messages containing my display name": "Повідомлення, що містять моє видиме ім'я", "Remember, you can always set an email address in user settings if you change your mind.": "Пам'ятайте, що ви завжди можете встановити адресу е-пошти у користувацьких налаштуваннях, якщо передумаєте.", @@ -124,7 +124,7 @@ "Explore Room State": "Перегляд статуса кімнати", "Source URL": "Джерельне посилання", "Messages sent by bot": "Повідомлення, надіслані ботом", - "Filter results": "Фільтр результатів", + "Filter results": "Відцідити результати", "Members": "Учасники", "No update available.": "Оновлення відсутні.", "Resend": "Перенадіслати", @@ -188,7 +188,7 @@ "Unable to join network": "Неможливо приєднатись до мережі", "Sorry, your browser is not able to run %(brand)s.": "Вибачте, ваш оглядач не спроможний запустити %(brand)s.", "Uploaded on %(date)s by %(user)s": "Завантажено %(date)s користувачем %(user)s", - "Messages in group chats": "Повідомлення у групових чатах", + "Messages in group chats": "Повідомлення у групових балачках", "Yesterday": "Вчора", "Error encountered (%(errorDetail)s).": "Трапилась помилка (%(errorDetail)s).", "Low Priority": "Неважливі", @@ -298,7 +298,7 @@ "Missing roomId.": "Бракує ідентифікатора кімнати.", "Failed to send request.": "Не вдалося надіслати запит.", "This room is not recognised.": "Кімнату не знайдено.", - "Power level must be positive integer.": "Рівень повноважень мусить бути додатнім цілим числом.", + "Power level must be positive integer.": "Рівень повноважень мусить бути додатним цілим числом.", "You are not in this room.": "Вас немає в цій кімнаті.", "You do not have permission to do that in this room.": "У вас немає прав виконувати для цього в цій кімнаті.", "Missing room_id in request": "У запиті бракує room_id", @@ -348,19 +348,19 @@ "(no answer)": "(немає відповіді)", "(unknown failure: %(reason)s)": "(невідома помилка: %(reason)s)", "%(senderName)s ended the call.": "%(senderName)s завершив/ла дзвінок.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s надіслав/ла запрошення %(targetDisplayName)s приєднатися до кімнати.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s надіслав(-ла) запрошення %(targetDisplayName)s приєднатися до кімнати.", "Show developer tools": "Показувати розробницькі засоби", "Default": "Типово", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s зробив/ла майбутню історію кімнати видимою для всіх учасників, з моменту, коли вони приєдналися.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s зробив/ла майбутню історію кімнати видимою для всіх учасників, з моменту, коли вони приєдналися.", - "%(senderName)s made future room history visible to all room members.": "%(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 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).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s з %(fromPowerLevel)s до %(toPowerLevel)s", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s змінив/ла прикріплені повідомлення для кімнати.", - "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s змінив/ла %(widgetName)s", - "%(widgetName)s widget added by %(senderName)s": "%(senderName)s додав/ла %(widgetName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s вилучив/ла %(widgetName)s", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s змінив(-ла) приколоті повідомлення у кімнаті.", + "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s змінив(-ла) знадіб %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "%(senderName)s додав(-ла) знадіб %(widgetName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s вилучив(-ла) знадіб %(widgetName)s", "Failure to create room": "Не вдалося створити кімнату", "Server may be unavailable, overloaded, or you hit a bug.": "Сервер може бути недоступний, перевантажений, або ж ви натрапили на ваду.", "Unnamed Room": "Кімната без назви", @@ -572,7 +572,7 @@ "Clear notifications": "Очистити сповіщення", "Add an email address to configure email notifications": "Додати адресу е-пошти для налаштування поштових сповіщень", "Theme added!": "Тему додано!", - "Email addresses": "Адреса е-пошти", + "Email addresses": "Адреси е-пошти", "Phone numbers": "Номери телефонів", "Set a new account password...": "Встановити новий пароль облікового запису…", "Forget this room": "Забути цю кімнату", @@ -680,18 +680,18 @@ "%(senderName)s placed a video call.": "%(senderName)s розпочав(-ла) відеовиклик.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s розпочав(-ла) відеовиклик. (не підтримується цим переглядачем)", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s відкликав(-ла) запрошення %(targetDisplayName)s приєднання до кімнати.", - "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s видалив(-ла) правило блокування користувачів за шаблоном %(glob)s", - "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s видалив(ла) правило блокування кімнат по шаблону %(glob)s", - "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s видалив(ла) правило блокування серверів по шаблону %(glob)s", - "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s видалив(ла) правило блокування по шаблону %(glob)s", - "%(senderName)s updated an invalid ban rule": "%(senderName)s оновив(ла) неправильне правило блокування", - "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s оновив(ла) правило блокування користувачів по шаблону %(glob)s за %(reason)s", - "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s оновив(ла) правило блокування кімнат по шаблону %(glob)s за %(reason)s", - "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s оновив(ла) правило блокування серверів по шаблону %(glob)s за %(reason)s", - "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s оновив(ла) правило блокування по шаблону %(glob)s за %(reason)s", - "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s створив(ла) правило блокування користувачів по шаблону %(glob)s за %(reason)s", - "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s створив(ла) правило блокування кімнат по шаблону %(glob)s за %(reason)s", - "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s створив(ла) правило блокування серверів по шаблону %(glob)s за %(reason)s", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s видалив(-ла) правило блокування користувачів зі збігом з %(glob)s", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s видалив(-ла) правило блокування кімнат зі збігом з %(glob)s", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s видалив(-ла) правило блокування серверів зі збігом з %(glob)s", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s видалив(-ла) правило блокування зі збігом з %(glob)s", + "%(senderName)s updated an invalid ban rule": "%(senderName)s оновив(-ла) хибне правило блокування", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s оновив(-ла) правило блокування користувачів зі збігом з %(glob)s через %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s оновив(-ла) правило блокування кімнат зі збігом з %(glob)s через %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s оновив(-ла) правило блокування серверів зі збігом з %(glob)s через %(reason)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s оновив(-ла) правило блокування зі збігом з %(glob)s через %(reason)s", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s створив(-ла) правило блокування користувачів зі збігом з %(glob)s через %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s створив(-ла) правило блокування кімнат зі збігом з %(glob)s через %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s створив(-ла) правило блокування серверів зі збігом з %(glob)s через %(reason)s", "Light": "Світла", "Dark": "Темна", "You signed in to a new session without verifying it:": "Ви увійшли в нову сесію, не підтвердивши її:", @@ -794,7 +794,7 @@ "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", "Custom user status messages": "користувацький статус", - "Group & filter rooms by custom tags (refresh to apply changes)": "Групувати та фільтрувати кімнати за кастомними тегами (оновіть для застосування змін)", + "Group & filter rooms by custom tags (refresh to apply changes)": "Групувати та проціджувати кімнати за нетиповими наличками (оновіть щоб застосувати зміни)", "Multiple integration managers": "Декілька менджерів інтеграції", "Try out new ways to ignore people (experimental)": "Спробуйте нові способи ігнорувати людей (експериментальні)", "Support adding custom themes": "Підтримка користувацьких тем", @@ -805,11 +805,11 @@ "Enable Emoji suggestions while typing": "Увімкнути пропонування емодзі при друкуванні", "Use a more compact ‘Modern’ layout": "Використовувати компактнішу \"Сучасну\" тему", "General": "Загальні", - "Discovery": "Відкриття", + "Discovery": "Виявлення", "Help & About": "Допомога та про програму", "Bug reporting": "Повідомити про помилку", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Якщо ви відправляли помилки через GitHub, журнали можуть допомогти нам виявити проблеми. Журнали відладки, що містять інформацію про використані додатки, включають ваше ім’я користувача, ідентифікатори або псевдоніми кімнат або груп, які ви відвідували, а також імена інших користувачів. Вони не містять повідомлень.", - "Submit debug logs": "Відправити відладочні журнали (debug logs)", + "Submit debug logs": "Надіслати журнал зневадження", "Clear cache and reload": "Очистити кеш та перезавантажити", "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "Щоб повідомити про проблеми безпеки Matrix, будь ласка, прочитайте Політику розкриття інформації Matrix.org.", "FAQ": "Часті питання", @@ -992,7 +992,7 @@ "Backup version: ": "Версія резервної копії: ", "Algorithm: ": "Алгоритм: ", "Backup key stored: ": "Резервна копія ключа збережена ", - "Enable audible notifications for this session": "Ввімкнути звукові сповіщення для цього сеансу", + "Enable audible notifications for this session": "Увімкнути звукові сповіщення для цього сеансу", "Save": "Зберегти", "Checking server": "Перевірка серверу", "Disconnect": "Відключити", @@ -1017,7 +1017,7 @@ "Unable to revoke sharing for email address": "Не вдалось відкликати оприлюднювання адреси е-пошти", "Revoke": "Відкликати", "Unable to revoke sharing for phone number": "Не вдалось відкликати оприлюднювання телефонного номеру", - "Filter room members": "Відфільтрувати учасників кімнати", + "Filter room members": "Відцідити учасників кімнати", "Voice call": "Голосовий виклик", "Video call": "Відеовиклик", "Not now": "Не зараз", @@ -1180,5 +1180,50 @@ "or another cross-signing capable Matrix client": "або інший здатний до перехресного підписування Matrix-клієнт", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Ваш новий сеанс тепер є звірений. Він має доступ до ваших зашифрованих повідомлень, а інші користувачі бачитимуть його як довірений.", "Emoji": "Емодзі", - "Emoji Autocomplete": "Самодоповнення емодзі" + "Emoji Autocomplete": "Самодоповнення емодзі", + "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s створив(-ла) правило блокування зі збігом з %(glob)s через %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування користувачів зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування кімнат зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування серверів зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s змінив(-ла) правило блокування зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", + "Enable Community Filter Panel": "Увімкнути панель спільнот", + "Messages containing my username": "Повідомлення, що містять моє користувацьке ім'я", + "Messages containing @room": "Повідомлення, що містять @room", + "When rooms are upgraded": "Коли кімнати поліпшено", + "Unknown caller": "Невідомий викликач", + "The integration manager is offline or it cannot reach your homeserver.": "Менеджер інтеграцій непід'єднаний або не може досягти вашого домашнього сервера.", + "Enable desktop notifications for this session": "Увімкнути стільничні сповіщення для цього сеансу", + "Profile picture": "Зображення профілю", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, знадобами та паками наліпок.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій для керування ботами, знадобами та паками наліпок.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджери інтеграцій отримують дані конфігурації та можуть змінювати знадоби, надсилати запрошення у кімнати й встановлювати рівні повноважень від вашого імені.", + "Show %(count)s more|other": "Показати ще %(count)s", + "Show %(count)s more|one": "Показати ще %(count)s", + "Failed to connect to integration manager": "Не вдалось з'єднатись з менеджером інтеграцій", + "Show image": "Показати зображення", + "You have ignored this user, so their message is hidden. Show anyways.": "Ви ігноруєте цього користувача, тож його повідомлення приховано. Все одно показати.", + "Show all": "Показати все", + "Add an Integration": "Додати інтеграцію", + "Filter community members": "Відцідити учасників спільноти", + "Filter community rooms": "Відцідити кімнати спільноти", + "Display your community flair in rooms configured to show it.": "Відбивати ваш спільнотний значок у кімнатах, що налаштовані показувати його.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Користування цим знадобом може призвести до поширення ваших даних з %(widgetDomain)s та вашим менеджером інтеграцій.", + "Show advanced": "Показати розширені", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Ваш %(brand)s не дозволяє вам використовувати для цього менеджер інтеграцій. Зверніться, будь ласка, до адміністратора.", + "Integration Manager": "Менеджер інтеграцій", + "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Ваша спільнота не має великого опису (HTML-сторінки, показуваної членам спільноти).
Клацніть тут щоб відкрити налаштування й створити цей опис!", + "Review terms and conditions": "Переглянути умови користування", + "Old cryptography data detected": "Виявлено старі криптографічні дані", + "Logout": "Вийти", + "Your Communities": "Ваші спільноти", + "Did you know: you can use communities to filter your %(brand)s experience!": "Чи знаєте ви, що спільноти можна використовувати для припасування %(brand)s під ваші потреби?", + "Communities": "Спільноти", + "Create a new community": "Створити нову спільноту", + "Clear filter": "Очистити цідило", + "Syncing...": "Синхронізування…", + "Signing In...": "Входження…", + "If you've joined lots of rooms, this might take a while": "Якщо ви приєднались до багатьох кімнат, це може зайняти деякий час", + "Create account": "Створити обліковий запис", + "Failed to fetch avatar URL": "Не вдалось вибрати URL личини", + "Clear room list filter field": "Очистити поле цідила списку кімнат" } From 2f44641ecd5c170cbf02f1adc6ac8aa0cf14154d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 14 Aug 2020 12:38:20 +0000 Subject: [PATCH 003/174] Translated using Weblate (Estonian) Currently translated at 99.8% (2328 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 95253f5256..6fa8fc525b 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2403,5 +2403,9 @@ "You have no visible notifications in this room.": "Jututoas pole nähtavaid teavitusi.", "You're all caught up.": "Ei tea... kõik vist on nüüd tehtud.", "You’re all caught up": "Ei tea... kõik vist on nüüd tehtud", - "%(brand)s Android": "%(brand)s Android" + "%(brand)s Android": "%(brand)s Android", + "Show message previews for reactions in DMs": "Näita eelvaates otsesõnumitele regeerimisi", + "Show message previews for reactions in all rooms": "Näita kõikides jututubades eelvaadetes sõnumitele regeerimisi", + "Master private key:": "Üldine privaatvõti:", + "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud" } From 3376afb6eb2c87e64da4fafe8579c78866db1e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 14 Aug 2020 12:48:05 +0000 Subject: [PATCH 004/174] Translated using Weblate (Estonian) Currently translated at 99.8% (2328 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 6fa8fc525b..2e39e3b087 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1025,7 +1025,7 @@ "Permissions": "Õigused", "Select the roles required to change various parts of the room": "Vali rollid, mis on vajalikud jututoa eri osade muutmiseks", "Enable encryption?": "Kas võtame krüptimise kasutusele?", - "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Kui kord juba kasutusele võetud, siis krüptimist enam hiljem ära lõpetada ei saa. Krüptitud sõnumeid ei saa lugeda ei vaheapealses veebiliikluses ega serveris ja vaid jututoa liikmed saavad neid lugeda. Krüptimise kasutusele võtmine takistada nii robotite kui sõnumisildade tööd. Lisateave krüptimise kohta.", + "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Kui kord juba kasutusele võetud, siis krüptimist enam hiljem ära lõpetada ei saa. Krüptitud sõnumeid ei saa lugeda ei vaheapealses veebiliikluses ega serveris ja vaid jututoa liikmed saavad neid lugeda. Krüptimise kasutusele võtmine võib takistada nii robotite kui sõnumisildade tööd. Lisateave krüptimise kohta.", "Guests cannot join this room even if explicitly invited.": "Külalised ei saa selle jututoaga liituda ka siis, kui neid on otseselt kutsutud.", "Click here to fix": "Parandamiseks klõpsi siia", "Server error": "Serveri viga", From 10ca71e589377cde0a9a33177a8d5a8e5d17d8da Mon Sep 17 00:00:00 2001 From: notramo Date: Fri, 14 Aug 2020 13:28:33 +0000 Subject: [PATCH 005/174] Translated using Weblate (Hungarian) Currently translated at 99.7% (2325 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 209c237c0c..b9603858bb 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -811,7 +811,7 @@ "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.", "No Audio Outputs detected": "Nem található hang kimenet", "Audio Output": "Hang kimenet", - "Share Link to User": "Hivatkozás megosztása felhasználóval", + "Share Link to User": "A felhasználóra mutató hivatkozás", "Share room": "Szoba megosztása", "Share Room": "Szoba megosztása", "Link to most recent message": "A legfrissebb üzenetre hivatkozás", @@ -987,7 +987,7 @@ "Send typing notifications": "Gépelés visszajelzés küldése", "Enable Community Filter Panel": "Közösségi szűrő panel bekapcsolása", "Messages containing my username": "Üzenetek amik a nevemet tartalmazzák", - "The other party cancelled the verification.": "A másik fél törölte az ellenőrzést.", + "The other party cancelled the verification.": "A másik fél megszakította az ellenőrzést.", "Verified!": "Ellenőrizve!", "You've successfully verified this user.": "Sikeresen ellenőrizted ezt a felhasználót.", "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Az üzenetek a felhasználóval végponttól végpontig titkosítva vannak és azt más nem tudja elolvasni.", @@ -1888,7 +1888,7 @@ "You've successfully verified %(displayName)s!": "Sikeresen ellenőrizted a felhasználót: %(displayName)s!", "Got it": "Értem", "Encryption enabled": "Titkosítás bekapcsolva", - "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Ebben a szobában az üzenetek végpontok között titkosítottak. További információkért és ellenőrzéshez nyisd meg a felhasználó profilját.", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Ebben a szobában az üzenetek végpontok között titkosítottak. További információkért és az ellenőrzéshez nyisd meg a felhasználók profiljait!", "Encryption not enabled": "Titkosítás nincs engedélyezve", "The encryption used by this room isn't supported.": "A szobában használt titkosítás nem támogatott.", "Clear all data in this session?": "Minden adat törlése ebben a munkamenetben?", @@ -2109,7 +2109,7 @@ "Server did not return valid authentication information.": "A szerver semmilyen érvényes azonosítási információt sem küldött vissza.", "There was a problem communicating with the server. Please try again.": "A szerverrel való kommunikációval probléma történt. Kérlek próbáld újra.", "Sign in with SSO": "Belépés SSO-val", - "Welcome to %(appName)s": "Üdv itt: %(appName)s", + "Welcome to %(appName)s": "Üdvözöl az %(appName)s", "Liberate your communication": "Szabadítsd fel a kommunikációdat", "Send a Direct Message": "Közvetlen üzenet küldése", "Explore Public Rooms": "Nyilvános szobák felderítése", @@ -2177,7 +2177,7 @@ "Waiting for your other session to verify…": "A másik munkameneted ellenőrzésére várunk…", "You've successfully verified your device!": "Sikeresen ellenőrizted az eszközödet!", "Message deleted": "Üzenet törölve", - "Message deleted by %(name)s": "%(name)s törölte az üzenetet", + "Message deleted by %(name)s": "%(name)s törölte ezt az üzenetet", "QR Code": "QR kód", "To continue, use Single Sign On to prove your identity.": "A folytatáshoz a személyazonosságod megerősítéséhez használd az egyszeri bejelentkezést.", "Confirm to continue": "Erősítsd meg a továbblépéshez", @@ -2239,7 +2239,7 @@ "Always show first": "Mindig az elsőt mutatja", "Show": "Mutat", "Message preview": "Üzenet előnézet", - "List options": "Lista beállítások", + "List options": "Lista beállításai", "Show %(count)s more|other": "Még %(count)s megjelenítése", "Show %(count)s more|one": "Még %(count)s megjelenítése", "Leave Room": "Szoba elhagyása", From 9b941c47fff3387ab7b7943521c573e295cbbc17 Mon Sep 17 00:00:00 2001 From: call_xz Date: Fri, 14 Aug 2020 13:34:01 +0000 Subject: [PATCH 006/174] Translated using Weblate (Japanese) Currently translated at 58.1% (1355 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index ff2afb67be..7c818e1596 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1373,5 +1373,7 @@ "Show %(count)s more|one": "さらに %(count)s 件を表示", "%(num)s minutes ago": "%(num)s 分前", "%(num)s hours ago": "%(num)s 時間前", - "%(num)s days ago": "%(num)s 日前" + "%(num)s days ago": "%(num)s 日前", + "Favourited": "お気に入り登録中", + "Room options": "部屋の設定" } From a51f9b64222b086ebc459af6880fe47271b36400 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Fri, 14 Aug 2020 15:01:38 +0000 Subject: [PATCH 007/174] Translated using Weblate (Kabyle) Currently translated at 50.2% (1172 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 431 +++++++++++++++++++++++++++++++++++++- 1 file changed, 428 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 6073fbfd38..10607a601f 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -647,7 +647,7 @@ " to store messages from ": " i usekles n yiznan sɣur ", "rooms.": "tixxamin.", "Connecting to integration manager...": "Tuqqna ɣer umsefrak n useddu...", - "Cannot connect to integration manager": "Ur nessaweḍ ara ad neqqen ɣer umsefrak n useddu...", + "Cannot connect to integration manager": "Ur nessaweḍ ara ad neqqen ɣer umsefrak n useddu", "Delete Backup": "Kkes aḥraz", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Iznan yettwawgelhen ttuḥerzen s uwgelhen n yixef ɣer yixef. Ala kečč d unermas (inermasen) i yesεan tisura akken ad ɣren iznan-a.", "This session is backing up your keys. ": "Tiɣimit tḥerrez tisura-inek·inem. ", @@ -719,7 +719,7 @@ "%(num)s hours ago": "%(num)s usrag seg yimir-nni", "about a day ago": "azal n wass seg yimir-nni", "%(num)s days ago": "%(num)s wussan seg yimir-nni", - "a few seconds from now": "Kra n tesinin seg yimir-a", + "a few seconds from now": "kra n tesinin seg yimir-a", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Not a valid %(brand)s keyfile": "Afaylu n tsarut %(brand)s d arameɣtu", "User %(user_id)s does not exist": "Aseqdac %(user_id)s ulac-it", @@ -789,5 +789,430 @@ "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s yekkes tansa-nni-nniḍen %(addresses)s i texxamt-a.", "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yekkes tansa-nni tayeḍ %(addresses)s i texxamt-a.", "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s ibeddel tansa-nni tayeḍ n texxamt-a.", - "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ibeddel tansa tagejdant d tansa-nni tayeḍ i texxamt-a." + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ibeddel tansa tagejdant d tansa-nni tayeḍ i texxamt-a.", + "Sends a message as html, without interpreting it as markdown": "Yuzen izen d html war ma isegza-t s tukksa n tecreḍt", + "Deops user with given id": "Aseqdac Deops s usulay i d-yettunefken", + "Sends the given message coloured as a rainbow": "Yuzen iznan i d-yettunefken yeɣman s yiniten am teslit n Unẓar", + "Sends the given emote coloured as a rainbow": "Yuzen tanfalit i d-yettunefken yeɣman s yiniten am teslit n Unẓar", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s yeqbel tinnubga i %(displayName)s.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s ibeddel tansiwin n texxamt-a.", + "(not supported by this browser)": "(ur yettusefrak ara sɣur iminig-a)", + "%(senderName)s answered the call.": "%(senderName)s yerra ɣef usiwel.", + "(could not connect media)": "(tuqqna n umidya tegguma)", + "%(senderName)s placed a voice call.": "%(senderName)s isɛedda asiwel s taɣect.", + "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s isɛedda asiwel s taɣect. (ur yettusefrak ara s yiming-a)", + "%(senderName)s placed a video call.": "%(senderName)s isɛedda asiwel s tvidyut.", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s isɛedda asiwel s tvidyut. (ur yettusefrak ara s yiming-a)", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s yerra amazray n texxamt i d-iteddun yettban i yal amdan.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ibeddel iznan yerzin n texxamt.", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s awiǧit yettwabeddel sɣur %(senderName)s", + "Manually Verify by Text": "Senqed s ufus s ttawil n uḍris", + "Interactively verify by Emoji": "Senqed amyigew s yimujit", + "Cannot reach homeserver": "Anekcum ɣer uqeddac agejdan d awezɣi", + "Cannot reach identity server": "Anekcum ɣer uqeddac n tmagit d awezɣi", + "No homeserver URL provided": "Ulac URL n uqeddac agejdan i d-yettunefken", + "about a minute from now": "akka tsasdidt seg yimir-a", + "%(num)s minutes from now": "%(num)s tesdidin seg yimir-nni", + "about an hour from now": "akka asrag seg yimir-a", + "%(num)s hours from now": "%(num)s yisragen seg yimir-a", + "about a day from now": "akka ass seg yimir-a", + "%(num)s days from now": "%(num)s wussan seg yimir-a", + "Unrecognised address": "Tansa ur tettwassen ara", + "You do not have permission to invite people to this room.": "Ur tesεiḍ ara tasiregt ad d-necdeḍ imdanen ɣer texxamt-a.", + "User %(userId)s is already in the room": "Aseqdac %(userId)s yella yakan deg texxamt", + "User %(user_id)s may or may not exist": "Aseqdac %(user_id)s yezmer yella, yezmer ulac-it", + "The user's homeserver does not support the version of the room.": "Aqeddac agejdan n useqdac ur issefrek ara lqem n texxamt yettwafernen.", + "All-uppercase is almost as easy to guess as all-lowercase": "Meṛṛa isekkilen imeqranen fessus-it i usumer ɣef akk isekkilen imeẓẓyanen", + "Recent years are easy to guess": "Iseggasen n melmi kan sehlen i tifin", + "Dates are often easy to guess": "Izemzen sehlen i tiftin", + "This is a top-10 common password": "Wagi d awal uffir gar 10 yimezwura yettwassnen", + "This is a top-100 common password": "Wagi d awal uffir gar 100 yimezwura yettwassnen", + "This is a very common password": "Wagi d awal uffir yettwassnen", + "I want to help": "Bɣiɣ ad d-muddeɣ tallalt", + "Enable them now": "Sermed-iten tura", + "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s", + "Change notification settings": "Snifel iɣewwaren n yilɣa", + "Match system theme": "Asentel n unagraw yemṣadan", + "Never send encrypted messages to unverified sessions from this session": "Ur ttazen ara akk iznan yettwawgelhen ɣer tɣimiyin ur nettusenqad ara seg tɣimit-a", + "Messages in group chats": "Iznan n yidiwenniyen n ugraw", + "Call invitation": "Ancad n tinnubga", + "Messages sent by bot": "Iznan yettwaznen s Bot", + "When rooms are upgraded": "Mi ara ttwaleqqment texxamin", + "My Ban List": "Tabdart-inu n tigtin", + "Incoming voice call": "Asiwel s taɣect ikcem-d", + "Incoming video call": "Asiwel s tvidyut ikcem-d", + "Incoming call": "Asiwel i d-ikecmen", + "Got It": "Awi-t", + "From %(deviceName)s (%(deviceId)s)": "Seg %(deviceName)s (%(deviceId)s)", + "Accept to continue:": "Qbel i wakken ad tkemmleḍ:", + "This bridge was provisioned by .": "Tileggit-a tella-d sɣur .", + "This bridge is managed by .": "Tileggit-a tettusefrak sɣur .", + "Workspace: %(networkName)s": "Tallunt n uxeddim: %(networkName)s", + "Channel: %(channelName)s": "Abadu: %(channelName)s", + "Upload new:": "Asali amaynut:", + "New passwords don't match": "Awalen uffiren imaynuten ur mṣadan ara", + "Passwords can't be empty": "Awalen uffiren ur ilaq ara ad ilin d ilmawen", + "in account data": "deg yisefka n umiḍan", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Sentem tukksa n tɣimiyin-a s useqdec n unekcum asuf i ubeggen n timagit-ik(im).", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Sentem tukksa n tɣimit-a s useqdec n unekcum asuf i ubeggen n timagit-ik·im.", + "Confirm deleting these sessions": "Sentem tukksa n tɣimiyin-a", + "Restore from Backup": "Tiririt seg uḥraz", + "All keys backed up": "Akk tisura ttwaḥerzent", + "Backup version: ": "Lqem n uḥraz: ", + "Failed to change settings": "Asnifel n yiɣewwaren ur yeddi ara", + "Failed to update keywords": "Aleqqem n wawalen ufrinen ur yeddi ara", + "Enable notifications for this account": "Sens ilɣa i umiḍan-a", + "Enable email notifications": "Sens ilɣa n yimayla", + "Notification targets": "Isaḍasen n yilɣa", + "Advanced notification settings": "Iɣewwaren n yilɣa leqqayen", + "Enable desktop notifications for this session": "Sens ilɣa n tnirawt i tɣimit-a", + "Enable audible notifications for this session": "Sens ilɣa imsiwal i texxamt", + "Upgrade to your own domain": "Leqqem ɣer taɣult-inek kečč", + "Profile picture": "Tugna n umaɣnu", + "Checking server": "Asenqed n uqeddac", + "Change identity server": "Snifel aqeddac n timagit", + "You should:": "Aql-ak·am:", + "Disconnect anyway": "Ɣas akken ffeɣ seg tuqqna", + "Do not use an identity server": "Ur seqdac ara aqeddac n timagt", + "Manage integrations": "Sefrek imsidf", + "Checking for an update...": "Anadi n lqem...", + "Downloading update...": "Asali n lqem...", + "New version available. Update now.": "Lqem amaynut yella. Leqqem tura.", + "Check for update": "Nadi lqem", + "Invalid theme schema.": "Azenziɣ n usentel d arameɣtu.", + "Theme added!": "Asentel yettwarnan!", + "Custom theme URL": "Sagen URL n usentel", + "Add theme": "Rnu asentel", + "Customise your appearance": "Err arwes-ik·im d udmawan", + "Set a new account password...": "Sbadu awal uffir amaynut n umiḍan...", + "Account management": "Asefrek n umiḍan", + "Deactivate Account": "Sens amiḍan", + "Deactivate account": "Sens amiḍan", + "Bug reporting": "Aneqqis n wabug", + "Submit debug logs": "Azen iɣmisen n wabug", + "Clear cache and reload": "Sfeḍ takatut tuffirt syen sali-d", + "%(brand)s version:": "Lqem %(brand)s:", + "olm version:": "lqem n olm:", + "Ignored/Blocked": "Yettunfen/Yettusweḥlen", + "Error unsubscribing from list": "Tuccḍa deg usefsex n ujerred seg texxamt", + "Server rules": "Ilugan n uqeddac", + "User rules": "Ilugan n useqdac", + "You are currently ignoring:": "Aql-ak tura tuɣaleḍ deg rrif:", + "Ignored users": "Iseqdacen yettunfen", + "Personal ban list": "Tabdart n tigtin tudmawant", + "Server or user ID to ignore": "Asulay n uqeddac neɣ n useqdac ara yuɣalen deg rrif", + "eg: @bot:* or example.org": "eg: @bot:* neɣ amedya.org", + "Room list": "Tabdart n texxamt", + "Autocomplete delay (ms)": "Tanzagt n usmad awurman (ms)", + "": "", + "Session ID:": "Asulay n tɣimit:", + "Message search": "Anadi n yizen", + "Default Device": "Ibenk arussin", + "Voice & Video": "Ameslaw & Tavidyut", + "Upgrade this room to the recommended room version": "Leqqem taxxamt-a ɣer lqem n texxamt yelhan", + "this room": "taxxamt-a", + "Internal room ID:": "Asulay n texxamt tagensant:", + "Room version": "Lqem n texxamt", + "Room version:": "Lqem n texxamt:", + "Open Devtools": "Ldi Devtools", + "Notification sound": "Imesli i yilɣa", + "Change main address for the room": "Beddel tansa tagejdant n texxamt", + "Change permissions": "Beddel tisirag", + "Change topic": "Beddel asentel", + "Upgrade the room": "Leqqem taxxamt", + "Enable room encryption": "Rmed awgelhen n texxamt", + "Failed to unban": "Sefsex aḍraq yugi ad yeddu", + "Banned by %(displayName)s": "Yettwagi sɣur %(displayName)s", + "Send messages": "Azen iznan", + "Invite users": "Nced-d iseqdacen", + "Change settings": "Snifel iɣewwaren", + "Kick users": "Suffeɣ iseqdacen", + "Ban users": "Agi yiseqdacen", + "Remove messages": "Kkes iznan", + "Privileged Users": "Iseqdacen i yettwafernen", + "Muted Users": "Iseqdacen i isusmen", + "Banned users": "Iseqdacen i yettwagin", + "Enable encryption?": "Rmed awgelhen?", + "Remove %(email)s?": "Kkes %(email)s?", + "Unable to add email address": "D awezɣi ad ternuḍ tansa n yimayl", + "Remove %(phone)s?": "Kkes %(phone)s?", + "This room is end-to-end encrypted": "Taxxamt-a tettwawgelhen seg yixef ɣer yixef", + "Edit message": "Ẓreg izen", + "Key request sent.": "Asuter n tsarut yettwazen.", + "This message cannot be decrypted": "Izen-a ur yezmir ara ad yettuwgelhen", + "Encrypted by a deleted session": "Yettuwgelhen s texxamt yettwakksen", + "Scroll to most recent messages": "Drurem ɣer yiznan akk n melmi kan", + "Close preview": "Mdel taskant", + "and %(count)s others...|other": "d %(count)s wiyaḍ...", + "and %(count)s others...|one": "d wayeḍ-nniḍen...", + "Invite to this room": "Nced-d ɣer texxamt-a", + "Filter room members": "Sizdeg iɛeggalen n texxamt", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", + "Voice call": "Asiwel s taɣect", + "Video call": "Asiwel s tvidyut", + "Send an encrypted reply…": "Azen tiririt yettuwgelhen...", + "Send a reply…": "Azen tiririt...", + "Send an encrypted message…": "Azen izen yettuwgelhen...", + "Send a message…": "Azen izen...", + "Italics": "Uknan", + "No pinned messages.": "Ulac iznan yerzin.", + "Pinned Messages": "Iznan yerzin", + "Online for %(duration)s": "Srid azal n %(duration)s", + "Idle for %(duration)s": "D arurmid azal n %(duration)s", + "Offline for %(duration)s": "Beṛṛa n tuqqna azal n %(duration)s", + "Seen by %(userName)s at %(dateTime)s": "Iwala-t %(userName)s at %(dateTime)s", + "Replying": "Tiririt", + "Guests can join": "Inebgawen zemren ad ttekkin", + "(~%(count)s results)|one": "(~%(count)s result)", + "Join Room": "Rnu ɣer texxamt", + "Forget room": "Tettuḍ taxxamt", + "Rooms": "Timɣiwent", + "Custom Tag": "Sagen tabzimt", + "This room": "Taxxamt-a", + "Loading …": "La d-yettali…", + "Rejecting invite …": "Tigtin n tinnubga...", + "Join the conversation with an account": "Ttekki deg udiwenni s umiḍan", + "Loading room preview": "Taskant n texxamt i la d-tettali", + "Re-join": "Ales attekki", + "Try to join anyway": "Ɣas akken ɛreḍ ad tettekkiḍ", + "Join the discussion": "Ttekki deg udiwenni", + "Start chatting": "Bdu adiwenni", + "%(roomName)s is not accessible at this time.": "%(weekDayName)s ulac anekcum ɣer-s akka tura.", + "Show previews of messages": "Sken tiskanin n yiznan", + "Jump to first unread room.": "Ɛeddi ɣer texxamt tamezwarut ur nettwaɣra ara.", + "Jump to first invite.": "Ɛreddi ɣer tinnubga tamezwarut.", + "Add room": "Rnu taxxamt", + "All messages": "Iznan i meṛṛa", + "Mentions & Keywords": "Ibdaren & Awalen ufrinen", + "Forget Room": "Tettuḍ taxxamt", + "Leave Room": "Ffeɣ seg texxamt", + "Add a topic": "Rnu asentel", + "This Room": "Taxxamt-a", + "Search…": "Ffeɣ seg unadi...", + "Send as message": "Azen-it d izen", + "Add some now": "Rnu kra tura", + "Hide Stickers": "Ffer istikiyen", + "Failed to revoke invite": "Asefsex n tinnubga ur yeddi ara", + "Admin Tools": "Ifecka n unedbal", + "Revoke invite": "Sefesex tinnubga", + "Invited by %(sender)s": "Yettunced-d sɣur %(sender)s", + "not specified": "ur iban ara", + "Other published addresses:": "Tansiwin-nniḍen i d-yeffɣen:", + "Invalid community ID": "Asulay n temɣiwent d arussin", + "Start Verification": "Bdu asenqed", + "Verify User": "Senqed aseqdac", + "Your messages are not secure": "Iznan-inek·inem d ariɣelsanen", + "Hide verified sessions": "Ffer tiɣimiyin yettwasneqden", + "%(count)s sessions|other": "Tiɣimiyin n %(count)s", + "Hide sessions": "Ffer tiɣimiyin", + "Jump to read receipt": "Ɛeddi ɣer tɣuri n wawwaḍ", + "Share Link to User": "Bḍu aseɣwen d useqdac", + "Disinvite this user?": "Kkes-d tinnubga n useqdac?", + "Kick this user?": "Suffeɣ aseqdac-a?", + "Remove %(count)s messages|one": "Kkes 1 izen", + "Remove recent messages": "Kkes iznan n melmi kan", + "Unban this user?": "Sefsex aḍraq n useqdac-a?", + "Ban this user?": "Zgel aseqdac-a?", + "Failed to mute user": "Tasusmi n useqdac ur yeddi ara", + "Remove from community": "Kkes seg temɣiwent", + "Disinvite this user from community?": "Kkes tinnubga n useqdac-a seg temɣiwent?", + "Remove this user from community?": "Kkes aseqdac-a seg temɣiwent?", + "Failed to withdraw invitation": "Tukksa n tinnubga ur yeddi ara", + "Deactivate user?": "Kkes aseqdac-a?", + "Deactivate user": "Kkes aseqdac", + "Verify by scanning": "Senqed s usiggez", + "Verify by emoji": "Senqed s yimujit", + "Verification timed out.": "Yemmed wakud n usenqed.", + "%(displayName)s cancelled verification.": "%(name)s isefsex asenqed.", + "You cancelled verification.": "Tesfesxeḍ asenqed.", + "Verification cancelled": "Yefsex usenqed", + "Encryption enabled": "Awgelhen ur yeddi ara", + "Decrypt %(text)s": "Wgelhen %(text)s", + "Download %(text)s": "Sader %(text)s", + "You verified %(name)s": "Tezsneqdeḍ %(name)s", + "%(name)s cancelled verifying": "%(name)s isefsex asenqed", + "You accepted": "Tqebleḍ", + "%(name)s accepted": "%(name)s yettwaqbel", + "You declined": "Tugiḍ", + "You cancelled": "Tesfesxeḍ", + "%(name)s declined": "%(name)s yettwagi", + "%(name)s cancelled": "%(name)s yettwasefsex", + "%(name)s wants to verify": "%(name)s yebɣa ad isenqed", + "Message deleted by %(name)s": "Izen yettwakkes sɣur %(name)s", + "Message deleted on %(date)s": "Izen yettwakkes deg %(date)s", + "Add an Integration": "Rnu asidef", + "Can't load this message": "Yegguma ad d-yali yizen-a", + "Submit logs": "Azen iɣmisen", + "Filter community members": "Sizdeg imttekkiyen n texxamt", + "Invite to this community": "Ancad ɣer temɣiwent", + "Visibility in Room List": "Abani n tebdart n texxamin", + "Only visible to community members": "Yettban kan i yimttekkiyen n temɣiwent", + "Add rooms to this community": "Rnu tixxamin ɣer temɣiwent", + "Filter community rooms": "Sizdeg tixxamin ɣer temɣiwent", + "Smileys & People": "Acmumeḥ & Imdanen", + "Animals & Nature": "Iɣersiwen & ugama", + "Activities": "Irmad", + "Travel & Places": "Inig & Imukan", + "Cancel search": "Sefsex anadi", + "Your user ID": "Asulay-ik·m n useqdac", + "Your theme": "Asentel-inek·inem", + "Room ID": "Asulay n texxamt", + "Widget ID": "Asulay n yiwiǧit", + "Download this file": "Sali-d afaylu-a", + "Manage Integrations": "Sefrek imsidaf", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "Power level": "Sagen aswir", + "Custom level": "Sagen aswir", + "In reply to ": "Deg tririt i ", + "e.g. my-room": "e.g. taxxamt-inu", + "Please provide a room address": "Ttxil-k·m mudd-d tansa n texxamt", + "Sign in with single sign-on": "Qqen s unekcum asuf", + "And %(count)s more...|other": "D %(count)s ugar...", + "Enter a server name": "Sekcem isem n uqeddac", + "Matrix": "Matrix", + "Matrix ID": "Asulay n Matrix", + "Matrix Room ID": "Asulay n n texxamt n Matrix", + "The following users may not exist": "Iseqdacen i d-iteddun yezmer ad ilin ulac-iten", + "Invite anyway": "Ɣas akken nced-d", + "Preparing to send logs": "Aheyyi n tuzna n yiɣmisen", + "Failed to send logs: ": "Tuzna n yiɣmisen ur teddi ara: ", + "Send logs": "Azen iɣmisen", + "Clear all data": "Sfeḍ meṛṛa isefka", + "Create Community": "Rnu tamɣiwent", + "Community Name": "Isem n temɣiwent", + "Please enter a name for the room": "Ttxil-k·m sekcem isem i texxamt", + "Enable end-to-end encryption": "Awgelhen seg yixef ɣer yixef ur yeddi ara", + "Topic (optional)": "Asentel (afrayan)", + "Make this room public": "Err taxxamt-a d tazayezt", + "Continue With Encryption Disabled": "Kemmel s uwgelhen yensan", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "Sentem asensi n umiḍan s useqdec n unekcum asuf i ubeggen n timagit-ik·im.", + "Confirm account deactivation": "Sentem asensi n umiḍan", + "Send Custom Event": "Azen tadyant tudmawant", + "Event sent!": "Tadyant tettwazen!", + "Send Account Data": "Azen isefka n umiḍan", + "Filter results": "Igmaḍ n usizdeg", + "Verification Requests": "Tuttriwin n usenqed", + "Waiting for partner to confirm...": "Aṛaǧu n umendad ad isentem...", + "Incoming Verification Request": "Tuttra n usenqed i d-ikecmen", + "Confirm to continue": "Sentem i wakken ad tkemmleḍ", + "Failed to invite the following users to chat: %(csvUsers)s": "Ancad n yiseqdacen i d-iteddun ɣer udiwenni ur yeddi ara: %(csvUsers)s", + "Failed to find the following users": "Ur nessaweḍ ara ad naf iseqdacen", + "Recent Conversations": "Idiwenniyen n melmi kan", + "Direct Messages": "Iznan usligen", + "Upload completed": "Asali yemmed", + "Signature upload success": "Asali n uzmul yedda akken iwata", + "Clear cache and resync": "Sfeḍ takatut tuffirt syen ales amtawi", + "Failed to upgrade room": "Aleqqem n texxamt ur yeddi ara", + "Upgrade this room to version %(version)s": "Leqqem taxxamt-a ɣer lqem amaynut %(version)s", + "Upgrade Room Version": "Lqem n uleqqem n texxamt", + "Automatically invite users": "Nced-d iseqdacen s wudem awurman", + "Upgrade private room": "Leqqem taxxamt tusligt", + "Upgrade public room": "Leqqem taxxamt tazayezt", + "Server isn't responding": "Ulac tiririt sɣur aqeddac", + "The server is offline.": "Aqeddac ha-t-an beṛṛa n tuqqna.", + "Clear Storage and Sign Out": "Sfeḍ aklas syen ffeɣ seg tuqqna", + "Send Logs": "Azen iɣmisen", + "Unable to restore session": "D awezɣi ad d-tuɣal texxamt", + "Verification Pending": "Asenqed yettṛaǧu", + "Share User": "Bḍu aseqdac", + "Share Community": "Bḍu tamɣiwent", + "Link to selected message": "Aseɣwen n yizen i yettwafernen", + "Missing session data": "Isefka n tɣimit xuṣṣen", + "Upload all": "Sali-d kullec", + "Cancel All": "Sefsex kullec", + "Verify other session": "Senqed tiɣimit tayeḍ", + "Verification Request": "Asuter n usenqed", + "Use your Security Key to continue.": "Seqdec tasarut-ik·im n tɣellist akken ad tkemmleḍ.", + "Incorrect recovery passphrase": "Tafyirt tuffirt n uεeddi d tarameɣtut", + "Unable to restore backup": "Tiririt n uḥraz tugi ad teddu", + "Keys restored": "Tisura ttwaskelsent", + "Enter recovery passphrase": "Sekcem tafyirt tuffirt n tririt", + "Enter recovery key": "Sekcem tasarut tririt", + "Private Chat": "Adiwenni uslig", + "Public Chat": "Adiwenni azayez", + "Address (optional)": "Tansa (tafrayan)", + "Reject invitation": "Agi tinnubga", + "Unable to reject invite": "Tegtin n tinnubga tegguma ad teddu", + "Resend edit": "Ales tuzna n useẓreg", + "Resend removal": "Azen tikkelt-nniḍen tukksa", + "Cancel Sending": "Sefsex tuzna", + "Share Permalink": "Bḍu aseɣwen ameɣlal", + "Share Message": "Bḍu izen", + "Collapse Reply Thread": "Fneẓ asqerdec n tririt", + "Report Content": "Agbur n uneqqis", + "All messages (noisy)": "Iznan i meṛṛa (sɛan ṣṣut)", + "Direct Chat": "Adiwenni uslig", + "Clear status": "Sfeḍ addaden", + "Update status": "Leqqem addaden", + "Set a new status...": "Sbadu addad amaynut...", + "View Community": "Wali tamɣiwent", + "Remove for everyone": "Kkes i meṛṛa", + "Remove for me": "Kkes i nekk", + "User Status": "Addaden n useqdac", + "Start authentication": "Bdu alɣu", + "Sign in with SSO": "Anekcum s SSO", + "Couldn't load page": "Asali n usebter ur yeddi ara", + "Add rooms to the community summary": "Rnu tixxamin ɣer ugzul n temɣiwent", + "Which rooms would you like to add to this summary?": "Anti tixxamin i tebɣiḍ ad tent-ternuḍ ɣer uzwel-a?", + "Add to summary": "Rnu ɣer ugzul", + "Add a Room": "Rnu taxxamt", + "Add users to the community summary": "Rnu iseqdacen ɣer ugzul n temɣiwent", + "Who would you like to add to this summary?": "Anwa i tebɣiḍ ad t-ternuḍ ɣer ugzul-a?", + "Add a User": "Rnu aseqdac", + "Failed to update community": "Aleqqem n temɣiwent ur yeddi ara", + "Unable to accept invite": "Aqbal n tinnubga d awezɣi", + "Unable to join community": "Timerna ɣer temɣiwent d awezɣi", + "Leave Community": "Ffeɣ seg temɣiwent", + "Leave %(groupName)s?": "Ffeɣ seg %(groupName)s?", + "Unable to leave community": "D awezɣi ad teffɣeḍ seg temɣiwent", + "Community Settings": "Iɣewwaren n temɣiwent", + "Featured Users:": "Iseqdacen i ifazen:", + "Join this community": "Rnu ɣer temɣiwent-a", + "Leave this community": "Ffeɣ seg temɣiwent-a", + "You are an administrator of this community": "Aql-ak·akem d (t)anedbal(t) n temɣiwent-a", + "You are a member of this community": "Aql-ak·akem d (t)aɛeggal(t) n temɣiwent-a", + "Who can join this community?": "Anwa i izemren ad d-yernu ɣer temɣiwent-a?", + "Long Description (HTML)": "Aglam ɣezzifen (HTML)", + "Community %(groupId)s not found": "Ur tettwaf ara temɣiwent %(groupId)s", + "This homeserver does not support communities": "Aqeddac-a agejdan ur issefrek ara timɣiwanin", + "Failed to load %(groupId)s": "Asali n %(groupId)s ur yeddi ara", + "Welcome to %(appName)s": "Ansuf ɣer %(appName)s", + "Send a Direct Message": "Azen izen uslig", + "Failed to reject invitation": "Tigtin n tinnubga ur yeddi ara", + "Failed to leave room": "Tuffɣa seg texxamt ur yeddi ara", + "Signed Out": "Yeffeɣ seg tuqqna", + "Self-verification request": "Asuter n usenqed awurman", + "Create a new community": "Rnu tamɣiwent tamaynut", + "Remove from Directory": "Kkes seg ukaram", + "Unable to join network": "Timerna ɣer uzeṭṭa d tawezɣit", + "Clear filter": "Sfeḍ asizdeg", + "%(count)s of your messages have not been sent.|one": "Izen-inek·inem ur yettwazen ara.", + "Room": "Taxxamt", + "Failed to reject invite": "Tigtin n tinnubga ur yeddi ara", + "Click to unmute video": "Sit i wakken ad tesremdeḍ tavidyut", + "Click to mute video": "Sit i wakken ad tsenseḍ tavidyut", + "Click to unmute audio": "Sit i wakken ad tesremdeḍ ameslaw", + "Click to mute audio": "Sit i wakken ad tsenseḍ ameslaw", + "Switch to light mode": "Uɣal ɣer uskar aceɛlal", + "Switch to dark mode": "Uɣal ɣer uskar aberkan", + "Switch theme": "Abeddel n usentel", + "All settings": "Akk iɣewwaren", + "Verify this login": "Senqed anekcam-a", + "A new password must be entered.": "Awal uffir amaynut ilaq ad yettusekcem.", + "Your Matrix account on ": "Amiḍan-ik·im Matrix deg ", + "Send Reset Email": "Azen imayl n uwennez", + "Set a new password": "Sbadu awal uffir amaynut", + "General failure": "Tuccḍa tamatut", + "This account has been deactivated.": "Amiḍan-a yettuḥbes.", + "Continue with previous account": "Kemmel s umiḍan yezrin", + "Log in to your new account.": "Kcem ɣer umiḍan-ik·im amaynut.", + "%(brand)s Web": "%(brand)s Web", + "%(brand)s Desktop": "Tanarit n %(tecreḍt)s", + "%(brand)s iOS": "%(tacreḍt)s iOS", + "%(brand)s Android": "%(tacreḍt)s Andriod", + "Incorrect password": "Awal uffir d arameɣtu", + "Failed to re-authenticate": "Aɛiwed n usesteb ur yeddi ara", + "Command Autocomplete": "Asmad awurman n tiludna", + "Emoji Autocomplete": "Asmad awurman n yimujit", + "Enter a recovery passphrase": "Sekcem tafyirt tuffirt n tririt" } From e3902cc1901a5358aa07ef2ad15a1f28982a4ae3 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Fri, 14 Aug 2020 13:07:48 +0000 Subject: [PATCH 008/174] Translated using Weblate (Ukrainian) Currently translated at 52.0% (1212 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 7dcfe4eeee..de19a22397 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1225,5 +1225,6 @@ "If you've joined lots of rooms, this might take a while": "Якщо ви приєднались до багатьох кімнат, це може зайняти деякий час", "Create account": "Створити обліковий запис", "Failed to fetch avatar URL": "Не вдалось вибрати URL личини", - "Clear room list filter field": "Очистити поле цідила списку кімнат" + "Clear room list filter field": "Очистити поле цідила списку кімнат", + "Cancel autocomplete": "Скасувати самодоповнення" } From 24d1b93f94778319c7e1b233bd5c350ff6730a65 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sat, 15 Aug 2020 08:40:33 +0000 Subject: [PATCH 009/174] Translated using Weblate (Albanian) Currently translated at 99.7% (2326 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 9d9be78fdf..270912f8a7 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2407,5 +2407,7 @@ "Attach files from chat or just drag and drop them anywhere in a room.": "Bashkëngjitni kartela prej fjalosjeje ose thjesht tërhiqini dhe lërini kudo qoftë brenda dhomës.", "You have no visible notifications in this room.": "S’ka njoftime të dukshme për ju në këtë dhomë.", "Master private key:": "Kyç privat i përgjithshëm:", - "%(brand)s Android": "%(brand)s Android" + "%(brand)s Android": "%(brand)s Android", + "Show message previews for reactions in DMs": "Shfaq paraparje mesazhi për reagime në MD", + "Show message previews for reactions in all rooms": "Shfaq paraparje mesazhi për reagime në krejt dhomat" } From 45846f3306bfe00759779e08c48d5b0fae59511e Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 15 Aug 2020 02:42:02 +0000 Subject: [PATCH 010/174] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index b8fc2b43fb..5a354ec27c 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2413,5 +2413,7 @@ "You’re all caught up": "您都設定好了", "You have no visible notifications in this room.": "您在此聊天室沒有可見的通知。", "%(brand)s Android": "%(brand)s Android", - "Master private key:": "主控私鑰:" + "Master private key:": "主控私鑰:", + "Show message previews for reactions in DMs": "在直接訊息中顯示反應的訊息預覽", + "Show message previews for reactions in all rooms": "在所有聊天室中顯示反應的訊息預覽" } From 2ec695f284452752dc3ed830a3f56c87e6789d5a Mon Sep 17 00:00:00 2001 From: Tirifto Date: Sun, 16 Aug 2020 16:26:03 +0000 Subject: [PATCH 011/174] Translated using Weblate (Esperanto) Currently translated at 99.7% (2327 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 8d07db7eaf..aec575b8b4 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -858,7 +858,7 @@ "Gift": "Donaco", "Light bulb": "Lampo", "Book": "Libro", - "Pencil": "Grifelo", + "Pencil": "Krajono", "Scissors": "Tondilo", "Key": "Ŝlosilo", "Hammer": "Martelo", @@ -2387,5 +2387,25 @@ "Enable advanced debugging for the room list": "Ŝalti altnivelan erarserĉadon por la ĉambrobreto", "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s", "Custom Tag": "Propra etikedo", - "Feedback": "Prikomenti" + "Feedback": "Prikomenti", + "The person who invited you already left the room.": "La persono, kiu vin invitis, jam foriris de la ĉambro.", + "The person who invited you already left the room, or their server is offline.": "Aŭ la persono, kiu vin invitis, jam foriris de la ĉambro, aŭ ĝia servilo estas eksterreta.", + "Change notification settings": "Ŝanĝi agordojn pri sciigoj", + "Show message previews for reactions in DMs": "Montri antaŭrigardojn al mesaĝoj ĉe reagoj en rektaj ĉambroj", + "Show message previews for reactions in all rooms": "Montri antaŭrigardojn al mesaĝoj ĉe reagoj en ĉiuj ĉambroj", + "Your server isn't responding to some requests.": "Via servilo ne respondas al iuj petoj.", + "Server isn't responding": "Servilo ne respondas", + "Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Via servilo ne respondas al iuj el viaj petoj. Vidu sube kelkon de la plej probablaj kialoj.", + "The server (%(serverName)s) took too long to respond.": "La servilo (%(serverName)s) tro longe ne respondis.", + "Your firewall or anti-virus is blocking the request.": "Via fajroŝirmilo aŭ kontraŭvirusilo blokas la peton.", + "A browser extension is preventing the request.": "Kromprogramo de la foliumilo malhelpas la peton.", + "The server is offline.": "La servilo estas eksterreta.", + "The server has denied your request.": "La servilo rifuzis vian peton.", + "Your area is experiencing difficulties connecting to the internet.": "Via loko nun havas problemojn pri interreta konekto.", + "A connection error occurred while trying to contact the server.": "Eraris konekto dum provo kontakti la servilon.", + "The server is not configured to indicate what the problem is (CORS).": "La servilo ne estas agordita por indiki la problemon (CORS).", + "Recent changes that have not yet been received": "Freŝaj ŝanĝoj ankoraŭ ne ricevitaj", + "No files visible in this room": "Neniuj dosieroj videblas en ĉi tiu ĉambro", + "You have no visible notifications in this room.": "Vi havas neniujn videblajn sciigojn en ĉi tiu ĉambro.", + "%(brand)s Android": "%(brand)s por Android" } From b989762cb9f4d9ad002ffafb1d9bbf91ae369832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 14 Aug 2020 20:51:02 +0000 Subject: [PATCH 012/174] Translated using Weblate (Estonian) Currently translated at 99.8% (2328 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 2e39e3b087..29c1d17b01 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -839,7 +839,7 @@ "Heart": "Süda", "Smiley": "Smaili", "Robot": "Robot", - "Hat": "Müts", + "Hat": "Kübar", "Glasses": "Prillid", "Spanner": "Mutrivõti", "Santa": "Jõuluvana", @@ -870,7 +870,7 @@ "Anchor": "Ankur", "Headphones": "Kõrvaklapid", "Folder": "Kaust", - "Pin": "Knopka", + "Pin": "Nööpnõel", "Verify all your sessions to ensure your account & messages are safe": "Selleks et sinu konto ja sõnumid oleks turvatud, verifitseeri kõik oma sessioonid", "Later": "Hiljem", "Review": "Vaata üle", From 5faa439b9e6d067a2e7346d60264aacd9971e865 Mon Sep 17 00:00:00 2001 From: XoseM Date: Sat, 15 Aug 2020 06:03:51 +0000 Subject: [PATCH 013/174] Translated using Weblate (Galician) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index db8a8f8100..c5501ac187 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2233,7 +2233,7 @@ "Alt": "Alt", "Alt Gr": "Alt Gr", "Shift": "Maiús", - "Super": "Super", + "Super": "Súper", "Ctrl": "Ctrl", "Toggle Bold": "Activa Resaltar", "Toggle Italics": "Activa Cursiva", @@ -2410,5 +2410,7 @@ "You’re all caught up": "Xa estás ó día", "You have no visible notifications in this room.": "Non tes notificacións visibles nesta sala.", "%(brand)s Android": "%(brand)s Android", - "Master private key:": "Chave mestra principal:" + "Master private key:": "Chave mestra principal:", + "Show message previews for reactions in DMs": "Mostrar vista previa das mensaxes para reaccións en MDs", + "Show message previews for reactions in all rooms": "Mostrar vista previa das mensaxes para reaccións en todas as salas" } From 861bf9ba62f78e8ffa259650100d91f9d1b2a066 Mon Sep 17 00:00:00 2001 From: Max Harmathy Date: Fri, 14 Aug 2020 19:25:36 +0000 Subject: [PATCH 014/174] Translated using Weblate (German) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3d5ba3722e..fdd2cc9a8c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1633,8 +1633,8 @@ "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren", "Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehlezu den kürzlich gesichteteten Räumen über der Raumliste anzeigen", - "Use Single Sign On to continue": "Nutze „Single Sign-On“ (Einmal-Anmeldung) um fortzufahren", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser E-Mail-Adresse mit „Single Sign-On“, um deine Identität nachzuweisen.", + "Use Single Sign On to continue": " Verwende Single-Sign-On um fortzufahren", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single-Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", "Confirm adding email": "Hinzufügen der E-Mail-Adresse bestätigen", "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser Telefonnummer, indem du deine Identität mittels „Single Sign-On“ nachweist.", From 0a16c1eb0d81fba09cd3ecbc16d9e711b1db92f2 Mon Sep 17 00:00:00 2001 From: toastbroot Date: Fri, 14 Aug 2020 19:26:11 +0000 Subject: [PATCH 015/174] Translated using Weblate (German) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index fdd2cc9a8c..a34f0cca3e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -784,7 +784,7 @@ "Checking for an update...": "Nach Updates suchen...", "Missing roomId.": "Fehlende Raum-ID.", "Every page you use in the app": "Jede Seite, die du in der App benutzt", - "e.g. ": "z.B. ", + "e.g. ": "z. B. ", "Your device resolution": "Deine Bildschirmauflösung", "Popout widget": "Widget ausklinken", "Always show encryption icons": "Immer Verschlüsselungssymbole zeigen", @@ -1636,8 +1636,8 @@ "Use Single Sign On to continue": " Verwende Single-Sign-On um fortzufahren", "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single-Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", - "Confirm adding email": "Hinzufügen der E-Mail-Adresse bestätigen", - "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige das Hinzufügen dieser Telefonnummer, indem du deine Identität mittels „Single Sign-On“ nachweist.", + "Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte Telefonnummer, indem du deine Identität mittels Single Sign-On nachweist.", "Click the button below to confirm adding this phone number.": "Klicke unten die Schaltfläche, um die hinzugefügte Telefonnummer zu bestätigen.", "If you cancel now, you won't complete your operation.": "Wenn du jetzt abbrichst, wirst du deinen Vorgang nicht fertigstellen.", "%(name)s is requesting verification": "%(name)s fordert eine Verifizierung an", @@ -1645,7 +1645,7 @@ "Command failed": "Befehl fehlgeschlagen", "Could not find user in room": "Der Benutzer konnte im Raum nicht gefunden werden", "Click the button below to confirm adding this email address.": "Klicke unten auf die Schaltfläche, um die hinzugefügte E-Mail-Adresse zu bestätigen.", - "Confirm adding phone number": "Hinzufügen der Telefonnummer bestätigen", + "Confirm adding phone number": "Bestätige hinzugefügte Telefonnummer", "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Server von %(oldGlob)s nach %(newGlob)s wegen %(reason)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s erneuert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s wegen %(reason)s", "Not Trusted": "Nicht vertraut", From 1dc908c16bc702509ef56766fd7fadaca1c92a5d Mon Sep 17 00:00:00 2001 From: thilobuchholz Date: Fri, 14 Aug 2020 19:26:43 +0000 Subject: [PATCH 016/174] Translated using Weblate (German) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index a34f0cca3e..880efb69c3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1328,7 +1328,7 @@ "Find a room…": "Suche einen Raum…", "Find a room… (e.g. %(exampleRoom)s)": "Suche einen Raum… (z.B. %(exampleRoom)s)", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Wenn du den gesuchten Raum nicht finden kannst, frage nach einer Einladung für den Raum oder Erstelle einen neuen Raum.", - "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein, und deine IP-Adresse mit diesem teilen. Du kannst dies auch in den Einstellungen konfigurieren.", + "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein, und deine IP-Adresse mit diesem Server teilen. Du kannst dies auch in den Einstellungen konfigurieren.", "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standard-Identitätsserver zuzugreifen, um eine E-Mail Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.", "Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du den Inhaber*innen des Servers vertraust.", "Trust": "Vertrauen", From b0f2230fa9ce179508f9ca4ff5beb20eefe71fdf Mon Sep 17 00:00:00 2001 From: dccs Date: Sat, 15 Aug 2020 09:33:30 +0000 Subject: [PATCH 017/174] Translated using Weblate (German) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 880efb69c3..ab424c7b31 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2408,5 +2408,7 @@ "Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Bewahre deinen Sicherheitsschlüssel an einem sicheren Ort wie z. B. in einem Passwort-Manager oder einem Safe auf. Er wird zum Schutz deiner verschlüsselten Daten verwendet.", "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Wenn du jetzt abbrichst, kannst du verschlüsselte Nachrichten und Daten verlieren, wenn du den Zugriff auf deine Logins verlierst.", "You can also set up Secure Backup & manage your keys in Settings.": "Du kannst auch in den Einstellungen eine Sicherung erstellen & deine Schlüssel verwalten.", - "Set up Secure backup": "Sicheres Backup einrichten" + "Set up Secure backup": "Sicheres Backup einrichten", + "Show message previews for reactions in DMs": "Anzeigen einer Nachrichtenvorschau für Reaktionen in DMs", + "Show message previews for reactions in all rooms": "Zeigen Sie eine Nachrichtenvorschau für Reaktionen in allen Räumen an" } From ee670a82c077a77de7c00f6f3a4d58a8a16b8e31 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Sat, 15 Aug 2020 13:14:47 +0000 Subject: [PATCH 018/174] Translated using Weblate (Hungarian) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index b9603858bb..7914da4d51 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2404,5 +2404,13 @@ "Your area is experiencing difficulties connecting to the internet.": "Probléma az Internet elérésben.", "A connection error occurred while trying to contact the server.": "Kapcsolati hiba lépett fel miközben a szervert próbáltad elérni.", "The server is not configured to indicate what the problem is (CORS).": "A szerver nincs beállítva, hogy megmutassa mi okozhatta a hibát (CORS).", - "Recent changes that have not yet been received": "Legutóbbi változások amik még nem érkeztek meg" + "Recent changes that have not yet been received": "Legutóbbi változások amik még nem érkeztek meg", + "Show message previews for reactions in DMs": "Üzenet előnézet mutatása a reakcióhoz a közvetlen beszélgetéseknél", + "Show message previews for reactions in all rooms": "Üzenet előnézet mutatása a reakciókhoz minden szobában", + "Master private key:": "Privát elsődleges kulcs:", + "No files visible in this room": "Ebben a szobában nincsenek fájlok", + "Attach files from chat or just drag and drop them anywhere in a room.": "Csatolj fájlt a csevegésből vagy húzd és ejtsd bárhova a szobában.", + "You’re all caught up": "Mindent elolvastál", + "You have no visible notifications in this room.": "Nincsenek látható értesítéseid ebben a szobában.", + "%(brand)s Android": "%(brand)s Android" } From 163a9398e8b7e1e3e08f7f59a2734e5c29f5e1e6 Mon Sep 17 00:00:00 2001 From: random Date: Mon, 17 Aug 2020 07:21:20 +0000 Subject: [PATCH 019/174] Translated using Weblate (Italian) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d86070018b..6c5fe1d4db 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2413,5 +2413,7 @@ "Attach files from chat or just drag and drop them anywhere in a room.": "Allega file dalla chat o trascinali in qualsiasi punto in una stanza.", "You’re all caught up": "Non hai nulla di nuovo da vedere", "You have no visible notifications in this room.": "Non hai alcuna notifica visibile in questa stanza.", - "%(brand)s Android": "%(brand)s Android" + "%(brand)s Android": "%(brand)s Android", + "Show message previews for reactions in DMs": "Mostra anteprime messaggi per le reazioni nei messaggi diretti", + "Show message previews for reactions in all rooms": "Mostra anteprime messaggi per le reazioni in tutte le stanze" } From c2769999ef53628cd629aafb15aad4deb16ad416 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Fri, 14 Aug 2020 22:40:13 +0000 Subject: [PATCH 020/174] Translated using Weblate (Kabyle) Currently translated at 58.1% (1356 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 186 +++++++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 10607a601f..377da10d56 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1214,5 +1214,189 @@ "Failed to re-authenticate": "Aɛiwed n usesteb ur yeddi ara", "Command Autocomplete": "Asmad awurman n tiludna", "Emoji Autocomplete": "Asmad awurman n yimujit", - "Enter a recovery passphrase": "Sekcem tafyirt tuffirt n tririt" + "Enter a recovery passphrase": "Sekcem tafyirt tuffirt n tririt", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Seqdec aqeddac n timagit i uncad s yimayl. Sit, tkemmleḍ aseqdec n uqeddac n timagit amezwer (%(defaultIdentityServerName)s) neɣ sefrek deg yiɣewwaren.", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ƔUR-K·M: tASARUT N USENQED UR TEDDI ARA! Tasarut n uzmul n %(userId)s akked tɣimit %(deviceId)s d \"%(fprint)s\" ur imṣada ara d tsarut i d-yettunefken \"%(fingerprint)s\". Ayagi yezmer ad d-yini tiywalin-ik·im ttusweḥlent!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Tasarut n uzmul i d-tefkiḍ temṣada d tsarut n uzmul i d-tremseḍ seg tɣimit %(userId)s's %(deviceId)s. Tiɣimit tettucreḍ tettwasenqed.", + "Displays list of commands with usages and descriptions": "Yeskan tabdart n tiludna s usegdec d uglam", + "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s yermed aɣawas i %(groups)s deg texxamt-a.", + "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s isens aɣawas i %(groups)s deg texxamt-a.", + "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s yermed aɣawas i %(newGroups)s syen isens aɣawas i %(oldGroups)s deg texxamt-a.", + "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s yeḥwi tinubga i %(targetDisplayName)s i uttekkki deg texxamt.", + "Unicorn": "Azara", + "Penguin": "Awarfus", + "Octopus": "Azayz", + "Globe": "Amaḍal", + "Pizza": "Tapizzat", + "Spanner": "Tasarut", + "Santa": "Santa", + "Hourglass": "Amasrag", + "Scissors": "Timqestin", + "Hammer": "Tafḍist", + "Train": "Tamacint", + "Aeroplane": "Asafag", + "Rocket": "Timeẓdit", + "Guitar": "Tagitaṛt", + "Trumpet": "Lɣiḍa", + "Bell": "Anayna", + "Pin": "Amessak", + "Your server isn't responding to some requests.": "Aqeddac-inek·inem ur d-yettarra ara ɣef kra n yisuturen. ", + "Decline (%(counter)s)": "Agi (%(counter)s)", + "Failed to upload profile picture!": "Asali n tewlaft n umaɣnu ur yeddui ara!", + "No display name": "Ulac meffer isem", + "Export E2E room keys": "Sifeḍ tisura n texxamt E2E", + "Do you want to set an email address?": "Tebɣiḍ ad tazneḍ tansa n yimayl?", + "Your homeserver does not support cross-signing.": "Aqeddac-ik·im agejdan ur yessefrak ara azmul anmidag.", + "Cross-signing and secret storage are enabled.": "Azmul anmidag d uklas uffir ur ttwaremden ara.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Amiḍan-inek·inem ɣer-s timagit n uzmul anmidag deg uklas uffir, maca mazal ur yettwaman ara sɣur taxxamt-a.", + "Cross-signing and secret storage are not yet set up.": "Azmul anmidag d uklas uffir mazal ar tura ur ttusbadeun ara.", + "Reset cross-signing and secret storage": "Wennez azmul anmidag d uklas uffir", + "Bootstrap cross-signing and secret storage": "Azmul anmidag s tazwara d uklas uffir", + "well formed": "imsel akken iwata", + "unexpected type": "anaw ur nettwaṛǧa ara", + "Cross-signing public keys:": "Tisura n uzmul anmidag tizuyaz:", + "in memory": "deg tkatut", + "Cross-signing private keys:": "Tisura tusligin n uzmul anmidag:", + "Create room": "Rnu taxxamt", + "System Alerts": "Ilɣa n unagraw", + "Forget this room": "Ttu taxxamt-a", + "Reject & Ignore user": "Agi & Zgel aseqdac", + "%(roomName)s does not exist.": "%(roomName)s ulac-it.", + "Don't ask me again": "Ur d-sutur ara tikelt-nniḍen", + "Show rooms with unread messages first": "Sken tixxamin yesεan iznan ur nettwaɣra ara d timezwura", + "List options": "Tixtiṛiyin n tebdart", + "Show %(count)s more|other": "Sken %(count)s ugar", + "Show %(count)s more|one": "Sken %(count)s ugar", + "Use default": "Seqdec udem amezwer", + "Notification options": "Tixtiṛiyin n wulɣu", + "Room options": "Tixtiṛiyin n texxamt", + "%(count)s unread messages including mentions.|one": "1 ubdar ur nettwaɣra ara.", + "%(count)s unread messages.|other": "Iznan ur nettwaɣra ara %(count)s.", + "%(count)s unread messages.|one": "1 yizen ur nettwaɣra ara.", + "Unread messages.": "Iznan ur nettwaɣra ara.", + "All Rooms": "Akk tixxamin", + "Unknown Command": "Taladna tarussint", + "Show Stickers": "Sken istikiyen", + "Mark all as read": "Creḍ kullec yettwaɣra", + "Error creating address": "Tuccḍa deg tmerna n tensa", + "Error removing address": "Tuccḍa deg tukksa n tensa", + "Main address": "Tansa tagejdant", + "Local address": "Tansa tadigant", + "Published Addresses": "Tansiwin tizuyaz", + "Local Addresses": "Tansiwin tidiganin", + "Room Name": "Isem n texxamt", + "Room Topic": "Asentel n texxamt", + "Room avatar": "Avaṭar n texxamt", + "Accepting…": "Aqbal...", + "Your homeserver": "Aqeddac-ik·im agejdan", + "Accepting …": "Aqbal...", + "Your display name": "Isem-ik·im yettwaskanen", + "Your avatar URL": "URL n avatar-inek·inem", + "%(brand)s URL": "%(brand)s URL", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Aseqdec n uwiǧit-a yezmer ad yebḍu isefka d %(widgetDomain)s & amsefrak-inek·inem n umsidef.", + "Using this widget may share data with %(widgetDomain)s.": "Aseqdec n uwiǧit-a yezmer ad bḍun yisefka d %(widgetDomain)s.", + "Widgets do not use message encryption.": "Iwiǧiten ur seqdacen ara awgelhen n yiznan.", + "Widget added by": "Awiǧit yettwarna sɣur", + "This widget may use cookies.": "Awiǧit-a yezmer ad iseqdec inagan n tuqqna.", + "Delete Widget": "Kkes awiǧit", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Tukksan n uwiǧit, ad t-tekkes akk i yiseqdacen n texxamt-nni. D tidet tebɣiḍ ad tekkseḍ awiǧit-a?", + "Delete widget": "Kkes awiǧit", + "Failed to remove widget": "Tukksa n uwiǧit ur teddi ara", + "An error ocurred whilst trying to remove the widget from the room": "Tella-d tuccḍa lawan n tukksa n uwiǧit seg texxamt", + "Minimize apps": "Semi isnasen", + "Maximize apps": "Semer isnasen", + "Popout widget": "Awiǧit attalan", + "Please create a new issue on GitHub so that we can investigate this bug.": "Ttxil-k·m rnu ugur amaynut deg GitHub akken ad nessiweḍ ad nezrew abug-a.", + "expand": "snefli", + "You cannot delete this image. (%(code)s)": "Ur tezmireḍ ara ad tekkseḍ tugna-a. (%(code)s)", + "Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s", + "Rotate Left": "Zzi ɣer uzelmaḍ", + "Rotate Right": "Zzi ɣer uyeffus", + "Language Dropdown": "Tabdart n udrurem n tutlayin", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)srnan-d %(count)s tikkal", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)srnan-d", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)syerna-d %(count)s tikkal", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)syerna-d", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)sffɣen %(count)s tikkal", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)sffɣen %(count)s", + "%(oneUser)sleft %(count)s times|other": "%(oneUsers)syeffeɣ %(count)s tikkal", + "%(oneUser)sleft %(count)s times|one": "%(oneUsers)syeffeɣ", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)srnan-d syen ffɣen %(count)s tikkal", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)srnan-d syen ffɣen", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)syerna-d syen yeffeɣ %(count)s tikkal", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)syerna-d syen yeffeɣ", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sffɣen syen uɣalen-d %(count)s tikkal", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sffɣen syen uɣalen-d", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)syeffeɣ-d syen yuɣal-d %(count)s tikkal", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)syeffeɣ-d syen yuɣal-d", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)sugin tinubgiwin-nsen %(count)s tikkal", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)sugin tinubgiwin-nsen", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)syugi tinubga-ines %(count)s tikkal", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)syugi tinubga-ines", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)sunfen i tinubgiwin-nsen yettwagin %(count)s tikkal", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)sunfen i tinubgiwin-nsen yettwagin", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)syunef i tinubga-ines yettwagin %(count)s tikkal", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)syunef i tinubga-ines yettwagin", + "were invited %(count)s times|other": "ttwanecden-d %(count)s tikkal", + "were invited %(count)s times|one": "ttwanecden-d", + "was invited %(count)s times|other": "yettwanced-d %(count)s tikkal", + "was invited %(count)s times|one": "yettwanced-d", + "were banned %(count)s times|other": "ttwazeglen %(count)s tikkal", + "were banned %(count)s times|one": "ttwazeglen", + "was banned %(count)s times|other": "yettwazgel %(count)s tikkal", + "was banned %(count)s times|one": "yettwazgel", + "were unbanned %(count)s times|other": "ur ttwazeglen ara %(count)s tikkal", + "were unbanned %(count)s times|one": "ur ttwazeglen ara", + "was unbanned %(count)s times|other": "ur yettwazgel ara %(count)s tikkal", + "was unbanned %(count)s times|one": "ur yettwazgel ara", + "were kicked %(count)s times|other": "ttwasuffɣen %(count)s tikkal", + "were kicked %(count)s times|one": "ttwasuffɣen", + "was kicked %(count)s times|other": "yettwasuffeɣ %(count)s tikkal", + "was kicked %(count)s times|one": "yettwasuffeɣ", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sbeddlen ismawen-nsen %(count)s tikkal", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sbeddlen ismawen-nsen", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sibeddel isem-is %(count)s tikkal", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sibeddel isem-is", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sbeddlen ivaṭaren-nsen %(count)s tikkal", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sbeddlen ivaṭaren-nsen", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sibeddel avaṭar-ines %(count)s tikkal", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sibeddel avaṭar-ines", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)sur gin ara isnifal %(count)s tikkal", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)sur gin ara isnifal", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)sur ye gi ara isnifal %(count)s tikkal", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)sur ye gi ara isnifal", + "QR Code": "Tangalt QR", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "YEgguma ad d-tali tedyant iɣef d-ttunefk tririt, ahat d tilin ur telli ara neɣ ur tesɛiḍ ara tisirag ad tt-twaliḍ.", + "Room address": "Tansa n texxamt", + "Some characters not allowed": "Kra n yisekkilen ur ttusirgen ara", + "This address is available to use": "Tansa-a tella i useqdec", + "This address is already in use": "Tansa-a ha-tt-an yakan deg useqdec", + "Room directory": "Akaram n texxamt", + "ex. @bob:example.com": "am. @bob:amedya.com", + "Looks good": "Ayagi yettban yelha", + "Can't find this server or its room list": "D awezɣi ad d-naf aqeddac-a neɣ tabdart-is n texxamt", + "All rooms": "Akk tixxamin", + "Your server": "Aqeddac-ik·im", + "Are you sure you want to remove %(serverName)s": "D tidet tebɣiḍ ad tekkseḍ %(serverName)s", + "Remove server": "Kkes aqeddac", + "Add a new server": "Rnu aqeddac amaynut", + "Enter the name of a new server you want to explore.": "Sekcem isem n uqeddac amaynut i tebɣiḍ ad tesnirmeḍ.", + "Add a new server...": "Rnu aqeddac amaynut...", + "%(networkName)s rooms": "Tixxamin %(networkName)s", + "Matrix rooms": "Tixxamin n Matrix", + "That doesn't look like a valid email address": "Ur tettban ara d tansa n yimayl tameɣtut", + "You have entered an invalid address.": "Teskecmeḍ tansa n yimayl tarameɣtut.", + "Try using one of the following valid address types: %(validTypesList)s.": "Ɛreḍ ad tesqedceḍ yiwen seg wanawen n tansa tameɣtut i d-iteddun: %(validTypesList)s.", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Seqdec aqeddac n timagit i uncad s yimayl. Seqdec (%(defaultIdentityServerName)s) amezwer neɣ sefrek deg yiɣewwaren.", + "Use an identity server to invite by email. Manage in Settings.": "Seqdec aqeddac n timagit i uncad s yimayl. Sefrek deg yiɣewwaren.", + "This room is public": "Taxxamt-a d tazayezt", + "Terms and Conditions": "Tiwtilin d tfadiwin", + "Review terms and conditions": "Senqed tiwtilin d tfadiwin", + "Your Communities": "Timɣiwnin-inek·inem", + "Communities": "Timɣiwnin", + "Remove %(name)s from the directory?": "Kkes %(name)s seg ukaram?", + "delete the address.": "kkes tansa.", + "Room not found": "Ur tettwaf ara texxamt", + "Find a room…": "Af-d taxxamt...", + "Search rooms": "Nadi tixxamin" } From 8b46a845726a3ca60e8edb4b1fbea78e237704e5 Mon Sep 17 00:00:00 2001 From: Mejans Date: Sat, 15 Aug 2020 13:52:10 +0000 Subject: [PATCH 021/174] Translated using Weblate (Occitan) Currently translated at 14.5% (339 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/oc/ --- src/i18n/strings/oc.json | 281 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 280 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/oc.json b/src/i18n/strings/oc.json index 124439a802..cd62ff69db 100644 --- a/src/i18n/strings/oc.json +++ b/src/i18n/strings/oc.json @@ -59,5 +59,284 @@ "This Room": "Aquesta sala", "All Rooms": "Totas les salas", "Search…": "Cercar…", - "Server error": "Error servidor" + "Server error": "Error servidor", + "Single Sign On": "Autentificacion unica", + "Confirm": "Confirmar", + "Dismiss": "Far desaparéisser", + "OK": "D’acòrdi", + "Continue": "Contunhar", + "Go Back": "En arrièr", + "Cancel": "Anullar", + "Sun": "Dg", + "Mon": "Dl", + "Tue": "Dm", + "Wed": "Dc", + "Thu": "Dj", + "Fri": "Dv", + "Sat": "Ds", + "Jan": "Gen", + "Feb": "Febr", + "Mar": "Març", + "Apr": "Abr", + "May": "mai", + "Jun": "Junh", + "Jul": "Julh", + "Aug": "Ago", + "Sep": "Set", + "Oct": "Oct", + "Nov": "Nov", + "Dec": "Dec", + "PM": "PM", + "AM": "AM", + "Trust": "Aprovacion", + "Sign In": "Se connectar", + "Default": "Predefinit", + "Moderator": "Moderator", + "Admin": "Admin", + "Operation failed": "L'operacion a fracassat", + "Messages": "Messatges", + "Actions": "Accions", + "Advanced": "Avançat", + "Other": "Autre", + "Usage": "Usatge", + "Command failed": "La comanda a fracassat", + "Thank you!": "Mercés !", + "Reason": "Rason", + "Light": "Clar", + "Dark": "Escur", + "Review": "Reveire", + "Notifications": "Notificacions", + "Close": "Tampar", + "Ok": "Validar", + "Set up": "Parametrar", + "Upgrade": "Metre a jorn", + "Verify": "Verificar", + "Update": "Mesa a jorn", + "Restart": "Reaviar", + "Font size": "Talha de poliça", + "Incoming video call": "Sonada vidèo entranta", + "Incoming call": "Sonada entranta", + "Accept": "Acceptar", + "Start": "Començament", + "Cancelling…": "Anullacion...", + "Fish": "Pes", + "Butterfly": "Parpalhòl", + "Tree": "Arborescéncia", + "Cloud": "Nívol", + "Apple": "Apple", + "Heart": "Còr", + "Clock": "Relòtge", + "Pencil": "Gredon", + "Scissors": "Cisèus intelligents", + "Lock": "Verrolhar", + "Key": "Clau", + "Telephone": "Telefòn", + "Trophy": "Trophy", + "Ball": "Balas", + "Anchor": "Ancorar", + "Headphones": "Escotadors", + "Folder": "Dorsièr", + "Pin": "Penjar", + "Upload": "Enviar", + "Show less": "Ne veire mens", + "Show more": "Ne veire mai", + "Current password": "Senhal actual", + "New Password": "Senhal novèl", + "Confirm password": "Confirmar lo senhal", + "Change Password": "Modificar senhal", + "not found": "pas trobat", + "exists": "existís", + "Authentication": "Autentificacion", + "ID": "ID", + "Manage": "Manage", + "Enable": "Activar", + "Restore from Backup": "Restablir a partir de l'archiu", + "Keywords": "Mots clau", + "Clear notifications": "Escafar", + "Off": "Atudat", + "Display Name": "Nom d'afichatge", + "Save": "Salvagardar", + "Disconnect": "Se desconnectar", + "Go back": "Precedent", + "Change": "Cambiar", + "Theme": "Tèma", + "Compact": "Ordenador", + "Success": "Succès", + "Profile": "Perfil", + "Account": "Compte", + "General": "General", + "Legal": "Legal", + "Credits": "Crèdits", + "FAQ": "FAQ", + "Keyboard Shortcuts": "Acorchis de clavièr", + "Versions": "Versions", + "Unsubscribe": "Se desabonar", + "Ignore": "Ignorar", + "Subscribe": "S'inscriure", + "Preferences": "Preferéncias", + "Composer": "Compositor", + "Timeline": "Axe temporal", + "Unignore": "Ignorar pas", + "Security & Privacy": "Seguretat e vida privada", + "Audio Output": "Sortida àudio", + "Microphone": "Microfòn", + "Camera": "Aparelh de fotografiar", + "Bridges": "Bridges", + "Sounds": "Sons", + "Reset": "Recomençar", + "Browse": "Percórrer", + "Unban": "Reabilitar", + "Permissions": "Permissions", + "Encryption": "Chiframent", + "Encrypted": "Chifrat", + "Complete": "Acabat", + "Revoke": "Revocar", + "Share": "Partiment", + "Add": "Ajustar", + "Phone Number": "Numèro de telefòn", + "Mod": "Moderador", + "Unencrypted": "Pas chifrat", + "Hangup": "Penjar", + "Italics": "Italicas", + "Strikethrough": "Raiat", + "Invites": "Convits", + "People": "Gent", + "Historical": "Istoric", + "Sign Up": "S’inscriure", + "Appearance": "Aparéncia", + "Sort by": "Triar per", + "Activity": "Activitat", + "A-Z": "A-Z", + "List options": "Opcions de lista", + "Favourite": "Favorit", + "Low Priority": "Prioritat bassa", + "Mark all as read": "Tot marcar coma legit", + "Members": "Participants", + "Trusted": "Fisable", + "Not trusted": "Pas securizat", + "Invite": "Convidar", + "Demote": "Retrogradar", + "Kick": "Forabandir", + "Ban": "Bandir", + "Are you sure?": "O volètz vertadièrament ?", + "Security": "Seguretat", + "Yes": "Òc", + "Got it": "Ai comprés", + "Sunday": "Dimenge", + "Monday": "Diluns", + "Tuesday": "Dimars", + "Wednesday": "Dimècres", + "Thursday": "Dijòus", + "Friday": "Divendres", + "Saturday": "Dissabte", + "Today": "Uèi", + "Yesterday": "Ièr", + "View Source": "Veire la font", + "Reply": "Respondre", + "Edit": "Editar", + "Attachment": "Pèça junta", + "Show image": "Afichar l'imatge", + "Show all": "O mostrar tot", + "Failed to copy": "Impossible de copiar", + "Smileys & People": "Emoticònas e personatges", + "Animals & Nature": "Animals e natura", + "Food & Drink": "Noiridura e bevenda", + "Activities": "Activitats", + "Travel & Places": "Viatges e luòcs", + "Objects": "Objèctes", + "Symbols": "Simbòls", + "Flags": "Marcadors", + "Categories": "Categorias", + "Cancel search": "Anullar la recèrca", + "More options": "Autras opcions", + "Join": "Jónher", + "No results": "Pas cap de resultat", + "Rotate Left": "Pivotar cap a èrra", + "Rotate Right": "Pivotar cap a drecha", + "Rotate clockwise": "Pivotar dins lo sens de las agulhas d'un relòtge", + "Add User": "Apondre un utilizaire", + "Matrix": "Matritz", + "Server name": "Títol del servidor", + "email address": "adreça de messatjariá", + "Notes": "Nòtas", + "Unavailable": "Pas disponible", + "Changelog": "Istoric dels cambiaments (Changelog)", + "Removing…": "Supression en cors…", + "Example": "Exemple", + "example": "exemple", + "Create": "Crear", + "Name": "Escais", + "Sign out": "Se desconnectar", + "Back": "Precedenta", + "Send": "Mandar", + "Toolbox": "Bóstia d'aisinas", + "Developer Tools": "Aisinas de desvolopament", + "An error has occurred.": "Una error s'es producha.", + "Suggestions": "Prepausicions", + "Go": "Validar", + "Session name": "Nom de session", + "Your password": "Vòstre senhal", + "Refresh": "Actualizada", + "Email address": "Adreça de corrièl", + "Skip": "Ignorar", + "Checking...": "Verificacion en cors...", + "Copy": "Copiar", + "Terms of Service": "Terms of Service", + "Service": "Servici", + "Summary": "Resumit", + "Document": "Document", + "Next": "Seguent", + "Upload files": "Mandar de fichièrs", + "Allow": "Autorizar", + "Deny": "Refusar", + "Custom": "Personalizada", + "Address (optional)": "Adreça (opcionala)", + "Leave": "Quitar", + "Forget": "Doblidar", + "Hide": "Amagar", + "Home": "Dorsièr personal", + "Sign in": "Connexion", + "Reload": "Tornar cargar", + "Away": "Absent", + "Submit": "Mandar", + "Enter password": "Sasissètz lo senhal", + "Email": "Corrièl", + "Username": "Nom d'_utilizaire", + "Phone": "Telefòn", + "Passwords don't match": "Los senhals correspondon pas", + "Register": "S'enregistrar", + "Free": "Liure", + "Premium": "De la melhora qualitat", + "Everyone": "Tot lo monde", + "Description": "descripcion", + "Unknown error": "Error desconeguda", + "Logout": "Desconnexion", + "Preview": "Apercebut", + "View": "Visualizacion", + "Search failed": "La recèrca a fracassat", + "Room": "Sala", + "Feedback": "Comentaris", + "Incorrect password": "Senhal incorrècte", + "Commands": "Comandas", + "Emoji": "Emoji", + "Users": "Utilizaires", + "Export": "Exportar", + "Import": "Importar", + "Restore": "Restablir", + "Download": "Telecargament", + "Retry": "Tornar ensajar", + "Success!": "Capitada !", + "Navigation": "Navigacion", + "Alt": "Alt", + "Alt Gr": "Alt Gr", + "Shift": "Descalatge", + "Super": "Super", + "Ctrl": "Ctrl", + "Upload a file": "Actualizar un fichièr", + "Page Up": "Pagina precedenta", + "Page Down": "Pagina seguenta", + "Esc": "Escap", + "Enter": "Entrada", + "Space": "Espaci", + "End": "Fin" } From fd3791de01f3f3b3961cbde006ce52e8d85e43e0 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Sun, 16 Aug 2020 19:04:51 +0000 Subject: [PATCH 022/174] Translated using Weblate (Portuguese (Brazil)) Currently translated at 97.0% (2263 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/pt_BR/ --- src/i18n/strings/pt_BR.json | 96 ++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index c82295e293..9db2be4b14 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -98,7 +98,7 @@ "VoIP conference started.": "Chamada em grupo iniciada.", "Who can access this room?": "Quem pode acessar esta sala?", "Who can read history?": "Quem pode ler o histórico da sala?", - "You do not have permission to post to this room": "Você não tem permissão de postar nesta sala", + "You do not have permission to post to this room": "Você não tem permissão para digitar nesta sala", "You have no visible notifications": "Voce não possui notificações visíveis", "Sun": "Dom", "Mon": "Seg", @@ -316,7 +316,7 @@ "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s alterou a foto da sala para ", "No Microphones detected": "Não foi detectado nenhum microfone", "No Webcams detected": "Nenhuma câmera detectada", - "No media permissions": "Não há permissões de uso de vídeo/áudio no seu navegador", + "No media permissions": "Não tem permissões para acessar a mídia", "You may need to manually permit %(brand)s to access your microphone/webcam": "Pode ser necessário permitir manualmente ao %(brand)s acessar seu microfone ou sua câmera", "Default Device": "Aparelho padrão", "Microphone": "Microfone", @@ -380,7 +380,7 @@ "(no answer)": "(sem resposta)", "(unknown failure: %(reason)s)": "(falha desconhecida: %(reason)s)", "Your browser does not support the required cryptography extensions": "O seu navegador não suporta as extensões de criptografia necessárias", - "Not a valid %(brand)s keyfile": "Não é um arquivo de chaves %(brand)s válido", + "Not a valid %(brand)s keyfile": "Não é um arquivo de chave válido do %(brand)s", "Authentication check failed: incorrect password?": "Falha ao checar a autenticação: senha incorreta?", "Do you want to set an email address?": "Você deseja definir um endereço de e-mail?", "This will allow you to reset your password and receive notifications.": "Isso permitirá que você redefina sua senha e receba notificações.", @@ -394,7 +394,7 @@ "Failed to invite the following users to %(groupId)s:": "Falha ao convidar os seguintes usuários para %(groupId)s:", "Failed to add the following rooms to %(groupId)s:": "Falha ao adicionar as seguintes salas em %(groupId)s:", "You are not in this room.": "Você não está nesta sala.", - "You do not have permission to do that in this room.": "Você não tem permissão para fazer isto nesta sala.", + "You do not have permission to do that in this room.": "Você não tem permissão para fazer isso nesta sala.", "Ignored user": "Usuário bloqueado", "You are no longer ignoring %(userId)s": "Você não está mais bloqueando %(userId)s", "Edit": "Editar", @@ -449,8 +449,8 @@ "Jump to read receipt": "Ir para a confirmação de leitura", "Mention": "Mencionar", "Invite": "Convidar", - "Send an encrypted reply…": "Enviar uma resposta criptografada…", - "Send an encrypted message…": "Enviar mensagem criptografada…", + "Send an encrypted reply…": "Digite sua resposta criptografada…", + "Send an encrypted message…": "Digite uma mensagem criptografada…", "Jump to message": "Pular para mensagem", "No pinned messages.": "Não há mensagens fixas.", "Loading...": "Carregando...", @@ -464,7 +464,7 @@ "Offline for %(duration)s": "Desconectado há %(duration)s", "Unknown for %(duration)s": "Status desconhecido há %(duration)s", "Unknown": "Desconhecido", - "Replying": "Respondendo", + "Replying": "Em resposta a", "No rooms to show": "Nenhuma sala para mostrar", "Unnamed room": "Sala sem nome", "World readable": "Aberto publicamente à leitura", @@ -640,7 +640,7 @@ "Failed to set direct chat tag": "Falha ao definir esta conversa como direta", "Failed to remove tag %(tagName)s from room": "Falha ao remover a tag %(tagName)s da sala", "Failed to add tag %(tagName)s to room": "Falha ao adicionar a tag %(tagName)s para a sala", - "Did you know: you can use communities to filter your %(brand)s experience!": "Você sabia? Você pode usar as comunidades para filtrar a sua experiência no %(brand)s!", + "Did you know: you can use communities to filter your %(brand)s experience!": "Você sabia? Você pode usar comunidades para filtrar a sua experiência no %(brand)s!", "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 criar um filtro, arraste a foto de uma comunidade sobre o painel de filtros na extrema esquerda da sua tela. Você pode clicar na foto de uma comunidade no painel de filtros a qualquer momento para ver apenas as salas e pessoas associadas com esta comunidade.", "Key request sent.": "Requisição de chave enviada.", "Fetching third party location failed": "Falha ao acessar a localização de terceiros", @@ -677,7 +677,7 @@ "Please set a password!": "Por favor, defina uma senha!", "You have successfully set a password!": "Você definiu sua senha com sucesso!", "An error occurred whilst saving your email notification preferences.": "Ocorreu um erro ao salvar sua configuração de notificações por e-mail.", - "Explore Room State": "Explorar Estado da Sala", + "Explore Room State": "Explorar estado da sala", "Source URL": "Link do código-fonte", "Messages sent by bot": "Mensagens enviadas por bots", "Filter results": "Filtrar resultados", @@ -696,9 +696,9 @@ "Search…": "Buscar…", "You have successfully set a password and an email address!": "Você definiu uma senha e um endereço de e-mail com sucesso!", "Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?", - "%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "O %(brand)s usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.", + "%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "%(brand)s usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.", "Developer Tools": "Ferramentas do desenvolvedor", - "Explore Account Data": "Explorar Dados da Conta", + "Explore Account Data": "Explorar dados da conta", "Remove from Directory": "Remover da lista pública de salas", "Saturday": "Sábado", "Remember, you can always set an email address in user settings if you change your mind.": "Lembre-se: você pode sempre definir um endereço de e-mail nas configurações de usuário, se mudar de ideia.", @@ -736,7 +736,7 @@ "Show message in desktop notification": "Mostrar a mensagem na notificação da área de trabalho", "Unhide Preview": "Mostrar a pré-visualização", "Unable to join network": "Não foi possível conectar na rede", - "Sorry, your browser is not able to run %(brand)s.": "Perdão. O seu navegador não é capaz de rodar o %(brand)s.", + "Sorry, your browser is not able to run %(brand)s.": "Infelizmente, o seu navegador não é capaz de rodar o %(brand)s.", "Messages in group chats": "Mensagens em salas", "Yesterday": "Ontem", "Error encountered (%(errorDetail)s).": "Erro encontrado (%(errorDetail)s).", @@ -766,7 +766,7 @@ "Call in Progress": "Chamada em andamento", "A call is currently being placed!": "Uma chamada já está em andamento!", "A call is already in progress!": "Uma chamada já está em andamento!", - "Permission Required": "Permissão Exigida", + "Permission Required": "Permissão necessária", "You do not have permission to start a conference call in this room": "Você não tem permissão para iniciar uma chamada em grupo nesta sala", "Unable to load! Check your network connectivity and try again.": "Incapaz de carregar! Verifique sua conectividade de rede e tente novamente.", "Failed to invite users to the room:": "Não foi possível convidar usuários para a sala:", @@ -867,7 +867,7 @@ "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 registros de depuração contêm dados de uso do aplicativo, incluindo seu nome de usuário, os IDs ou aliases das salas ou comunidades que você visitou e os nomes de usuários de outros usuários. Eles não contêm mensagens.", "Before submitting logs, you must create a GitHub issue to describe your problem.": "Antes de enviar os registros, você deve criar um bilhete de erro no GitHub para descrever seu problema.", "Unable to load commit detail: %(msg)s": "Não é possível carregar os detalhes do commit: %(msg)s", - "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Para evitar perder seu histórico de bate-papo, você deve exportar as chaves da sua sala antes de se desconectar. Para fazer isso, você precisará retornar na versão mais atual do %(brand)s", + "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Para evitar perder seu histórico de bate-papo, você precisa exportar as chaves da sua sala antes de se desconectar. Quando entrar novamente, você precisará usar a versão mais atual do %(brand)s", "Incompatible Database": "Banco de dados incompatível", "Continue With Encryption Disabled": "Continuar com criptografia desativada", "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Isso tornará sua conta permanentemente inutilizável. Você não poderá efetuar login e ninguém poderá registrar novamente o mesmo ID de usuário. Isso fará com que sua conta deixe todas as salas nas quais está participando e removerá os detalhes da sua conta do seu servidor de identidade. Esta ação é irreversível.", @@ -877,16 +877,16 @@ "To continue, please enter your password:": "Para continuar, por favor digite sua senha:", "Incompatible local cache": "Cache local incompatível", "Clear cache and resync": "Limpar cache e ressincronizar", - "%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s agora usa 3-5x menos memória, pois carrega informação sobre outros usuários apenas quando for necessário. Por favor, aguarde enquanto ressincronizamos com o servidor!", - "Updating %(brand)s": "Atualizando %(brand)s", + "%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s agora usa de 3 a 5 vezes menos memória, pois carrega as informações dos outros usuários apenas quando for necessário. Por favor, aguarde enquanto ressincronizamos com o servidor!", + "Updating %(brand)s": "Atualizando o %(brand)s", "Failed to upgrade room": "Falha ao atualizar a sala", "The room upgrade could not be completed": "A atualização da sala não pode ser completada", "Upgrade this room to version %(version)s": "Atualize essa sala para versão %(version)s", "Upgrade Room Version": "Atualize a Versão da Sala", "Create a new room with the same name, description and avatar": "Criar uma nova sala com o mesmo nome, descrição e foto", - "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Impedir usuários de conversar na versão antiga da sala e postar uma mensagem aconselhando os usuários a migrarem para a nova sala", + "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Impeça os usuários de conversarem na versão antiga da sala. Além disso, digite uma mensagem aconselhando os usuários a migrarem para a nova sala", "Put a link back to the old room at the start of the new room so people can see old messages": "Colocar um link para a sala antiga no começo da sala nova de modo que as pessoas possam ver mensagens antigas", - "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Você já usou o %(brand)s em %(host)s com o carregamento Lazy de membros ativado. Nesta versão, o carregamento Lazy está desativado. Como o cache local não é compatível entre essas duas configurações, a %(brand)s precisa ressincronizar sua conta.", + "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Você já usou o %(brand)s em %(host)s com o carregamento Lazy de membros ativado. Nesta versão, o carregamento Lazy está desativado. Como o cache local não é compatível entre essas duas configurações, o %(brand)s precisa ressincronizar sua conta.", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Se a outra versão do %(brand)s ainda estiver aberta em outra aba, por favor, feche-a pois usar o %(brand)s no mesmo host com o carregamento Lazy ativado e desativado simultaneamente causará problemas.", "Update any local room aliases to point to the new room": "Atualize todos os aliases da sala local para apontar para a nova sala", "Clear Storage and Sign Out": "Limpar armazenamento e sair", @@ -907,7 +907,7 @@ "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Acesse seu histórico de mensagens seguras e configure mensagens seguras digitando sua frase secreta de recuperação.", "Next": "Próximo", "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "Se você esqueceu sua frase secreta de recuperação, você pode usar sua chave de recuperação ou configurar novas opções de recuperação", - "This looks like a valid recovery key!": "Isso parece uma chave de recuperação válida!", + "This looks like a valid recovery key!": "A chave de recuperação está correta!", "Not a valid recovery key": "Não é uma chave de recuperação válida", "Access your secure message history and set up secure messaging by entering your recovery key.": "Acesse seu histórico seguro de mensagens e configure mensagens seguras inserindo sua chave de recuperação.", "Share Message": "Compartilhar Mensagem", @@ -984,19 +984,19 @@ "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s tornou a sala disponível apenas por convite.", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s alterou a regra de entrada para %(rule)s", "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s permitiu que os convidados entrem na sala.", - "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s impediu que os convidados entrassem na sala.", + "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s impediu que convidados entrassem na sala.", "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s alterou a permissão de acesso de convidados para %(rule)s", "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s ativou o ícone de %(groups)s nesta sala.", "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s desativou o ícone de %(groups)s nesta sala.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s ativou o ícone de %(newGroups)s e desativou o ícone de %(oldGroups)s nesta sala.", "%(displayName)s is typing …": "%(displayName)s está digitando…", "%(names)s and %(count)s others are typing …|other": "%(names)s e %(count)s outras pessoas estão digitando…", - "%(names)s and %(count)s others are typing …|one": "%(names)s e outro está digitando …", - "%(names)s and %(lastPerson)s are typing …": "%(names)s e %(lastPerson)s estão digitando …", + "%(names)s and %(count)s others are typing …|one": "%(names)s e outra pessoa estão digitando…", + "%(names)s and %(lastPerson)s are typing …": "%(names)s e %(lastPerson)s estão digitando…", "Show read receipts sent by other users": "Mostrar confirmações de leitura enviadas por outros usuários", "Show avatars in user and room mentions": "Mostrar fotos de perfil em menções de usuários e de salas", "Enable big emoji in chat": "Ativar emojis grandes no bate-papo", - "Send typing notifications": "Enviar notificações de digitação", + "Send typing notifications": "Permitir que saibam quando eu estiver digitando", "Enable Community Filter Panel": "Ativar o painel de comunidades", "Allow Peer-to-Peer for 1:1 calls": "Permitir Peer-to-Peer para chamadas 1:1", "Messages containing my username": "Mensagens contendo meu nome de usuário", @@ -1101,7 +1101,7 @@ "Deactivating your account is a permanent action - be careful!": "Desativar sua conta é uma ação permanente - tenha cuidado!", "General": "Geral", "Credits": "Créditos", - "For help with using %(brand)s, click here.": "Para ajuda com o uso do %(brand)s, clique aqui.", + "For help with using %(brand)s, click here.": "Para obter ajuda com o uso do %(brand)s, clique aqui.", "For help with using %(brand)s, click here or start a chat with our bot using the button below.": "Para obter ajuda com o uso do %(brand)s, clique aqui ou inicie um bate-papo com nosso bot usando o botão abaixo.", "Chat with %(brand)s Bot": "Converse com o bot do %(brand)s", "Help & About": "Ajuda & Sobre", @@ -1146,9 +1146,9 @@ "Add Email Address": "Adicionar endereço de e-mail", "Confirm adding phone number": "Confirmar adição de número de telefone", "Add Phone Number": "Adicionar número de telefone", - "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Se estiver usando %(brand)s em um aparelho onde touch é o mecanismo primário de entrada de dados", + "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Se estiver usando o %(brand)s em um aparelho onde a tela principal é touch", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Se você está usando ou não o recurso 'breadcrumbs' (fotos acima da lista de salas)", - "Whether you're using %(brand)s as an installed Progressive Web App": "Se estiver usando %(brand)s como uma Progressive Web App (PWA)", + "Whether you're using %(brand)s as an installed Progressive Web App": "Se estiver usando o %(brand)s como um Progressive Web App (PWA)", "Your user agent": "Seu agente de usuária(o)", "Call failed due to misconfigured server": "A chamada falhou por conta de má configuração no servidor", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Por favor, peça ao administrador do seu servidor (%(homeserverDomain)s) para configurar um servidor TURN, de modo que as chamadas funcionem de maneira estável.", @@ -1258,7 +1258,7 @@ "Cannot reach homeserver": "Não consigo acessar o servidor", "Ensure you have a stable internet connection, or get in touch with the server admin": "Verifique se está com uma conexão de internet estável, ou entre em contato com os administradores do servidor", "Your %(brand)s is misconfigured": "O %(brand)s está mal configurado", - "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Peça aos administradores do %(brand)s que verifique suas configurações por entradas incorretas ou duplicadas.", + "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Entre em contato com o administrador do %(brand)s para verificar se há entradas inválidas ou duplicadas nas suas configurações.", "Cannot reach identity server": "Não consigo acessar o servidor de identidade", "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode se registrar, mas algumas funcionalidades não estarão disponíveis até que o servidor de identidade esteja de volta online. Se você continuar vendo este alerta, verifique sua configuração ou entre em contato com um dos administradores do servidor.", "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode trocar sua senha, mas algumas das funcionalidades não estarão mais disponíveis até que o servidor de identidade esteja de volta ao ar. Se você seguir vendo este alerta, verifique suas configurações ou entre em contato com um dos administradores do servidor.", @@ -1283,7 +1283,7 @@ "%(num)s days from now": "dentro de %(num)s dias", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "The user's homeserver does not support the version of the room.": "O servidor desta(e) usuária(o) não suporta a versão desta sala.", - "Help us improve %(brand)s": "Ajude-nos a melhorar %(brand)s", + "Help us improve %(brand)s": "Ajude-nos a melhorar o %(brand)s", "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Envie dados anônimos de uso que nos ajudam a melhorar o %(brand)s. Isso necessitará do uso de um cookie.", "I want to help": "Quero ajudar", "Review where you’re logged in": "Revisar onde você está logada(o)", @@ -1323,7 +1323,7 @@ "%(senderName)s: %(message)s": "%(senderName)s: %(message)s", "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", - "New spinner design": "Novo design do spinner", + "New spinner design": "Nova aparência do símbolo de carregamento", "Multiple integration managers": "Múltiplos gestores de integrações", "Try out new ways to ignore people (experimental)": "Tente novas maneiras de bloquear pessoas (experimental)", "Support adding custom themes": "Permite adicionar temas personalizados", @@ -1332,7 +1332,7 @@ "Font size": "Tamanho da fonte", "Use custom size": "Usar tamanho personalizado", "Use a more compact ‘Modern’ layout": "Usar um layout mais compacto 'Moderno'", - "Show typing notifications": "Mostrar notificações de digitação", + "Show typing notifications": "Mostrar quando alguém estiver digitando", "Match system theme": "Se adaptar ao tema do sistema", "Use a system font": "Usar uma fonte do sistema", "System font name": "Nome da fonte do sistema", @@ -1427,8 +1427,8 @@ "Manage": "Gerenciar", "Securely cache encrypted messages locally for them to appear in search results.": "Armazene mensagens criptografadas de forma segura localmente para que possam aparecer nos resultados das buscas.", "Enable": "Ativar", - "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "%(brand)s não está com alguns dos componentes necessários para armazenar com segurança mensagens criptografadas localmente. Se você quer fazer testes com esta funcionalidade, construa uma versão Desktop do %(brand)s com componentes de busca ativos.", - "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s não consegue armazenar de forma segura as mensagens criptografadas localmente enquanto funciona em um navegador web. Use %(brand)s Desktop para que mensagens criptografadas sejam exibidas nos resultados de buscas.", + "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "%(brand)s precisa de componentes adicionais para pesquisar as mensagens criptografadas armazenadas localmente. Se quiser testar esse recurso, construa uma versão do %(brand)s para Computador com componentes de busca ativados.", + "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s não consegue pesquisar as mensagens criptografadas armazenadas localmente em um navegador de internet. Use o %(brand)s para Computador para que as mensagens criptografadas sejam exibidas nos resultados de buscas.", "Connecting to integration manager...": "Conectando ao gestor de integrações...", "Cannot connect to integration manager": "Não foi possível conectar ao gerenciador de integrações", "The integration manager is offline or it cannot reach your homeserver.": "Ou o gerenciador de integrações está desconectado, ou ele não conseguiu acessar o seu servidor.", @@ -1493,7 +1493,7 @@ "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "Você apagará para todos as %(count)s mensagens de %(user)s na sala. Isso não pode ser desfeito. Deseja continuar?", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Você está a ponto de remover 1 mensagem de %(user)s. Isso não poderá ser desfeito. Quer continuar?", "This client does not support end-to-end encryption.": "A sua versão do aplicativo não suporta a criptografia de ponta a ponta.", - "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "A sessão que você está tentando verificar não permite escanear QR code ou verificação via emojis, que é o que %(brand)s permite. Tente um cliente diferente.", + "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "A sessão que você deseja verificar não é compatível com o escaneamento de código QR ou a verificação via emojis do %(brand)s. Tente verificar a partir de outro aplicativo do Element.", "Verify by scanning": "Verificar através de QR Code", "If you can't scan the code above, verify by comparing unique emoji.": "Se você não consegue escanear o código acima, verifique comparando os emojis únicos.", "Verify by comparing unique emoji.": "Verificar comparando emoji único.", @@ -1550,7 +1550,7 @@ "Enter your Security Phrase or to continue.": "Entre com sua Frase de Segurança ou para continuar.", "Security Key": "Chave de Segurança", "Use your Security Key to continue.": "Use sua Chave de Segurança para continuar.", - "Recovery key mismatch": "A chave de segurança não corresponde à correta", + "Recovery key mismatch": "Chave de recuperação incorreta", "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "O backup não pôde ser descriptografado com esta chave de recuperação: por favor, verifique se você entrou com a chave de recuperação correta.", "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "O backup não pôde ser descriptografado com esta frase de recuperação: por favor, verifique se você entrou com a frase de recuperação correta.", "Warning: you should only set up key backup from a trusted computer.": "Atenção: você só deve configurar a cópia de segurança (backup) das chaves em um computador de sua confiança.", @@ -1564,7 +1564,7 @@ "Welcome to %(appName)s": "Bem-vinda/o ao %(appName)s", "Liberate your communication": "Liberte sua comunicação", "Send a Direct Message": "Enviar uma mensagem", - "Explore Public Rooms": "Explore as salas públicas", + "Explore Public Rooms": "Explorar salas públicas", "Create a Group Chat": "Criar um chat de grupo", "Explore rooms": "Explorar salas", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Detectamos uma versão mais antiga do %(brand)s. Isso fará com que a criptografia de ponta a ponta não funcione corretamente. As mensagens criptografadas de ponta a ponta trocadas recentemente, enquanto você usava a versão mais antiga, talvez não sejam descriptografáveis na nova versão. Isso também poderá fazer com que as mensagens trocadas nesta sessão falhem na mais atual. Se você tiver problemas, desconecte-se e entre novamente. Para manter o histórico de mensagens, exporte e reimporte suas chaves.", @@ -1575,7 +1575,7 @@ "Create account": "Criar conta", "Create your account": "Criar sua conta", "Use Recovery Key or Passphrase": "Use a chave de recuperação, ou a frase de recuperação", - "Use Recovery Key": "Use a chave de recuperação", + "Use Recovery Key": "Usar a chave de recuperação", "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirme sua identidade através da verificação deste login em qualquer uma de suas outras sessões, garantindo a elas acesso a mensagens criptografadas.", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sua nova sessão está agora verificada. Ela tem acesso às suas mensagens criptografadas, e outras(os) usuárias(os) poderão ver esta sessão como confiável.", "Without completing security on this session, it won’t have access to encrypted messages.": "Sem completar os procedimentos de segurança nesta sessão, você não terá acesso a mensagens criptografadas.", @@ -1608,7 +1608,7 @@ "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Esta sessão detectou que sua frase e chave de recuperação para Mensagens Seguras foram removidas.", "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Se você fez isso acidentalmente, você pode configurar Mensagens Seguras nesta sessão, o que vai re-criptografar o histórico de mensagens desta sessão com um novo método de recuperação.", "If disabled, messages from encrypted rooms won't appear in search results.": "Se desativado, as mensagens de salas criptografadas não aparecerão em resultados de buscas.", - "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s está armazenando de forma segura as mensagens criptografadas localmente, para que possam aparecer em resultados das buscas:", + "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s está armazenando de forma segura as mensagens criptografadas localmente, para que possam aparecer nos resultados das buscas:", "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s de %(totalRooms)s", "Jump to start/end of the composer": "Pule para o início/fim do compositor", "Click the button below to confirm adding this phone number.": "Clique no botão abaixo para confirmar a adição deste número de telefone.", @@ -1728,7 +1728,7 @@ "Your display name": "Seu nome e sobrenome", "Your avatar URL": "Link da sua foto de perfil", "Your user ID": "Sua ID de usuário", - "%(brand)s URL": "Link de %(brand)s", + "%(brand)s URL": "Link do %(brand)s", "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s & seu Gerenciador de Integrações.", "Using this widget may share data with %(widgetDomain)s.": "Se você usar esse widget, os dados poderão ser compartilhados com %(widgetDomain)s.", "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s não fizeram alterações %(count)s vezes", @@ -1767,7 +1767,7 @@ "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Você não pôde se conectar na sua conta. Entre em contato com o administrador do servidor para obter mais informações.", "Confirm adding this phone number by using Single Sign On to prove your identity.": "Confirme a adição deste número de telefone usando o Login Único para provar sua identidade.", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Use um servidor de identidade para convidar por e-mail. Clique em continuar para usar o servidor de identidade padrão (%(defaultIdentityServerName)s) ou gerencie nas Configurações.", - "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Você pode ter configurado estas opções em um cliente que não seja %(brand)s. Você não pode ajustar essas opções no %(brand)s, mas elas ainda se aplicam.", + "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Você pode ter configurado estas opções em um aplicativo que não seja o %(brand)s. Você não pode ajustar essas opções no %(brand)s, mas elas ainda se aplicam.", "Enable audible notifications for this session": "Ativar o som de notificações nesta sessão", "Display Name": "Nome e sobrenome", "Identity Server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS", @@ -1797,7 +1797,7 @@ "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Desconectar-se do servidor de identidade significa que você não poderá ser descoberto por outros usuários e não poderá convidar outras pessoas por e-mail ou número de celular.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Usar um servidor de identidade é opcional. Se você optar por não usar um servidor de identidade, não poderá ser descoberto por outros usuários e não poderá convidar outras pessoas por e-mail ou por número de celular.", "Do not use an identity server": "Não usar um servidor de identidade", - "Enter a new identity server": "Digitar um novo servidor de identidade", + "Enter a new identity server": "Digite um novo servidor de identidade", "Change": "Alterar", "Manage integrations": "Gerenciar integrações", "New version available. Update now.": "Nova versão disponível. Atualize agora.", @@ -1813,9 +1813,9 @@ "Message layout": "Aparência da mensagem", "Compact": "Compacto", "Modern": "Moderno", - "Set the name of a font installed on your system & %(brand)s will attempt to use it.": "Defina o nome de uma fonte instalada no seu sistema e %(brand)s tentará usá-la.", + "Set the name of a font installed on your system & %(brand)s will attempt to use it.": "Defina o nome de uma fonte instalada no seu sistema e o %(brand)s tentará usá-la.", "Customise your appearance": "Personalize sua aparência", - "Appearance Settings only affect this %(brand)s session.": "As Configurações de aparência afetam apenas esta sessão do %(brand)s.", + "Appearance Settings only affect this %(brand)s session.": "As configurações de aparência afetam apenas esta sessão do %(brand)s.", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Sua senha foi alterada com sucesso. Você não receberá notificações pop-up em outras sessões até fazer login novamente nelas", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Concorde com os Termos de Serviço do servidor de identidade (%(serverName)s), para que você possa ser descoberto por endereço de e-mail ou por número de celular.", "Discovery": "Contatos", @@ -1852,10 +1852,10 @@ "You can still join it because this is a public room.": "Você ainda pode entrar, porque esta é uma sala pública.", "Join the discussion": "Participar da discussão", "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Este convite para %(roomName)s foi enviado para %(email)s, que não está associado à sua conta", - "Link this email with your account in Settings to receive invites directly in %(brand)s.": "Vincule esse e-mail à sua conta em Configurações, para receber convites diretamente em %(brand)s.", + "Link this email with your account in Settings to receive invites directly in %(brand)s.": "Vincule esse e-mail à sua conta em Configurações, para receber convites diretamente no %(brand)s.", "This invite to %(roomName)s was sent to %(email)s": "Este convite para %(roomName)s foi enviado para %(email)s", - "Use an identity server in Settings to receive invites directly in %(brand)s.": "Use um servidor de identidade em Configurações para receber convites diretamente em %(brand)s.", - "Share this email in Settings to receive invites directly in %(brand)s.": "Compartilhe este e-mail em Configurações para receber convites diretamente em %(brand)s.", + "Use an identity server in Settings to receive invites directly in %(brand)s.": "Use um servidor de identidade em Configurações para receber convites diretamente no %(brand)s.", + "Share this email in Settings to receive invites directly in %(brand)s.": "Compartilhe este e-mail em Configurações para receber convites diretamente no %(brand)s.", "Do you want to chat with %(user)s?": "Deseja conversar com %(user)s?", " wants to chat": " quer conversar", "Do you want to join %(roomName)s?": "Deseja se juntar a %(roomName)s?", @@ -1972,7 +1972,7 @@ "Mod": "Moderador", "Scroll to most recent messages": "Ir para as mensagens mais recentes", "Close preview": "Fechar a visualização", - "Send a reply…": "Enviar uma resposta…", + "Send a reply…": "Digite sua resposta…", "Send a message…": "Digite uma mensagem…", "Bold": "Negrito", "Italics": "Itálico", @@ -2034,7 +2034,7 @@ "Destroy cross-signing keys?": "Destruir chaves autoverificadas?", "Waiting for partner to confirm...": "Aguardando seu contato confirmar...", "Enable 'Manage Integrations' in Settings to do this.": "Para fazer isso, ative 'Gerenciar Integrações' nas Configurações.", - "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Seu %(brand)s não permite que você use o Gerenciador de Integrações para fazer isso. Entre em contato com um administrador.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Seu %(brand)s não permite que você use o Gerenciador de Integrações para fazer isso. Entre em contato com o administrador.", "Confirm to continue": "Confirme para continuar", "Click the button below to confirm your identity.": "Clique no botão abaixo para confirmar sua identidade.", "Failed to invite the following users to chat: %(csvUsers)s": "Falha ao convidar os seguintes usuários para a conversa: %(csvUsers)s", @@ -2193,7 +2193,7 @@ "Reload": "Recarregar", "Take picture": "Tirar uma foto", "Country Dropdown": "Selecione o país", - "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "Você pode usar as opções personalizadas do servidor para entrar em outros servidores Matrix especificando um endereço de servidor local diferente. Isso permite que você use %(brand)s com uma conta Matrix existente em um servidor local diferente.", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "Você pode usar as opções personalizadas do servidor para entrar em outros servidores Matrix especificando um endereço de servidor local diferente. Isso permite que você use o %(brand)s com uma conta Matrix existente em um servidor local diferente.", "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Nenhum servidor de identidade está configurado, portanto você não pode adicionar um endereço de e-mail para redefinir sua senha no futuro.", "Enter your custom identity server URL What does this mean?": "Digite o endereço do servidor de identidade personalizado O que isso significa?", "Join millions for free on the largest public server": "Junte-se a milhões de pessoas gratuitamente no maior servidor público", From 20c245ecd4b32a07012cf02a929632f5563de1ea Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Sat, 15 Aug 2020 07:51:20 +0000 Subject: [PATCH 023/174] Translated using Weblate (Russian) Currently translated at 100.0% (2333 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index ed685cc6ce..b584f83f2d 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2405,5 +2405,7 @@ "You’re all caught up": "Нет непрочитанных сообщений", "You have no visible notifications in this room.": "Нет видимых уведомлений в этой комнате.", "%(brand)s Android": "%(brand)s Android", - "Master private key:": "Приватный мастер-ключ:" + "Master private key:": "Приватный мастер-ключ:", + "Show message previews for reactions in DMs": "Показывать превью сообщений для реакций в ЛС", + "Show message previews for reactions in all rooms": "Показывать предварительный просмотр сообщений для реакций во всех комнатах" } From 21cb4b3fd445b8d2e39b472d3a720aeed0c8a90b Mon Sep 17 00:00:00 2001 From: strix aluco Date: Fri, 14 Aug 2020 20:03:16 +0000 Subject: [PATCH 024/174] Translated using Weblate (Ukrainian) Currently translated at 52.1% (1215 of 2333 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index de19a22397..62bfe2f1ab 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -556,9 +556,9 @@ "Decline (%(counter)s)": "Відхилити (%(counter)s)", "Language and region": "Мова та регіон", "Account management": "Керування обліковим записом", - "Deactivating your account is a permanent action - be careful!": "Деактивація вашого облікового запису є безповоротною дією — будьте обережні!", - "Deactivate Account": "Деактивувати обліковий запис", - "Deactivate account": "Знедіяти обліківку", + "Deactivating your account is a permanent action - be careful!": "Знедіяння вашого облікового запису є безповоротним — будьте обережні!", + "Deactivate Account": "Знедіяти обліковий запис", + "Deactivate account": "Знедіяти обліковий запис", "Legal": "Правова інформація", "Credits": "Подяки", "For help with using %(brand)s, click here.": "Якщо необхідна допомога у користуванні %(brand)s'ом, клацніть тут.", @@ -582,7 +582,7 @@ "This invite to %(roomName)s was sent to %(email)s": "Це запрошення до %(roomName)s було надіслане на %(email)s", "Use an identity server in Settings to receive invites directly in %(brand)s.": "Використовувати сервер ідентифікації у Налаштуваннях щоб отримувати запрошення прямо у %(brand)s.", "Are you sure you want to deactivate your account? This is irreversible.": "Ви впевнені у тому, що бажаєте знедіяти ваш обліковий запис? Ця дія безповоротна.", - "Confirm account deactivation": "Підтвердьте деактивацію облікового запису", + "Confirm account deactivation": "Підтвердьте знедіювання облікового запису", "To continue, please enter your password:": "Щоб продовжити, введіть, будь ласка, ваш пароль:", "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Ваш обліковий запис стане назавжди невикористовним. Ви не матимете змоги увійти в нього і ніхто не зможе перереєструватись під цим користувацьким ID. Це призведе до виходу вашого облікового запису з усіх кімнат та до видалення деталей вашого облікового запису з вашого серверу ідентифікації. Ця дія є безповоротною.", "Verify session": "Звірити сесію", @@ -807,8 +807,8 @@ "General": "Загальні", "Discovery": "Виявлення", "Help & About": "Допомога та про програму", - "Bug reporting": "Повідомити про помилку", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Якщо ви відправляли помилки через GitHub, журнали можуть допомогти нам виявити проблеми. Журнали відладки, що містять інформацію про використані додатки, включають ваше ім’я користувача, ідентифікатори або псевдоніми кімнат або груп, які ви відвідували, а також імена інших користувачів. Вони не містять повідомлень.", + "Bug reporting": "Звітування про вади", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Якщо ви подали ваду через GitHub, журнали зневадження можуть допомогти нам відстежити проблему. Журнали зневадження містять дані використання застосунку, включно з вашим користувацьким ім’ям, ідентифікаторами або псевдонімами відвіданих вами кімнат або груп, а також іменами інших користувачів. Вони не містять повідомлень.", "Submit debug logs": "Надіслати журнал зневадження", "Clear cache and reload": "Очистити кеш та перезавантажити", "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "Щоб повідомити про проблеми безпеки Matrix, будь ласка, прочитайте Політику розкриття інформації Matrix.org.", @@ -1226,5 +1226,8 @@ "Create account": "Створити обліковий запис", "Failed to fetch avatar URL": "Не вдалось вибрати URL личини", "Clear room list filter field": "Очистити поле цідила списку кімнат", - "Cancel autocomplete": "Скасувати самодоповнення" + "Cancel autocomplete": "Скасувати самодоповнення", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Журнали зневадження містять дані використання застосунку, включно з вашим користувацьким ім’ям, ідентифікаторами або псевдонімами відвіданих вами кімнат або груп, а також іменами інших користувачів. Вони не містять повідомлень.", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "Підтвердьте знедіяння вашого облікового запису через Single Sign On щоб підтвердити вашу особу.", + "This account has been deactivated.": "Цей обліковий запис було знедіяно." } From aed2c24b736b2e4312dbd1294d9e2347b1d3f6e1 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Mon, 17 Aug 2020 09:18:39 +0000 Subject: [PATCH 025/174] Translated using Weblate (Russian) Currently translated at 100.0% (2334 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 b584f83f2d..1e2763f59f 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2407,5 +2407,6 @@ "%(brand)s Android": "%(brand)s Android", "Master private key:": "Приватный мастер-ключ:", "Show message previews for reactions in DMs": "Показывать превью сообщений для реакций в ЛС", - "Show message previews for reactions in all rooms": "Показывать предварительный просмотр сообщений для реакций во всех комнатах" + "Show message previews for reactions in all rooms": "Показывать предварительный просмотр сообщений для реакций во всех комнатах", + "Explore public rooms": "Просмотреть публичные комнаты" } From 7ca3707b2fd4931f996a8d6481d27906dcfe2e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 17 Aug 2020 10:53:36 +0000 Subject: [PATCH 026/174] Translated using Weblate (Estonian) Currently translated at 99.8% (2329 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 29c1d17b01..857877e61f 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2407,5 +2407,6 @@ "Show message previews for reactions in DMs": "Näita eelvaates otsesõnumitele regeerimisi", "Show message previews for reactions in all rooms": "Näita kõikides jututubades eelvaadetes sõnumitele regeerimisi", "Master private key:": "Üldine privaatvõti:", - "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud" + "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud", + "Explore public rooms": "Sirvi avalikke jututubasid" } From 7389be2a5fd8cd3a1ecb741e6dc9d4b9697deee8 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Mon, 17 Aug 2020 10:13:36 +0000 Subject: [PATCH 027/174] Translated using Weblate (Hungarian) Currently translated at 100.0% (2334 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 7914da4d51..d2581b4405 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2412,5 +2412,6 @@ "Attach files from chat or just drag and drop them anywhere in a room.": "Csatolj fájlt a csevegésből vagy húzd és ejtsd bárhova a szobában.", "You’re all caught up": "Mindent elolvastál", "You have no visible notifications in this room.": "Nincsenek látható értesítéseid ebben a szobában.", - "%(brand)s Android": "%(brand)s Android" + "%(brand)s Android": "%(brand)s Android", + "Explore public rooms": "Nyilvános szobák felderítése" } From 96087d61f689b97217548cb2a47a69e51b69e58b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 17 Aug 2020 13:12:18 -0600 Subject: [PATCH 028/174] Convert feature setting usages to regular settings --- src/FromWidgetPostMessageApi.js | 2 +- src/components/structures/LeftPanel.tsx | 2 +- .../avatars/MemberStatusMessageAvatar.js | 4 +- .../views/context_menus/MessageContextMenu.js | 2 +- .../views/dialogs/RoomSettingsDialog.js | 2 +- .../views/dialogs/UserSettingsDialog.js | 2 +- src/components/views/elements/AppTile.js | 2 +- .../views/elements/InlineSpinner.js | 2 +- .../views/elements/ManageIntegsButton.js | 2 +- src/components/views/elements/Spinner.js | 2 +- src/components/views/messages/MessageEvent.js | 2 +- src/components/views/right_panel/UserInfo.js | 2 +- src/components/views/rooms/AppsDrawer.js | 2 +- src/components/views/rooms/AuxPanel.js | 6 +- src/components/views/rooms/MemberTile.js | 4 +- src/components/views/rooms/RoomHeader.js | 2 +- src/components/views/rooms/Stickerpicker.js | 2 +- .../tabs/user/AppearanceUserSettingsTab.tsx | 2 +- .../settings/tabs/user/LabsUserSettingsTab.js | 2 +- src/hooks/useSettings.ts | 4 +- src/rageshake/submit-rageshake.ts | 2 +- src/settings/SettingsStore.ts | 71 ------------------- src/stores/CustomRoomTagStore.js | 2 +- src/stores/room-list/RoomListStore.ts | 2 +- .../previews/ReactionEventPreview.ts | 4 +- 25 files changed, 30 insertions(+), 101 deletions(-) diff --git a/src/FromWidgetPostMessageApi.js b/src/FromWidgetPostMessageApi.js index 1b4aa19ebf..d5d7c08d50 100644 --- a/src/FromWidgetPostMessageApi.js +++ b/src/FromWidgetPostMessageApi.js @@ -197,7 +197,7 @@ export default class FromWidgetPostMessageApi { const integId = (data && data.integId) ? data.integId : null; // TODO: Open the right integration manager for the widget - if (SettingsStore.isFeatureEnabled("feature_many_integration_managers")) { + if (SettingsStore.getValue("feature_many_integration_managers")) { IntegrationManagers.sharedInstance().openAll( MatrixClientPeg.get().getRoom(RoomViewStore.getRoomId()), `type_${integType}`, diff --git a/src/components/structures/LeftPanel.tsx b/src/components/structures/LeftPanel.tsx index bc17bbe23f..a0d7f3d9ea 100644 --- a/src/components/structures/LeftPanel.tsx +++ b/src/components/structures/LeftPanel.tsx @@ -377,7 +377,7 @@ export default class LeftPanel extends React.Component { const tagPanel = !this.state.showTagPanel ? null : (
- {SettingsStore.isFeatureEnabled("feature_custom_tags") ? : null} + {SettingsStore.getValue("feature_custom_tags") ? : null}
); diff --git a/src/components/views/avatars/MemberStatusMessageAvatar.js b/src/components/views/avatars/MemberStatusMessageAvatar.js index eef3f86d9a..d5d927106c 100644 --- a/src/components/views/avatars/MemberStatusMessageAvatar.js +++ b/src/components/views/avatars/MemberStatusMessageAvatar.js @@ -53,7 +53,7 @@ export default class MemberStatusMessageAvatar extends React.Component { if (this.props.member.userId !== MatrixClientPeg.get().getUserId()) { throw new Error("Cannot use MemberStatusMessageAvatar on anyone but the logged in user"); } - if (!SettingsStore.isFeatureEnabled("feature_custom_status")) { + if (!SettingsStore.getValue("feature_custom_status")) { return; } const { user } = this.props.member; @@ -105,7 +105,7 @@ export default class MemberStatusMessageAvatar extends React.Component { resizeMethod={this.props.resizeMethod} />; - if (!SettingsStore.isFeatureEnabled("feature_custom_status")) { + if (!SettingsStore.getValue("feature_custom_status")) { return avatar; } diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index 59e3d4c230..6fa54058a0 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -81,7 +81,7 @@ export default createReactClass({ let canPin = room.currentState.mayClientSendStateEvent('m.room.pinned_events', cli); // HACK: Intentionally say we can't pin if the user doesn't want to use the functionality - if (!SettingsStore.isFeatureEnabled("feature_pinning")) canPin = false; + if (!SettingsStore.getValue("feature_pinning")) canPin = false; this.setState({canRedact, canPin}); }, diff --git a/src/components/views/dialogs/RoomSettingsDialog.js b/src/components/views/dialogs/RoomSettingsDialog.js index 7ad1001f75..613708e436 100644 --- a/src/components/views/dialogs/RoomSettingsDialog.js +++ b/src/components/views/dialogs/RoomSettingsDialog.js @@ -87,7 +87,7 @@ export default class RoomSettingsDialog extends React.Component { , )); - if (SettingsStore.isFeatureEnabled("feature_bridge_state")) { + if (SettingsStore.getValue("feature_bridge_state")) { tabs.push(new Tab( ROOM_BRIDGES_TAB, _td("Bridges"), diff --git a/src/components/views/dialogs/UserSettingsDialog.js b/src/components/views/dialogs/UserSettingsDialog.js index 1f1a8d1523..820de713c1 100644 --- a/src/components/views/dialogs/UserSettingsDialog.js +++ b/src/components/views/dialogs/UserSettingsDialog.js @@ -54,7 +54,7 @@ export default class UserSettingsDialog extends React.Component { super(); this.state = { - mjolnirEnabled: SettingsStore.isFeatureEnabled("feature_mjolnir"), + mjolnirEnabled: SettingsStore.getValue("feature_mjolnir"), }; } diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 75946f19c1..a52dea3e0a 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -311,7 +311,7 @@ export default class AppTile extends React.Component { this.props.onEditClick(); } else { // TODO: Open the right manager for the widget - if (SettingsStore.isFeatureEnabled("feature_many_integration_managers")) { + if (SettingsStore.getValue("feature_many_integration_managers")) { IntegrationManagers.sharedInstance().openAll( this.props.room, 'type_' + this.props.app.type, diff --git a/src/components/views/elements/InlineSpinner.js b/src/components/views/elements/InlineSpinner.js index 89b5e6f19d..ce3c738f3b 100644 --- a/src/components/views/elements/InlineSpinner.js +++ b/src/components/views/elements/InlineSpinner.js @@ -28,7 +28,7 @@ export default createReactClass({ const imgClass = this.props.imgClassName || ""; let imageSource; - if (SettingsStore.isFeatureEnabled('feature_new_spinner')) { + if (SettingsStore.getValue('feature_new_spinner')) { imageSource = require("../../../../res/img/spinner.svg"); } else { imageSource = require("../../../../res/img/spinner.gif"); diff --git a/src/components/views/elements/ManageIntegsButton.js b/src/components/views/elements/ManageIntegsButton.js index ac8a98a94a..0990218c65 100644 --- a/src/components/views/elements/ManageIntegsButton.js +++ b/src/components/views/elements/ManageIntegsButton.js @@ -34,7 +34,7 @@ export default class ManageIntegsButton extends React.Component { if (!managers.hasManager()) { managers.openNoManagerDialog(); } else { - if (SettingsStore.isFeatureEnabled("feature_many_integration_managers")) { + if (SettingsStore.getValue("feature_many_integration_managers")) { managers.openAll(this.props.room); } else { managers.getPrimaryManager().open(this.props.room); diff --git a/src/components/views/elements/Spinner.js b/src/components/views/elements/Spinner.js index 033d4d13f4..4d2dcea90a 100644 --- a/src/components/views/elements/Spinner.js +++ b/src/components/views/elements/Spinner.js @@ -22,7 +22,7 @@ import SettingsStore from "../../../settings/SettingsStore"; const Spinner = ({w = 32, h = 32, imgClassName, message}) => { let imageSource; - if (SettingsStore.isFeatureEnabled('feature_new_spinner')) { + if (SettingsStore.getValue('feature_new_spinner')) { imageSource = require("../../../../res/img/spinner.svg"); } else { imageSource = require("../../../../res/img/spinner.gif"); diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index eb74270762..c3e5af2eb6 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -95,7 +95,7 @@ export default createReactClass({ } } - if (SettingsStore.isFeatureEnabled("feature_mjolnir")) { + if (SettingsStore.getValue("feature_mjolnir")) { const key = `mx_mjolnir_render_${this.props.mxEvent.getRoomId()}__${this.props.mxEvent.getId()}`; const allowRender = localStorage.getItem(key) === "true"; diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index b52792b3d1..71ee86a1ea 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1428,7 +1428,7 @@ const UserInfoHeader = ({onClose, member, e2eStatus}) => { presenceLastActiveAgo = member.user.lastActiveAgo; presenceCurrentlyActive = member.user.currentlyActive; - if (SettingsStore.isFeatureEnabled("feature_custom_status")) { + if (SettingsStore.getValue("feature_custom_status")) { statusMessage = member.user._unstable_statusMessage; } } diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 06dfffad30..8cf7a54da2 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -130,7 +130,7 @@ export default createReactClass({ }, _launchManageIntegrations: function() { - if (SettingsStore.isFeatureEnabled("feature_many_integration_managers")) { + if (SettingsStore.getValue("feature_many_integration_managers")) { IntegrationManagers.sharedInstance().openAll(); } else { IntegrationManagers.sharedInstance().getPrimaryManager().open(this.props.room, 'add_integ'); diff --git a/src/components/views/rooms/AuxPanel.js b/src/components/views/rooms/AuxPanel.js index ad66f0e151..521aeec406 100644 --- a/src/components/views/rooms/AuxPanel.js +++ b/src/components/views/rooms/AuxPanel.js @@ -104,7 +104,7 @@ export default createReactClass({ }, _rateLimitedUpdate: new RateLimitedFunc(function() { - if (SettingsStore.isFeatureEnabled("feature_state_counters")) { + if (SettingsStore.getValue("feature_state_counters")) { this.setState({counters: this._computeCounters()}); } }, 500), @@ -112,7 +112,7 @@ export default createReactClass({ _computeCounters: function() { let counters = []; - if (this.props.room && SettingsStore.isFeatureEnabled("feature_state_counters")) { + if (this.props.room && SettingsStore.getValue("feature_state_counters")) { const stateEvs = this.props.room.currentState.getStateEvents('re.jki.counter'); stateEvs.sort((a, b) => { return a.getStateKey() < b.getStateKey(); @@ -206,7 +206,7 @@ export default createReactClass({ />; let stateViews = null; - if (this.state.counters && SettingsStore.isFeatureEnabled("feature_state_counters")) { + if (this.state.counters && SettingsStore.getValue("feature_state_counters")) { let counters = []; this.state.counters.forEach((counter, idx) => { diff --git a/src/components/views/rooms/MemberTile.js b/src/components/views/rooms/MemberTile.js index 3be378b341..ebb8b7999d 100644 --- a/src/components/views/rooms/MemberTile.js +++ b/src/components/views/rooms/MemberTile.js @@ -50,7 +50,7 @@ export default createReactClass({ componentDidMount() { const cli = MatrixClientPeg.get(); - if (SettingsStore.isFeatureEnabled("feature_custom_status")) { + if (SettingsStore.getValue("feature_custom_status")) { const { user } = this.props.member; if (user) { user.on("User._unstable_statusMessage", this._onStatusMessageCommitted); @@ -209,7 +209,7 @@ export default createReactClass({ const presenceState = member.user ? member.user.presence : null; let statusMessage = null; - if (member.user && SettingsStore.isFeatureEnabled("feature_custom_status")) { + if (member.user && SettingsStore.getValue("feature_custom_status")) { statusMessage = this.state.statusMessage; } diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 1dedd53d00..fe5b12c1c0 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -226,7 +226,7 @@ export default createReactClass({ title={_t("Settings")} />; } - if (this.props.onPinnedClick && SettingsStore.isFeatureEnabled('feature_pinning')) { + if (this.props.onPinnedClick && SettingsStore.getValue('feature_pinning')) { let pinsIndicator = null; if (this._hasUnreadPins()) { pinsIndicator = (
); diff --git a/src/components/views/rooms/Stickerpicker.js b/src/components/views/rooms/Stickerpicker.js index b48790a9cf..dba25a94cf 100644 --- a/src/components/views/rooms/Stickerpicker.js +++ b/src/components/views/rooms/Stickerpicker.js @@ -363,7 +363,7 @@ export default class Stickerpicker extends React.Component { */ _launchManageIntegrations() { // TODO: Open the right integration manager for the widget - if (SettingsStore.isFeatureEnabled("feature_many_integration_managers")) { + if (SettingsStore.getValue("feature_many_integration_managers")) { IntegrationManagers.sharedInstance().openAll( this.props.room, `type_${WidgetType.STICKERPICKER.preferred}`, diff --git a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx index c646025bbe..c9ec4a6bc7 100644 --- a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx @@ -237,7 +237,7 @@ export default class AppearanceUserSettingsTab extends React.Component; } } diff --git a/src/hooks/useSettings.ts b/src/hooks/useSettings.ts index 4d1e1d5bad..9534fccc4c 100644 --- a/src/hooks/useSettings.ts +++ b/src/hooks/useSettings.ts @@ -36,11 +36,11 @@ export const useSettingValue = (settingName: string, roomId: string = null, excl // Hook to fetch whether a feature is enabled and dynamically update when that changes export const useFeatureEnabled = (featureName: string, roomId: string = null) => { - const [enabled, setEnabled] = useState(SettingsStore.isFeatureEnabled(featureName, roomId)); + const [enabled, setEnabled] = useState(SettingsStore.getValue(featureName, roomId)); useEffect(() => { const ref = SettingsStore.watchSetting(featureName, roomId, () => { - setEnabled(SettingsStore.isFeatureEnabled(featureName, roomId)); + setEnabled(SettingsStore.getValue(featureName, roomId)); }); // clean-up return () => { diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index 76b0444052..80034691c8 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -143,7 +143,7 @@ export default async function sendBugReport(bugReportEndpoint: string, opts: IOp } // add labs options - const enabledLabs = SettingsStore.getLabsFeatures().filter(f => SettingsStore.isFeatureEnabled(f)); + const enabledLabs = SettingsStore.getLabsFeatures().filter(f => SettingsStore.getValue(f)); if (enabledLabs.length) { body.append('enabled_labs', enabledLabs.join(', ')); } diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index e64de8af16..6c1f9b8411 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -240,19 +240,6 @@ export default class SettingsStore { return _t(displayName as string); } - /** - * Returns a list of all available labs feature names - * @returns {string[]} The list of available feature names - */ - public static getLabsFeatures(): string[] { - const possibleFeatures = Object.keys(SETTINGS).filter((s) => SettingsStore.isFeature(s)); - - const enableLabs = SdkConfig.get()["enableLabs"]; - if (enableLabs) return possibleFeatures; - - return possibleFeatures.filter((s) => SettingsStore.getFeatureState(s) === "labs"); - } - /** * Determines if a setting is also a feature. * @param {string} settingName The setting to look up. @@ -263,39 +250,6 @@ export default class SettingsStore { return SETTINGS[settingName].isFeature; } - /** - * Determines if a given feature is enabled. The feature given must be a known - * feature. - * @param {string} settingName The name of the setting that is a feature. - * @param {String} roomId The optional room ID to validate in, may be null. - * @return {boolean} True if the feature is enabled, false otherwise - */ - public static isFeatureEnabled(settingName: string, roomId: string = null) { - if (!SettingsStore.isFeature(settingName)) { - throw new Error("Setting " + settingName + " is not a feature"); - } - - return SettingsStore.getValue(settingName, roomId); - } - - /** - * Sets a feature as enabled or disabled on the current device. - * @param {string} settingName The name of the setting. - * @param {boolean} value True to enable the feature, false otherwise. - * @returns {Promise} Resolves when the setting has been set. - */ - public static setFeatureEnabled(settingName: string, value: any): Promise { - // Verify that the setting is actually a setting - if (!SETTINGS[settingName]) { - throw new Error("Setting '" + settingName + "' does not appear to be a setting."); - } - if (!SettingsStore.isFeature(settingName)) { - throw new Error("Setting " + settingName + " is not a feature"); - } - - return SettingsStore.setValue(settingName, null, SettingLevel.DEVICE, value); - } - /** * Gets the value of a setting. The room ID is optional if the setting is not to * be applied to any particular room, otherwise it should be supplied. @@ -346,13 +300,6 @@ export default class SettingsStore { const minIndex = levelOrder.indexOf(level); if (minIndex === -1) throw new Error("Level " + level + " is not prioritized"); - if (SettingsStore.isFeature(settingName)) { - const configValue = SettingsStore.getFeatureState(settingName); - if (configValue === "enable") return true; - if (configValue === "disable") return false; - // else let it fall through the default process - } - const handlers = SettingsStore.getHandlers(settingName); // Check if we need to invert the setting at all. Do this after we get the setting @@ -611,24 +558,6 @@ export default class SettingsStore { return handlers; } - - private static getFeatureState(settingName: string): LabsFeatureState { - const featuresConfig = SdkConfig.get()['features']; - const enableLabs = SdkConfig.get()['enableLabs']; // we'll honour the old flag - - let featureState = enableLabs ? "labs" : "disable"; - if (featuresConfig && featuresConfig[settingName] !== undefined) { - featureState = featuresConfig[settingName]; - } - - const allowedStates = ['enable', 'disable', 'labs']; - if (!allowedStates.includes(featureState)) { - console.warn("Feature state '" + featureState + "' is invalid for " + settingName); - featureState = "disable"; // to prevent accidental features. - } - - return featureState; - } } // For debugging purposes diff --git a/src/stores/CustomRoomTagStore.js b/src/stores/CustomRoomTagStore.js index 1f24dc589a..39177181b4 100644 --- a/src/stores/CustomRoomTagStore.js +++ b/src/stores/CustomRoomTagStore.js @@ -137,7 +137,7 @@ class CustomRoomTagStore extends EventEmitter { } _getUpdatedTags() { - if (!SettingsStore.isFeatureEnabled("feature_custom_tags")) { + if (!SettingsStore.getValue("feature_custom_tags")) { return {}; // none } diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index f4c2d5050e..0f3138fe9e 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -136,7 +136,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { } private async readAndCacheSettingsFromStore() { - const tagsEnabled = SettingsStore.isFeatureEnabled("feature_custom_tags"); + const tagsEnabled = SettingsStore.getValue("feature_custom_tags"); await this.updateState({ tagsEnabled, }); diff --git a/src/stores/room-list/previews/ReactionEventPreview.ts b/src/stores/room-list/previews/ReactionEventPreview.ts index c8f2be9a6e..95cdc01c66 100644 --- a/src/stores/room-list/previews/ReactionEventPreview.ts +++ b/src/stores/room-list/previews/ReactionEventPreview.ts @@ -24,8 +24,8 @@ import DMRoomMap from "../../../utils/DMRoomMap"; export class ReactionEventPreview implements IPreview { public getTextFor(event: MatrixEvent, tagId?: TagID): string { - const showDms = SettingsStore.isFeatureEnabled("feature_roomlist_preview_reactions_dms"); - const showAll = SettingsStore.isFeatureEnabled("feature_roomlist_preview_reactions_all"); + const showDms = SettingsStore.getValue("feature_roomlist_preview_reactions_dms"); + const showAll = SettingsStore.getValue("feature_roomlist_preview_reactions_all"); if (!showAll && (!showDms || DMRoomMap.shared().getUserIdForRoomId(event.getRoomId()))) return null; From eda4e24926c00138db2fbbea850ce90b3875560b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 17 Aug 2020 13:19:15 -0600 Subject: [PATCH 029/174] Update LabsUserSettings for new feature behaviour --- .../views/settings/tabs/user/LabsUserSettingsTab.js | 4 ++-- src/settings/SettingsStore.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js index 2666671a30..6559448dfe 100644 --- a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js @@ -28,7 +28,7 @@ export class LabsSettingToggle extends React.Component { }; _onChange = async (checked) => { - await SettingsStore.setFeatureEnabled(this.props.featureId, checked); + await SettingsStore.setValue(this.props.featureId, null, SettingLevel.DEVICE, checked); this.forceUpdate(); }; @@ -46,7 +46,7 @@ export default class LabsUserSettingsTab extends React.Component { render() { const SettingsFlag = sdk.getComponent("views.elements.SettingsFlag"); - const flags = SettingsStore.getLabsFeatures().map(f => ); + const flags = SettingsStore.getFeatureSettingNames().map(f => ); return (
{_t("Labs")}
diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index 6c1f9b8411..ea7d965720 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -124,6 +124,14 @@ export default class SettingsStore { // Counter used for generation of watcher IDs private static watcherCount = 1; + /** + * Gets all the feature-style setting names. + * @returns {string[]} The names of the feature settings. + */ + public static getFeatureSettingNames(): string[] { + return Object.keys(SETTINGS).filter(n => SettingsStore.isFeature(n)); + } + /** * Watches for changes in a particular setting. This is done without any local echo * wrapping and fires whenever a change is detected in a setting's value, at any level. From 71643862c04b93976c3cc77b3d848e2d4fb4b30c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 17 Aug 2020 13:24:55 -0600 Subject: [PATCH 030/174] Implement new config style for features --- src/settings/SettingsStore.ts | 2 +- src/settings/handlers/ConfigSettingsHandler.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index ea7d965720..dd75f8d1c9 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -53,7 +53,7 @@ const LEVEL_HANDLERS = { [SettingLevel.ROOM_ACCOUNT]: new RoomAccountSettingsHandler(defaultWatchManager), [SettingLevel.ACCOUNT]: new AccountSettingsHandler(defaultWatchManager), [SettingLevel.ROOM]: new RoomSettingsHandler(defaultWatchManager), - [SettingLevel.CONFIG]: new ConfigSettingsHandler(), + [SettingLevel.CONFIG]: new ConfigSettingsHandler(featureNames), [SettingLevel.DEFAULT]: new DefaultSettingsHandler(defaultSettings, invertedDefaultSettings), }; diff --git a/src/settings/handlers/ConfigSettingsHandler.ts b/src/settings/handlers/ConfigSettingsHandler.ts index 3e8b1724c1..791c655a0d 100644 --- a/src/settings/handlers/ConfigSettingsHandler.ts +++ b/src/settings/handlers/ConfigSettingsHandler.ts @@ -24,9 +24,24 @@ import {isNullOrUndefined} from "matrix-js-sdk/src/utils"; * roomId parameter. */ export default class ConfigSettingsHandler extends SettingsHandler { + public constructor(private featureNames: string[]) { + super(); + } + public getValue(settingName: string, roomId: string): any { const config = SdkConfig.get() || {}; + if (this.featureNames.includes(settingName)) { + const labsConfig = config["features"] || {}; + const val = labsConfig[settingName]; + if (isNullOrUndefined(val)) return null; // no definition at this level + if (val === true || val === false) return val; // new style: mapped as a boolean + if (val === "enable") return true; // backwards compat + if (val === "disable") return false; // backwards compat + if (val === "labs") return null; // backwards compat, no override + return null; // fallback in the case of invalid input + } + // Special case themes if (settingName === "theme") { return config["default_theme"]; From 2c0e6c859ab21c0e23b5a5a97cc3d7225819ec58 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 17 Aug 2020 13:32:33 -0600 Subject: [PATCH 031/174] Update settings documentation for features --- docs/settings.md | 85 ++++++++++++------------------------------------ 1 file changed, 20 insertions(+), 65 deletions(-) diff --git a/docs/settings.md b/docs/settings.md index 46e4a68fdb..40c3e6a7d6 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -9,13 +9,13 @@ of dealing with the different levels and exposes easy to use getters and setters ## Levels Granular Settings rely on a series of known levels in order to use the correct value for the scenario. These levels, in -order of prioirty, are: +order of priority, are: * `device` - The current user's device * `room-device` - The current user's device, but only when in a specific room * `room-account` - The current user's account, but only when in a specific room * `account` - The current user's account * `room` - A specific room (setting for all members of the room) -* `config` - Values are defined by the `settingDefaults` key (usually) in `config.json` +* `config` - Values are defined by the `settingDefaults` key (usually) in `config.tson` * `default` - The hardcoded default for the settings Individual settings may control which levels are appropriate for them as part of the defaults. This is often to ensure @@ -25,33 +25,10 @@ that room administrators cannot force account-only settings upon participants. ## Settings Settings are the different options a user may set or experience in the application. These are pre-defined in -`src/settings/Settings.js` under the `SETTINGS` constant and have the following minimum requirements: -``` -// The ID is used to reference the setting throughout the application. This must be unique. -"theSettingId": { - // The levels this setting supports is required. In `src/settings/Settings.js` there are various pre-set arrays - // for this option - they should be used where possible to avoid copy/pasting arrays across settings. - supportedLevels: [...], +`src/settings/Settings.ts` under the `SETTINGS` constant, and match the `ISetting` interface as defined there. - // The default for this setting serves two purposes: It provides a value if the setting is not defined at other - // levels, and it serves to demonstrate the expected type to other developers. The value isn't enforced, but it - // should be respected throughout the code. The default may be any data type. - default: false, - - // The display name has two notations: string and object. The object notation allows for different translatable - // strings to be used for different levels, while the string notation represents the string for all levels. - - displayName: _td("Change something"), // effectively `displayName: { "default": _td("Change something") }` - displayName: { - "room": _td("Change something for participants of this room"), - - // Note: the default will be used if the level requested (such as `device`) does not have a string defined here. - "default": _td("Change something"), - } -} -``` - -Settings that support the config level can be set in the config file under the `settingDefaults` key (note that some settings, like the "theme" setting, are special cased in the config file): +Settings that support the config level can be set in the config file under the `settingDefaults` key (note that some +settings, like the "theme" setting, are special cased in the config file): ```json { ... @@ -119,38 +96,29 @@ for you. If a display name cannot be found, it will return `null`. ## Features -Occasionally some parts of the application may be undergoing testing and are not quite production ready. These are -commonly known to be behind a "labs flag". Features behind lab flags must go through the granular settings system, and -look and act very much normal settings. The exception is that they must supply `isFeature: true` as part of the setting -definition and should go through the helper functions on `SettingsStore`. +Feature flags are just like regular settings with some underlying semantics for how they are meant to be used. Usually +a feature flag is used when a portion of the application is under development or not ready for full release yet, such +as new functionality or experimental ideas. In these cases, the feature name *should* be named with the `feature_*` +convention and must be tagged with `isFeature: true` in the setting definition. By doing so, the feature will automatically +appear in the "labs" section of the user's settings. -Although features have levels and a default value, the calculation of those options is blocked by the feature's state. -A feature's state is determined from the `SdkConfig` and is a little complex. If `enableLabs` (a legacy flag) is `true` -then the feature's state is `labs`, if it is `false`, the state is `disable`. If `enableLabs` is not set then the state -is determined from the `features` config, such as in the following: +Features can be controlled at the config level using the following structure: ```json "features": { - "feature_lazyloading": "labs" + "feature_lazyloading": true } ``` -In this example, `feature_lazyloading` is in the `labs` state. It may also be in the `enable` or `disable` state with a -similar approach. If the state is invalid, the feature is in the `disable` state. A feature's levels are only calculated -if it is in the `labs` state, therefore the default only applies in that scenario. If the state is `enable`, the feature -is always-on. -Once a feature flag has served its purpose, it is generally recommended to remove it and the associated feature flag -checks. This would enable the feature implicitly as it is part of the application now. +When `true`, the user will see the feature as enabled. Similarly, when `false` the user will see the feature as disabled. +The user will only be able to change/see these states if `showLabsSettings: true` is in the config. ### Determining if a feature is enabled -A simple call to `SettingsStore.isFeatureEnabled` will tell you if the feature is enabled. This will perform all the -required calculations to determine if the feature is enabled based upon the configuration and user selection. +Call `SettingsStore.getValue()` as you would for any other setting. ### Enabling a feature -Features can only be enabled if the feature is in the `labs` state, otherwise this is a no-op. To find the current set -of features in the `labs` state, call `SettingsStore.getLabsFeatures`. To set the value, call -`SettingsStore.setFeatureEnabled`. +Call `SettingsStore.setValue("feature_name", null, SettingLevel.DEVICE, true)`. ## Setting controllers @@ -162,7 +130,7 @@ kept up to date with the setting where it is otherwise not possible. An example they can only be considered enabled if the platform supports notifications, and enabling notifications requires additional steps to actually enable notifications. -For more information, see `src/settings/controllers/SettingController.js`. +For more information, see `src/settings/controllers/SettingController.ts`. ## Local echo @@ -222,7 +190,7 @@ The `SettingsStore` uses the hardcoded `LEVEL_ORDER` constant to ensure that it The array is checked from left to right, simulating the behaviour of overriding values from the higher levels. Each level should be defined in this array, including `default`. -Handlers (`src/settings/handlers/SettingsHandler.js`) represent a single level and are responsible for getting and +Handlers (`src/settings/handlers/SettingsHandler.ts`) represent a single level and are responsible for getting and setting values at that level. Handlers also provide additional information to the `SettingsStore` such as if the level is supported or if the current user may set values at the level. The `SettingsStore` will use the handler to enforce checks and manipulate settings. Handlers are also responsible for dealing with migration patterns or legacy settings for @@ -230,7 +198,7 @@ their level (for example, a setting being renamed or using a different key from Handlers are provided to the `SettingsStore` via the `LEVEL_HANDLERS` constant. `SettingsStore` will optimize lookups by only considering handlers that are supported on the platform. -Local echo is achieved through `src/settings/handlers/LocalEchoWrapper.js` which acts as a wrapper around a given +Local echo is achieved through `src/settings/handlers/LocalEchoWrapper.ts` which acts as a wrapper around a given handler. This is automatically applied to all defined `LEVEL_HANDLERS` and proxies the calls to the wrapped handler where possible. The echo is achieved by a simple object cache stored within the class itself. The cache is invalidated immediately upon the proxied save call succeeding or failing. @@ -240,20 +208,7 @@ Controllers are notified of changes by the `SettingsStore`, and are given the op ### Features -Features automatically get considered as `disabled` if they are not listed in the `SdkConfig` or `enableLabs` is -false/not set. Features are always checked against the configuration before going through the level order as they have -the option of being forced-on or forced-off for the application. This is done by the `features` section and looks -something like this: - -``` -"features": { - "feature_groups": "enable", - "feature_pinning": "disable", // the default - "feature_presence": "labs" -} -``` - -If `enableLabs` is true in the configuration, the default for features becomes `"labs"`. +See above for feature reference. ### Watchers From 3659115921ade127e46bf9a5f5b5abdd1147dc0e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 17 Aug 2020 13:37:16 -0600 Subject: [PATCH 032/174] Followup on some SettingsStore removals --- src/components/views/dialogs/UserSettingsDialog.js | 2 +- src/rageshake/submit-rageshake.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/UserSettingsDialog.js b/src/components/views/dialogs/UserSettingsDialog.js index 820de713c1..ffde03fe31 100644 --- a/src/components/views/dialogs/UserSettingsDialog.js +++ b/src/components/views/dialogs/UserSettingsDialog.js @@ -116,7 +116,7 @@ export default class UserSettingsDialog extends React.Component { "mx_UserSettingsDialog_securityIcon", , )); - if (SdkConfig.get()['showLabsSettings'] || SettingsStore.getLabsFeatures().length > 0) { + if (SdkConfig.get()['showLabsSettings']) { tabs.push(new Tab( USER_LABS_TAB, _td("Labs"), diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index 80034691c8..1dcf929e86 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -143,7 +143,7 @@ export default async function sendBugReport(bugReportEndpoint: string, opts: IOp } // add labs options - const enabledLabs = SettingsStore.getLabsFeatures().filter(f => SettingsStore.getValue(f)); + const enabledLabs = SettingsStore.getFeatureSettingNames().filter(f => SettingsStore.getValue(f)); if (enabledLabs.length) { body.append('enabled_labs', enabledLabs.join(', ')); } From 4f851542ac882243b52a383106dc64d588fbd0e8 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 17 Aug 2020 13:51:41 -0600 Subject: [PATCH 033/174] Implement force state for features like in the proposal --- .../views/settings/tabs/user/LabsUserSettingsTab.js | 3 ++- src/settings/SettingsStore.ts | 7 ++++++- test/end-to-end-tests/riot/config-template/config.json | 5 +---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js index 6559448dfe..eba5c6586d 100644 --- a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js @@ -35,7 +35,8 @@ export class LabsSettingToggle extends React.Component { render() { const label = SettingsStore.getDisplayName(this.props.featureId); const value = SettingsStore.getValue(this.props.featureId); - return ; + const canChange = SettingsStore.canSetValue(this.props.featureId, null, SettingLevel.DEVICE); + return ; } } diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index dd75f8d1c9..9e146ad799 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -23,7 +23,6 @@ import AccountSettingsHandler from "./handlers/AccountSettingsHandler"; import RoomSettingsHandler from "./handlers/RoomSettingsHandler"; import ConfigSettingsHandler from "./handlers/ConfigSettingsHandler"; import { _t } from '../languageHandler'; -import SdkConfig from "../SdkConfig"; import dis from '../dispatcher/dispatcher'; import { ISetting, SETTINGS } from "./Settings"; import LocalEchoWrapper from "./handlers/LocalEchoWrapper"; @@ -435,6 +434,12 @@ export default class SettingsStore { throw new Error("Setting '" + settingName + "' does not appear to be a setting."); } + // When features are specified in the config.json, we force them as enabled or disabled. + if (SettingsStore.isFeature(settingName)) { + const configVal = SettingsStore.getValueAt(SettingLevel.CONFIG, settingName, roomId, true, true); + if (configVal === true || configVal === false) return false; + } + const handler = SettingsStore.getHandler(settingName, level); if (!handler) return false; return handler.canSetValue(settingName, roomId); diff --git a/test/end-to-end-tests/riot/config-template/config.json b/test/end-to-end-tests/riot/config-template/config.json index d0d3a288e4..b647d0bec8 100644 --- a/test/end-to-end-tests/riot/config-template/config.json +++ b/test/end-to-end-tests/riot/config-template/config.json @@ -9,10 +9,7 @@ "integrations_ui_url": "https://scalar.vector.im/", "integrations_rest_url": "https://scalar.vector.im/api", "bug_report_endpoint_url": "https://riot.im/bugreports/submit", - "features": { - "feature_groups": "labs", - "feature_pinning": "labs" - }, + "showLabsSettings": true, "default_federate": true, "welcomePageUrl": "home.html", "default_theme": "light", From a039582cfc52b0ec68408e5d86d1ae15eb8e2950 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 18 Aug 2020 07:54:37 +0000 Subject: [PATCH 034/174] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2334 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 5a354ec27c..cef1d21701 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2415,5 +2415,6 @@ "%(brand)s Android": "%(brand)s Android", "Master private key:": "主控私鑰:", "Show message previews for reactions in DMs": "在直接訊息中顯示反應的訊息預覽", - "Show message previews for reactions in all rooms": "在所有聊天室中顯示反應的訊息預覽" + "Show message previews for reactions in all rooms": "在所有聊天室中顯示反應的訊息預覽", + "Explore public rooms": "探索公開聊天室" } From 8d23072e78326e662c3f7f4684e56b8298b0d13a Mon Sep 17 00:00:00 2001 From: XoseM Date: Tue, 18 Aug 2020 05:27:51 +0000 Subject: [PATCH 035/174] Translated using Weblate (Galician) Currently translated at 100.0% (2334 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index c5501ac187..e023ce9801 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2412,5 +2412,6 @@ "%(brand)s Android": "%(brand)s Android", "Master private key:": "Chave mestra principal:", "Show message previews for reactions in DMs": "Mostrar vista previa das mensaxes para reaccións en MDs", - "Show message previews for reactions in all rooms": "Mostrar vista previa das mensaxes para reaccións en todas as salas" + "Show message previews for reactions in all rooms": "Mostrar vista previa das mensaxes para reaccións en todas as salas", + "Explore public rooms": "Explorar salas públicas" } From 6d82203b3b1904f8a7344ce12423f0dd5d5677a0 Mon Sep 17 00:00:00 2001 From: random Date: Mon, 17 Aug 2020 13:44:43 +0000 Subject: [PATCH 036/174] Translated using Weblate (Italian) Currently translated at 100.0% (2334 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 6c5fe1d4db..fb76f3a621 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2415,5 +2415,6 @@ "You have no visible notifications in this room.": "Non hai alcuna notifica visibile in questa stanza.", "%(brand)s Android": "%(brand)s Android", "Show message previews for reactions in DMs": "Mostra anteprime messaggi per le reazioni nei messaggi diretti", - "Show message previews for reactions in all rooms": "Mostra anteprime messaggi per le reazioni in tutte le stanze" + "Show message previews for reactions in all rooms": "Mostra anteprime messaggi per le reazioni in tutte le stanze", + "Explore public rooms": "Esplora stanze pubbliche" } From 25f74581cb139e5da89614c1de8bfc585b707cd5 Mon Sep 17 00:00:00 2001 From: call_xz Date: Mon, 17 Aug 2020 14:11:16 +0000 Subject: [PATCH 037/174] Translated using Weblate (Japanese) Currently translated at 58.6% (1367 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 7c818e1596..4edf415efb 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -579,7 +579,7 @@ "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s は退出しました", "%(oneUser)sleft %(count)s times|other": "%(oneUser)s は %(count)s 回退出しました", "%(oneUser)sleft %(count)s times|one": "%(oneUser)s は退出しました", - "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s が%(count)s 回参加し、退出した", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s が %(count)s 回参加し、退出しました", "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s は参加して退出しました", "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s が %(count)s 回参加し退出しました", "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s が参加し退出しました", @@ -668,7 +668,7 @@ "Update any local room aliases to point to the new room": "新しいルームを指すようにローカルルームのエイリアスを更新する", "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "古いバージョンの部屋でのユーザーの発言を停止し、新しい部屋に移動するようユーザーに通知するメッセージを投稿する", "Mention": "記載", - "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s が %(count)s 回招待を撤回した", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s が %(count)s 回招待を取り消しました", "was unbanned %(count)s times|one": "ブロック解除されました", "Put a link back to the old room at the start of the new room so people can see old messages": "新しい部屋の始めに古い部屋にリンクを張って、人々が古いメッセージを見ることができるようにする", "Sign out": "サインアウト", @@ -1375,5 +1375,17 @@ "%(num)s hours ago": "%(num)s 時間前", "%(num)s days ago": "%(num)s 日前", "Favourited": "お気に入り登録中", - "Room options": "部屋の設定" + "Room options": "部屋の設定", + "Ignored users": "無視しているユーザー", + "Show tray icon and minimize window to it on close": "トレイアイコンを表示しウィンドウを閉じても最小化して待機する", + "This message cannot be decrypted": "メッセージが復号できません", + "Unencrypted": "暗号化されていません", + "Encrypted by a deleted session": "削除済みのセッションによる暗号化", + "Scroll to most recent messages": "最新のメッセージを表示", + "Emoji picker": "絵文字を選択", + "All rooms": "全ての部屋", + "Your server": "あなたのサーバー", + "Matrix": "Matrix", + "Add a new server": "新しいサーバーを追加", + "Server name": "サーバー名" } From ef9e1b494a4a15769008e18d1e00437a449090c3 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Mon, 17 Aug 2020 18:52:06 +0000 Subject: [PATCH 038/174] Translated using Weblate (Kabyle) Currently translated at 60.0% (1401 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 50 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 377da10d56..653a198e3a 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1240,7 +1240,7 @@ "Trumpet": "Lɣiḍa", "Bell": "Anayna", "Pin": "Amessak", - "Your server isn't responding to some requests.": "Aqeddac-inek·inem ur d-yettarra ara ɣef kra n yisuturen. ", + "Your server isn't responding to some requests.": "Aqeddac-inek·inem ur d-yettarra ara ɣef kra n yisuturen.", "Decline (%(counter)s)": "Agi (%(counter)s)", "Failed to upload profile picture!": "Asali n tewlaft n umaɣnu ur yeddui ara!", "No display name": "Ulac meffer isem", @@ -1398,5 +1398,51 @@ "delete the address.": "kkes tansa.", "Room not found": "Ur tettwaf ara texxamt", "Find a room…": "Af-d taxxamt...", - "Search rooms": "Nadi tixxamin" + "Search rooms": "Nadi tixxamin", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s yuzen tinubga i %(targetDisplayName)s i wakken ad d-yernu ɣer texxamt.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s yerra amazray n texxamt tamaynut yettban i meṛṛa iɛeggalen n texxamt, segmi ara d-ttwanecden.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s yerra amazray n texxamt tamaynut yettban i meṛṛa iɛeggalen n texxamt, segmi ara d-rnun.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s yerra amazray n texxamt tamaynut yettban i meṛṛa iɛeggalen n texxamt.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s yerra amazray n texxamt tamaynut yettban i wid ur nettwassen ara (%(visibility)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s seg %(fromPowerLevel)s ɣer %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s yettwabeddel uswir afellay n %(powerLevelDiffText)s.", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s yekkes alugen i yugin iseqdacen yemṣadan d %(glob)s", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s yekkes alugen i yugin tixxamin yemṣadan d %(glob)s", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s yekkes alugen i yugin iqeddacen yemṣadan d %(glob)s", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s yekkes alugen n tigtin yemṣadan d %(glob)s", + "%(senderName)s updated an invalid ban rule": "%(senderName)s ileqqem alugen n tigtin arameɣtu", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin iseqdacen yemṣadan d %(glob)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin tixxamin yemṣadan d %(glob)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin iqeddacen yemṣadan d %(glob)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen n tigtin yemṣadan d %(glob)s", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s yerna alugen i yugin iseqdacen yemṣadan d %(glob)s i %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s yerna alugen i yugin tixxamin yemṣadan d %(glob)s i %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s yerna alugen i yugin iqeddacen yemṣadan d %(glob)s i %(reason)s", + "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s yerna alugen yemṣadan d %(glob)s i %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ibeddel alugen i yugin iseqdacen yemṣadan d %(oldGlob)s deg %(newGlob)s yemṣadan i %(reason)s", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ibeddel alugen i yugin tixxamin yemṣadan d %(oldGlob)s deg %(newGlob)s yemṣadan i %(reason)s", + "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ibeddel alugen i yugin tixxamin iqeddacen d %(oldGlob)s deg %(newGlob)s yemṣadan i %(reason)s", + "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ibeddel alugen i yemṣadan d %(oldGlob)s deg %(newGlob)s yemṣadan i %(reason)s", + "You signed in to a new session without verifying it:": "Teqqneḍ ɣer tɣimit war ma tesneqdeḍ-tt:", + "Verify your other session using one of the options below.": "Senqed tiɣimiyin-ik·im tiyaḍ s useqdec yiwet seg textiṛiyin ddaw.", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) yeqqen ɣer tɣimit tamaynut war ma isenqed-itt:", + "Ask this user to verify their session, or manually verify it below.": "Suter deg useqdac-a ad isenqed tiɣimit-is, neɣ senqed-itt ddaw s ufus.", + "Ensure you have a stable internet connection, or get in touch with the server admin": "Ḍmen qbel tesɛiḍ tuqqna i igerrzen, neɣ nermes anedbal n uqeddac", + "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Suter deg %(brand)s unedbal ad isenqed tawila-ik·im n unekcam arameɣtu neɣ i d-yuɣalen.", + "The message you are trying to send is too large.": "Izen i tettaɛraḍeḍ ad t-tazneḍ ɣezzif aṭas.", + "This homeserver has hit its Monthly Active User limit.": "Aqeddac-a agejdan yewweḍ ɣer talast n useqdac urmid n wayyur.", + "Please contact your service administrator to continue using the service.": "Ttxil-k·m nermes anedbal-ik·im n uqeddac i wakken ad tkemmleḍ aseqdec n uqeddac.", + "Unable to connect to Homeserver. Retrying...": "Yegguma ad yeqqen ɣer uqeddac agejdan. Ales aneɛruḍ...", + "Use a few words, avoid common phrases": "Seqdec kra n wawalen, sinef i tefyar i d-yettuɣalen", + "No need for symbols, digits, or uppercase letters": "Ulayɣer izamulen, izwilen d yisekkilen imeqqranen", + "Make a copy of your recovery key": "Eg anɣal i tsarut-ik·im n uɛeddi", + "Create key backup": "Rnu aḥraz n tsarut", + "Unable to create key backup": "Yegguma ad yernu uḥraz n tsarut", + "If you don't want to set this up now, you can later in Settings.": "Ma yella ur tebɣiḍ ara ad t-tesbaduḍ tura, tzemreḍ ad t-tgeḍ mbeɛd deg yiɣewwaren.", + "A new recovery passphrase and key for Secure Messages have been detected.": "Tasarut tuffirt n uɛeddi tamaynut d tsarut i tɣellist n yiznan ttwafent.", + "This session is encrypting history using the new recovery method.": "Tiɣimit-a, amazray-ines awgelhen yesseqdac tarrayt n uɛeddi tamaynut.", + "If disabled, messages from encrypted rooms won't appear in search results.": "Ma yella tensa, iznan n texxamin tiwgelhanin ur d-ttbanen ara deg yigmaḍ n unadi.", + "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s iteffer iznan iwgelhanen idiganen s wudem aɣelsan i wakken ad d-banen deg yigmaḍ n unadi:", + "Message downloading sleep time(ms)": "Akud n usgunfu n usali n yiznan (ms)", + "Dismiss read marker and jump to bottom": "Zgel ticreḍt n tɣuri, tɛeddiḍ d akessar" } From f0bfc17228e61ab7a8205d92d78968edfa141d5f Mon Sep 17 00:00:00 2001 From: Kahina Messaoudi Date: Mon, 17 Aug 2020 20:58:28 +0000 Subject: [PATCH 039/174] Translated using Weblate (Kabyle) Currently translated at 60.0% (1401 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 653a198e3a..2ec5616ddf 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -532,16 +532,16 @@ "Session already verified!": "Tiɣimit tettwasenqed yakan!", "Verified key": "Tasarut tettwasenqed", "Displays information about a user": "Yeskan talɣut ɣef useqdac", - "Send a bug report with logs": "Azen aneqqis n wabug s yiɣƔisen", + "Send a bug report with logs": "Azen aneqqis n ubug s yiɣmisen", "Logs sent": "Iɣmisen ttewaznen", "Opens chat with the given user": "Yeldi adiwenni d useqdac i d-yettunefken", - "Sends a message to the given user": "Yuzen iznan i useqdac i d-yettunefken", + "Sends a message to the given user": "Yettazen izen i useqdac i d-yettunefken", "Displays action": "Yeskan tigawt", "%(targetName)s accepted an invitation.": "%(targetName)s yeqbel tinnubga.", "%(senderName)s invited %(targetName)s.": "%(senderName)s inced-d %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s yugi %(targetName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s kksen isem ara d-ibanen (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaqnu-ines.", + "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaɣnu-ines.", "%(senderName)s changed their profile picture.": "%(senderName)s ibeddel tawlaft n umaɣnu-ines.", "%(senderName)s set a profile picture.": "%(senderName)s yesbadu tawlaft n umaɣnu.", "%(senderName)s made no change.": "%(senderName)s ur yegi ara ula d yiwen n ubeddel.", From 2e2bcf18710bb03a2973a001087b4f4e9b03763d Mon Sep 17 00:00:00 2001 From: rkfg Date: Tue, 18 Aug 2020 06:58:24 +0000 Subject: [PATCH 040/174] Translated using Weblate (Russian) Currently translated at 100.0% (2334 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 1e2763f59f..214648eea7 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -975,7 +975,7 @@ "Developer options": "Параметры разработчика", "General": "Общие", "Set a new account password...": "Установить новый пароль учётной записи...", - "Legal": "Законный", + "Legal": "Правовая информация", "Room avatar": "Аватар комнаты", "The following users may not exist": "Следующих пользователей может не существовать", "Invite anyway and never warn me again": "Пригласить и больше не предупреждать", From 13e7a3ebd7500d65c1f9c9ca143f8b3890c25d0b Mon Sep 17 00:00:00 2001 From: aethralis Date: Tue, 18 Aug 2020 13:43:55 +0000 Subject: [PATCH 041/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2334 of 2334 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 857877e61f..fdd717db6f 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2342,7 +2342,7 @@ "Custom Tag": "Kohandatud silt", "%(brand)s does not know how to join a room on this network": "%(brand)s ei tea kuidas selles võrgus jututoaga liituda", "%(brand)s Web": "%(brand)s Web", - "%(brand)s Desktop": "%(brand)s Desktop", + "%(brand)s Desktop": "%(brand)s Töölaud", "%(brand)s iOS": "%(brand)s iOS", "%(brand)s X for Android": "%(brand)s X Androidi jaoks", "Starting backup...": "Alusta varundamist...", @@ -2408,5 +2408,10 @@ "Show message previews for reactions in all rooms": "Näita kõikides jututubades eelvaadetes sõnumitele regeerimisi", "Master private key:": "Üldine privaatvõti:", "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud", - "Explore public rooms": "Sirvi avalikke jututubasid" + "Explore public rooms": "Sirvi avalikke jututubasid", + "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüpteeritud ruumi grupivestluse seansist", + "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olete varem kasutanud %(brand)s %(host)s ja lubanud liikmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe sätte vahel ei ühildu, peab %(brand)s teie konto uuesti sünkroonima.", + "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, sulgege see, kuna %(brand)s kasutamine samal hostil, kui laisk laadimine on lubatud ja keelatud ühekorraga põhjustab probleeme.", + "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See on põhjustanud krüptograafia tõrke vanemas versioonis. Krüptitud teated, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada ka selle versiooniga vahetatud sõnumite tõrke. Kui teil on probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma võtmed.", + "Navigation": "Navigeerimine" } From bc8a4175d5a26066f7a40a89fd05798e42ad1aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 18 Aug 2020 17:58:58 +0000 Subject: [PATCH 042/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index fdd717db6f..f2a3909bc6 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2342,7 +2342,7 @@ "Custom Tag": "Kohandatud silt", "%(brand)s does not know how to join a room on this network": "%(brand)s ei tea kuidas selles võrgus jututoaga liituda", "%(brand)s Web": "%(brand)s Web", - "%(brand)s Desktop": "%(brand)s Töölaud", + "%(brand)s Desktop": "%(brand)s Desktop", "%(brand)s iOS": "%(brand)s iOS", "%(brand)s X for Android": "%(brand)s X Androidi jaoks", "Starting backup...": "Alusta varundamist...", @@ -2413,5 +2413,12 @@ "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olete varem kasutanud %(brand)s %(host)s ja lubanud liikmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe sätte vahel ei ühildu, peab %(brand)s teie konto uuesti sünkroonima.", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, sulgege see, kuna %(brand)s kasutamine samal hostil, kui laisk laadimine on lubatud ja keelatud ühekorraga põhjustab probleeme.", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See on põhjustanud krüptograafia tõrke vanemas versioonis. Krüptitud teated, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada ka selle versiooniga vahetatud sõnumite tõrke. Kui teil on probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma võtmed.", - "Navigation": "Navigeerimine" + "Navigation": "Navigeerimine", + "Uploading logs": "Laen üles logisid", + "Downloading logs": "Laen alla logisid", + "Can't see what you’re looking for?": "Kas sa ei leia seda, mida otsisid?", + "Explore all public rooms": "Sirvi kõiki avalikke jututubasid", + "%(count)s results|other": "%(count)s tulemust", + "Preparing to download logs": "Valmistun logikirjete allalaadimiseks", + "Download logs": "Lae logikirjed alla" } From cdab2c3a07419fbe22426ad4af36a05797c83c60 Mon Sep 17 00:00:00 2001 From: aethralis Date: Tue, 18 Aug 2020 18:16:30 +0000 Subject: [PATCH 043/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index f2a3909bc6..c58a8a82f2 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2409,7 +2409,7 @@ "Master private key:": "Üldine privaatvõti:", "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud", "Explore public rooms": "Sirvi avalikke jututubasid", - "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüpteeritud ruumi grupivestluse seansist", + "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüpteeritud ruumi grupivestluse seansist.", "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olete varem kasutanud %(brand)s %(host)s ja lubanud liikmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe sätte vahel ei ühildu, peab %(brand)s teie konto uuesti sünkroonima.", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, sulgege see, kuna %(brand)s kasutamine samal hostil, kui laisk laadimine on lubatud ja keelatud ühekorraga põhjustab probleeme.", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See on põhjustanud krüptograafia tõrke vanemas versioonis. Krüptitud teated, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada ka selle versiooniga vahetatud sõnumite tõrke. Kui teil on probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma võtmed.", From 192d1416057cce1039874e6848081d0aa3f4aa84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 18 Aug 2020 18:17:06 +0000 Subject: [PATCH 044/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index c58a8a82f2..88822514bb 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2409,9 +2409,9 @@ "Master private key:": "Üldine privaatvõti:", "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud", "Explore public rooms": "Sirvi avalikke jututubasid", - "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüpteeritud ruumi grupivestluse seansist.", + "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüptitud jututoa rühmavestluse seansist", "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olete varem kasutanud %(brand)s %(host)s ja lubanud liikmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe sätte vahel ei ühildu, peab %(brand)s teie konto uuesti sünkroonima.", - "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, sulgege see, kuna %(brand)s kasutamine samal hostil, kui laisk laadimine on lubatud ja keelatud ühekorraga põhjustab probleeme.", + "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, palun sulge see. %(brand)s kasutamine samal serveril põhjustab vigu olukorras, kus laisk laadimine on samal ajal lubatud ja keelatud.", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See on põhjustanud krüptograafia tõrke vanemas versioonis. Krüptitud teated, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada ka selle versiooniga vahetatud sõnumite tõrke. Kui teil on probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma võtmed.", "Navigation": "Navigeerimine", "Uploading logs": "Laen üles logisid", From 569f09742736745561d14a27aca80b1a94cebce1 Mon Sep 17 00:00:00 2001 From: aethralis Date: Tue, 18 Aug 2020 18:26:38 +0000 Subject: [PATCH 045/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 88822514bb..2b620bd8a0 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2410,7 +2410,7 @@ "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud", "Explore public rooms": "Sirvi avalikke jututubasid", "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüptitud jututoa rühmavestluse seansist", - "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olete varem kasutanud %(brand)s %(host)s ja lubanud liikmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe sätte vahel ei ühildu, peab %(brand)s teie konto uuesti sünkroonima.", + "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olete varem kasutanud %(brand)s %(host)s ja lubanud liikmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe sätte vahel ei ühildu, peab %(brand)s teie konto uuesti sünkroonima. ", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, palun sulge see. %(brand)s kasutamine samal serveril põhjustab vigu olukorras, kus laisk laadimine on samal ajal lubatud ja keelatud.", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See on põhjustanud krüptograafia tõrke vanemas versioonis. Krüptitud teated, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada ka selle versiooniga vahetatud sõnumite tõrke. Kui teil on probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma võtmed.", "Navigation": "Navigeerimine", From 49243e5de9da9e590f71303c89a7d0badd76249f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 18 Aug 2020 18:27:17 +0000 Subject: [PATCH 046/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 2b620bd8a0..de71fd1ab0 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2410,7 +2410,7 @@ "Recent changes that have not yet been received": "Hiljutised muudatused, mis pole veel alla laetud või saabunud", "Explore public rooms": "Sirvi avalikke jututubasid", "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüptitud jututoa rühmavestluse seansist", - "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olete varem kasutanud %(brand)s %(host)s ja lubanud liikmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe sätte vahel ei ühildu, peab %(brand)s teie konto uuesti sünkroonima. ", + "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Oled varem kasutanud %(brand)s serveriga %(host)s ja lubanud andmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe seadistuse vahel ei ühildu, peab %(brand)s sinu konto uuesti sünkroonima.", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, palun sulge see. %(brand)s kasutamine samal serveril põhjustab vigu olukorras, kus laisk laadimine on samal ajal lubatud ja keelatud.", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See on põhjustanud krüptograafia tõrke vanemas versioonis. Krüptitud teated, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada ka selle versiooniga vahetatud sõnumite tõrke. Kui teil on probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma võtmed.", "Navigation": "Navigeerimine", From 820adca5a863e6a090ddbbd31df5cded41597f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 18 Aug 2020 18:31:19 +0000 Subject: [PATCH 047/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index de71fd1ab0..e00a5e0ecc 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2412,7 +2412,7 @@ "Forces the current outbound group session in an encrypted room to be discarded": "Sunnib loobuma praeguse krüptitud jututoa rühmavestluse seansist", "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Oled varem kasutanud %(brand)s serveriga %(host)s ja lubanud andmete laisa laadimise. Selles versioonis on laisk laadimine keelatud. Kuna kohalik vahemälu nende kahe seadistuse vahel ei ühildu, peab %(brand)s sinu konto uuesti sünkroonima.", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, palun sulge see. %(brand)s kasutamine samal serveril põhjustab vigu olukorras, kus laisk laadimine on samal ajal lubatud ja keelatud.", - "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See on põhjustanud krüptograafia tõrke vanemas versioonis. Krüptitud teated, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada ka selle versiooniga vahetatud sõnumite tõrke. Kui teil on probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma võtmed.", + "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See kindlasti põhjustab läbiva krüptimise tõrke vanemas versioonis. Läbivalt krüptitud sõnumid, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada vigu ka selle versiooniga saadetud sõnumite lugemisel. Kui teil tekib probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma krüptovõtmed.", "Navigation": "Navigeerimine", "Uploading logs": "Laen üles logisid", "Downloading logs": "Laen alla logisid", From ad6f2f0db25cfe3cbb788f24906f27a58f5686ca Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 19 Aug 2020 10:09:46 +0000 Subject: [PATCH 048/174] Translated using Weblate (Albanian) Currently translated at 99.7% (2334 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 270912f8a7..726508ebb2 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2409,5 +2409,13 @@ "Master private key:": "Kyç privat i përgjithshëm:", "%(brand)s Android": "%(brand)s Android", "Show message previews for reactions in DMs": "Shfaq paraparje mesazhi për reagime në MD", - "Show message previews for reactions in all rooms": "Shfaq paraparje mesazhi për reagime në krejt dhomat" + "Show message previews for reactions in all rooms": "Shfaq paraparje mesazhi për reagime në krejt dhomat", + "Uploading logs": "Po ngarkohen regjistra", + "Downloading logs": "Po shkarkohen regjistra", + "Explore public rooms": "Eksploroni dhoma publike", + "Can't see what you’re looking for?": "S’shihni ç’po kërkoni?", + "Explore all public rooms": "Eksploroni krejt dhomat publike", + "%(count)s results|other": "%(count)s përfundime", + "Preparing to download logs": "Po bëhet gati për shkarkim regjistrash", + "Download logs": "Shkarko regjistra" } From af5d16485c3bcf34b5e33a24926ff3d97e21a9c1 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 19 Aug 2020 05:43:32 +0000 Subject: [PATCH 049/174] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index cef1d21701..d5eacd1141 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2416,5 +2416,12 @@ "Master private key:": "主控私鑰:", "Show message previews for reactions in DMs": "在直接訊息中顯示反應的訊息預覽", "Show message previews for reactions in all rooms": "在所有聊天室中顯示反應的訊息預覽", - "Explore public rooms": "探索公開聊天室" + "Explore public rooms": "探索公開聊天室", + "Uploading logs": "正在上傳紀錄檔", + "Downloading logs": "正在下載紀錄檔", + "Can't see what you’re looking for?": "看不到您要找的東西嗎?", + "Explore all public rooms": "探索所有公開聊天室", + "%(count)s results|other": "%(count)s 個結果", + "Preparing to download logs": "正在準備下載紀錄檔", + "Download logs": "下載紀錄檔" } From 0acdef27fef8d54cb1ab34848ded914cd1901a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 18 Aug 2020 22:21:18 +0000 Subject: [PATCH 050/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index e00a5e0ecc..2d6b11d769 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -650,7 +650,7 @@ "Where you’re logged in": "Kus sa oled võrku loginud", "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Halda alljärgnevas oma sessioonide nimesid, logi neist välja või verifitseeri neid oma kasutajaprofiilis.", "A session's public name is visible to people you communicate with": "Sessiooni avalik nimi on nähtav neile, kellega sa suhtled", - "%(brand)s collects anonymous analytics to allow us to improve the application.": "Võimaldamaks meil rakendust parandada kogub %(brand)s anonüümset analüütikat.", + "%(brand)s collects anonymous analytics to allow us to improve the application.": "Võimaldamaks meil rakendust parandada kogub %(brand)s anonüümset teavet rakenduse kasutuse kohta.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privaatsus on meile oluline ning seega me ei kogu ei isiklikke ega isikustatavaid andmeid.", "Learn more about how we use analytics.": "Loe lisaks kuidas me kasutama analüütikat.", "No media permissions": "Meediaõigused puuduvad", From 1cc36d9ea2329f11401961fa7a034bdf707b7a2c Mon Sep 17 00:00:00 2001 From: XoseM Date: Wed, 19 Aug 2020 06:12:15 +0000 Subject: [PATCH 051/174] Translated using Weblate (Galician) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index e023ce9801..0075550412 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2413,5 +2413,12 @@ "Master private key:": "Chave mestra principal:", "Show message previews for reactions in DMs": "Mostrar vista previa das mensaxes para reaccións en MDs", "Show message previews for reactions in all rooms": "Mostrar vista previa das mensaxes para reaccións en todas as salas", - "Explore public rooms": "Explorar salas públicas" + "Explore public rooms": "Explorar salas públicas", + "Uploading logs": "Subindo o rexistro", + "Downloading logs": "Descargando o rexistro", + "Can't see what you’re looking for?": "¿Non atopas o que buscas?", + "Explore all public rooms": "Explora todas as salas públicas", + "%(count)s results|other": "%(count)s resultados", + "Preparing to download logs": "Preparándose para descargar rexistro", + "Download logs": "Descargar rexistro" } From 016866cd986a70cbd75c6f2e670c92ec7e9d859f Mon Sep 17 00:00:00 2001 From: random Date: Wed, 19 Aug 2020 08:35:24 +0000 Subject: [PATCH 052/174] Translated using Weblate (Italian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index fb76f3a621..8cea189ff6 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2416,5 +2416,12 @@ "%(brand)s Android": "%(brand)s Android", "Show message previews for reactions in DMs": "Mostra anteprime messaggi per le reazioni nei messaggi diretti", "Show message previews for reactions in all rooms": "Mostra anteprime messaggi per le reazioni in tutte le stanze", - "Explore public rooms": "Esplora stanze pubbliche" + "Explore public rooms": "Esplora stanze pubbliche", + "Uploading logs": "Invio dei log", + "Downloading logs": "Scaricamento dei log", + "Can't see what you’re looking for?": "Non vedi quello che cerchi?", + "Explore all public rooms": "Esplora tutte le stanze pubbliche", + "%(count)s results|other": "%(count)s risultati", + "Preparing to download logs": "Preparazione al download dei log", + "Download logs": "Scarica i log" } From 4ba97c5dcc0ec5e728f694a8c1ab04dfb6789769 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Tue, 18 Aug 2020 21:36:31 +0000 Subject: [PATCH 053/174] Translated using Weblate (Kabyle) Currently translated at 64.8% (1516 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 182 +++++++++++++++++++++++++++++++------- 1 file changed, 149 insertions(+), 33 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 2ec5616ddf..2117158ed8 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -354,7 +354,7 @@ "Please check your email and click on the link it contains. Once this is done, click continue.": "Ma ulac aɣilif, senqed imayl-ik/im syen sit ɣef useɣwen i yellan. Akken ara yemmed waya, sit ad tkemmleḍ.", "This will allow you to reset your password and receive notifications.": "Ayagi ad ak(akem)-yeǧǧ ad twennzeḍ awal-ik/im uffir yerna ad d-tremseḍ ilɣa.", "A username can only contain lower case letters, numbers and '=_-./'": "Isem n useqdac yezmer kan ad yegber isekkilen imeẓyanen, izwilen neɣ '=_-./'", - "Username invalid: %(errMessage)s": "Isem n useqdac d armeɣtu", + "Username invalid: %(errMessage)s": "Isem n useqdac d arameɣtu: %(errMessage)s", "An error occurred: %(error_string)s": "Tella-d tuccḍa: %(error_string)s", "To get started, please pick a username!": "I wakken ad tebduḍ, ttxil-k/m fren isem n useqdac!", "This will be your account name on the homeserver, or you can pick a different server.": "Wagi ad yili d isem-ik/im deg usebter agejdan, neɣ tzemreḍ ad tferneḍ aqeddac-nniḍen.", @@ -532,16 +532,16 @@ "Session already verified!": "Tiɣimit tettwasenqed yakan!", "Verified key": "Tasarut tettwasenqed", "Displays information about a user": "Yeskan talɣut ɣef useqdac", - "Send a bug report with logs": "Azen aneqqis n ubug s yiɣmisen", + "Send a bug report with logs": "Azen aneqqis n wabug s yiɣƔisen", "Logs sent": "Iɣmisen ttewaznen", "Opens chat with the given user": "Yeldi adiwenni d useqdac i d-yettunefken", - "Sends a message to the given user": "Yettazen izen i useqdac i d-yettunefken", + "Sends a message to the given user": "Yuzen iznan i useqdac i d-yettunefken", "Displays action": "Yeskan tigawt", "%(targetName)s accepted an invitation.": "%(targetName)s yeqbel tinnubga.", "%(senderName)s invited %(targetName)s.": "%(senderName)s inced-d %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s yugi %(targetName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s kksen isem ara d-ibanen (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaɣnu-ines.", + "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaqnu-ines.", "%(senderName)s changed their profile picture.": "%(senderName)s ibeddel tawlaft n umaɣnu-ines.", "%(senderName)s set a profile picture.": "%(senderName)s yesbadu tawlaft n umaɣnu.", "%(senderName)s made no change.": "%(senderName)s ur yegi ara ula d yiwen n ubeddel.", @@ -568,9 +568,9 @@ "%(displayName)s is typing …": "%(displayName)s yettaru-d …", "%(names)s and %(count)s others are typing …|other": "%(names)s d %(count)s wiyaḍ ttarun-d …", "%(names)s and %(count)s others are typing …|one": "%(names)s d wayeḍ-nniḍen yettaru-d …", - "%(names)s and %(lastPerson)s are typing …": "%(names)s d %(count)s ttarun-d …", - "%(items)s and %(count)s others|other": "%(names)s d %(count)s wiyaḍ", - "%(items)s and %(count)s others|one": "%(names)s d wayeḍ-nniḍen", + "%(names)s and %(lastPerson)s are typing …": "%(names)s d %(lastPerson)s ttarun-d …", + "%(items)s and %(count)s others|other": "%(items)s d %(count)s wiyaḍ", + "%(items)s and %(count)s others|one": "%(items)s d wayeḍ-nniḍen", "%(items)s and %(lastItem)s": "%(items)s d %(lastItem)s", "a few seconds ago": "kra n tesinin seg yimir-nni", "about a minute ago": "tasdidt seg yimir-nni", @@ -731,7 +731,7 @@ "Avoid dates and years that are associated with you": "Zgel izmaz akked iseggasen i icudden ɣur-k", "System font name": "Isem n tsefsit n unagraw", "Send analytics data": "Azen isefka n tesleḍt", - "Cancelling…": "Asefsex...", + "Cancelling…": "Asefsex…", "They match": "Mṣadan", "They don't match": "Ur mṣadan ara", "Dog": "Aqjun", @@ -947,13 +947,13 @@ "and %(count)s others...|one": "d wayeḍ-nniḍen...", "Invite to this room": "Nced-d ɣer texxamt-a", "Filter room members": "Sizdeg iɛeggalen n texxamt", - "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (i iǧehden %(powerLevelNumber)s", "Voice call": "Asiwel s taɣect", "Video call": "Asiwel s tvidyut", - "Send an encrypted reply…": "Azen tiririt yettuwgelhen...", - "Send a reply…": "Azen tiririt...", - "Send an encrypted message…": "Azen izen yettuwgelhen...", - "Send a message…": "Azen izen...", + "Send an encrypted reply…": "Azen tiririt yettuwgelhen…", + "Send a reply…": "Azen tiririt…", + "Send an encrypted message…": "Azen izen yettuwgelhen…", + "Send a message…": "Azen izen…", "Italics": "Uknan", "No pinned messages.": "Ulac iznan yerzin.", "Pinned Messages": "Iznan yerzin", @@ -963,21 +963,21 @@ "Seen by %(userName)s at %(dateTime)s": "Iwala-t %(userName)s at %(dateTime)s", "Replying": "Tiririt", "Guests can join": "Inebgawen zemren ad ttekkin", - "(~%(count)s results)|one": "(~%(count)s result)", + "(~%(count)s results)|one": "(~%(count)s igmaḍ)", "Join Room": "Rnu ɣer texxamt", "Forget room": "Tettuḍ taxxamt", "Rooms": "Timɣiwent", "Custom Tag": "Sagen tabzimt", "This room": "Taxxamt-a", "Loading …": "La d-yettali…", - "Rejecting invite …": "Tigtin n tinnubga...", + "Rejecting invite …": "Tigtin n tinnubga…", "Join the conversation with an account": "Ttekki deg udiwenni s umiḍan", "Loading room preview": "Taskant n texxamt i la d-tettali", "Re-join": "Ales attekki", "Try to join anyway": "Ɣas akken ɛreḍ ad tettekkiḍ", "Join the discussion": "Ttekki deg udiwenni", "Start chatting": "Bdu adiwenni", - "%(roomName)s is not accessible at this time.": "%(weekDayName)s ulac anekcum ɣer-s akka tura.", + "%(roomName)s is not accessible at this time.": "%(roomName)s ulac anekcum ɣer-s akka tura.", "Show previews of messages": "Sken tiskanin n yiznan", "Jump to first unread room.": "Ɛeddi ɣer texxamt tamezwarut ur nettwaɣra ara.", "Jump to first invite.": "Ɛreddi ɣer tinnubga tamezwarut.", @@ -988,7 +988,7 @@ "Leave Room": "Ffeɣ seg texxamt", "Add a topic": "Rnu asentel", "This Room": "Taxxamt-a", - "Search…": "Ffeɣ seg unadi...", + "Search…": "Nadi…", "Send as message": "Azen-it d izen", "Add some now": "Rnu kra tura", "Hide Stickers": "Ffer istikiyen", @@ -1023,7 +1023,7 @@ "Verify by scanning": "Senqed s usiggez", "Verify by emoji": "Senqed s yimujit", "Verification timed out.": "Yemmed wakud n usenqed.", - "%(displayName)s cancelled verification.": "%(name)s isefsex asenqed.", + "%(displayName)s cancelled verification.": "%(displayName)s isefsex asenqed.", "You cancelled verification.": "Tesfesxeḍ asenqed.", "Verification cancelled": "Yefsex usenqed", "Encryption enabled": "Awgelhen ur yeddi ara", @@ -1207,9 +1207,9 @@ "Continue with previous account": "Kemmel s umiḍan yezrin", "Log in to your new account.": "Kcem ɣer umiḍan-ik·im amaynut.", "%(brand)s Web": "%(brand)s Web", - "%(brand)s Desktop": "Tanarit n %(tecreḍt)s", - "%(brand)s iOS": "%(tacreḍt)s iOS", - "%(brand)s Android": "%(tacreḍt)s Andriod", + "%(brand)s Desktop": "%(brand)s n tnarit", + "%(brand)s iOS": "%(brand)s iOS", + "%(brand)s Android": "%(brand)s Andriod", "Incorrect password": "Awal uffir d arameɣtu", "Failed to re-authenticate": "Aɛiwed n usesteb ur yeddi ara", "Command Autocomplete": "Asmad awurman n tiludna", @@ -1287,9 +1287,9 @@ "Room Name": "Isem n texxamt", "Room Topic": "Asentel n texxamt", "Room avatar": "Avaṭar n texxamt", - "Accepting…": "Aqbal...", + "Accepting…": "Aqbal…", "Your homeserver": "Aqeddac-ik·im agejdan", - "Accepting …": "Aqbal...", + "Accepting …": "Aqbal…", "Your display name": "Isem-ik·im yettwaskanen", "Your avatar URL": "URL n avatar-inek·inem", "%(brand)s URL": "%(brand)s URL", @@ -1309,7 +1309,7 @@ "Please create a new issue on GitHub so that we can investigate this bug.": "Ttxil-k·m rnu ugur amaynut deg GitHub akken ad nessiweḍ ad nezrew abug-a.", "expand": "snefli", "You cannot delete this image. (%(code)s)": "Ur tezmireḍ ara ad tekkseḍ tugna-a. (%(code)s)", - "Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s", + "Uploaded on %(date)s by %(user)s": "Yuli-d deg %(date)s sɣur %(user)s", "Rotate Left": "Zzi ɣer uzelmaḍ", "Rotate Right": "Zzi ɣer uyeffus", "Language Dropdown": "Tabdart n udrurem n tutlayin", @@ -1318,9 +1318,9 @@ "%(oneUser)sjoined %(count)s times|other": "%(oneUser)syerna-d %(count)s tikkal", "%(oneUser)sjoined %(count)s times|one": "%(oneUser)syerna-d", "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)sffɣen %(count)s tikkal", - "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)sffɣen %(count)s", - "%(oneUser)sleft %(count)s times|other": "%(oneUsers)syeffeɣ %(count)s tikkal", - "%(oneUser)sleft %(count)s times|one": "%(oneUsers)syeffeɣ", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s ffɣen", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s yeffeɣ %(count)s tikkal", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s yeffeɣ", "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)srnan-d syen ffɣen %(count)s tikkal", "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)srnan-d syen ffɣen", "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)syerna-d syen yeffeɣ %(count)s tikkal", @@ -1397,7 +1397,7 @@ "Remove %(name)s from the directory?": "Kkes %(name)s seg ukaram?", "delete the address.": "kkes tansa.", "Room not found": "Ur tettwaf ara texxamt", - "Find a room…": "Af-d taxxamt...", + "Find a room…": "Af-d taxxamt…", "Search rooms": "Nadi tixxamin", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s yuzen tinubga i %(targetDisplayName)s i wakken ad d-yernu ɣer texxamt.", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s yerra amazray n texxamt tamaynut yettban i meṛṛa iɛeggalen n texxamt, segmi ara d-ttwanecden.", @@ -1411,10 +1411,10 @@ "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s yekkes alugen i yugin iqeddacen yemṣadan d %(glob)s", "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s yekkes alugen n tigtin yemṣadan d %(glob)s", "%(senderName)s updated an invalid ban rule": "%(senderName)s ileqqem alugen n tigtin arameɣtu", - "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin iseqdacen yemṣadan d %(glob)s", - "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin tixxamin yemṣadan d %(glob)s", - "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin iqeddacen yemṣadan d %(glob)s", - "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen n tigtin yemṣadan d %(glob)s", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin iseqdacen yemṣadan d %(glob)s i %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin tixxamin yemṣadan d %(glob)s i %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen i yugin iqeddacen yemṣadan d %(glob)s i %(reason)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s ileqqem alugen n tigtin yemṣadan d %(glob)s i %(reason)s", "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s yerna alugen i yugin iseqdacen yemṣadan d %(glob)s i %(reason)s", "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s yerna alugen i yugin tixxamin yemṣadan d %(glob)s i %(reason)s", "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s yerna alugen i yugin iqeddacen yemṣadan d %(glob)s i %(reason)s", @@ -1444,5 +1444,121 @@ "If disabled, messages from encrypted rooms won't appear in search results.": "Ma yella tensa, iznan n texxamin tiwgelhanin ur d-ttbanen ara deg yigmaḍ n unadi.", "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s iteffer iznan iwgelhanen idiganen s wudem aɣelsan i wakken ad d-banen deg yigmaḍ n unadi:", "Message downloading sleep time(ms)": "Akud n usgunfu n usali n yiznan (ms)", - "Dismiss read marker and jump to bottom": "Zgel ticreḍt n tɣuri, tɛeddiḍ d akessar" + "Dismiss read marker and jump to bottom": "Zgel ticreḍt n tɣuri, tɛeddiḍ d akessar", + "Show display name changes": "Sken isnifal n yisem yettwaskanen", + "Show read receipts sent by other users": "Sken awwaḍen n tɣuri yettwaznen sɣur yiseqdacen-nniḍen", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Sken azemzakud s umasal 12 yisragen (am. 14:30)", + "Always show message timestamps": "Sken yal tikkelt azemzakud n yiznan", + "Autoplay GIFs and videos": "Taɣuri tawurmant n GIFs d tvidyutin", + "When I'm invited to a room": "Mi ara d-ttunecdeɣ ɣer texxamt", + "This is your list of users/servers you have blocked - don't leave the room!": "Tagi d tabdart-ik·im n yiseqdacen/yiqeddacen i tesweḥleḍ - ur teffeɣ ara seg texxamt!", + "Active call": "Asiwel urmid", + "Verified!": "Yettwasenqed!", + "Scan this unique code": "Ḍumm tangalt-a tasuft", + "Compare unique emoji": "Serwes gar yimujiten asufen", + "in secret storage": "deg uklas uffir", + "Master private key:": "Tasarut tusligt tagejdant:", + "cached locally": "yettwaffer s wudem adigan", + "not found locally": "Ulac s wudem adigan", + "Self signing private key:": "Tasarut tusligt n uzmul awurman:", + "User signing private key:": "Tasarut tusligt n uzmul n useqdac:", + "Session backup key:": "Tasarut n uḥraz n tɣimit:", + "Secret storage public key:": "Tasarut tazayezt n uḥraz uffir:", + "Homeserver feature support:": "Asefrek n tmahilt n Homeserver:", + "exists": "yella", + "Your homeserver does not support session management.": "Aqeddac-ik·im agejdan ur yessefrak ara asefrek n tɣimit.", + "Unable to load session list": "Asali n tebdart n tɣimit ur yeddi ara", + "Click the button below to confirm deleting these sessions.|other": "Sit ɣef tqeffalt ddaw akken ad tesnetmeḍ tukksa n tɣimiyin-a.", + "Click the button below to confirm deleting these sessions.|one": "Sit ɣef tqeffalt ddaw akken ad tesnetmeḍ tukksa n tɣimit-a.", + "Unable to load key backup status": "Asali n waddad n uḥraz n tsarut ur yeddi ara", + "not stored": "ur yettusekles ara", + "Backing up %(sessionsRemaining)s keys...": "Aḥraz n tsura %(sessionsRemaining)s...", + "Backup has a valid signature from this user": "Aḥraz ɣer-s azmul ameɣtu sɣur aseqdac-a", + "Backup has a invalid signature from this user": "Aḥraz ɣer-s azmul arameɣtu sɣur aseqdac-a", + "Backup has a signature from unknown user with ID %(deviceId)s": "Aḥraz ɣer-s azmul sɣur useqdac arussin s usulay %(deviceId)s", + "Backup has a signature from unknown session with ID %(deviceId)s": "Aḥraz ɣer-s azmul seg tiɣimit arussin s usulay %(deviceId)s", + "Backup has a valid signature from this session": "Aḥraz ɣer-s azmul ameɣtu seg tɣimit-a", + "Backup has an invalid signature from this session": "Aḥraz ɣer-s azmul arameɣtu seg tɣimit-a", + "Backup has a valid signature from verified session ": "Aḥraz ɣer-s azmul ameɣtu seg tɣimit yettwasneqden ", + "Backup has a valid signature from unverified session ": "Aḥraz ɣer-s azmul ameɣtu seg tɣimit ur yettwasneqden ara ", + "Backup has an invalid signature from verified session ": "Aḥraz ɣer-s azmul arameɣtu seg tɣimit yettwasneqden ", + "Backup has an invalid signature from unverified session ": "Aḥraz ɣer-s azmul arameɣtu seg tɣimit ur yettwasneqden ara ", + "Backup is not signed by any of your sessions": "Aḥraz ur yettuzmel ara ula seg yiwet n tɣimit-ik·im", + "Algorithm: ": "Alguritm: ", + "Backup key stored: ": "Tasarut n uḥraz tettwasekles: ", + "Your keys are not being backed up from this session.": "Tisura-inek·inem ur ttwaḥrazent ara seg tɣimit-a.", + "Start using Key Backup": "Bdu aseqdec n uḥraz n tsarut", + "Flair": "Lbenna", + "Failed to change password. Is your password correct?": "Asnifel n wawal uffir ur yeddi ara. Awal-ik·im d ameɣtu?", + "Email addresses": "Tansiwin n yimayl", + "Phone numbers": "Uṭṭunen n tiliɣri", + "Language and region": "Tutlayt d temnaḍt", + "Yours, or the other users’ session": "Tiɣimit-ik·im neɣ tin n yiseqdacen wiyaḍ", + "Not trusted": "Ur yettwattkal ara", + "%(count)s verified sessions|other": "%(count)s isenqed tiɣimiyin", + "%(count)s verified sessions|one": "1 n tɣimit i yettwasneqden", + "%(count)s sessions|one": "Tiɣimit n %(count)s", + "Direct message": "Izen uslig", + "Demote yourself?": "Ṣubb deg usellun-ik·im?", + "Demote": "Ṣubb deg usellun", + "Disinvite": "Kkes-d tinnubga", + "Kick": "Suffeɣ", + "Failed to kick": "Asuffeɣ ur yeddi ara", + "No recent messages by %(user)s found": "Ulac iznan i yettwafen sɣur %(user)s", + "Try scrolling up in the timeline to see if there are any earlier ones.": "Ɛreḍ adrurem deg wazemzakud i wakken ad twaliḍ ma yella llan wid yellan uqbel.", + "Remove recent messages by %(user)s": "Kkes iznan n melmi kan sɣur %(user)s", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "Aql-ak·akem akken ara tekkseḍ iznan n %(count)s sɣur %(user)s. Ulac tuɣalin ɣer deffir deg waya. Tebɣiḍ ad tkemmleḍ?", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Aql-ak·akem akken ara tekkseḍ 1 yizen sɣur %(user)s. Ulac tuɣalin ɣer deffir deg waya. Tebɣiḍ ad tkemmleḍ?", + "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "I tugget meqqren n yiznan, ayagi yezmer ad yeṭṭef kra n wakud. Ṛǧu ur sirin ara amsaɣ-ik·im deg leɛḍil.", + "Remove %(count)s messages|other": "Kkes iznan n %(count)s", + "Ban": "Agi", + "Failed to ban user": "Tigtin n useqdac ur yeddi ara", + "Failed to remove user from community": "Tukksa n useqdac seg temɣiwent ur yeddi ara", + "%(role)s in %(roomName)s": "%(role)s deg %(roomName)s", + "Failed to change power level": "Asnifel n uswir afellay ur yeddi ara", + "Failed to deactivate user": "Asensi n useqdac ur yeddi ara", + "This client does not support end-to-end encryption.": "Amsaɣ-a ur yessefrak ara awgelhen seg yixef ɣer yixef.", + "Ask %(displayName)s to scan your code:": "Suter deg %(displayName)s aḍummu n tengalt-ik·im:", + "If you can't scan the code above, verify by comparing unique emoji.": "Ma yella ur tezmireḍ ara ad tḍummeḍ tangalt nnig, senqed s userwes s yimujiten asufen.", + "Verify by comparing unique emoji.": "Senqed s userwes s yimujiten asufen.", + "Almost there! Is your other session showing the same shield?": "Qrib ad tawḍeḍ! Wissen ma yella tiɣimit-ik·im-nniḍen kifkif aɣar i d-teskanay?", + "Almost there! Is %(displayName)s showing the same shield?": "Qrib ad tawḍeḍ! Wissen ma yella%(displayName)s kifkif aɣar i d-yeskanay?", + "Verify all users in a room to ensure it's secure.": "Senqed akk iseqdacen yellan deg texxamt i wakken ad tḍemneḍ d taɣelsant.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Deg texxamin tiwgelhanin, senqed akk iseqdacen i wakken ad tḍemneḍ d tiɣelsanin.", + "You've successfully verified your device!": "Tesneqdeḍ akken iwata ibenk-inek·inem!", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Tesneqdeḍ akken iwata %(deviceName)s (%(deviceId)s)!", + "You've successfully verified %(displayName)s!": "Tesneqdeḍ akken iwata %(displayName)s!", + "Start verification again from the notification.": "Bdu asenqed daɣen seg ulɣu.", + "Start verification again from their profile.": "Bdu asenqed daɣen seg umaɣnu-nsen.", + "You cancelled verification on your other session.": "Tesfesxeḍ asenqed deg tɣimiyin tiyaḍ.", + "Compare emoji": "Serwes imujiten", + "Encryption not enabled": "Awgelhen ur yermid ara", + "The encryption used by this room isn't supported.": "Awgelhen yettusqedcen ur yettusefrak ara s texxamt-a.", + "Error decrypting audio": "Tuccḍa deg uwgelhen n umeslaw", + "React": "Sedmer", + "Message Actions": "Tigawin n yizen", + "Invalid file%(extra)s": "D afaylu %(extra)s arameɣtu", + "Error decrypting image": "Tuccḍa deg uwgelhen n tugna", + "Show image": "Sken tugna", + "Invalid base_url for m.identity_server": "base_url d arameɣtu i m.identity_server", + "Signing In...": "Anekcum ɣer...", + "If you've joined lots of rooms, this might take a while": "Ma yella tettekkaḍ deg waṭas n texxamin, ayagi yezmer ad yeṭṭef kra n wakud", + "Set a display name:": "Sbadu isem n uskan:", + "Upload an avatar:": "Sali-d avaṭar:", + "Use Recovery Key": "Seqdec tasarut n uɛeddi", + "Emoji": "Imujit", + "For maximum security, this should be different from your account password.": "I wugar n tɣellist, wagi ilaq ad yemgarad ɣef wawal uffir n umiḍan-ik·im.", + "Set up with a recovery key": "Sbadu s tsarut n uɛeddi", + "Please enter your recovery passphrase a second time to confirm.": "Ttxil-ik·im sekcem tafyirt-ik·im tuffirt n uɛeddi tikkelt tis sant i usentem.", + "Repeat your recovery passphrase...": "Ales-as i tefyirt-ik·im tuffirt n uɛeddi...", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Ḥrez anɣal-ines deg wadeg aɣelsan, am umsefrak n wawalen uffiren neɣ am usenduq iǧehden.", + "Your recovery key": "Tasarut-ik·im n uɛeddi", + "Your recovery key has been copied to your clipboard, paste it to:": "Tasarut-ik·im n uɛeddi tettwanɣel ɣer ɣef wafus, senteḍ-itt deg:", + "Your recovery key is in your Downloads folder.": "Tasarut-ik·im n tririt ha-tt-an deg ufaylu n yisidar.", + "Print it and store it somewhere safe": "Siggez-itt syen kles-itt deg wadeg aɣelsan", + "Save it on a USB key or backup drive": "Sekles-itt ɣef tsarut USB neɣ deg yibenk n uḥraz", + "Copy it to your personal cloud storage": "Nɣel-itt ɣer uklas-ik·im n usigna udmawan", + "Your keys are being backed up (the first backup could take a few minutes).": "Tisura-ik·im la ttwaḥrazent (aḥraz amezwaru yezmer ad yeṭṭef kra n tesdidin).", + "Set up Secure Message Recovery": "Sbadu iznan iɣelsanen n tririt", + "Secure your backup with a recovery passphrase": "Ḍmen aḥrazen-inek·inem s tefyirt tuffirt n uɛeddi" } From ad4ca8af96e97e1883bc01d1671671fb76267565 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Tue, 18 Aug 2020 20:19:10 +0000 Subject: [PATCH 054/174] Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.8% (2265 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/pt_BR/ --- src/i18n/strings/pt_BR.json | 249 ++++++++++++++++++------------------ 1 file changed, 126 insertions(+), 123 deletions(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 9db2be4b14..c16e7a980d 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -20,7 +20,7 @@ "Current password": "Senha atual", "Deactivate Account": "Desativar minha conta", "Default": "Padrão", - "Deops user with given id": "Retirar função de moderador do usuário com o identificador informado", + "Deops user with given id": "Retirar nível de moderador do usuário com o identificador informado", "Displays action": "Visualizar atividades", "Emoji": "Emoji", "Error": "Erro", @@ -39,7 +39,7 @@ "Historical": "Histórico", "Homeserver is": "Servidor padrão é", "Identity Server is": "O servidor de identificação é", - "I have verified my email address": "Eu verifiquei o meu endereço de e-mail", + "I have verified my email address": "Eu confirmei o meu endereço de e-mail", "Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala", "Invalid Email Address": "Endereço de e-mail inválido", "Invites": "Convidar", @@ -62,7 +62,7 @@ "Passwords can't be empty": "As senhas não podem estar em branco", "Permissions": "Permissões", "Phone": "Telefone", - "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, verifique o seu e-mail e clique no link enviado. Feito isso, clique em continuar.", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, confirme o seu e-mail e clique no link enviado. Feito isso, clique em continuar.", "Privileged Users": "Usuárias/os privilegiadas/os", "Profile": "Perfil", "Reject invitation": "Recusar o convite", @@ -85,13 +85,13 @@ "This room is not accessible by remote Matrix servers": "Esta sala não é acessível para servidores Matrix remotos", "Unable to add email address": "Não foi possível adicionar um endereço de e-mail", "Unable to remove contact information": "Não foi possível remover informação de contato", - "Unable to verify email address.": "Não foi possível verificar o endereço de e-mail.", + "Unable to verify email address.": "Não foi possível confirmar o endereço de e-mail.", "Unban": "Remover banimento", "unknown error code": "código de erro desconhecido", "Upload avatar": "Enviar uma foto de perfil", "Upload file": "Enviar arquivo", "Users": "Usuários", - "Verification Pending": "Verificação pendente", + "Verification Pending": "Confirmação pendente", "Video call": "Chamada de vídeo", "Voice call": "Chamada de voz", "VoIP conference finished.": "Chamada em grupo encerrada.", @@ -135,7 +135,7 @@ "Existing Call": "Chamada em andamento", "Failed to send email": "Não foi possível enviar e-mail", "Failed to send request.": "Não foi possível mandar requisição.", - "Failed to verify email address: make sure you clicked the link in the email": "Falha ao verificar o endereço de e-mail: certifique-se de clicar no link do e-mail", + "Failed to verify email address: make sure you clicked the link in the email": "Falha ao confirmar o endereço de e-mail: certifique-se de clicar no link do e-mail", "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.", @@ -156,7 +156,7 @@ "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o nome e sobrenome (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s removeu a foto de perfil.", "%(senderName)s requested a VoIP conference.": "%(senderName)s deseja iniciar uma chamada em grupo.", - "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s não tem permissão para lhe enviar notificações - verifique as configurações do seu navegador", + "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s não tem permissão para lhe enviar notificações - confirme as configurações do seu navegador", "%(brand)s was not given permission to send notifications - please try again": "%(brand)s não tem permissão para lhe enviar notificações - 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.", @@ -168,7 +168,7 @@ "The remote side failed to pick up": "A pessoa não atendeu a chamada", "This room is not recognised.": "Esta sala não é reconhecida.", "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, aguarde o carregamento dos resultados de autocompletar e então escolha entre as opções.", + "To use it, just wait for autocomplete results to load and tab through them.": "Para usar este recurso, aguarde o carregamento dos resultados de autocompletar e então escolha entre as opções.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s removeu 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", @@ -217,7 +217,7 @@ "Failed to reject invite": "Não foi possível recusar o convite", "Failed to set display name": "Falha ao definir o nome e sobrenome", "Fill screen": "Tela cheia", - "Incorrect verification code": "Código de verificação incorreto", + "Incorrect verification code": "Código de confirmação incorreto", "Join Room": "Ingressar na sala", "Jump to first unread message.": "Ir diretamente para a primeira das mensagens não lidas.", "Kick": "Remover da sala", @@ -285,7 +285,7 @@ "Add User": "Adicionar usuária(o)", "Custom Server Options": "Opções para Servidor Personalizado", "Dismiss": "Descartar", - "Please check your email to continue registration.": "Por favor, verifique o seu e-mail para continuar a inscrição.", + "Please check your email to continue registration.": "Por favor, confirme o seu e-mail para continuar a inscrição.", "Token incorrect": "Token incorreto", "Please enter the code it contains:": "Por favor, entre com o código que está na mensagem:", "powered by Matrix": "oferecido por Matrix", @@ -310,7 +310,7 @@ "Incorrect username and/or password.": "Nome de usuário e/ou senha incorreto.", "Invited": "Convidada(o)", "Results from DuckDuckGo": "Resultados de DuckDuckGo", - "Verified key": "Chave verificada", + "Verified key": "Chave confirmada", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a foto da sala.", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a foto da sala %(roomName)s", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s alterou a foto da sala para ", @@ -338,7 +338,7 @@ "Uploading %(filename)s and %(count)s others|one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos", "Uploading %(filename)s and %(count)s others|other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos", "Username invalid: %(errMessage)s": "Nome de usuário inválido: %(errMessage)s", - "You must register to use this functionality": "Você deve se registrar para poder usar esta funcionalidade", + "You must register to use this functionality": "Você deve se registrar para usar este recurso", "Create new room": "Criar nova sala", "Room directory": "Lista pública de salas", "Start chat": "Iniciar conversa", @@ -411,7 +411,7 @@ "Call Failed": "A chamada falhou", "PM": "PM", "AM": "AM", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s de %(monthName)s de%(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s de %(monthName)s de %(fullYear)s", "Who would you like to add to this community?": "Quem você gostaria de adicionar a esta comunidade?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Atenção: qualquer pessoa que você adicionar a esta comunidade estará publicamente visível para todas as pessoas que conheçam o ID da comunidade", "Invite new community members": "Convidar novos integrantes para a comunidade", @@ -471,7 +471,7 @@ "Guests can join": "Convidadas/os podem entrar", "Community Invites": "Convites a comunidades", "Banned by %(displayName)s": "Banido por %(displayName)s", - "Publish this room to the public in %(domain)s's room directory?": "Quer publicar esta sala na lista pública de salas em %(domain)s's?", + "Publish this room to the public in %(domain)s's room directory?": "Quer publicar esta sala na lista pública de salas da %(domain)s?", "Members only (since the point in time of selecting this option)": "Apenas integrantes (a partir do momento em que esta opção for selecionada)", "Members only (since they were invited)": "Apenas integrantes (desde que foram convidadas/os)", "Members only (since they joined)": "Apenas integrantes (desde que entraram na sala)", @@ -696,7 +696,7 @@ "Search…": "Buscar…", "You have successfully set a password and an email address!": "Você definiu uma senha e um endereço de e-mail com sucesso!", "Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?", - "%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "%(brand)s usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.", + "%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "%(brand)s usa muitos recursos avançados, e alguns deles não estão disponíveis ou ainda são experimentais no seu navegador de internet atual.", "Developer Tools": "Ferramentas do desenvolvedor", "Explore Account Data": "Explorar dados da conta", "Remove from Directory": "Remover da lista pública de salas", @@ -758,7 +758,7 @@ "Event Content": "Conteúdo do Evento", "Thank you!": "Obrigado!", "Quote": "Citar", - "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!", + "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 alguns dos recursos poderão não funcionar. Você ainda pode prosseguir, mas estará sozinho diante de problemas que possam surgir!", "Checking for an update...": "Verificando se há atualizações...", "Every page you use in the app": "Toda a página que você usa no aplicativo", "e.g. ": "por exemplo: ", @@ -768,7 +768,7 @@ "A call is already in progress!": "Uma chamada já está em andamento!", "Permission Required": "Permissão necessária", "You do not have permission to start a conference call in this room": "Você não tem permissão para iniciar uma chamada em grupo nesta sala", - "Unable to load! Check your network connectivity and try again.": "Incapaz de carregar! Verifique sua conectividade de rede e tente novamente.", + "Unable to load! Check your network connectivity and try again.": "Não foi possível carregar! Verifique sua conexão de rede e tente novamente.", "Failed to invite users to the room:": "Não foi possível convidar usuários para a sala:", "Missing roomId.": "RoomId ausente.", "Opens the Developer Tools dialog": "Abre a caixa de diálogo Ferramentas do desenvolvedor", @@ -1000,12 +1000,12 @@ "Enable Community Filter Panel": "Ativar o painel de comunidades", "Allow Peer-to-Peer for 1:1 calls": "Permitir Peer-to-Peer para chamadas 1:1", "Messages containing my username": "Mensagens contendo meu nome de usuário", - "The other party cancelled the verification.": "Seu contato cancelou a verificação.", - "Verified!": "Verificado!", + "The other party cancelled the verification.": "Seu contato cancelou a confirmação.", + "Verified!": "Confirmado!", "You've successfully verified this user.": "Você confirmou este usuário com sucesso.", "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "As mensagens com este usuário estão protegidas com a criptografia de ponta a ponta e não podem ser lidas por terceiros.", "Got It": "Ok, entendi", - "Unable to find a supported verification method.": "Não é possível encontrar um método de confirmação suportado.", + "Unable to find a supported verification method.": "Não há um método de confirmação suportado.", "Dog": "Cachorro", "Cat": "Gato", "Lion": "Leão", @@ -1046,8 +1046,8 @@ "User %(userId)s is already in the room": "O usuário %(userId)s já está na sala", "The user must be unbanned before they can be invited.": "O banimento do usuário precisa ser removido antes de ser convidado.", "Show display name changes": "Mostrar alterações de nome e sobrenome", - "Verify this user by confirming the following emoji appear on their screen.": "Verifique este usuário confirmando os emojis a seguir exibidos na tela dele.", - "Verify this user by confirming the following number appears on their screen.": "Confirme este usuário confirmando se o número a seguir aparece na tela dele.", + "Verify this user by confirming the following emoji appear on their screen.": "Confirme este usuário confirmando os emojis a seguir exibidos na tela dele.", + "Verify this user by confirming the following number appears on their screen.": "Confirme este usuário, comparando os números a seguir que serão exibidos na sua e na tela dele.", "Thumbs up": "Joinha", "Umbrella": "Guarda-chuva", "Hourglass": "Ampulheta", @@ -1087,8 +1087,8 @@ "All keys backed up": "O Backup de todas as chaves foi realizado", "Start using Key Backup": "Comece a usar o Backup de chave", "Add an email address to configure email notifications": "Adicione um endereço de e-mail para configurar notificações por e-mail", - "Unable to verify phone number.": "Não é possível verificar o número de telefone.", - "Verification code": "Código de verificação", + "Unable to verify phone number.": "Não foi possível confirmar o número de telefone.", + "Verification code": "Código de confirmação", "Phone Number": "Número de telefone", "Profile picture": "Foto de perfil", "Upgrade to your own domain": "Atualize para seu próprio domínio", @@ -1168,7 +1168,7 @@ "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Esta ação requer acesso ao servidor de identidade padrão para poder validar um endereço de e-mail ou número de telefone, mas este servidor não tem nenhum termo de uso.", "Only continue if you trust the owner of the server.": "Continue apenas se você confia em quem possui este servidor.", "Trust": "Confiança", - "%(name)s is requesting verification": "%(name)s está solicitando verificação", + "%(name)s is requesting verification": "%(name)s está solicitando confirmação", "Use your account to sign in to the latest version": "Use sua conta para logar na última versão", "We’re excited to announce Riot is now Element": "Estamos muito felizes em anunciar que Riot agora é Element", "Riot is now Element!": "Riot agora é Element!", @@ -1185,7 +1185,7 @@ "Sends a message as html, without interpreting it as markdown": "Envia uma mensagem como HTML, sem interpretá-la como markdown", "You do not have the required permissions to use this command.": "Você não tem as permissões necessárias para usar este comando.", "Error upgrading room": "Erro atualizando a sala", - "Double check that your server supports the room version chosen and try again.": "Verifique mais uma ver se seu servidor suporta a versão de sala escolhida e tente novamente.", + "Double check that your server supports the room version chosen and try again.": "Verifique se seu servidor suporta a versão de sala escolhida e tente novamente.", "Changes the avatar of the current room": "Altera a foto da sala atual", "Changes your avatar in this current room only": "Altera a sua foto de perfil apenas nesta sala", "Changes your avatar in all rooms": "Altera a sua foto de perfil em todas as salas", @@ -1201,12 +1201,12 @@ "Please supply a widget URL or embed code": "Forneça o link de um widget ou de um código de incorporação", "Please supply a https:// or http:// widget URL": "Forneça o link de um widget com https:// ou http://", "You cannot modify widgets in this room.": "Você não pode modificar widgets nesta sala.", - "Verifies a user, session, and pubkey tuple": "Verifica um(a) usuário(a), e a tupla de chave pública", + "Verifies a user, session, and pubkey tuple": "Confirma um usuário, sessão, e chave criptografada pública", "Unknown (user, session) pair:": "Par (usuária(o), sessão) desconhecido:", - "Session already verified!": "Sessão já verificada!", - "WARNING: Session already verified, but keys do NOT MATCH!": "ATENÇÃO: Sessão já verificada, mas as chaves NÃO SE CORRESPONDEM!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: A VERIFICAÇÃO DA CHAVE FALHOU! A chave de assinatura para %(userId)s e sessão %(deviceId)s é \"%(fprint)s\", o que não corresponde à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estejam sendo interceptadas por terceiros!", - "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A chave de assinatura que você forneceu corresponde à chave de assinatura que você recebeu da sessão %(deviceId)s da(do) usuária(o) %(userId)s. Esta sessão foi marcada como verificada.", + "Session already verified!": "Sessão já confirmada!", + "WARNING: Session already verified, but keys do NOT MATCH!": "ATENÇÃO: Sessão já confirmada, mas as chaves NÃO SÃO IGUAIS!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: A CONFIRMAÇÃO DA CHAVE FALHOU! A chave de assinatura para %(userId)s e sessão %(deviceId)s é \"%(fprint)s\", o que não corresponde à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estejam sendo interceptadas por terceiros!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A chave de assinatura que você forneceu corresponde à chave de assinatura que você recebeu da sessão %(deviceId)s do usuário %(userId)s. Esta sessão foi marcada como confirmada.", "Sends the given message coloured as a rainbow": "Envia a mensagem colorida como arco-íris", "Sends the given emote coloured as a rainbow": "Envia o emoji colorido como um arco-íris", "Displays list of commands with usages and descriptions": "Exibe a lista de comandos com usos e descrições", @@ -1247,22 +1247,22 @@ "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s alterou uma regra que bania o que correspondia a %(oldGlob)s para corresponder a %(newGlob)s devido à %(reason)s", "Light": "Claro", "Dark": "Escuro", - "You signed in to a new session without verifying it:": "Você entrou em uma nova sessão sem verificá-la:", - "Verify your other session using one of the options below.": "Verifique suas outras sessões usando uma das opções abaixo.", - "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) entrou em uma nova sessão sem verificá-la:", - "Ask this user to verify their session, or manually verify it below.": "Peça a este usuário para verificar a sessão, ou verifique manualmente abaixo.", + "You signed in to a new session without verifying it:": "Você entrou em uma nova sessão sem confirmá-la:", + "Verify your other session using one of the options below.": "Confirme suas outras sessões usando uma das opções abaixo.", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) entrou em uma nova sessão sem confirmá-la:", + "Ask this user to verify their session, or manually verify it below.": "Peça a este usuário para confirmar a sessão dele, ou confirme-a manualmente abaixo.", "Not Trusted": "Não confiável", - "Manually Verify by Text": "Verifique manualmente por texto", - "Interactively verify by Emoji": "Verifiquem interativamente por emojis", - "Done": "Pronto", + "Manually Verify by Text": "Confirme manualmente por texto", + "Interactively verify by Emoji": "Confirme interativamente por emojis", + "Done": "Fechar", "Cannot reach homeserver": "Não consigo acessar o servidor", "Ensure you have a stable internet connection, or get in touch with the server admin": "Verifique se está com uma conexão de internet estável, ou entre em contato com os administradores do servidor", "Your %(brand)s is misconfigured": "O %(brand)s está mal configurado", "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Entre em contato com o administrador do %(brand)s para verificar se há entradas inválidas ou duplicadas nas suas configurações.", "Cannot reach identity server": "Não consigo acessar o servidor de identidade", - "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode se registrar, mas algumas funcionalidades não estarão disponíveis até que o servidor de identidade esteja de volta online. Se você continuar vendo este alerta, verifique sua configuração ou entre em contato com um dos administradores do servidor.", - "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode trocar sua senha, mas algumas das funcionalidades não estarão mais disponíveis até que o servidor de identidade esteja de volta ao ar. Se você seguir vendo este alerta, verifique suas configurações ou entre em contato com um dos administradores do servidor.", - "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode fazer login, mas algumas funcionalidades estarão indisponíveis até que o servidor de identidade estiver de volta. Se você continuar vendo este alerta, verifique suas configurações ou entre em contato com os administradores do servidor.", + "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode se registrar, mas alguns recursos não estarão disponíveis até que o servidor de identidade esteja no ar novamente. Se você continuar vendo este alerta, verifique sua configuração ou entre em contato com um dos administradores do servidor.", + "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode trocar sua senha, mas alguns recursos não estarão disponíveis até que o servidor de identidade esteja no ar novamente. Se você seguir vendo este alerta, verifique suas configurações ou entre em contato com um dos administradores do servidor.", + "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Você pode fazer login, mas alguns recursos estarão indisponíveis até que o servidor de identidade estiver no ar novamente. Se você continuar vendo este alerta, verifique suas configurações ou entre em contato com os administradores do servidor.", "No homeserver URL provided": "Nenhum endereço fornecido do servidor local", "Unexpected error resolving homeserver configuration": "Erro inesperado buscando a configuração do servidor", "Unexpected error resolving identity server configuration": "Erro inesperado buscando a configuração do servidor de identidade", @@ -1287,7 +1287,7 @@ "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Envie dados anônimos de uso que nos ajudam a melhorar o %(brand)s. Isso necessitará do uso de um cookie.", "I want to help": "Quero ajudar", "Review where you’re logged in": "Revisar onde você está logada(o)", - "Verify all your sessions to ensure your account & messages are safe": "Verifique todas as suas sessões para garantir que sua conta e mensagens estão seguras", + "Verify all your sessions to ensure your account & messages are safe": "Confirme todas as suas sessões para garantir que sua conta e mensagens estão seguras", "Review": "Revisar", "Later": "Mais tarde", "Your homeserver has exceeded its user limit.": "Seu servidor ultrapassou seu limite de usuárias(os).", @@ -1298,10 +1298,10 @@ "To return to your account in future you need to set a password": "Para retornar à sua conta no futuro, você precisa definir uma senha", "Set up encryption": "Configurar a criptografia", "Encryption upgrade available": "Atualização de criptografia disponível", - "Verify this session": "Verificar esta sessão", + "Verify this session": "Confirmar esta sessão", "Upgrade": "Atualizar", - "Verify": "Verificar", - "Verify yourself & others to keep your chats safe": "Verifique a sua conta e as dos seus contatos, para manter suas conversas seguras", + "Verify": "Confirmar", + "Verify yourself & others to keep your chats safe": "Confirme a sua conta e as dos seus contatos, para manter suas conversas seguras", "Other users may not trust it": "Outras(os) usuárias(os) podem não confiar nela", "New login. Was this you?": "Novo login. Foi você?", "Verify the new login accessing your account: %(name)s": "Verifique o novo login na sua conta: %(name)s", @@ -1336,8 +1336,8 @@ "Match system theme": "Se adaptar ao tema do sistema", "Use a system font": "Usar uma fonte do sistema", "System font name": "Nome da fonte do sistema", - "Never send encrypted messages to unverified sessions from this session": "Nunca envie mensagens criptografadas para sessões não verificadas desta sessão", - "Never send encrypted messages to unverified sessions in this room from this session": "Nunca envie mensagens criptografadas para sessões não verificadas nesta sala, desta sessão", + "Never send encrypted messages to unverified sessions from this session": "Nunca envie mensagens criptografadas a partir desta sessão para sessões não confirmadas", + "Never send encrypted messages to unverified sessions in this room from this session": "Nunca envie mensagens criptografadas a partir desta sessão para sessões não confirmadas nessa sala", "Order rooms by name": "Ordenar salas por nome", "Show rooms with unread notifications first": "Mostrar primeiro as salas com notificações não lidas", "Show shortcuts to recently viewed rooms above the room list": "Mostrar atalhos para salas recentemente visualizadas acima da lista de salas", @@ -1358,7 +1358,7 @@ "Incoming voice call": "Recebendo chamada de voz", "Incoming video call": "Recebendo chamada de vídeo", "Incoming call": "Recebendo chamada", - "Verify this session by completing one of the following:": "Verifique esta sessão completando um dos seguintes:", + "Verify this session by completing one of the following:": "Confirme esta sessão completando um dos seguintes:", "Scan this unique code": "Escaneie este código único", "or": "ou", "Compare unique emoji": "Comparar emojis únicos", @@ -1366,9 +1366,9 @@ "Start": "Iniciar", "Confirm the emoji below are displayed on both sessions, in the same order:": "Confirme que os emojis abaixo estão sendo exibidos nas duas sessões, na mesma ordem:", "Verify this session by confirming the following number appears on its screen.": "Verifique esta sessão confirmando que o seguinte número aparece na sua tela.", - "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Aguardando a outra sessão, %(deviceName)s (%(deviceId)s), verificar…", - "Waiting for your other session to verify…": "Aguardando a outra sessão verificar…", - "Waiting for %(displayName)s to verify…": "Aguardando %(displayName)s verificar…", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Aguardando a outra sessão, %(deviceName)s (%(deviceId)s), confirmar…", + "Waiting for your other session to verify…": "Aguardando a outra sessão confirmar…", + "Waiting for %(displayName)s to verify…": "Aguardando %(displayName)s confirmar…", "Cancelling…": "Cancelando…", "They match": "São coincidentes", "They don't match": "Elas não são correspondentes", @@ -1405,7 +1405,7 @@ "Session backup key:": "Chave de cópia (backup) da sessão:", "Secret storage public key:": "Chave pública do armazenamento secreto:", "in account data": "nos dados de conta", - "Homeserver feature support:": "Funcionalidades suportadas pelo servidor:", + "Homeserver feature support:": "Recursos suportados pelo servidor:", "exists": "existe", "Your homeserver does not support session management.": "Seu servidor não suporta gerenciamento de sessões.", "Unable to load session list": "Não foi possível carregar a lista de sessões", @@ -1420,7 +1420,7 @@ "Delete %(count)s sessions|one": "Apagar %(count)s sessão", "ID": "ID", "Public Name": "Nome público", - "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verificar individualmente cada sessão usada por um usuário para marcá-la como confiável, em vez de confiar em aparelhos autoverificados.", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifique individualmente cada sessão usada por um usuário para marcá-la como confiável, em vez de confirmar em aparelhos autoverificados.", "Securely cache encrypted messages locally for them to appear in search results, using ": "Armazene mensagens criptografadas localmente para que elas apareçam nas buscas, usando· ", " to store messages from ": " para armazenar mensagens de ", "rooms.": "salas.", @@ -1439,14 +1439,14 @@ "not stored": "não armazenado", "Backup has a valid signature from this user": "A cópia de segurança (backup) tem uma assinatura válida deste(a) usuário(a)", "Backup has a invalid signature from this user": "A cópia de segurança (backup) tem uma assinatura inválida deste(a) usuário(a)", - "Backup has a signature from unknown user with ID %(deviceId)s": "A cópia de segurança tem uma assinatura de um(a) usuário desconhecido com ID %(deviceId)s", + "Backup has a signature from unknown user with ID %(deviceId)s": "A cópia de segurança tem uma assinatura de um usuário desconhecido com ID %(deviceId)s", "Backup has a signature from unknown session with ID %(deviceId)s": "A cópia de segurança tem uma assinatura de uma sessão desconhecida com ID %(deviceId)s", "Backup has a valid signature from this session": "A cópia de segurança (backup) tem uma assinatura válida desta sessão", "Backup has an invalid signature from this session": "A cópia de segurança (backup) tem uma assinatura inválida desta sessão", - "Backup has a valid signature from verified session ": "A cópia de segurança (backup) tem uma assinatura válida da sessão verificada ", - "Backup has a valid signature from unverified session ": "A cópia de segurança tem uma assinatura válida de uma sessão não verificada ", - "Backup has an invalid signature from verified session ": "A cópia de segurança tem uma assinatura inválida de uma sessão verificada ", - "Backup has an invalid signature from unverified session ": "A cópia de segurança (backup) tem uma assinatura inválida de uma sessão não verificada ", + "Backup has a valid signature from verified session ": "A cópia de segurança (backup) tem uma assinatura válida da sessão confirmada ", + "Backup has a valid signature from unverified session ": "A cópia de segurança tem uma assinatura válida de uma sessão não confirmada ", + "Backup has an invalid signature from verified session ": "A cópia de segurança tem uma assinatura inválida de uma sessão confirmada ", + "Backup has an invalid signature from unverified session ": "A cópia de segurança (backup) tem uma assinatura inválida de uma sessão não confirmada ", "Backup is not signed by any of your sessions": "A cópia de segurança (backup) não foi assinada por nenhuma de suas sessões", "This backup is trusted because it has been restored on this session": "Esta cópia de segurança (backup) é confiável, pois foi restaurada nesta sessão", "Backup key stored: ": "Chave de segurança (backup) armazenada: ", @@ -1464,15 +1464,15 @@ "Encryption": "Criptografia", "Once enabled, encryption cannot be disabled.": "Uma vez ativada, a criptografia não poderá ser desativada.", "Encrypted": "Criptografada", - "Click the link in the email you received to verify and then click continue again.": "Clique no link no e-mail que você recebeu para verificar e então clique novamente em continuar.", + "Click the link in the email you received to verify and then click continue again.": "Clique no link no e-mail que você recebeu para confirmar e então clique novamente em continuar.", "Verify the link in your inbox": "Verifique o link na sua caixa de e-mails", "This room is end-to-end encrypted": "Esta sala é criptografada de ponta a ponta", - "Your key share request has been sent - please check your other sessions for key share requests.": "Sua solicitação de compartilhamento de chaves foi enviada - por favor, verifique a existência de solicitações de compartilhamento de chaves em suas outras sessões .", + "Your key share request has been sent - please check your other sessions for key share requests.": "Sua solicitação de compartilhamento de chaves foi enviada - por favor, confirme a existência de solicitações de compartilhamento de chaves em suas outras sessões.", "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Solicitações de compartilhamento de chaves são enviadas para suas outras sessões automaticamente. Se você recusou ou ignorou a solicitação de compartilhamento de chaves em suas outras sessões, clique aqui para solicitar as chaves para esta sessão novamente.", "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Se suas outras sessões não possuem a chave para esta mensagem, você não será capaz de descriptografá-la.", "Re-request encryption keys from your other sessions.": "Solicitar novamente as chaves de criptografia das suas outras sessões.", "This message cannot be decrypted": "Esta mensagem não pode ser descriptografada", - "Encrypted by an unverified session": "Criptografada por uma sessão não verificada", + "Encrypted by an unverified session": "Criptografada por uma sessão não confirmada", "Unencrypted": "Descriptografada", "Encrypted by a deleted session": "Criptografada por uma sessão já apagada", "The authenticity of this encrypted message can't be guaranteed on this device.": "A autenticidade desta mensagem criptografada não pode ser garantida neste aparelho.", @@ -1484,29 +1484,29 @@ "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "As mensagens nesta sala estão protegidas com a criptografia de ponta a ponta. Apenas você e a(s) demais pessoa(s) desta sala têm a chave para ler estas mensagens.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Atualizar esta sala irá fechar a instância atual da sala e criar uma sala atualizada com o mesmo nome.", "Hint: Begin your message with // to start it with a slash.": "Dica: Inicie sua mensagem com // para iniciar com uma barra.", - "Start Verification": "Iniciar verificação", + "Start Verification": "Iniciar confirmação", "Messages in this room are end-to-end encrypted.": "As mensagens nesta sala estão criptografadas de ponta a ponta.", "Messages in this room are not end-to-end encrypted.": "As mensagens nesta sala não estão criptografadas de ponta a ponta.", "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "Em salas criptografadas, suas mensagens estão seguras e apenas você e a pessoa que a recebe têm as chaves únicas que permitem a sua leitura.", - "Verify User": "Verificar usuária(o)", - "For extra security, verify this user by checking a one-time code on both of your devices.": "Para maior segurança, verifique esta(e) usuária(o) verificando um código único em ambos aparelhos.", + "Verify User": "Confirmar usuário", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Para maior segurança, confirme este usuário comparando um código único em ambos os aparelhos.", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "Você apagará para todos as %(count)s mensagens de %(user)s na sala. Isso não pode ser desfeito. Deseja continuar?", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Você está a ponto de remover 1 mensagem de %(user)s. Isso não poderá ser desfeito. Quer continuar?", "This client does not support end-to-end encryption.": "A sua versão do aplicativo não suporta a criptografia de ponta a ponta.", - "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "A sessão que você deseja verificar não é compatível com o escaneamento de código QR ou a verificação via emojis do %(brand)s. Tente verificar a partir de outro aplicativo do Element.", - "Verify by scanning": "Verificar através de QR Code", - "If you can't scan the code above, verify by comparing unique emoji.": "Se você não consegue escanear o código acima, verifique comparando os emojis únicos.", - "Verify by comparing unique emoji.": "Verificar comparando emoji único.", - "Verify by emoji": "Verificar por emoji", - "Verify all users in a room to ensure it's secure.": "Verificar todas(os) as(os) usuárias(os) em uma sala para se certificar que ela é segura.", - "In encrypted rooms, verify all users to ensure it’s secure.": "Em salas criptografadas, verificar todas(os) as(os) usuárias(os) para garantir que elas são seguras.", - "Start verification again from the notification.": "Iniciar verificação novamente, após a notificação.", - "Start verification again from their profile.": "Iniciar a verificação novamente a partir do perfil deste usuário.", + "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "A sessão que você deseja confirmar não é compatível com o escaneamento de código QR ou a confirmação via emojis do %(brand)s. Tente confirmar a partir de outro aplicativo do Element.", + "Verify by scanning": "Confirmar através de QR Code", + "If you can't scan the code above, verify by comparing unique emoji.": "Se você não consegue escanear o código acima, confirme comparando emojis únicos.", + "Verify by comparing unique emoji.": "Confirmar comparando emojis únicos.", + "Verify by emoji": "Confirmar por emojis", + "Verify all users in a room to ensure it's secure.": "Verifique todos os usuários em uma sala para se certificar de que ela está segura.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Em salas criptografadas, verifique todos os usuários para garantir que a sala está segura.", + "Start verification again from the notification.": "Iniciar a confirmação novamente, após a notificação.", + "Start verification again from their profile.": "Iniciar a confirmação novamente, a partir do perfil deste usuário.", "Encryption enabled": "Criptografia ativada", - "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "As mensagens nesta sala estão criptografadas de ponta a ponta. Lembre-se de verificar este usuário no perfil dele/dela.", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "As mensagens nesta sala estão criptografadas de ponta a ponta. Lembre-se de confirmar este usuário no perfil dele/dela.", "Encryption not enabled": "Criptografia desativada", "The encryption used by this room isn't supported.": "A criptografia usada nesta sala não é suportada.", - "%(name)s wants to verify": "%(name)s deseja verificar", + "%(name)s wants to verify": "%(name)s solicita confirmação", "Smileys & People": "Sorrisos e pessoas", "Widgets do not use message encryption.": "Widgets não usam criptografia de mensagens.", "Please create a new issue on GitHub so that we can investigate this bug.": "Por favor, crie um novo bilhete de erro no GitHub para que possamos investigar esta falha.", @@ -1520,9 +1520,9 @@ "Create a private room": "Criar uma sala privada", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Impedir usuários de outros servidores na rede Matrix de entrarem nesta sala (Essa configuração não pode ser alterada posteriormente!)", "You've previously used a newer version of %(brand)s with this session. To use this version again with end to end encryption, you will need to sign out and back in again.": "Você já usou uma versão mais recente do %(brand)s nesta sessão. Para usar esta versão novamente com a criptografia de ponta a ponta, você terá que se desconectar e entrar novamente.", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifique este usuário para torná-lo confiável. Confiar nos usuários fornece segurança adicional ao trocar mensagens criptografadas de ponta a ponta.", - "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifique este aparelho para torná-lo confiável. Confiar neste aparelho fornecerá segurança adicional para você e aos outros ao trocarem mensagens criptografadas de ponta a ponta.", - "We couldn't create your DM. Please check the users you want to invite and try again.": "Não conseguimos criar sua mensagem direta. Por favor, verifique as(os) usuárias(os) que você quer convidar e tente novamente.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Confirme este usuário para torná-lo confiável. Confiar nos usuários fornece segurança adicional ao trocar mensagens criptografadas de ponta a ponta.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Confirme este aparelho para torná-lo confiável. Confiar neste aparelho fornecerá segurança adicional para você e aos outros ao trocarem mensagens criptografadas de ponta a ponta.", + "We couldn't create your DM. Please check the users you want to invite and try again.": "Não conseguimos criar sua mensagem direta. Por favor, verifique os usuários que você deseja convidar e tente novamente.", "Start a conversation with someone using their name, username (like ) or email address.": "Comece uma conversa com alguém usando o seu respectivo nome e sobrenome, nome de usuário (por exemplo: ) ou endereço de e-mail.", "a new master key signature": "uma nova chave mestra de assinatura", "a new cross-signing key signature": "uma nova chave de autoverificação", @@ -1530,9 +1530,9 @@ "I don't want my encrypted messages": "Não quero minhas mensagens criptografadas", "You'll lose access to your encrypted messages": "Você perderá acesso às suas mensagens criptografadas", "Session key": "Chave da sessão", - "Verify session": "Verificar sessão", + "Verify session": "Confirmar sessão", "We recommend you change your password and recovery key in Settings immediately": "Nós recomendamos que você altere imediatamente sua senha e chave de recuperação nas Configurações", - "Use this session to verify your new one, granting it access to encrypted messages:": "Use esta sessão para verificar a sua nova sessão, dando a ela acesso às mensagens criptografadas:", + "Use this session to verify your new one, granting it access to encrypted messages:": "Use esta sessão para confirmar a sua nova sessão, dando a ela acesso às mensagens criptografadas:", "You’re already signed in and good to go here, but you can also grab the latest versions of the app on all platforms at element.io/get-started.": "Você já está logada(o) e pode começar a usar à vontade, mas você também pode buscar pelas últimas versões do app em todas as plataformas em element.io/get-started.", "Go to Element": "Ir a Element", "We’re excited to announce Riot is now Element!": "Estamos muito felizes de anunciar que agora Riot é Element!", @@ -1541,18 +1541,18 @@ "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Reportar esta mensagem enviará o seu 'event ID' único para o/a administrador/a do seu Homeserver. Se as mensagens nesta sala são criptografadas, o/a administrador/a não conseguirá ler o texto da mensagem nem ver nenhuma imagem ou arquivo.", "Sign out and remove encryption keys?": "Fazer logout e remover as chaves de criptografia?", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Alguns dados de sessão, incluindo chaves de mensagens criptografadas, estão faltando. Faça logout e entre novamente para resolver isso, restaurando as chaves do backup.", - "Verify other session": "Verificar outra sessão", - "A widget would like to verify your identity": "Um Widget quer verificar sua identidade", - "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Um widget localizado em %(widgetUrl)s deseja verificar sua identidade. Permitindo isso, o widget poderá verificar sua ID de usuário, mas não poderá realizar nenhuma ação em seu nome.", + "Verify other session": "Confirmar outra sessão", + "A widget would like to verify your identity": "Um widget deseja confirmar sua identidade", + "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Um widget localizado em %(widgetUrl)s deseja confirmar sua identidade. Permitindo isso, o widget poderá verificar sua ID de usuário, mas não poderá realizar nenhuma ação em seu nome.", "Wrong Recovery Key": "Chave de recuperação errada", "Invalid Recovery Key": "Chave de recuperação inválida", - "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Não foi possível acessar o armazenamento secreto. Por favor, verifique que você entrou com a frase de recuperação correta.", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Não foi possível acessar o armazenamento secreto. Por favor, verifique que você digitou a frase de recuperação correta.", "Enter your Security Phrase or to continue.": "Entre com sua Frase de Segurança ou para continuar.", "Security Key": "Chave de Segurança", "Use your Security Key to continue.": "Use sua Chave de Segurança para continuar.", "Recovery key mismatch": "Chave de recuperação incorreta", - "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "O backup não pôde ser descriptografado com esta chave de recuperação: por favor, verifique se você entrou com a chave de recuperação correta.", - "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "O backup não pôde ser descriptografado com esta frase de recuperação: por favor, verifique se você entrou com a frase de recuperação correta.", + "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "O backup não pôde ser descriptografado com esta chave de recuperação: por favor, verifique se você digitou a chave de recuperação correta.", + "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "O backup não pôde ser descriptografado com esta frase de recuperação: por favor, verifique se você digitou a frase de recuperação correta.", "Warning: you should only set up key backup from a trusted computer.": "Atenção: você só deve configurar a cópia de segurança (backup) das chaves em um computador de sua confiança.", "Enter recovery key": "Digite a chave de recuperação", "Warning: You should only set up key backup from a trusted computer.": "Atenção: Você só deve configurar a cópia de segurança (backup) das chaves em um computador de sua confiança.", @@ -1570,14 +1570,14 @@ "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Detectamos uma versão mais antiga do %(brand)s. Isso fará com que a criptografia de ponta a ponta não funcione corretamente. As mensagens criptografadas de ponta a ponta trocadas recentemente, enquanto você usava a versão mais antiga, talvez não sejam descriptografáveis na nova versão. Isso também poderá fazer com que as mensagens trocadas nesta sessão falhem na mais atual. Se você tiver problemas, desconecte-se e entre novamente. Para manter o histórico de mensagens, exporte e reimporte suas chaves.", "%(creator)s created and configured the room.": "%(creator)s criou e configurou esta sala.", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Se você não conseguir encontrar a sala que está procurando, peça um convite para a sala ou Crie uma nova sala.", - "Verify this login": "Verificar este login", + "Verify this login": "Confirmar este login", "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Alterar a sua senha redefinirá todas as chaves de criptografia de ponta a ponta existentes em todas as suas sessões, tornando o histórico de mensagens criptografadas ilegível. Faça uma cópia (backup) das suas chaves, ou exporte as chaves de outra sessão antes de alterar a sua senha.", "Create account": "Criar conta", "Create your account": "Criar sua conta", "Use Recovery Key or Passphrase": "Use a chave de recuperação, ou a frase de recuperação", "Use Recovery Key": "Usar a chave de recuperação", - "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirme sua identidade através da verificação deste login em qualquer uma de suas outras sessões, garantindo a elas acesso a mensagens criptografadas.", - "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sua nova sessão está agora verificada. Ela tem acesso às suas mensagens criptografadas, e outras(os) usuárias(os) poderão ver esta sessão como confiável.", + "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirme sua identidade através da confirmação deste login em qualquer uma de suas outras sessões, garantindo a elas acesso a mensagens criptografadas.", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sua nova sessão está agora confirmada. Ela tem acesso às suas mensagens criptografadas, e outros usuários poderão ver esta sessão como confiável.", "Without completing security on this session, it won’t have access to encrypted messages.": "Sem completar os procedimentos de segurança nesta sessão, você não terá acesso a mensagens criptografadas.", "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Recupere acesso à sua conta e restaure as chaves de criptografia armazenadas nesta sessão. Sem elas, você não conseguirá ler todas as suas mensagens seguras em nenhuma sessão.", "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Atenção: Seus dados pessoais (incluindo chaves de criptografia) ainda estão armazenados nesta sessão. Apague-os quando tiver finalizado esta sessão, ou se quer entrar com outra conta.", @@ -1588,7 +1588,7 @@ "We’ll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "Nós geramos uma Chave de Segurança para você. Por favor, guarde-a em um lugar seguro, como um gerenciador de senhas ou um cofre.", "Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Use uma frase secreta que apenas você conhece, e opcionalmente salve uma Chave de Segurança para usar como cópia de segurança (backup).", "Restore your key backup to upgrade your encryption": "Restaurar a sua cópia segura (backup) de chaves para atualizar a sua criptografia", - "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Atualize esta sessão para permitir que ela verifique outras sessões, dando a elas acesso às mensagens criptografadas e marcando-as como confiáveis para as(os) demais usuárias(os).", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Atualize esta sessão para permitir que ela confirme outras sessões, dando a elas acesso às mensagens criptografadas e marcando-as como confiáveis para os seus contatos.", "Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Guarde sua Chave de Segurança em algum lugar seguro, como por exemplo um gestor de senhas ou um cofre, já que esta chave é a proteção para seus dados criptografados.", "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Se você cancelar agora, poderá perder mensagens e dados criptografados se você perder acesso aos seus logins atuais.", "Upgrade your encryption": "Atualizar sua criptografia", @@ -1620,7 +1620,7 @@ "Leave Room": "Sair da sala", "Forget Room": "Esquecer Sala", "Favourited": "Favoritado", - "You cancelled verifying %(name)s": "Você cancelou a verificação do %(name)s", + "You cancelled verifying %(name)s": "Você cancelou a confirmação de %(name)s", "You accepted": "Você aceitou", "%(name)s accepted": "%(name)s aceitou", "You declined": "Você recusou", @@ -1629,7 +1629,7 @@ "%(name)s cancelled": "%(name)s cancelou", "Accepting …": "Aceitando…", "Declining …": "Recusando…", - "You sent a verification request": "Você enviou uma solicitação de verificação", + "You sent a verification request": "Você enviou uma solicitação de confirmação", "Show all": "Mostrar tudo", "Reactions": "Reações", " reacted with %(content)s": " reagiu com %(content)s", @@ -1697,7 +1697,7 @@ "Confirm account deactivation": "Confirmar desativação da conta", "Server did not return valid authentication information.": "O servidor não retornou informações de autenticação válidas.", "View Servers in Room": "Ver Servidores na Sala", - "Verification Requests": "Solicitações de verificação", + "Verification Requests": "Solicitações de confirmação", "Integrations are disabled": "As integrações estão desativadas", "Integrations not allowed": "As integrações não estão permitidas", "End": "Fim", @@ -1724,7 +1724,7 @@ "Other published addresses:": "Outros endereços publicados:", "New published address (e.g. #alias:server)": "Novo endereço publicado (por exemplo, #apelido:server)", "Local Addresses": "Endereços locais", - "%(name)s cancelled verifying": "%(name)s cancelou a verificação", + "%(name)s cancelled verifying": "%(name)s cancelou a confirmação", "Your display name": "Seu nome e sobrenome", "Your avatar URL": "Link da sua foto de perfil", "Your user ID": "Sua ID de usuário", @@ -1747,8 +1747,8 @@ "Topic (optional)": "Descrição (opcional)", "There was a problem communicating with the server. Please try again.": "Ocorreu um problema na comunicação com o servidor. Por favor, tente novamente.", "Server did not require any authentication": "O servidor não exigiu autenticação", - "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Se você verificar esse usuário, a sessão será marcada como confiável para você e para ele.", - "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verificar este aparelho o marcará como confiável, e os usuários que confirmaram com você também confiarão neste aparelho.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Se você confirmar esse usuário, a sessão será marcada como confiável para você e para ele.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Confirmar este aparelho o marcará como confiável para você e para os usuários que se confirmaram com você.", "Keep going...": "Continue...", "The username field must not be blank.": "O campo do nome de usuário não pode ficar em branco.", "Username": "Nome de usuário", @@ -1867,9 +1867,9 @@ "Securely back up your keys to avoid losing them. Learn more.": "Faça backup de suas chaves com segurança para evitar perdê-las. Saiba mais.", "Not now": "Agora não", "Don't ask me again": "Não pergunte novamente", - "Appearance": "Mostrar", - "Show rooms with unread messages first": "Salas não lidas primeiro", - "Show previews of messages": "Pré-visualizações de mensagens", + "Appearance": "Aparência", + "Show rooms with unread messages first": "Mostrar salas não lidas em primeiro", + "Show previews of messages": "Mostrar pré-visualizações de mensagens", "Sort by": "Ordenar por", "Activity": "Atividade recente", "A-Z": "A-Z", @@ -1954,20 +1954,20 @@ "Ban users": "Banir usuários", "Remove messages": "Apagar mensagens dos outros", "Notify everyone": "Notificar todos", - "Your email address hasn't been verified yet": "Seu endereço de e-mail ainda não foi verificado", + "Your email address hasn't been verified yet": "Seu endereço de e-mail ainda não foi confirmado", "Revoke": "Revogar", "Share": "Compartilhar", "Unable to revoke sharing for phone number": "Não foi possível revogar o compartilhamento do número de celular", "Unable to share phone number": "Não foi possível compartilhar o número de celular", - "Please enter verification code sent via text.": "Digite o código de verificação enviado por mensagem de texto.", + "Please enter verification code sent via text.": "Digite o código de confirmação enviado por mensagem de texto.", "Remove %(email)s?": "Remover %(email)s?", "Remove %(phone)s?": "Remover %(phone)s?", - "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Digite o código de verificação enviado por mensagem de texto para +%(msisdn)s.", - "This user has not verified all of their sessions.": "Este usuário não verificou todas as próprias sessões.", - "You have not verified this user.": "Você não verificou este usuário.", - "You have verified this user. This user has verified all of their sessions.": "Você confirmou este usuário. Este usuário verificou todas as próprias sessões.", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Digite o código de confirmação enviado por mensagem de texto para +%(msisdn)s.", + "This user has not verified all of their sessions.": "Este usuário não confirmou todas as próprias sessões.", + "You have not verified this user.": "Você não confirmou este usuário.", + "You have verified this user. This user has verified all of their sessions.": "Você confirmou este usuário. Este usuário confirmou todas as próprias sessões.", "Someone is using an unknown session": "Alguém está usando uma sessão desconhecida", - "Everyone in this room is verified": "Todos nesta sala estão verificados", + "Everyone in this room is verified": "Todos nesta sala estão confirmados", "Edit message": "Editar mensagem", "Mod": "Moderador", "Scroll to most recent messages": "Ir para as mensagens mais recentes", @@ -2003,9 +2003,9 @@ "Your homeserver": "Seu servidor local", "Trusted": "Confiável", "Not trusted": "Não confiável", - "%(count)s verified sessions|other": "%(count)s sessões verificadas", - "%(count)s verified sessions|one": "1 sessão verificada", - "Hide verified sessions": "Esconder sessões verificadas", + "%(count)s verified sessions|other": "%(count)s sessões confirmadas", + "%(count)s verified sessions|one": "1 sessão confirmada", + "Hide verified sessions": "Esconder sessões confirmadas", "%(count)s sessions|other": "%(count)s sessões", "%(count)s sessions|one": "%(count)s sessão", "Hide sessions": "Esconder sessões", @@ -2019,16 +2019,16 @@ "Deactivate user": "Desativar usuário", "Failed to deactivate user": "Falha ao desativar o usuário", "Security": "Segurança", - "You've successfully verified your device!": "Você verificou o seu aparelho com êxito!", - "Verification timed out.": "O tempo de verificação se esgotou.", - "You cancelled verification on your other session.": "Você cancelou a verificação em sua outra sessão.", - "%(displayName)s cancelled verification.": "%(displayName)s cancelou a verificação.", - "You cancelled verification.": "Você cancelou a verificação.", - "Verification cancelled": "Verificação cancelada", + "You've successfully verified your device!": "Você confirmou o seu aparelho com êxito!", + "Verification timed out.": "O tempo de confirmação se esgotou.", + "You cancelled verification on your other session.": "Você cancelou a confirmação em sua outra sessão.", + "%(displayName)s cancelled verification.": "%(displayName)s cancelou a confirmação.", + "You cancelled verification.": "Você cancelou a confirmação.", + "Verification cancelled": "Confirmação cancelada", "Compare emoji": "Compare os emojis", "Show image": "Mostrar imagem", "You have ignored this user, so their message is hidden. Show anyways.": "Você bloqueou este usuário, portanto, a mensagem dele foi escondida. Mostrar mesmo assim.", - "You verified %(name)s": "Você verificou %(name)s", + "You verified %(name)s": "Você confirmou %(name)s", "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Use um servidor de identidade para convidar por e-mail. Use o padrão (%(defaultIdentityServerName)s) ou um servidor personalizado em Configurações.", "Use an identity server to invite by email. Manage in Settings.": "Use um servidor de identidade para convidar por e-mail. Gerencie o servidor em Configurações.", "Destroy cross-signing keys?": "Destruir chaves autoverificadas?", @@ -2076,7 +2076,7 @@ "Upload %(count)s other files|one": "Enviar %(count)s outros arquivos", "Cancel All": "Cancelar tudo", "Upload Error": "Erro no envio", - "Verification Request": "Solicitação de verificação", + "Verification Request": "Solicitação de confirmação", "Remember my selection for this widget": "Lembrar minha escolha para este widget", "Deny": "Rejeitar", "Wrong file type": "Tipo errado de arquivo", @@ -2125,7 +2125,7 @@ "Feedback": "Fale conosco", "User menu": "Menu do usuário", "Could not load user profile": "Não foi possível carregar o perfil do usuário", - "Session verified": "Sessão verificada", + "Session verified": "Sessão confirmada", "Your Matrix account on %(serverName)s": "Sua conta Matrix em %(serverName)s", "Your Matrix account on ": "Sua conta Matrix em ", "No identity server is configured: add one in server settings to reset your password.": "Nenhum servidor de identidade está configurado: adicione um nas configurações do servidor para redefinir sua senha.", @@ -2164,7 +2164,7 @@ "Unable to revoke sharing for email address": "Não foi possível revogar o compartilhamento do endereço de e-mail", "Unable to share email address": "Não foi possível compartilhar o endereço de e-mail", "Direct message": "Enviar mensagem", - "Incoming Verification Request": "Recebendo solicitação de verificação", + "Incoming Verification Request": "Recebendo solicitação de confirmação", "Recently Direct Messaged": "Conversas recentes", "Direct Messages": "Conversas", "Your account is not secure": "Sua conta não está segura", @@ -2209,7 +2209,7 @@ "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Alterações em quem pode ler o histórico de conversas aplica-se apenas para mensagens futuras nesta sala. A visibilidade do histórico existente não será alterada.", "Ask %(displayName)s to scan your code:": "Peça para %(displayName)s escanear o seu código:", "Almost there! Is %(displayName)s showing the same shield?": "Quase lá! Este escudo também aparece para %(displayName)s?", - "You've successfully verified %(displayName)s!": "Você verificou %(displayName)s com sucesso!", + "You've successfully verified %(displayName)s!": "Você confirmou %(displayName)s com sucesso!", "Confirm this user's session by comparing the following with their User Settings:": "Confirme a sessão deste usuário comparando o seguinte com as configurações deste usuário:", "Report Content to Your Homeserver Administrator": "Denunciar conteúdo ao administrador do seu servidor principal", "Cross-signing": "Autoverificação", @@ -2217,7 +2217,7 @@ "Error updating flair": "Falha ao atualizar o ícone", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Ocorreu um erro ao atualizar o ícone nesta sala. O servidor pode não permitir ou ocorreu um erro temporário.", "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Desativar este usuário irá desconectá-lo e impedi-lo de fazer o login novamente. Além disso, ele sairá de todas as salas em que estiver. Esta ação não pode ser revertida. Tem certeza de que deseja desativar este usuário?", - "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Apagar chaves de autoverificação é permanente. Qualquer pessoa com quem você fez a verificação receberá alertas de segurança. Não é aconselhável fazer isso, a menos que você tenha perdido todos os aparelhos nos quais fez a autoverificação.", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Apagar chaves de autoverificação é permanente. Qualquer pessoa com quem você se confirmou receberá alertas de segurança. Não é aconselhável fazer isso, a menos que você tenha perdido todos os aparelhos nos quais fez a autoverificação.", "Clear cross-signing keys": "Limpar chaves autoverificadas", "a device cross-signing signature": "um aparelho autoverificado", "Homeserver URL does not appear to be a valid Matrix homeserver": "O endereço do servidor local não parece indicar um servidor local válido na Matrix", @@ -2235,7 +2235,7 @@ "No other published addresses yet, add one below": "Nenhum endereço publicado ainda, adicione um abaixo", "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Defina endereços para esta sala, de modo que os usuários possam encontrar esta sala em seu servidor local (%(localDomain)s)", "One of the following may be compromised:": "Um dos seguintes pode estar comprometido:", - "The homeserver the user you’re verifying is connected to": "O servidor local no qual o usuário que você está verificando está conectado", + "The homeserver the user you’re verifying is connected to": "O servidor local no qual o usuário que você está confirmando está conectado", "Yours, or the other users’ internet connection": "A sua conexão de internet ou a dos outros usuários", "Yours, or the other users’ session": "A sua sessão ou a dos outros usuários", "Got it": "Ok, entendi", @@ -2280,5 +2280,8 @@ "Enter your recovery passphrase a second time to confirm it.": "Digite sua senha de recuperação uma segunda vez para confirmá-la.", "Confirm your recovery passphrase": "Confirme a sua frase de recuperação", "Page Up": "Page Up", - "Page Down": "Page Down" + "Page Down": "Page Down", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Você confirmou %(deviceName)s (%(deviceId)s) com êxito!", + "Verified": "Confirmado", + "Close dialog or context menu": "Fechar caixa de diálogo ou menu" } From 2ffc99fa7109f3f28823f632e6e2e3cb7ec77a2d Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Wed, 19 Aug 2020 10:13:35 +0000 Subject: [PATCH 055/174] Translated using Weblate (Russian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 214648eea7..7a6d4c3866 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2408,5 +2408,12 @@ "Master private key:": "Приватный мастер-ключ:", "Show message previews for reactions in DMs": "Показывать превью сообщений для реакций в ЛС", "Show message previews for reactions in all rooms": "Показывать предварительный просмотр сообщений для реакций во всех комнатах", - "Explore public rooms": "Просмотреть публичные комнаты" + "Explore public rooms": "Просмотреть публичные комнаты", + "Uploading logs": "Загрузка журналов", + "Downloading logs": "Скачивание журналов", + "Can't see what you’re looking for?": "Не видите то, что ищете?", + "Explore all public rooms": "Просмотреть все публичные комнаты", + "%(count)s results|other": "%(count)s результатов", + "Preparing to download logs": "Подготовка к загрузке журналов", + "Download logs": "Скачать журналы" } From b293ef067442c157b39760fb7506b6fcf3c770b7 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 14 Aug 2020 13:01:43 +0100 Subject: [PATCH 056/174] Check for .well-known E2EE settings under new key This adds an extra check for `.well-known` E2EE settings under the key `im.vector.e2ee`. The older key `im.vector.riot.e2ee` is kept for historical compatibility. Part of https://github.com/vector-im/element-web/issues/14954 --- src/createRoom.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/createRoom.ts b/src/createRoom.ts index 23a664a4c4..b9f30476e4 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -27,7 +27,8 @@ import * as Rooms from "./Rooms"; import DMRoomMap from "./utils/DMRoomMap"; import {getAddressType} from "./UserAddress"; -const E2EE_WK_KEY = "im.vector.riot.e2ee"; +const E2EE_WK_KEY = "im.vector.e2ee"; +const E2EE_WK_KEY_DEPRECATED = "im.vector.riot.e2ee"; // we define a number of interfaces which take their names from the js-sdk /* eslint-disable camelcase */ @@ -300,6 +301,10 @@ export function privateShouldBeEncrypted() { const defaultDisabled = clientWellKnown[E2EE_WK_KEY]["default"] === false; return !defaultDisabled; } + if (clientWellKnown && clientWellKnown[E2EE_WK_KEY_DEPRECATED]) { + const defaultDisabled = clientWellKnown[E2EE_WK_KEY_DEPRECATED]["default"] === false; + return !defaultDisabled; + } return true; } From 2b0865e89c3377ac66035e9c4873757614417835 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 14 Aug 2020 13:27:12 +0100 Subject: [PATCH 057/174] Move E2EE well-known access to utils --- src/createRoom.ts | 17 +++++------------ src/utils/WellKnownUtils.ts | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 src/utils/WellKnownUtils.ts diff --git a/src/createRoom.ts b/src/createRoom.ts index b9f30476e4..78d0cf1356 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -26,9 +26,7 @@ import dis from "./dispatcher/dispatcher"; import * as Rooms from "./Rooms"; import DMRoomMap from "./utils/DMRoomMap"; import {getAddressType} from "./UserAddress"; - -const E2EE_WK_KEY = "im.vector.e2ee"; -const E2EE_WK_KEY_DEPRECATED = "im.vector.riot.e2ee"; +import { getE2EEWellKnown } from "./utils/WellKnownUtils"; // we define a number of interfaces which take their names from the js-sdk /* eslint-disable camelcase */ @@ -295,16 +293,11 @@ export async function ensureDMExists(client: MatrixClient, userId: string): Prom return roomId; } -export function privateShouldBeEncrypted() { - const clientWellKnown = MatrixClientPeg.get().getClientWellKnown(); - if (clientWellKnown && clientWellKnown[E2EE_WK_KEY]) { - const defaultDisabled = clientWellKnown[E2EE_WK_KEY]["default"] === false; +export function privateShouldBeEncrypted(): boolean { + const e2eeWellKnown = getE2EEWellKnown(); + if (e2eeWellKnown) { + const defaultDisabled = e2eeWellKnown["default"] === false; return !defaultDisabled; } - if (clientWellKnown && clientWellKnown[E2EE_WK_KEY_DEPRECATED]) { - const defaultDisabled = clientWellKnown[E2EE_WK_KEY_DEPRECATED]["default"] === false; - return !defaultDisabled; - } - return true; } diff --git a/src/utils/WellKnownUtils.ts b/src/utils/WellKnownUtils.ts new file mode 100644 index 0000000000..2712570396 --- /dev/null +++ b/src/utils/WellKnownUtils.ts @@ -0,0 +1,35 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {MatrixClientPeg} from '../MatrixClientPeg'; + +const E2EE_WK_KEY = "im.vector.e2ee"; +const E2EE_WK_KEY_DEPRECATED = "im.vector.riot.e2ee"; + +export interface IE2EEWellKnown { + default?: boolean; +} + +export function getE2EEWellKnown(): IE2EEWellKnown { + const clientWellKnown = MatrixClientPeg.get().getClientWellKnown(); + if (clientWellKnown && clientWellKnown[E2EE_WK_KEY]) { + return clientWellKnown[E2EE_WK_KEY]; + } + if (clientWellKnown && clientWellKnown[E2EE_WK_KEY_DEPRECATED]) { + return clientWellKnown[E2EE_WK_KEY_DEPRECATED] + } + return null; +} From 941cbc47c8f6e656a30801e6cb2407b5596780e4 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 14 Aug 2020 16:40:46 +0100 Subject: [PATCH 058/174] Fix casing of Secure Backup to match designs --- .../views/dialogs/secretstorage/CreateSecretStorageDialog.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 53b3033330..bb231c24a0 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -714,7 +714,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _titleForPhase(phase) { switch (phase) { case PHASE_CHOOSE_KEY_PASSPHRASE: - return _t('Set up Secure backup'); + return _t('Set up Secure Backup'); case PHASE_MIGRATE: return _t('Upgrade your encryption'); case PHASE_PASSPHRASE: diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 8bfc3ed703..51132179cf 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2241,7 +2241,7 @@ "Retry": "Retry", "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.", "You can also set up Secure Backup & manage your keys in Settings.": "You can also set up Secure Backup & manage your keys in Settings.", - "Set up Secure backup": "Set up Secure backup", + "Set up Secure Backup": "Set up Secure Backup", "Upgrade your encryption": "Upgrade your encryption", "Set a Security Phrase": "Set a Security Phrase", "Confirm Security Phrase": "Confirm Security Phrase", From 1932505d3b6cbab5a5035f61d3eae73e91a4c23f Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 14 Aug 2020 18:06:35 +0100 Subject: [PATCH 059/174] Enforce Secure Backup completion when requested by HS This removes all buttons to escape the Secure Backup setup flow when the matching `.well-known` setting is set by homeserver. Part of https://github.com/vector-im/element-web/issues/14954 --- src/CrossSigningManager.js | 14 +++++++++++++- .../secretstorage/CreateSecretStorageDialog.js | 9 +++++---- src/utils/WellKnownUtils.ts | 5 +++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 676c41d7d7..46f0284776 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -21,6 +21,7 @@ import { deriveKey } from 'matrix-js-sdk/src/crypto/key_passphrase'; import { decodeRecoveryKey } from 'matrix-js-sdk/src/crypto/recoverykey'; import { _t } from './languageHandler'; import {encodeBase64} from "matrix-js-sdk/src/crypto/olmlib"; +import { isSecureBackupRequired } from './utils/WellKnownUtils'; // This stores the secret storage private keys in memory for the JS SDK. This is // only meant to act as a cache to avoid prompting the user multiple times @@ -208,7 +209,18 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f { force: forceReset, }, - null, /* priority = */ false, /* static = */ true, + null, + /* priority = */ false, + /* static = */ true, + /* options = */ { + onBeforeClose(reason) { + // If Secure Backup is required, you cannot leave the modal. + if (reason === "backgroundClick") { + return !isSecureBackupRequired(); + } + return true; + }, + }, ); const [confirmed] = await finished; if (!confirmed) { diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index bb231c24a0..47faa35df4 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -30,6 +30,7 @@ import StyledRadioButton from '../../../../components/views/elements/StyledRadio import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; import DialogButtons from "../../../../components/views/elements/DialogButtons"; import InlineSpinner from "../../../../components/views/elements/InlineSpinner"; +import { isSecureBackupRequired } from '../../../../utils/WellKnownUtils'; const PHASE_LOADING = 0; const PHASE_LOADERROR = 1; @@ -85,8 +86,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { canUploadKeysWithPasswordOnly: null, accountPassword: props.accountPassword || "", accountPasswordCorrect: null, - passPhraseKeySelected: CREATE_STORAGE_OPTION_KEY, + canSkip: !isSecureBackupRequired(), }; this._passphraseField = createRef(); @@ -470,7 +471,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { primaryButton={_t("Continue")} onPrimaryButtonClick={this._onChooseKeyPassphraseFormSubmit} onCancel={this._onCancelClick} - hasCancel={true} + hasCancel={this.state.canSkip} /> ; } @@ -687,7 +688,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
@@ -742,7 +743,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
diff --git a/src/utils/WellKnownUtils.ts b/src/utils/WellKnownUtils.ts index 2712570396..f16acdb408 100644 --- a/src/utils/WellKnownUtils.ts +++ b/src/utils/WellKnownUtils.ts @@ -33,3 +33,8 @@ export function getE2EEWellKnown(): IE2EEWellKnown { } return null; } + +export function isSecureBackupRequired(): boolean { + const wellKnown = getE2EEWellKnown(); + return wellKnown && wellKnown["secure_backup_required"] === true; +} From fed7ebb6bc3a9549b62cedaa94041d220a7c5605 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 17 Aug 2020 16:00:30 +0100 Subject: [PATCH 060/174] Hide Delete Backup button when Secure Backup required If Secure Backup is required by the HS admin, then this hides the Delete Backup button in Settings to ensure everyone keeps their backup per policy. Part of https://github.com/vector-im/element-web/issues/14954 --- src/components/views/settings/KeyBackupPanel.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/views/settings/KeyBackupPanel.js b/src/components/views/settings/KeyBackupPanel.js index a7a2c768db..8a74276f58 100644 --- a/src/components/views/settings/KeyBackupPanel.js +++ b/src/components/views/settings/KeyBackupPanel.js @@ -21,6 +21,7 @@ import * as sdk from '../../../index'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; +import { isSecureBackupRequired } from '../../../utils/WellKnownUtils'; export default class KeyBackupPanel extends React.PureComponent { constructor(props) { @@ -315,14 +316,19 @@ export default class KeyBackupPanel extends React.PureComponent { trustedLocally = _t("This backup is trusted because it has been restored on this session"); } + let deleteBackupButton; + if (!isSecureBackupRequired()) { + deleteBackupButton = + {_t("Delete Backup")} + ; + } + const buttonRow = (
{restoreButtonCaption}     - - {_t("Delete Backup")} - + {deleteBackupButton}
); From e8e691b746b2c8e4b6573c6407d6caec09a69db1 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 19 Aug 2020 13:28:03 +0100 Subject: [PATCH 061/174] Avoid adding setup toast in the middle of setup This improves the experience of going through secret storage setup / reset flows by avoiding intermittent toasts that appear and disappear in the middle of the operation. --- src/CrossSigningManager.js | 11 +++++++++++ src/DeviceListener.ts | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 46f0284776..da09a436e9 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -35,6 +35,17 @@ function isCachingAllowed() { return secretStorageBeingAccessed; } +/** + * This can be used by other components to check if secret storage access is in + * progress, so that we can e.g. avoid intermittently showing toasts during + * secret storage setup. + * + * @returns {bool} + */ +export function isSecretStorageBeingAccessed() { + return secretStorageBeingAccessed; +} + export class AccessCancelledError extends Error { constructor() { super("Secret storage access canceled"); diff --git a/src/DeviceListener.ts b/src/DeviceListener.ts index a37521118f..aa9580834f 100644 --- a/src/DeviceListener.ts +++ b/src/DeviceListener.ts @@ -28,7 +28,8 @@ import { hideToast as hideUnverifiedSessionsToast, showToast as showUnverifiedSessionsToast, } from "./toasts/UnverifiedSessionToast"; -import {privateShouldBeEncrypted} from "./createRoom"; +import { privateShouldBeEncrypted } from "./createRoom"; +import { isSecretStorageBeingAccessed } from "./CrossSigningManager"; const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000; @@ -170,6 +171,9 @@ export default class DeviceListener { } private shouldShowSetupEncryptionToast() { + // If we're in the middle of a secret storage operation, we're likely + // modifying the state involved here, so don't add new toasts to setup. + if (isSecretStorageBeingAccessed()) return false; // In a default configuration, show the toasts. If the well-known config causes e2ee default to be false // then do not show the toasts until user is in at least one encrypted room. if (privateShouldBeEncrypted()) return true; From e56a61ec68a5baf63295ac22fd95697324f53620 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 19 Aug 2020 16:13:29 +0100 Subject: [PATCH 062/174] Invoke Secure Backup flow inside the app when requested by HS If the Secure Backup required mode is set the client `.well-known` file, then this will ensure that everyone already inside the app is required to complete setup matching that policy. Fixes https://github.com/vector-im/element-web/issues/14954 --- src/@types/global.d.ts | 2 ++ src/DeviceListener.ts | 27 ++++++++++++++++++++++-- src/components/structures/MatrixChat.tsx | 7 ++++++ src/utils/WellKnownUtils.ts | 8 +++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 86ee995a13..84340d8219 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -27,10 +27,12 @@ import {ModalManager} from "../Modal"; import SettingsStore from "../settings/SettingsStore"; import {ActiveRoomObserver} from "../ActiveRoomObserver"; import {Notifier} from "../Notifier"; +import type {Renderer} from "react-dom"; declare global { interface Window { Modernizr: ModernizrStatic; + matrixChat: ReturnType; mxMatrixClientPeg: IMatrixClientPeg; Olm: { init: () => Promise; diff --git a/src/DeviceListener.ts b/src/DeviceListener.ts index aa9580834f..41daa74376 100644 --- a/src/DeviceListener.ts +++ b/src/DeviceListener.ts @@ -15,6 +15,7 @@ limitations under the License. */ import {MatrixClientPeg} from './MatrixClientPeg'; +import dis from "./dispatcher/dispatcher"; import { hideToast as hideBulkUnverifiedSessionsToast, showToast as showBulkUnverifiedSessionsToast, @@ -29,11 +30,15 @@ import { showToast as showUnverifiedSessionsToast, } from "./toasts/UnverifiedSessionToast"; import { privateShouldBeEncrypted } from "./createRoom"; -import { isSecretStorageBeingAccessed } from "./CrossSigningManager"; +import { isSecretStorageBeingAccessed, accessSecretStorage } from "./CrossSigningManager"; +import { ensureClientWellKnown, isSecureBackupRequired } from './utils/WellKnownUtils'; +import { isLoggedIn } from './components/structures/MatrixChat'; + const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000; export default class DeviceListener { + private dispatcherRef: string; // device IDs for which the user has dismissed the verify toast ('Later') private dismissed = new Set(); // has the user dismissed any of the various nag toasts to setup encryption on this device? @@ -61,6 +66,7 @@ export default class DeviceListener { MatrixClientPeg.get().on('crossSigning.keysChanged', this._onCrossSingingKeysChanged); MatrixClientPeg.get().on('accountData', this._onAccountData); MatrixClientPeg.get().on('sync', this._onSync); + this.dispatcherRef = dis.register(this._onAction); this._recheck(); } @@ -74,6 +80,10 @@ export default class DeviceListener { MatrixClientPeg.get().removeListener('accountData', this._onAccountData); MatrixClientPeg.get().removeListener('sync', this._onSync); } + if (this.dispatcherRef) { + dis.unregister(this.dispatcherRef); + this.dispatcherRef = null; + } this.dismissed.clear(); this.dismissedThisDeviceToast = false; this.keyBackupInfo = null; @@ -159,6 +169,11 @@ export default class DeviceListener { if (state === 'PREPARED' && prevState === null) this._recheck(); }; + _onAction = ({ action }) => { + if (action !== "on_logged_in") return; + this._recheck(); + }; + // The server doesn't tell us when key backup is set up, so we poll // & cache the result async _getKeyBackupInfo() { @@ -211,7 +226,15 @@ export default class DeviceListener { showSetupEncryptionToast(SetupKind.UPGRADE_ENCRYPTION); } else { // No cross-signing or key backup on account (set up encryption) - showSetupEncryptionToast(SetupKind.SET_UP_ENCRYPTION); + await ensureClientWellKnown(); + if (isSecureBackupRequired() && isLoggedIn()) { + // If we're meant to set up, and Secure Backup is required, + // trigger the flow directly without a toast once logged in. + hideSetupEncryptionToast(); + accessSecretStorage(); + } else { + showSetupEncryptionToast(SetupKind.SET_UP_ENCRYPTION); + } } } } diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index ce96847d28..9929cc523e 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -2085,3 +2085,10 @@ export default class MatrixChat extends React.PureComponent { ; } } + +export function isLoggedIn(): boolean { + // JRS: Maybe we should move the step that writes this to the window out of + // `element-web` and into this file? + const app = window.matrixChat; + return app && (app as MatrixChat).state.view === Views.LOGGED_IN; +} diff --git a/src/utils/WellKnownUtils.ts b/src/utils/WellKnownUtils.ts index f16acdb408..1fe28f2b0c 100644 --- a/src/utils/WellKnownUtils.ts +++ b/src/utils/WellKnownUtils.ts @@ -23,6 +23,14 @@ export interface IE2EEWellKnown { default?: boolean; } +export async function ensureClientWellKnown() { + const cli = MatrixClientPeg.get(); + if (cli.haveAttemptedFetchingClientWellKnown()) return; + return new Promise(resolve => { + cli.once("WellKnown.attempted", resolve); + }); +} + export function getE2EEWellKnown(): IE2EEWellKnown { const clientWellKnown = MatrixClientPeg.get().getClientWellKnown(); if (clientWellKnown && clientWellKnown[E2EE_WK_KEY]) { From 0fef86cc743916ed0124e6f4ef9e25d5b98e1554 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 19 Aug 2020 11:52:02 -0600 Subject: [PATCH 063/174] Fix find & replace error --- docs/settings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/settings.md b/docs/settings.md index 40c3e6a7d6..4172c72c15 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -15,7 +15,7 @@ order of priority, are: * `room-account` - The current user's account, but only when in a specific room * `account` - The current user's account * `room` - A specific room (setting for all members of the room) -* `config` - Values are defined by the `settingDefaults` key (usually) in `config.tson` +* `config` - Values are defined by the `settingDefaults` key (usually) in `config.json` * `default` - The hardcoded default for the settings Individual settings may control which levels are appropriate for them as part of the defaults. This is often to ensure From 2a68cb0cb843cdd3bc7b2623b4a076b50aa1ce88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 19 Aug 2020 11:22:56 +0000 Subject: [PATCH 064/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 2d6b11d769..8690811f3d 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2289,8 +2289,8 @@ "All keys backed up": "Kõik krüptovõtmed on varundatud", "Backup has a valid signature from this user": "Varukoopial on selle kasutaja kehtiv allkiri", "Backup has a invalid signature from this user": "Varukoopial on selle kasutaja vigane allkiri", - "Backup has a signature from unknown user with ID %(deviceId)s": "Varukoopial tundmatu kasutaja allkiri seadme tunnusega %(deviceId)s", - "Backup has a signature from unknown session with ID %(deviceId)s": "Varukoopial tundmatu sessiooni allkiri seadme tunnusega %(deviceId)s", + "Backup has a signature from unknown user with ID %(deviceId)s": "Varukoopial on tundmatu kasutaja allkiri seadme tunnusega %(deviceId)s", + "Backup has a signature from unknown session with ID %(deviceId)s": "Varukoopial on tundmatu sessiooni allkiri seadme tunnusega %(deviceId)s", "Backup has a valid signature from this session": "Varukoopial on selle sessiooni kehtiv allkiri", "Backup has an invalid signature from this session": "Varukoopial on selle sessiooni vigane allkiri", "Backup is not signed by any of your sessions": "Varunduse andmetel pole mitte ühegi sinu sessiooni allkirja", From 499f7bf0fd0fb83fbd2e91006b029147b235a94d Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Wed, 19 Aug 2020 13:43:20 +0000 Subject: [PATCH 065/174] Translated using Weblate (German) Currently translated at 100.0% (2340 of 2340 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ab424c7b31..05b8775f6f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1633,7 +1633,7 @@ "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren", "Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehlezu den kürzlich gesichteteten Räumen über der Raumliste anzeigen", - "Use Single Sign On to continue": " Verwende Single-Sign-On um fortzufahren", + "Use Single Sign On to continue": "Verwende Single-Sign-On um fortzufahren", "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single-Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", "Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse", @@ -2410,5 +2410,13 @@ "You can also set up Secure Backup & manage your keys in Settings.": "Du kannst auch in den Einstellungen eine Sicherung erstellen & deine Schlüssel verwalten.", "Set up Secure backup": "Sicheres Backup einrichten", "Show message previews for reactions in DMs": "Anzeigen einer Nachrichtenvorschau für Reaktionen in DMs", - "Show message previews for reactions in all rooms": "Zeigen Sie eine Nachrichtenvorschau für Reaktionen in allen Räumen an" + "Show message previews for reactions in all rooms": "Zeigen Sie eine Nachrichtenvorschau für Reaktionen in allen Räumen an", + "Uploading logs": "Protokolle werden hochgeladen", + "Downloading logs": "Protokolle werden heruntergeladen", + "Explore public rooms": "Erkunde öffentliche Räume", + "Can't see what you’re looking for?": "Kannst du nicht finden wonach du suchst?", + "Explore all public rooms": "Erkunde alle öffentlichen Räume", + "%(count)s results|other": "%(count)s Ergebnisse", + "Preparing to download logs": "Bereite das Herunterladen der Protokolle vor", + "Download logs": "Protokolle herunterladen" } From d1bca2838ffe201011b6fd64c64ce6fbc80f8148 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 19 Aug 2020 19:07:12 +0100 Subject: [PATCH 066/174] Add clarifying comment in media device selection Hopefully explain the confusing mismatch. --- .../views/settings/tabs/user/VoiceUserSettingsTab.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/views/settings/tabs/user/VoiceUserSettingsTab.js b/src/components/views/settings/tabs/user/VoiceUserSettingsTab.js index 4114f6bb22..a78cc10b92 100644 --- a/src/components/views/settings/tabs/user/VoiceUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/VoiceUserSettingsTab.js @@ -157,6 +157,9 @@ export default class VoiceUserSettingsTab extends React.Component { label: _t('Default Device'), }; const getDefaultDevice = (devices) => { + // Note we're looking for a device with deviceId 'default' but adding a device + // with deviceId == the empty string: this is because Chrome gives us a device + // with deviceId 'default', so we're looking for this, not the one we are adding. if (!devices.some((i) => i.deviceId === 'default')) { devices.unshift(defaultOption); return ''; From e0b8343088153642cd5a383666ce1ca57dac750d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 19 Aug 2020 19:21:40 -0600 Subject: [PATCH 067/174] Run all room leaving behaviour through a single function Fixes https://github.com/vector-im/element-web/issues/14999 Fixes https://github.com/vector-im/element-web/issues/10380 We were failing to handle errors when `/part`ing a room, though the leave room button was fine. This runs both the button and command through the same function for handling, including the 'view next room' behaviour. --- src/SlashCommands.tsx | 8 +-- src/components/structures/MatrixChat.tsx | 42 ++------------- src/i18n/strings/en_EN.json | 9 ++-- src/utils/membership.ts | 68 ++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 49 deletions(-) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index 50a49ccf1c..d674634109 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -43,7 +43,7 @@ import SdkConfig from "./SdkConfig"; import { ensureDMExists } from "./createRoom"; import { ViewUserPayload } from "./dispatcher/payloads/ViewUserPayload"; import { Action } from "./dispatcher/actions"; -import { EffectiveMembership, getEffectiveMembership } from "./utils/membership"; +import { EffectiveMembership, getEffectiveMembership, leaveRoomBehaviour } from "./utils/membership"; // XXX: workaround for https://github.com/microsoft/TypeScript/issues/31816 interface HTMLInputEvent extends Event { @@ -601,11 +601,7 @@ export const Commands = [ } if (!targetRoomId) targetRoomId = roomId; - return success( - cli.leaveRoomChain(targetRoomId).then(function() { - dis.dispatch({action: 'view_next_room'}); - }), - ); + return success(leaveRoomBehaviour(targetRoomId)); }, category: CommandCategories.actions, }), diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index ce96847d28..460148045c 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -76,6 +76,7 @@ import { OpenToTabPayload } from "../../dispatcher/payloads/OpenToTabPayload"; import ErrorDialog from "../views/dialogs/ErrorDialog"; import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore"; import { SettingLevel } from "../../settings/SettingLevel"; +import { leaveRoomBehaviour } from "../../utils/membership"; /** constants for MatrixChat.state.view */ export enum Views { @@ -1082,50 +1083,13 @@ export default class MatrixChat extends React.PureComponent { button: _t("Leave"), onFinished: (shouldLeave) => { if (shouldLeave) { - const d = MatrixClientPeg.get().leaveRoomChain(roomId); + const d = leaveRoomBehaviour(roomId); // FIXME: controller shouldn't be loading a view :( const Loader = sdk.getComponent("elements.Spinner"); const modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); - d.then((errors) => { - modal.close(); - - for (const leftRoomId of Object.keys(errors)) { - const err = errors[leftRoomId]; - if (!err) continue; - - console.error("Failed to leave room " + leftRoomId + " " + 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 Homeserver, " + - "so you cannot leave it.", - ); - } else if (err && err.message) { - message = err.message; - } - Modal.createTrackedDialog('Failed to leave room', '', ErrorDialog, { - title: title, - description: message, - }); - return; - } - - if (this.state.currentRoomId === roomId) { - dis.dispatch({action: 'view_next_room'}); - } - }, (err) => { - // This should only happen if something went seriously wrong with leaving the chain. - modal.close(); - console.error("Failed to leave room " + roomId + " " + err); - Modal.createTrackedDialog('Failed to leave room', '', ErrorDialog, { - title: _t("Failed to leave room"), - description: _t("Unknown error"), - }); - }); + d.finally(() => modal.close()); } }, }); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 8bfc3ed703..4c0557ac70 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -347,6 +347,10 @@ "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", "Not a valid %(brand)s keyfile": "Not a valid %(brand)s keyfile", "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", + "Unexpected server error trying to leave the room": "Unexpected server error trying to leave the room", + "Can't leave Server Notices room": "Can't leave Server Notices room", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "This room is used for important messages from the Homeserver, so you cannot leave it.", + "Error leaving room": "Error leaving room", "Unrecognised address": "Unrecognised address", "You do not have permission to invite people to this room.": "You do not have permission to invite people to this room.", "User %(userId)s is already in the room": "User %(userId)s is already in the room", @@ -2028,10 +2032,6 @@ "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'?", - "Failed to leave room": "Failed to leave room", - "Can't leave Server Notices room": "Can't leave Server Notices room", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "This room is used for important messages from the Homeserver, so you cannot leave it.", - "Unknown error": "Unknown error", "Signed Out": "Signed Out", "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", "Terms and Conditions": "Terms and Conditions", @@ -2203,6 +2203,7 @@ "User Autocomplete": "User Autocomplete", "Passphrases must match": "Passphrases must match", "Passphrase must not be empty": "Passphrase must not be empty", + "Unknown error": "Unknown error", "Export room keys": "Export room keys", "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.": "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.": "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/utils/membership.ts b/src/utils/membership.ts index 9534623d62..a8abacbeaa 100644 --- a/src/utils/membership.ts +++ b/src/utils/membership.ts @@ -15,6 +15,13 @@ limitations under the License. */ import { Room } from "matrix-js-sdk/src/models/room"; +import { MatrixClientPeg } from "../MatrixClientPeg"; +import { _t } from "../languageHandler"; +import Modal from "../Modal"; +import ErrorDialog from "../components/views/dialogs/ErrorDialog"; +import React from "react"; +import dis from "../dispatcher/dispatcher"; +import RoomViewStore from "../stores/RoomViewStore"; /** * Approximation of a membership status for a given room. @@ -70,3 +77,64 @@ export function getEffectiveMembership(membership: string): EffectiveMembership return EffectiveMembership.Leave; } } + +export async function leaveRoomBehaviour(roomId: string): Promise { + let leavingAllVersions = true; + const history = await MatrixClientPeg.get().getRoomUpgradeHistory(roomId); + if (history && history.length > 0) { + const currentRoom = history[history.length - 1]; + if (currentRoom.roomId !== roomId) { + // The user is trying to leave an older version of the room. Let them through + // without making them leave the current version of the room. + leavingAllVersions = false; + } + } + + let results: { [roomId: string]: Error & { errcode: string, message: string } } = {}; + if (!leavingAllVersions || true) { + try { + await MatrixClientPeg.get().leave(roomId); + } catch (e) { + if (e && e.data && e.data.errcode) { + const message = e.data.error || _t("Unexpected server error trying to leave the room"); + results[roomId] = Object.assign(new Error(message), {errcode: e.data.errcode}); + } else { + results[roomId] = e || new Error("Failed to leave room for unknown causes"); + } + } + } else { + results = await MatrixClientPeg.get().leaveRoomChain(roomId); + } + + const errors = Object.entries(results).filter(r => !!r[1]); + if (errors.length > 0) { + let messages = []; + for (const err of errors) { + let message = _t("Unexpected server error trying to leave the room"); + if (results[roomId].errcode && results[roomId].message) { + if (results[roomId].errcode === 'M_CANNOT_LEAVE_SERVER_NOTICE_ROOM') { + Modal.createTrackedDialog('Error Leaving Room', '', ErrorDialog, { + title: _t("Can't leave Server Notices room"), + description: _t( + "This room is used for important messages from the Homeserver, " + + "so you cannot leave it.", + ), + }); + return false; + } + message = results[roomId].message; + } + messages.push(message, React.createElement('BR')); // createElement to avoid using a tsx file in utils + } + Modal.createTrackedDialog('Error Leaving Room', '', ErrorDialog, { + title: _t("Error leaving room"), + description: messages, + }); + return false; + } + + if (RoomViewStore.getRoomId() === roomId) { + dis.dispatch({action: 'view_next_room'}); + } + return true; +} From 309c32700b32e06ce8c282014b258fe5553a1c08 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 19 Aug 2020 19:23:27 -0600 Subject: [PATCH 068/174] Remove unused success state --- src/utils/membership.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/utils/membership.ts b/src/utils/membership.ts index a8abacbeaa..2693d816a5 100644 --- a/src/utils/membership.ts +++ b/src/utils/membership.ts @@ -78,7 +78,7 @@ export function getEffectiveMembership(membership: string): EffectiveMembership } } -export async function leaveRoomBehaviour(roomId: string): Promise { +export async function leaveRoomBehaviour(roomId: string) { let leavingAllVersions = true; const history = await MatrixClientPeg.get().getRoomUpgradeHistory(roomId); if (history && history.length > 0) { @@ -120,7 +120,7 @@ export async function leaveRoomBehaviour(roomId: string): Promise { "so you cannot leave it.", ), }); - return false; + return; } message = results[roomId].message; } @@ -130,11 +130,10 @@ export async function leaveRoomBehaviour(roomId: string): Promise { title: _t("Error leaving room"), description: messages, }); - return false; + return; } if (RoomViewStore.getRoomId() === roomId) { dis.dispatch({action: 'view_next_room'}); } - return true; } From 8fffce8a303c764ce61a968109e0c5ddb70024d7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 19 Aug 2020 19:42:36 -0600 Subject: [PATCH 069/174] Appease the linter --- src/utils/membership.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/utils/membership.ts b/src/utils/membership.ts index 2693d816a5..14a3ced739 100644 --- a/src/utils/membership.ts +++ b/src/utils/membership.ts @@ -108,11 +108,12 @@ export async function leaveRoomBehaviour(roomId: string) { const errors = Object.entries(results).filter(r => !!r[1]); if (errors.length > 0) { - let messages = []; - for (const err of errors) { + const messages = []; + for (const roomErr of errors) { + const err = roomErr[1]; // [0] is the roomId let message = _t("Unexpected server error trying to leave the room"); - if (results[roomId].errcode && results[roomId].message) { - if (results[roomId].errcode === 'M_CANNOT_LEAVE_SERVER_NOTICE_ROOM') { + if (err.errcode && err.message) { + if (err.errcode === 'M_CANNOT_LEAVE_SERVER_NOTICE_ROOM') { Modal.createTrackedDialog('Error Leaving Room', '', ErrorDialog, { title: _t("Can't leave Server Notices room"), description: _t( From 42988d373bb030d44d707c07ff80ef17ffb8fc93 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 19 Aug 2020 19:42:58 -0600 Subject: [PATCH 070/174] Remove debugging --- src/utils/membership.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/membership.ts b/src/utils/membership.ts index 14a3ced739..68ac958490 100644 --- a/src/utils/membership.ts +++ b/src/utils/membership.ts @@ -91,7 +91,7 @@ export async function leaveRoomBehaviour(roomId: string) { } let results: { [roomId: string]: Error & { errcode: string, message: string } } = {}; - if (!leavingAllVersions || true) { + if (!leavingAllVersions) { try { await MatrixClientPeg.get().leave(roomId); } catch (e) { From 0c80db882027708350fb9d47f8d17091781c1a44 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 20 Aug 2020 19:44:59 -0600 Subject: [PATCH 071/174] Add feature flag for prototypes --- src/i18n/strings/en_EN.json | 1 + src/settings/Settings.ts | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4c0557ac70..3ffc11b5b8 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -444,6 +444,7 @@ "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", "Change notification settings": "Change notification settings", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.", "New spinner design": "New spinner design", "Message Pinning": "Message Pinning", "Custom user status messages": "Custom user status messages", diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 3d18c14e16..838df51ea3 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -109,6 +109,12 @@ export interface ISetting { } export const SETTINGS: {[setting: string]: ISetting} = { + "feature_communities_v2_prototypes": { + isFeature: true, + displayName: _td("Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution."), + supportedLevels: LEVELS_FEATURE, + default: false, + }, "feature_new_spinner": { isFeature: true, displayName: _td("New spinner design"), From beb5c2627c6ebe7da5f05765b66e7455b5f78658 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 20 Aug 2020 19:45:22 -0600 Subject: [PATCH 072/174] Disable CTRL+Click and SHIFT+Click actions on tag panel --- src/stores/TagOrderStore.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/stores/TagOrderStore.js b/src/stores/TagOrderStore.js index 2acf531d86..3cd3f796cc 100644 --- a/src/stores/TagOrderStore.js +++ b/src/stores/TagOrderStore.js @@ -115,9 +115,11 @@ class TagOrderStore extends Store { break; } case 'select_tag': { + const allowMultiple = !SettingsStore.getValue("feature_communities_v2_prototypes") + let newTags = []; // Shift-click semantics - if (payload.shiftKey) { + if (payload.shiftKey && allowMultiple) { // Select range of tags let start = this._state.orderedTags.indexOf(this._state.anchorTag); let end = this._state.orderedTags.indexOf(payload.tag); @@ -135,7 +137,7 @@ class TagOrderStore extends Store { this._state.orderedTags.slice(start, end + 1).concat(newTags), )]; } else { - if (payload.ctrlOrCmdKey) { + if (payload.ctrlOrCmdKey && allowMultiple) { // Toggle individual tag if (this._state.selectedTags.includes(payload.tag)) { newTags = this._state.selectedTags.filter((t) => t !== payload.tag); From 81a7be29aaaafb798ad0ecfab4b84a70af65790d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 20 Aug 2020 19:45:54 -0600 Subject: [PATCH 073/174] Show the selected community in the top left menu --- src/components/structures/UserMenu.tsx | 50 +++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/components/structures/UserMenu.tsx b/src/components/structures/UserMenu.tsx index e782618872..839d4bccda 100644 --- a/src/components/structures/UserMenu.tsx +++ b/src/components/structures/UserMenu.tsx @@ -42,6 +42,9 @@ import IconizedContextMenu, { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../views/context_menus/IconizedContextMenu"; +import TagOrderStore from "../../stores/TagOrderStore"; +import * as fbEmitter from "fbemitter"; +import FlairStore from "../../stores/FlairStore"; interface IProps { isMinimized: boolean; @@ -52,11 +55,16 @@ type PartialDOMRect = Pick; interface IState { contextMenuPosition: PartialDOMRect; isDarkTheme: boolean; + selectedCommunityProfile: { + displayName: string; + avatarMxc: string; + }; } export default class UserMenu extends React.Component { private dispatcherRef: string; private themeWatcherRef: string; + private tagStoreRef: fbEmitter.EventSubscription; private buttonRef: React.RefObject = createRef(); constructor(props: IProps) { @@ -65,6 +73,7 @@ export default class UserMenu extends React.Component { this.state = { contextMenuPosition: null, isDarkTheme: this.isUserOnDarkTheme(), + selectedCommunityProfile: null, }; OwnProfileStore.instance.on(UPDATE_EVENT, this.onProfileUpdate); @@ -77,6 +86,7 @@ export default class UserMenu extends React.Component { public componentDidMount() { this.dispatcherRef = defaultDispatcher.register(this.onAction); this.themeWatcherRef = SettingsStore.watchSetting("theme", null, this.onThemeChanged); + this.tagStoreRef = TagOrderStore.addListener(this.onTagStoreUpdate); } public componentWillUnmount() { @@ -93,6 +103,25 @@ export default class UserMenu extends React.Component { return theme === "dark"; } + private onTagStoreUpdate = async () => { + if (!SettingsStore.getValue("feature_communities_v2_prototypes")) { + return; + } + + const selectedId = TagOrderStore.getSelectedTags()[0]; + if (!selectedId) { + this.setState({selectedCommunityProfile: null}); + return; + } + + // For some reason the group's profile info isn't on the js-sdk Group object but + // is in the flair store, so get it from there. + const profile = await FlairStore.getGroupProfileCached(MatrixClientPeg.get(), selectedId); + const displayName = profile.name || selectedId; + const avatarMxc = profile.avatarUrl; + this.setState({selectedCommunityProfile: {displayName, avatarMxc}}); + }; + private onProfileUpdate = async () => { // the store triggered an update, so force a layout update. We don't // have any state to store here for that to magically happen. @@ -295,7 +324,20 @@ export default class UserMenu extends React.Component { public render() { const avatarSize = 32; // should match border-radius of the avatar - let name = {OwnProfileStore.instance.displayName}; + let displayName = OwnProfileStore.instance.displayName || MatrixClientPeg.get().getUserId(); + let avatarUrl = OwnProfileStore.instance.getHttpAvatarUrl(avatarSize); + + if (this.state.selectedCommunityProfile) { + displayName = this.state.selectedCommunityProfile.displayName + const mxc = this.state.selectedCommunityProfile.avatarMxc; + if (mxc) { + avatarUrl = MatrixClientPeg.get().mxcUrlToHttp(mxc, avatarSize, avatarSize); + } else { + avatarUrl = null; + } + } + + let name = {displayName}; let buttons = ( {/* masked image in CSS */} @@ -324,9 +366,9 @@ export default class UserMenu extends React.Component {
Date: Thu, 20 Aug 2020 19:54:09 -0600 Subject: [PATCH 074/174] Disable context menu for v2 communities --- src/components/views/elements/TagTile.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/views/elements/TagTile.js b/src/components/views/elements/TagTile.js index c59aaeefa4..6a12c87024 100644 --- a/src/components/views/elements/TagTile.js +++ b/src/components/views/elements/TagTile.js @@ -30,6 +30,7 @@ import GroupStore from '../../../stores/GroupStore'; import TagOrderStore from '../../../stores/TagOrderStore'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import AccessibleButton from "./AccessibleButton"; +import SettingsStore from "../../../settings/SettingsStore"; // A class for a child of TagPanel (possibly wrapped in a DNDTagTile) that represents // a thing to click on for the user to filter the visible rooms in the RoomList to: @@ -112,6 +113,7 @@ export default createReactClass({ }, onMouseOver: function() { + if (SettingsStore.getValue("feature_communities_v2_prototypes")) return; this.setState({ hover: true }); }, @@ -123,6 +125,7 @@ export default createReactClass({ // Prevent the TagTile onClick event firing as well e.stopPropagation(); e.preventDefault(); + if (SettingsStore.getValue("feature_communities_v2_prototypes")) return; this.setState({ hover: false }); this.props.openMenu(); }, From ae04c5ce9d1d28f96eb0919d455a43c7f9417513 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 20 Aug 2020 19:59:44 -0600 Subject: [PATCH 075/174] Appease the linter --- src/settings/Settings.ts | 5 ++++- src/stores/TagOrderStore.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 838df51ea3..95861e11df 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -111,7 +111,10 @@ export interface ISetting { export const SETTINGS: {[setting: string]: ISetting} = { "feature_communities_v2_prototypes": { isFeature: true, - displayName: _td("Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution."), + displayName: _td( + "Communities v2 prototypes. Requires compatible homeserver. " + + "Highly experimental - use with caution.", + ), supportedLevels: LEVELS_FEATURE, default: false, }, diff --git a/src/stores/TagOrderStore.js b/src/stores/TagOrderStore.js index 3cd3f796cc..2b72a963b0 100644 --- a/src/stores/TagOrderStore.js +++ b/src/stores/TagOrderStore.js @@ -115,7 +115,7 @@ class TagOrderStore extends Store { break; } case 'select_tag': { - const allowMultiple = !SettingsStore.getValue("feature_communities_v2_prototypes") + const allowMultiple = !SettingsStore.getValue("feature_communities_v2_prototypes"); let newTags = []; // Shift-click semantics From c815a370e7cec593c57a3f4d03c80e0b023070de Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 20 Aug 2020 20:46:31 -0600 Subject: [PATCH 076/174] Remove some unused components We no longer have tinting support, so remove it. We still need the `Tinter` to exist though as it's used in quite a few places (though does nothing). Similarly, we have to keep the `roomColor` setting due to it being used in a few places - another PR can take away the tinter support properly. The room tile context menu and top left menu are artifacts of the old room list. The end to end tests weren't failing before as the code path is unused, however it seems worthwhile to keep it as we will eventually need it. --- res/css/_components.scss | 3 - .../context_menus/_RoomTileContextMenu.scss | 114 ----- res/css/views/context_menus/_TopLeftMenu.scss | 96 ----- .../views/room_settings/_ColorSettings.scss | 39 -- .../context_menus/RoomTileContextMenu.js | 404 ------------------ .../views/context_menus/TopLeftMenu.js | 155 ------- .../views/room_settings/ColorSettings.js | 154 ------- .../end-to-end-tests/src/usecases/settings.js | 4 +- 8 files changed, 2 insertions(+), 967 deletions(-) delete mode 100644 res/css/views/context_menus/_RoomTileContextMenu.scss delete mode 100644 res/css/views/context_menus/_TopLeftMenu.scss delete mode 100644 res/css/views/room_settings/_ColorSettings.scss delete mode 100644 src/components/views/context_menus/RoomTileContextMenu.js delete mode 100644 src/components/views/context_menus/TopLeftMenu.js delete mode 100644 src/components/views/room_settings/ColorSettings.js diff --git a/res/css/_components.scss b/res/css/_components.scss index aedb5c1334..5145133127 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -53,10 +53,8 @@ @import "./views/avatars/_PulsedAvatar.scss"; @import "./views/context_menus/_IconizedContextMenu.scss"; @import "./views/context_menus/_MessageContextMenu.scss"; -@import "./views/context_menus/_RoomTileContextMenu.scss"; @import "./views/context_menus/_StatusMessageContextMenu.scss"; @import "./views/context_menus/_TagTileContextMenu.scss"; -@import "./views/context_menus/_TopLeftMenu.scss"; @import "./views/context_menus/_WidgetContextMenu.scss"; @import "./views/dialogs/_AddressPickerDialog.scss"; @import "./views/dialogs/_Analytics.scss"; @@ -157,7 +155,6 @@ @import "./views/right_panel/_UserInfo.scss"; @import "./views/right_panel/_VerificationPanel.scss"; @import "./views/room_settings/_AliasSettings.scss"; -@import "./views/room_settings/_ColorSettings.scss"; @import "./views/rooms/_AppsDrawer.scss"; @import "./views/rooms/_Autocomplete.scss"; @import "./views/rooms/_AuxPanel.scss"; diff --git a/res/css/views/context_menus/_RoomTileContextMenu.scss b/res/css/views/context_menus/_RoomTileContextMenu.scss deleted file mode 100644 index 9697ac9bef..0000000000 --- a/res/css/views/context_menus/_RoomTileContextMenu.scss +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket 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_RoomTileContextMenu { - padding: 6px; -} - -.mx_RoomTileContextMenu_tag_icon { - padding-right: 8px; - padding-left: 4px; - display: inline-block; -} - -.mx_RoomTileContextMenu_tag_icon_set { - padding-right: 8px; - padding-left: 4px; - display: none; -} - -.mx_RoomTileContextMenu_tag_field, .mx_RoomTileContextMenu_leave { - padding-top: 8px; - padding-right: 20px; - padding-bottom: 8px; - cursor: pointer; - white-space: nowrap; - display: flex; - align-items: center; - line-height: $font-16px; -} - -.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet { - font-weight: bold; -} - -.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet .mx_RoomTileContextMenu_tag_icon { - display: none; -} - -.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldSet .mx_RoomTileContextMenu_tag_icon_set { - display: inline-block; -} - -.mx_RoomTileContextMenu_tag_field.mx_RoomTileContextMenu_tag_fieldDisabled { - color: rgba(0, 0, 0, 0.2); -} - -.mx_RoomTileContextMenu_separator { - margin-top: 0; - margin-bottom: 0; - border-bottom-style: none; - border-left-style: none; - border-right-style: none; - border-top-style: solid; - border-top-width: 1px; - border-color: $menu-border-color; -} - -.mx_RoomTileContextMenu_leave { - color: $warning-color; -} - -.mx_RoomTileContextMenu_notif_picker { - position: absolute; - top: 16px; - left: 5px; -} - -.mx_RoomTileContextMenu_notif_field { - padding-top: 4px; - padding-right: 6px; - padding-bottom: 10px; - padding-left: 8px; /* 20px */ - cursor: pointer; - white-space: nowrap; - display: flex; - align-items: center; -} - -.mx_RoomTileContextMenu_notif_field.mx_RoomTileContextMenu_notif_fieldSet { - font-weight: bold; -} - -.mx_RoomTileContextMenu_notif_field.mx_RoomTileContextMenu_notif_fieldDisabled { - color: rgba(0, 0, 0, 0.2); -} - -.mx_RoomTileContextMenu_notif_icon { - padding-right: 4px; - padding-left: 4px; -} - -.mx_RoomTileContextMenu_notif_activeIcon { - display: inline-block; - opacity: 0; - position: relative; - left: -5px; -} - -.mx_RoomTileContextMenu_notif_fieldSet .mx_RoomTileContextMenu_notif_activeIcon { - opacity: 1; -} diff --git a/res/css/views/context_menus/_TopLeftMenu.scss b/res/css/views/context_menus/_TopLeftMenu.scss deleted file mode 100644 index e0f5dd47bd..0000000000 --- a/res/css/views/context_menus/_TopLeftMenu.scss +++ /dev/null @@ -1,96 +0,0 @@ -/* -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_TopLeftMenu { - min-width: 210px; - border-radius: 4px; - - .mx_TopLeftMenu_greyedText { - font-size: $font-12px; - opacity: 0.5; - } - - .mx_TopLeftMenu_upgradeLink { - font-size: $font-12px; - - img { - margin-left: 5px; - } - } - - .mx_TopLeftMenu_section:not(:last-child) { - border-bottom: 1px solid $menu-border-color; - } - - .mx_TopLeftMenu_section_noIcon { - margin: 5px 0; - padding: 5px 20px 5px 15px; - - div:not(:first-child) { - margin-top: 5px; - } - } - - .mx_TopLeftMenu_section_withIcon { - margin: 5px 0; - padding: 0; - list-style: none; - - .mx_TopLeftMenu_icon_home::after { - mask-image: url('$(res)/img/feather-customised/home.svg'); - } - - .mx_TopLeftMenu_icon_help::after { - mask-image: url('$(res)/img/feather-customised/life-buoy.svg'); - } - - .mx_TopLeftMenu_icon_settings::after { - mask-image: url('$(res)/img/feather-customised/settings.svg'); - } - - .mx_TopLeftMenu_icon_signin::after { - mask-image: url('$(res)/img/feather-customised/sign-in.svg'); - } - - .mx_TopLeftMenu_icon_signout::after { - mask-image: url('$(res)/img/feather-customised/sign-out.svg'); - } - - .mx_AccessibleButton::after { - mask-repeat: no-repeat; - mask-position: 0 center; - mask-size: $font-16px; - position: absolute; - width: $font-16px; - height: $font-16px; - content: ""; - top: 5px; - left: 14px; - background-color: $primary-fg-color; - } - - .mx_AccessibleButton { - position: relative; - cursor: pointer; - white-space: nowrap; - padding: 5px 20px 5px 43px; - } - - .mx_AccessibleButton:hover { - background-color: $menu-selected-color; - } - } -} diff --git a/res/css/views/room_settings/_ColorSettings.scss b/res/css/views/room_settings/_ColorSettings.scss deleted file mode 100644 index fc6a4443ad..0000000000 --- a/res/css/views/room_settings/_ColorSettings.scss +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2019 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_ColorSettings_roomColor { - display: inline-block; - position: relative; - width: 37px; - height: 37px; - border: 1px solid #979797; - margin-right: 13px; - cursor: pointer; -} - -.mx_ColorSettings_roomColor_selected { - position: absolute; - left: 10px; - top: 4px; - cursor: default !important; -} - -.mx_ColorSettings_roomColorPrimary { - height: 10px; - position: absolute; - bottom: 0px; - width: 100%; -} diff --git a/src/components/views/context_menus/RoomTileContextMenu.js b/src/components/views/context_menus/RoomTileContextMenu.js deleted file mode 100644 index b08cf3be60..0000000000 --- a/src/components/views/context_menus/RoomTileContextMenu.js +++ /dev/null @@ -1,404 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 Vector Creations Ltd -Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from 'react'; -import PropTypes from 'prop-types'; -import createReactClass from 'create-react-class'; -import classNames from 'classnames'; -import * as sdk from '../../../index'; -import { _t, _td } from '../../../languageHandler'; -import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import dis from '../../../dispatcher/dispatcher'; -import DMRoomMap from '../../../utils/DMRoomMap'; -import * as Rooms from '../../../Rooms'; -import * as RoomNotifs from '../../../RoomNotifs'; -import Modal from '../../../Modal'; -import RoomListActions from '../../../actions/RoomListActions'; -import RoomViewStore from '../../../stores/RoomViewStore'; -import {sleep} from "../../../utils/promise"; -import {MenuItem, MenuItemCheckbox, MenuItemRadio} from "../../structures/ContextMenu"; - -const RoomTagOption = ({active, onClick, src, srcSet, label}) => { - const classes = classNames('mx_RoomTileContextMenu_tag_field', { - 'mx_RoomTileContextMenu_tag_fieldSet': active, - 'mx_RoomTileContextMenu_tag_fieldDisabled': false, - }); - - return ( - - - - { label } - - ); -}; - -const NotifOption = ({active, onClick, src, label}) => { - const classes = classNames('mx_RoomTileContextMenu_notif_field', { - 'mx_RoomTileContextMenu_notif_fieldSet': active, - }); - - return ( - - - - { label } - - ); -}; - -export default createReactClass({ - displayName: 'RoomTileContextMenu', - - propTypes: { - room: PropTypes.object.isRequired, - /* callback called when the menu is dismissed */ - onFinished: PropTypes.func, - }, - - getInitialState() { - const dmRoomMap = new DMRoomMap(MatrixClientPeg.get()); - return { - roomNotifState: RoomNotifs.getRoomNotifsState(this.props.room.roomId), - isFavourite: this.props.room.tags.hasOwnProperty("m.favourite"), - isLowPriority: this.props.room.tags.hasOwnProperty("m.lowpriority"), - isDirectMessage: Boolean(dmRoomMap.getUserIdForRoomId(this.props.room.roomId)), - }; - }, - - componentDidMount: function() { - this._unmounted = false; - }, - - componentWillUnmount: function() { - this._unmounted = true; - }, - - _toggleTag: function(tagNameOn, tagNameOff) { - if (!MatrixClientPeg.get().isGuest()) { - sleep(500).then(() => { - dis.dispatch(RoomListActions.tagRoom( - MatrixClientPeg.get(), - this.props.room, - tagNameOff, tagNameOn, - undefined, 0, - ), true); - - this.props.onFinished(); - }); - } - }, - - _onClickFavourite: function() { - // Tag room as 'Favourite' - if (!this.state.isFavourite && this.state.isLowPriority) { - this.setState({ - isFavourite: true, - isLowPriority: false, - }); - this._toggleTag("m.favourite", "m.lowpriority"); - } else if (this.state.isFavourite) { - this.setState({isFavourite: false}); - this._toggleTag(null, "m.favourite"); - } else if (!this.state.isFavourite) { - this.setState({isFavourite: true}); - this._toggleTag("m.favourite"); - } - }, - - _onClickLowPriority: function() { - // Tag room as 'Low Priority' - if (!this.state.isLowPriority && this.state.isFavourite) { - this.setState({ - isFavourite: false, - isLowPriority: true, - }); - this._toggleTag("m.lowpriority", "m.favourite"); - } else if (this.state.isLowPriority) { - this.setState({isLowPriority: false}); - this._toggleTag(null, "m.lowpriority"); - } else if (!this.state.isLowPriority) { - this.setState({isLowPriority: true}); - this._toggleTag("m.lowpriority"); - } - }, - - _onClickDM: function() { - if (MatrixClientPeg.get().isGuest()) return; - - const newIsDirectMessage = !this.state.isDirectMessage; - this.setState({ - isDirectMessage: newIsDirectMessage, - }); - - Rooms.guessAndSetDMRoom( - this.props.room, newIsDirectMessage, - ).then(sleep(500)).finally(() => { - // Close the context menu - if (this.props.onFinished) { - this.props.onFinished(); - } - }, (err) => { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Failed to set Direct Message status of room', '', ErrorDialog, { - title: _t('Failed to set Direct Message status of room'), - description: ((err && err.message) ? err.message : _t('Operation failed')), - }); - }); - }, - - _onClickLeave: function() { - // Leave room - dis.dispatch({ - action: 'leave_room', - room_id: this.props.room.roomId, - }); - - // Close the context menu - if (this.props.onFinished) { - this.props.onFinished(); - } - }, - - _onClickReject: function() { - dis.dispatch({ - action: 'reject_invite', - room_id: this.props.room.roomId, - }); - - // Close the context menu - if (this.props.onFinished) { - this.props.onFinished(); - } - }, - - _onClickForget: function() { - // FIXME: duplicated with RoomSettings (and dead code in RoomView) - MatrixClientPeg.get().forget(this.props.room.roomId).then(() => { - // Switch to another room view if we're currently viewing the - // historical room - if (RoomViewStore.getRoomId() === this.props.room.roomId) { - dis.dispatch({ action: 'view_next_room' }); - } - }, function(err) { - const errCode = err.errcode || _td("unknown error code"); - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Failed to forget room', '', ErrorDialog, { - title: _t('Failed to forget room %(errCode)s', {errCode: errCode}), - description: ((err && err.message) ? err.message : _t('Operation failed')), - }); - }); - - // Close the context menu - if (this.props.onFinished) { - this.props.onFinished(); - } - }, - - _saveNotifState: function(newState) { - if (MatrixClientPeg.get().isGuest()) return; - - const oldState = this.state.roomNotifState; - const roomId = this.props.room.roomId; - - this.setState({ - roomNotifState: newState, - }); - RoomNotifs.setRoomNotifsState(roomId, newState).then(() => { - // delay slightly so that the user can see their state change - // before closing the menu - return sleep(500).then(() => { - if (this._unmounted) return; - // Close the context menu - if (this.props.onFinished) { - this.props.onFinished(); - } - }); - }, (error) => { - // TODO: some form of error notification to the user - // to inform them that their state change failed. - // For now we at least set the state back - if (this._unmounted) return; - this.setState({ - roomNotifState: oldState, - }); - }); - }, - - _onClickAlertMe: function() { - this._saveNotifState(RoomNotifs.ALL_MESSAGES_LOUD); - }, - - _onClickAllNotifs: function() { - this._saveNotifState(RoomNotifs.ALL_MESSAGES); - }, - - _onClickMentions: function() { - this._saveNotifState(RoomNotifs.MENTIONS_ONLY); - }, - - _onClickMute: function() { - this._saveNotifState(RoomNotifs.MUTE); - }, - - _renderNotifMenu: function() { - return ( -
-
- -
- - - - - -
- ); - }, - - _onClickSettings: function() { - dis.dispatch({ - action: 'open_room_settings', - room_id: this.props.room.roomId, - }); - if (this.props.onFinished) { - this.props.onFinished(); - } - }, - - _renderSettingsMenu: function() { - return ( -
- - - { _t('Settings') } - -
- ); - }, - - _renderLeaveMenu: function(membership) { - if (!membership) { - return null; - } - - let leaveClickHandler = null; - let leaveText = null; - - switch (membership) { - case "join": - leaveClickHandler = this._onClickLeave; - leaveText = _t('Leave'); - break; - case "leave": - case "ban": - leaveClickHandler = this._onClickForget; - leaveText = _t('Forget'); - break; - case "invite": - leaveClickHandler = this._onClickReject; - leaveText = _t('Reject'); - break; - } - - return ( -
- - - { leaveText } - -
- ); - }, - - _renderRoomTagMenu: function() { - return ( -
- - - -
- ); - }, - - render: function() { - const myMembership = this.props.room.getMyMembership(); - - switch (myMembership) { - case 'join': - return
- { this._renderNotifMenu() } -
- { this._renderLeaveMenu(myMembership) } -
- { this._renderRoomTagMenu() } -
- { this._renderSettingsMenu() } -
; - case 'invite': - return
- { this._renderLeaveMenu(myMembership) } -
; - default: - return
- { this._renderLeaveMenu(myMembership) } -
- { this._renderSettingsMenu() } -
; - } - }, -}); diff --git a/src/components/views/context_menus/TopLeftMenu.js b/src/components/views/context_menus/TopLeftMenu.js deleted file mode 100644 index ec99c63724..0000000000 --- a/src/components/views/context_menus/TopLeftMenu.js +++ /dev/null @@ -1,155 +0,0 @@ -/* -Copyright 2018, 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from 'react'; -import PropTypes from 'prop-types'; -import dis from '../../../dispatcher/dispatcher'; -import { _t } from '../../../languageHandler'; -import LogoutDialog from "../dialogs/LogoutDialog"; -import Modal from "../../../Modal"; -import SdkConfig from '../../../SdkConfig'; -import { getHostingLink } from '../../../utils/HostingLink'; -import {MatrixClientPeg} from '../../../MatrixClientPeg'; -import {MenuItem} from "../../structures/ContextMenu"; -import * as sdk from "../../../index"; -import {getHomePageUrl} from "../../../utils/pages"; -import {Action} from "../../../dispatcher/actions"; - -export default class TopLeftMenu extends React.Component { - static propTypes = { - displayName: PropTypes.string.isRequired, - userId: PropTypes.string.isRequired, - onFinished: PropTypes.func, - - // Optional function to collect a reference to the container - // of this component directly. - containerRef: PropTypes.func, - }; - - constructor() { - super(); - this.viewHomePage = this.viewHomePage.bind(this); - this.openSettings = this.openSettings.bind(this); - this.signIn = this.signIn.bind(this); - this.signOut = this.signOut.bind(this); - } - - hasHomePage() { - return !!getHomePageUrl(SdkConfig.get()); - } - - render() { - const isGuest = MatrixClientPeg.get().isGuest(); - - const hostingSignupLink = getHostingLink('user-context-menu'); - let hostingSignup = null; - if (hostingSignupLink) { - hostingSignup =
- {_t( - "Upgrade to your own domain", {}, - { - a: sub => - {sub}, - }, - )} - - - -
; - } - - let homePageItem = null; - if (this.hasHomePage()) { - homePageItem = ( - - {_t("Home")} - - ); - } - - let signInOutItem; - if (isGuest) { - signInOutItem = ( - - {_t("Sign in")} - - ); - } else { - signInOutItem = ( - - {_t("Sign out")} - - ); - } - - const helpItem = ( - - {_t("Help")} - - ); - - const settingsItem = ( - - {_t("Settings")} - - ); - - return
-
-
{this.props.displayName}
-
{this.props.userId}
- {hostingSignup} -
-
    - {homePageItem} - {settingsItem} - {helpItem} - {signInOutItem} -
-
; - } - - openHelp = () => { - this.closeMenu(); - const RedesignFeedbackDialog = sdk.getComponent("views.dialogs.RedesignFeedbackDialog"); - Modal.createTrackedDialog('Report bugs & give feedback', '', RedesignFeedbackDialog); - }; - - viewHomePage() { - dis.dispatch({action: 'view_home_page'}); - this.closeMenu(); - } - - openSettings() { - dis.fire(Action.ViewUserSettings); - this.closeMenu(); - } - - signIn() { - dis.dispatch({action: 'start_login'}); - this.closeMenu(); - } - - signOut() { - Modal.createTrackedDialog('Logout E2E Export', '', LogoutDialog); - this.closeMenu(); - } - - closeMenu() { - if (this.props.onFinished) this.props.onFinished(); - } -} diff --git a/src/components/views/room_settings/ColorSettings.js b/src/components/views/room_settings/ColorSettings.js deleted file mode 100644 index 2179bd905e..0000000000 --- a/src/components/views/room_settings/ColorSettings.js +++ /dev/null @@ -1,154 +0,0 @@ -/* -Copyright 2016 OpenMarket 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 createReactClass from 'create-react-class'; - -import Tinter from '../../../Tinter'; -import dis from '../../../dispatcher/dispatcher'; -import SettingsStore from "../../../settings/SettingsStore"; -import {SettingLevel} from "../../../settings/SettingLevel"; - -const ROOM_COLORS = [ - // magic room default values courtesy of Ribot - [Tinter.getKeyRgb()[0], Tinter.getKeyRgb()[1]], - ["#81bddb", "#eaf1f4"], - ["#bd79cb", "#f3eaf5"], - ["#c65d94", "#f5eaef"], - ["#e55e5e", "#f5eaea"], - ["#eca46f", "#f5eeea"], - ["#dad658", "#f5f4ea"], - ["#80c553", "#eef5ea"], - ["#bb814e", "#eee8e3"], - //["#595959", "#ececec"], // Grey makes everything appear disabled, so remove it for now -]; - -// Dev note: this component is not attached anywhere, but is left here as it -// has a high possibility of being used in the nearish future. -// Ref: https://github.com/vector-im/element-web/issues/8421 - -export default createReactClass({ - displayName: 'ColorSettings', - - propTypes: { - room: PropTypes.object.isRequired, - }, - - getInitialState: function() { - const data = { - index: 0, - primary_color: ROOM_COLORS[0][0], - secondary_color: ROOM_COLORS[0][1], - hasChanged: false, - }; - const scheme = SettingsStore.getValueAt(SettingLevel.ROOM_ACCOUNT, "roomColor", this.props.room.roomId); - - if (scheme.primary_color && scheme.secondary_color) { - // We only use the user's scheme if the scheme is valid. - data.primary_color = scheme.primary_color; - data.secondary_color = scheme.secondary_color; - } - data.index = this._getColorIndex(data); - - if (data.index === -1) { - // append the unrecognised colours to our palette - data.index = ROOM_COLORS.length; - ROOM_COLORS.push([ - scheme.primary_color, scheme.secondary_color, - ]); - } - return data; - }, - - saveSettings: function() { // : Promise - if (!this.state.hasChanged) { - return Promise.resolve(); // They didn't explicitly give a color to save. - } - const originalState = this.getInitialState(); - if (originalState.primary_color !== this.state.primary_color || - originalState.secondary_color !== this.state.secondary_color) { - console.log("ColorSettings: Saving new color"); - // We would like guests to be able to set room colour but currently - // they can't, so we still send the request but display a sensible - // error if it fails. - // TODO: Support guests for room color. Technically this is possible via granular settings - // Granular settings would mean the guest is forced to use the DEVICE level though. - SettingsStore.setValue("roomColor", this.props.room.roomId, SettingLevel.ROOM_ACCOUNT, { - primary_color: this.state.primary_color, - secondary_color: this.state.secondary_color, - }).catch(function(err) { - if (err.errcode === 'M_GUEST_ACCESS_FORBIDDEN') { - dis.dispatch({action: 'require_registration'}); - } - }); - } - return Promise.resolve(); // no color diff - }, - - _getColorIndex: function(scheme) { - if (!scheme || !scheme.primary_color || !scheme.secondary_color) { - return -1; - } - // XXX: we should validate these values - for (let i = 0; i < ROOM_COLORS.length; i++) { - const room_color = ROOM_COLORS[i]; - if (room_color[0] === String(scheme.primary_color).toLowerCase() && - room_color[1] === String(scheme.secondary_color).toLowerCase()) { - return i; - } - } - return -1; - }, - - _onColorSchemeChanged: function(index) { - // preview what the user just changed the scheme to. - Tinter.tint(ROOM_COLORS[index][0], ROOM_COLORS[index][1]); - this.setState({ - index: index, - primary_color: ROOM_COLORS[index][0], - secondary_color: ROOM_COLORS[index][1], - hasChanged: true, - }); - }, - - render: function() { - return ( -
- { ROOM_COLORS.map((room_color, i) => { - let selected; - if (i === this.state.index) { - selected = ( -
- ./ -
- ); - } - const boundClick = this._onColorSchemeChanged.bind(this, i); - return ( -
- { selected } -
-
- ); - }) } -
- ); - }, -}); diff --git a/test/end-to-end-tests/src/usecases/settings.js b/test/end-to-end-tests/src/usecases/settings.js index a405fde9fb..52e4bb7e0a 100644 --- a/test/end-to-end-tests/src/usecases/settings.js +++ b/test/end-to-end-tests/src/usecases/settings.js @@ -18,9 +18,9 @@ limitations under the License. const assert = require('assert'); async function openSettings(session, section) { - const menuButton = await session.query(".mx_TopLeftMenuButton_name"); + const menuButton = await session.query(".mx_UserMenu"); await menuButton.click(); - const settingsItem = await session.query(".mx_TopLeftMenu_icon_settings"); + const settingsItem = await session.query(".mx_UserMenu_iconSettings"); await settingsItem.click(); if (section) { const sectionButton = await session.query( From fd062720623c65a0896a7efeb7fd02ccbc0d547f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 20 Aug 2020 20:50:28 -0600 Subject: [PATCH 077/174] Update i18n --- src/i18n/strings/en_EN.json | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4c0557ac70..85c587426a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1883,23 +1883,12 @@ "Source URL": "Source URL", "Collapse Reply Thread": "Collapse Reply Thread", "Report Content": "Report Content", - "Failed to set Direct Message status of room": "Failed to set Direct Message status of room", - "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s", - "Notification settings": "Notification settings", - "All messages (noisy)": "All messages (noisy)", - "Mentions only": "Mentions only", - "Leave": "Leave", - "Forget": "Forget", - "Direct Chat": "Direct Chat", "Clear status": "Clear status", "Update status": "Update status", "Set status": "Set status", "Set a new status...": "Set a new status...", "View Community": "View Community", "Hide": "Hide", - "Home": "Home", - "Sign in": "Sign in", - "Help": "Help", "Reload": "Reload", "Take picture": "Take picture", "Remove for everyone": "Remove for everyone", @@ -1940,6 +1929,7 @@ "Phone": "Phone", "Not sure of your password? Set a new one": "Not sure of your password? Set a new one", "Sign in with": "Sign in with", + "Sign in": "Sign in", "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "No identity server is configured so you cannot add an email address in order to reset your password in the future.", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "If you don't specify an email address, you won't be able to reset your password. Are you sure?", "Use an email address to recover your account": "Use an email address to recover your account", @@ -2002,6 +1992,7 @@ "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.", "Leave Community": "Leave Community", "Leave %(groupName)s?": "Leave %(groupName)s?", + "Leave": "Leave", "Unable to leave community": "Unable to leave community", "Community Settings": "Community Settings", "Want more than a community? Get your own server": "Want more than a community? Get your own server", @@ -2032,6 +2023,7 @@ "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'?", + "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s", "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", @@ -2103,9 +2095,11 @@ "Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others", "Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other", + "Home": "Home", "Switch to light mode": "Switch to light mode", "Switch to dark mode": "Switch to dark mode", "Switch theme": "Switch theme", + "Notification settings": "Notification settings", "Security & privacy": "Security & privacy", "All settings": "All settings", "Feedback": "Feedback", From 6a03c0a3c00ae288cd3c73013a1698cc9eee690d Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 21 Aug 2020 10:32:51 +0100 Subject: [PATCH 078/174] Send mx_local_settings in rageshake Perhaps ideally we should get a complete dump of the settings in effect out of the settings manager, but all I want for now is the webrtc audio inputs and outputs, so let's send the ones stored locally. --- src/rageshake/submit-rageshake.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index 76b0444052..04a0ad934d 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -182,6 +182,8 @@ export default async function sendBugReport(bugReportEndpoint: string, opts: IOp } } + body.append("mx_local_settings", localStorage.getItem('mx_local_settings')); + if (opts.sendLogs) { progressCallback(_t("Collecting logs")); const logs = await rageshake.getLogsForReport(); From 1e1770d01c626b616b6090f67f6087121220a62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 20 Aug 2020 13:27:59 +0000 Subject: [PATCH 079/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2341 of 2341 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 8690811f3d..89df7c4f26 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1334,7 +1334,7 @@ "If you cancel now, you won't complete your operation.": "Kui sa katkestad nüüd, siis sul jääb pooleliolev tegevus lõpetamata.", "Cancel entering passphrase?": "Kas katkestame paroolifraasi sisestamise?", "Enter passphrase": "Sisesta paroolifraas", - "Setting up keys": "Võtamevõtmed kasutusele", + "Setting up keys": "Võtame krüptovõtmed kasutusele", "Room name or address": "Jututoa nimi või aadress", "Unable to enable Notifications": "Teavituste kasutusele võtmine ei õnnestunud", "This email address was not found": "Seda e-posti aadressi ei leidunud", @@ -2420,5 +2420,7 @@ "Explore all public rooms": "Sirvi kõiki avalikke jututubasid", "%(count)s results|other": "%(count)s tulemust", "Preparing to download logs": "Valmistun logikirjete allalaadimiseks", - "Download logs": "Lae logikirjed alla" + "Download logs": "Lae logikirjed alla", + "Unexpected server error trying to leave the room": "Jututoast lahkumisel tekkis serveris ootamatu viga", + "Error leaving room": "Viga jututoast lahkumisel" } From a3ce4377212e328bf51066dfab9caa6c5c41ac1f Mon Sep 17 00:00:00 2001 From: XoseM Date: Fri, 21 Aug 2020 05:14:11 +0000 Subject: [PATCH 080/174] Translated using Weblate (Galician) Currently translated at 100.0% (2341 of 2341 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 0075550412..7843a416df 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2420,5 +2420,7 @@ "Explore all public rooms": "Explora todas as salas públicas", "%(count)s results|other": "%(count)s resultados", "Preparing to download logs": "Preparándose para descargar rexistro", - "Download logs": "Descargar rexistro" + "Download logs": "Descargar rexistro", + "Unexpected server error trying to leave the room": "Fallo non agardado no servidor ó intentar saír da sala", + "Error leaving room": "Erro ó saír da sala" } From a0b2c1c34bb1352bdb5ec19b83c66ced381211e9 Mon Sep 17 00:00:00 2001 From: rkfg Date: Fri, 21 Aug 2020 08:27:41 +0000 Subject: [PATCH 081/174] Translated using Weblate (Russian) Currently translated at 99.9% (2339 of 2341 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 7a6d4c3866..80327bd1e6 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1590,7 +1590,7 @@ "Error subscribing to list": "Ошибка при подписке на список", "Error upgrading room": "Ошибка обновления комнаты", "Match system theme": "Тема системы", - "Show tray icon and minimize window to it on close": "Показать иконку в панели задач и свернуть окно при закрытии", + "Show tray icon and minimize window to it on close": "Показать иконку в трее и сворачивать окно при закрытии", "Show typing notifications": "Показывать уведомления о наборе", "Delete %(count)s sessions|other": "Удалить %(count)s сессий", "Enable desktop notifications for this session": "Включить уведомления для рабочего стола для этой сессии", From 9193c81008056dac32272aa9ce04bda411566bb1 Mon Sep 17 00:00:00 2001 From: Heiko Carrasco Date: Fri, 21 Aug 2020 11:36:57 +0200 Subject: [PATCH 082/174] Fix image avatar view for 1:1 rooms Signed-off-by: Heiko Carrasco --- src/components/views/avatars/RoomAvatar.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/views/avatars/RoomAvatar.tsx b/src/components/views/avatars/RoomAvatar.tsx index 3317ed3a60..e37dff4bfe 100644 --- a/src/components/views/avatars/RoomAvatar.tsx +++ b/src/components/views/avatars/RoomAvatar.tsx @@ -114,9 +114,12 @@ export default class RoomAvatar extends React.Component { } private onRoomAvatarClick = () => { - const avatarUrl = this.props.room.getAvatarUrl( - MatrixClientPeg.get().getHomeserverUrl(), - null, null, null, false); + const avatarUrl = Avatar.avatarUrlForRoom( + this.props.room, + null, + null, + null, + ); const params = { src: avatarUrl, name: this.props.room.name, From 1b5abdab23ab00c95ebff6ab3944a90e2e42e768 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 21 Aug 2020 15:56:54 -0600 Subject: [PATCH 083/174] Override the room directory with the selected group's rooms --- src/components/structures/RoomDirectory.js | 117 ++++++++++++++++----- 1 file changed, 88 insertions(+), 29 deletions(-) diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index 5b12dae7df..11d3508ee5 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -30,6 +30,10 @@ import { instanceForInstanceId, protocolNameForInstanceId } from '../../utils/Di import Analytics from '../../Analytics'; import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; import {ALL_ROOMS} from "../views/directory/NetworkDropdown"; +import SettingsStore from "../../settings/SettingsStore"; +import TagOrderStore from "../../stores/TagOrderStore"; +import GroupStore from "../../stores/GroupStore"; +import FlairStore from "../../stores/FlairStore"; const MAX_NAME_LENGTH = 80; const MAX_TOPIC_LENGTH = 160; @@ -46,6 +50,7 @@ export default createReactClass({ }, getInitialState: function() { + const selectedCommunityId = TagOrderStore.getSelectedTags()[0]; return { publicRooms: [], loading: true, @@ -54,6 +59,10 @@ export default createReactClass({ instanceId: undefined, roomServer: MatrixClientPeg.getHomeserverName(), filterString: null, + selectedCommunityId: SettingsStore.getValue("feature_communities_v2_prototypes") + ? selectedCommunityId + : null, + communityName: null, }; }, @@ -71,28 +80,39 @@ export default createReactClass({ this.setState({protocolsLoading: false}); return; } - MatrixClientPeg.get().getThirdpartyProtocols().then((response) => { - this.protocols = response; - this.setState({protocolsLoading: false}); - }, (err) => { - console.warn(`error loading third party protocols: ${err}`); - this.setState({protocolsLoading: false}); - if (MatrixClientPeg.get().isGuest()) { - // Guests currently aren't allowed to use this API, so - // ignore this as otherwise this error is literally the - // thing you see when loading the client! - return; - } - track('Failed to get protocol list from homeserver'); - const brand = SdkConfig.get().brand; - this.setState({ - error: _t( - '%(brand)s failed to get the protocol list from the homeserver. ' + - 'The homeserver may be too old to support third party networks.', - { brand }, - ), + + if (!this.state.selectedCommunityId) { + MatrixClientPeg.get().getThirdpartyProtocols().then((response) => { + this.protocols = response; + this.setState({protocolsLoading: false}); + }, (err) => { + console.warn(`error loading third party protocols: ${err}`); + this.setState({protocolsLoading: false}); + if (MatrixClientPeg.get().isGuest()) { + // Guests currently aren't allowed to use this API, so + // ignore this as otherwise this error is literally the + // thing you see when loading the client! + return; + } + track('Failed to get protocol list from homeserver'); + const brand = SdkConfig.get().brand; + this.setState({ + error: _t( + '%(brand)s failed to get the protocol list from the homeserver. ' + + 'The homeserver may be too old to support third party networks.', + {brand}, + ), + }); }); - }); + } else { + // We don't use the protocols in the communities v2 prototype experience + this.setState({protocolsLoading: false}); + + // Grab the profile info async + FlairStore.getGroupProfileCached(MatrixClientPeg.get(), this.state.selectedCommunityId).then(profile => { + this.setState({communityName: profile.name}); + }); + } this.refreshRoomList(); }, @@ -105,6 +125,33 @@ export default createReactClass({ }, refreshRoomList: function() { + if (this.state.selectedCommunityId) { + this.setState({ + publicRooms: GroupStore.getGroupRooms(this.state.selectedCommunityId).map(r => { + return { + // Translate all the group properties to the directory format + room_id: r.roomId, + name: r.name, + topic: r.topic, + canonical_alias: r.canonicalAlias, + num_joined_members: r.numJoinedMembers, + avatarUrl: r.avatarUrl, + world_readable: r.worldReadable, + guest_can_join: r.guestsCanJoin, + }; + }).filter(r => { + const filterString = this.state.filterString; + if (filterString) { + const containedIn = (s: string) => (s || "").toLowerCase().includes(filterString.toLowerCase()); + return containedIn(r.name) || containedIn(r.topic) || containedIn(r.canonical_alias); + } + return true; + }), + loading: false, + }); + return; + } + this.nextBatch = null; this.setState({ publicRooms: [], @@ -114,6 +161,7 @@ export default createReactClass({ }, getMoreRooms: function() { + if (this.state.selectedCommunityId) return Promise.resolve(); // no more rooms if (!MatrixClientPeg.get()) return Promise.resolve(); this.setState({ @@ -239,7 +287,7 @@ export default createReactClass({ }, onRoomClicked: function(room, ev) { - if (ev.shiftKey) { + if (ev.shiftKey && !this.state.selectedCommunityId) { ev.preventDefault(); this.removeFromDirectory(room); } else { @@ -610,6 +658,18 @@ export default createReactClass({ } } + let dropdown = ( + + ); + if (this.state.selectedCommunityId) { + dropdown = null; + } + listHeader =
- + {dropdown}
; } const explanation = @@ -637,12 +692,16 @@ export default createReactClass({ }}, ); + const title = this.state.selectedCommunityId + ? _t("Explore rooms in %(communityName)s", { + communityName: this.state.communityName || this.state.selectedCommunityId, + }) : _t("Explore rooms"); return (
{explanation} From 276ed90884d03be7a0ff745f24213a869d3c4191 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 21 Aug 2020 18:10:05 -0600 Subject: [PATCH 084/174] Add a personal group for an all-communities state Design is approximate and needs review, though being completed out of band. --- res/css/structures/_TagPanel.scss | 10 +- res/themes/dark/css/_dark.scss | 2 + res/themes/legacy-dark/css/_legacy-dark.scss | 2 + .../legacy-light/css/_legacy-light.scss | 2 + res/themes/light/css/_light.scss | 2 + src/components/structures/TagPanel.js | 15 ++- src/components/views/elements/TagTile.js | 1 + src/components/views/elements/UserTagTile.tsx | 99 +++++++++++++++++++ 8 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 src/components/views/elements/UserTagTile.tsx diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index b2d05ad7e6..6c85341aaf 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -51,9 +51,9 @@ limitations under the License. .mx_TagPanel .mx_TagPanel_divider { height: 0px; - width: 34px; - border-bottom: 1px solid $panel-divider-color; - display: none; + width: 90%; + border: none; + border-bottom: 1px solid $tagpanel-divider-color; } .mx_TagPanel .mx_TagPanel_scroller { @@ -116,6 +116,10 @@ limitations under the License. border-radius: 0 3px 3px 0; } +.mx_TagPanel .mx_TagTile.mx_TagTile_large.mx_TagTile_selected::before { + left: -10px; +} + .mx_TagPanel .mx_TagTile.mx_AccessibleButton:focus { filter: none; } diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index d48abf6a4c..a3b03c777e 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -119,6 +119,8 @@ $roomlist-bg-color: rgba(33, 38, 44, 0.90); $roomlist-header-color: $tertiary-fg-color; $roomsublist-divider-color: $primary-fg-color; +$tagpanel-divider-color: $roomlist-header-color; + $roomtile-preview-color: $secondary-fg-color; $roomtile-default-badge-bg-color: #61708b; $roomtile-selected-bg-color: rgba(141, 151, 165, 0.2); diff --git a/res/themes/legacy-dark/css/_legacy-dark.scss b/res/themes/legacy-dark/css/_legacy-dark.scss index 4ab5f99942..2741dcebf8 100644 --- a/res/themes/legacy-dark/css/_legacy-dark.scss +++ b/res/themes/legacy-dark/css/_legacy-dark.scss @@ -116,6 +116,8 @@ $roomlist-bg-color: $header-panel-bg-color; $roomsublist-divider-color: $primary-fg-color; +$tagpanel-divider-color: $roomlist-header-color; + $roomtile-preview-color: #9e9e9e; $roomtile-default-badge-bg-color: #61708b; $roomtile-selected-bg-color: #1A1D23; diff --git a/res/themes/legacy-light/css/_legacy-light.scss b/res/themes/legacy-light/css/_legacy-light.scss index 6e66964fdf..4fd2a3615b 100644 --- a/res/themes/legacy-light/css/_legacy-light.scss +++ b/res/themes/legacy-light/css/_legacy-light.scss @@ -183,6 +183,8 @@ $roomlist-bg-color: $header-panel-bg-color; $roomlist-header-color: $primary-fg-color; $roomsublist-divider-color: $primary-fg-color; +$tagpanel-divider-color: $roomlist-header-color; + $roomtile-preview-color: #9e9e9e; $roomtile-default-badge-bg-color: #61708b; $roomtile-selected-bg-color: #fff; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index ceb8d5677c..05302a2a80 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -177,6 +177,8 @@ $roomlist-bg-color: rgba(245, 245, 245, 0.90); $roomlist-header-color: $tertiary-fg-color; $roomsublist-divider-color: $primary-fg-color; +$tagpanel-divider-color: $roomlist-header-color; + $roomtile-preview-color: $secondary-fg-color; $roomtile-default-badge-bg-color: #61708b; $roomtile-selected-bg-color: #FFF; diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 4f8a051e62..3acec417f2 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -29,6 +29,8 @@ import { Droppable } from 'react-beautiful-dnd'; import classNames from 'classnames'; import MatrixClientContext from "../../contexts/MatrixClientContext"; import AutoHideScrollbar from "./AutoHideScrollbar"; +import SettingsStore from "../../settings/SettingsStore"; +import UserTagTile from "../views/elements/UserTagTile"; const TagPanel = createReactClass({ displayName: 'TagPanel', @@ -102,6 +104,17 @@ const TagPanel = createReactClass({ dis.dispatch({action: 'deselect_tags'}); }, + renderGlobalIcon() { + if (!SettingsStore.getValue("feature_communities_v2_prototypes")) return null; + + return ( +
+ +
+
+ ); + }, + render() { const DNDTagTile = sdk.getComponent('elements.DNDTagTile'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); @@ -137,7 +150,6 @@ const TagPanel = createReactClass({
{ clearButton }
-
+ { this.renderGlobalIcon() } { tags }
{ + private tagStoreRef: fbEmitter.EventSubscription; + + constructor(props: IProps) { + super(props); + + this.state = { + selected: TagOrderStore.getSelectedTags().length === 0, + }; + } + + public componentDidMount() { + OwnProfileStore.instance.on(UPDATE_EVENT, this.onProfileUpdate); + this.tagStoreRef = TagOrderStore.addListener(this.onTagStoreUpdate); + } + + public componentWillUnmount() { + OwnProfileStore.instance.off(UPDATE_EVENT, this.onProfileUpdate); + } + + private onProfileUpdate = () => { + this.forceUpdate(); + }; + + private onTagStoreUpdate = () => { + const selected = TagOrderStore.getSelectedTags().length === 0; + this.setState({selected}); + }; + + private onTileClick = (ev) => { + ev.preventDefault(); + ev.stopPropagation(); + + // Deselect all tags + defaultDispatcher.dispatch({action: "deselect_tags"}); + }; + + public render() { + // XXX: We reuse TagTile classes for ease of demonstration - we should probably generify + // TagTile instead if we continue to use this component. + const avatarHeight = 36; + const name = OwnProfileStore.instance.displayName || MatrixClientPeg.get().getUserId(); + const className = classNames({ + mx_TagTile: true, + mx_TagTile_selected: this.state.selected, + mx_TagTile_large: true, + }); + return ( + +
+ +
+
+ ); + } +} From f0bd4d3625e3f38c6b4f8935fed1f3bd808b644a Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 21 Aug 2020 18:17:57 -0600 Subject: [PATCH 085/174] Show the group's room if one is returned --- .../views/dialogs/CreateGroupDialog.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/components/views/dialogs/CreateGroupDialog.js b/src/components/views/dialogs/CreateGroupDialog.js index 10285ccee0..d8a8b96961 100644 --- a/src/components/views/dialogs/CreateGroupDialog.js +++ b/src/components/views/dialogs/CreateGroupDialog.js @@ -83,11 +83,18 @@ export default createReactClass({ localpart: this.state.groupId, profile: profile, }).then((result) => { - dis.dispatch({ - action: 'view_group', - group_id: result.group_id, - group_is_new: true, - }); + if (result.room_id) { + dis.dispatch({ + action: 'view_room', + room_id: result.room_id, + }); + } else { + dis.dispatch({ + action: 'view_group', + group_id: result.group_id, + group_is_new: true, + }); + } this.props.onFinished(true); }).catch((e) => { this.setState({createError: e}); From 8e23b1072fdd6d4147ac4c30a5e62ae747db4e92 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 21 Aug 2020 18:27:49 -0600 Subject: [PATCH 086/174] Add i18n it's probably important --- 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 3ffc11b5b8..c66211ff41 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2072,6 +2072,7 @@ "Find a room…": "Find a room…", "Find a room… (e.g. %(exampleRoom)s)": "Find a room… (e.g. %(exampleRoom)s)", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "If you can't find the room you're looking for, ask for an invite or Create a new room.", + "Explore rooms in %(communityName)s": "Explore rooms in %(communityName)s", "Clear filter": "Clear filter", "Search rooms": "Search rooms", "You can't send any messages until you review and agree to our terms and conditions.": "You can't send any messages until you review and agree to our terms and conditions.", From 531030e180699aa5f97848f961ea9a3329fa8c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 21 Aug 2020 22:13:10 +0000 Subject: [PATCH 087/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2335 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 89df7c4f26..2eb000d7b5 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -170,7 +170,7 @@ "Are you sure you want to remove %(serverName)s": "Kas sa oled kindel et soovid eemadlada %(serverName)s", "Remove server": "Eemalda server", "%(networkName)s rooms": "%(networkName)s jututoad", - "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Kas sa oled kindel et soovid eemaldada (kustutada) seda sündmust? Pane tähele, et see muutus võib tagasi pöörduda, kui muudad hiljem jututoa nime või teemanime.", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Kas sa oled kindel et soovid eemaldada (kustutada) seda sündmust? Pane tähele, et see muutus võib tagasi pöörduda, kui muudad hiljem jututoa nime või teema nime.", "Sign out and remove encryption keys?": "Logi välja ja eemalda krüptimisvõtmed?", "Upload files (%(current)s of %(total)s)": "Lae failid üles (%(current)s / %(total)s)", "Upload files": "Lae failid üles", From 449bcc1c45e20d9840b3c1810f90c4467bb58178 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Sat, 22 Aug 2020 07:24:29 +0000 Subject: [PATCH 088/174] Translated using Weblate (Kabyle) Currently translated at 75.7% (1768 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 247 +++++++++++++++++++++++++++++++++++++- 1 file changed, 244 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 2117158ed8..2c65421910 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1459,7 +1459,7 @@ "in secret storage": "deg uklas uffir", "Master private key:": "Tasarut tusligt tagejdant:", "cached locally": "yettwaffer s wudem adigan", - "not found locally": "Ulac s wudem adigan", + "not found locally": "ulac s wudem adigan", "Self signing private key:": "Tasarut tusligt n uzmul awurman:", "User signing private key:": "Tasarut tusligt n uzmul n useqdac:", "Session backup key:": "Tasarut n uḥraz n tɣimit:", @@ -1540,7 +1540,7 @@ "Invalid file%(extra)s": "D afaylu %(extra)s arameɣtu", "Error decrypting image": "Tuccḍa deg uwgelhen n tugna", "Show image": "Sken tugna", - "Invalid base_url for m.identity_server": "base_url d arameɣtu i m.identity_server", + "Invalid base_url for m.identity_server": "D arameɣtu base_url i m.identity_server", "Signing In...": "Anekcum ɣer...", "If you've joined lots of rooms, this might take a while": "Ma yella tettekkaḍ deg waṭas n texxamin, ayagi yezmer ad yeṭṭef kra n wakud", "Set a display name:": "Sbadu isem n uskan:", @@ -1560,5 +1560,246 @@ "Copy it to your personal cloud storage": "Nɣel-itt ɣer uklas-ik·im n usigna udmawan", "Your keys are being backed up (the first backup could take a few minutes).": "Tisura-ik·im la ttwaḥrazent (aḥraz amezwaru yezmer ad yeṭṭef kra n tesdidin).", "Set up Secure Message Recovery": "Sbadu iznan iɣelsanen n tririt", - "Secure your backup with a recovery passphrase": "Ḍmen aḥrazen-inek·inem s tefyirt tuffirt n uɛeddi" + "Secure your backup with a recovery passphrase": "Ḍmen aḥrazen-inek·inem s tefyirt tuffirt n uɛeddi", + "Unexpected error resolving homeserver configuration": "Tuccḍa ur nettwaṛǧa ara lawan n uṣeggem n twila n uqeddac agejdan", + "Unexpected error resolving identity server configuration": "Tuccḍa ur nettwaṛǧa ara lawan n uṣeggem n uqeddac n timagit", + "This homeserver has exceeded one of its resource limits.": "Aqeddac-a agejdan iɛedda yiwet seg tlisa-ines tiɣbula.", + "Your browser does not support the required cryptography extensions": "Iminig-ik·im ur issefrak ara iseɣzaf n uwgelhen yettusran", + "Authentication check failed: incorrect password?": "Asenqed n usesteb ur yeddi ara: awal uffir d arameɣtu?", + "Can't leave Server Notices room": "Ur nezmir ara ad neǧǧ taxxamt n yiwenniten n uqeddac", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Taxxamt-a tettuseqdac i yiznan yesɛan azal sɣur aqeddac agejdan, ɣef waya ur tezmireḍ ara ad tt-teǧǧeḍ.", + "Error leaving room": "Tuccaḍa deg tuffɣa seg texxamt", + "The user must be unbanned before they can be invited.": "Aseqdac ilaq ad yettwakkes uqbel ad izmiren ad t-id-snubegten.", + "Use a longer keyboard pattern with more turns": "Seqdec talɣa n unasiw ɣezzifen s wugar n tuzzyiwin", + "Capitalization doesn't help very much": "Tira timeqqranin ur tettɛawan ara aṭas", + "Reversed words aren't much harder to guess": "Awalen imettiyen ur weɛrit ara i tifin", + "Predictable substitutions like '@' instead of 'a' don't help very much": "Isnifal yettbeddilen am '@' deg wadeg n 'a' ur ttɛawanen ara aṭas", + "Repeats like \"aaa\" are easy to guess": "Allus am \"aaa\" fessus i usumer", + "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "Allus am \"abcabcabc\" yewɛer cwiṭ i tifin ɣef \"abc\"", + "Sequences like abc or 6543 are easy to guess": "Asemyizwer am abc neɣ 6543 fessus i usumer", + "This is similar to a commonly used password": "Wagi kifkif am wawal uffir yettwaseqdacen acḥal n tikkal", + "A word by itself is easy to guess": "Awal s timmad-is fessus i usumer", + "Names and surnames by themselves are easy to guess": "Ismawen d yismawen n useqdac s timmad-nsen fessusit i usumer", + "Common names and surnames are easy to guess": "Ismawen d yismawen n useqdac yettwassnen fessusit i usumer", + "Straight rows of keys are easy to guess": "Idurren ubdisen n tsura fessusit i ussumer", + "Short keyboard patterns are easy to guess": "Tinerufin n unasiw amecṭuḥ fessusit i ussumer", + "Help us improve %(brand)s": "Mudd-aɣ-d tallalt ad nesnerni %(brand)s", + "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Azen inesfka n useqdec udrig ayen ara aɣ-iɛawnen ad nesnerni %(brand)s. Ayagi ad isseqdec inagan n tuqqna.", + "Review where you’re logged in": "Senqed ansi i d-tkecmeḍ", + "Verify all your sessions to ensure your account & messages are safe": "Senqed akk tiqimiyin-ik·im i wakken ad tḍemneḍ amiḍan-ik·m & yiznan d iɣelsanen", + "You are not receiving desktop notifications": "Ur d-termiseḍ ara ilɣa n tnarit", + "Your homeserver has exceeded its user limit.": "Aqeddac-inek·inem agejdan yewweḍ ɣer talast n useqdac.", + "Your homeserver has exceeded one of its resource limits.": "Aqeddac-inek·inem agejdan iɛedda yiwet seg tlisa-ines tiɣbula.", + "Contact your server admin.": "Nermes anedbal-inek·inem n uqeddac.", + "To return to your account in future you need to set a password": "Akken ad tuɣaleḍ ɣer umiḍan-ik·im ɣer sdat tesriḍ ad tesbaduḍ awal uffir", + "New spinner design": "Afeṣṣel amaynut n usezzay", + "Render simple counters in room header": "Err amsiḍen afessa ɣef uqerru n texxamt", + "Multiple integration managers": "Imsefrak n waṭas n yimsidaf", + "Try out new ways to ignore people (experimental)": "Ɛreḍ iberdan-nniḍen i tigtin n yimdanen (armitan)", + "Show message previews for reactions in DMs": "Sken timeẓriwin n yiznan i tsedmirin deg DMs", + "Show message previews for reactions in all rooms": "Sken timeẓriwin n yiznan i tsedmirin deg meṛṛa tixxamin", + "Enable advanced debugging for the room list": "Rmed tamseɣtayt leqqayen i tebdart n texxamt", + "Enable big emoji in chat": "Rmed imujit ameqqran deg udiwenni", + "Automatically replace plain text Emoji": "Semselsi iujit n uḍris aččuran s wudem awurman", + "Enable Community Filter Panel": "Rmed agalis n umsizdeg n temɣiwent", + "Use a system font": "Seqdec tasefsit n unagraw", + "Size must be a number": "Teɣzi ilaq ad tili d uṭṭun", + "Message layout": "Talɣa n yizen", + "Discovery": "Tagrut ", + "Help & About": "Tallalt & Ɣef", + "Homeserver is": "Aqeddac agejdan d", + "Identity Server is": "Aqeddac n timagit d", + "Access Token:": "Ajuṭu n unekcum:", + "click to reveal": "sit i ubeggen", + "Labs": "Tinarimin", + "Customise your experience with experimental labs features. Learn more.": "Sagen tarmit-ik·im s tmahilin n tinarimin tirmitanin. Issin ugar.", + "Error adding ignored user/server": "Tuccḍa deg tmerna n useqdac/uqeddac yettwanfen", + "Something went wrong. Please try again or view your console for hints.": "Yella wayen ur nteddu ara akken iwata, ma ulac aɣilif ales tikkelt-nniḍen neɣ senqed tadiwent-ik·im i yiwellihen.", + "Error subscribing to list": "Tuccḍa deg ujerred ɣef tebdart", + "Please verify the room ID or address and try again.": "Ma ulac aɣilif senqed asulay n texxamt neɣ tansa syen ɛreḍ tikkelt-nniḍen.", + "Error removing ignored user/server": "Tuccḍa deg tukksa n useqdac/uqeddac yettwanfen", + "Please try again or view your console for hints.": "Ma ulac aɣilif ales tikkelt-nniḍen neɣ senqed tadiwent-ik·im i yiwellihen.", + "Ban list rules - %(roomName)s": "Ilugan n tebdart n tigtin - %(roomName)s", + "You have not ignored anyone.": "Ur tunifeḍ ula i yiwen.", + "You are not subscribed to any lists": "Ur tettwajerrdeḍ ula deg yiwet n tebdart", + "View rules": "Senqed ilugan", + "You are currently subscribed to:": "Aql-ak·akem akka tura tjerrdeḍ ɣer:", + "⚠ These settings are meant for advanced users.": "⚠ Iɣewwaren-a n yiseqdac ifazen.", + "Subscribed lists": "Tibdarin n ujerred", + "Import E2E room keys": "Kter tisura n texxamt E2E", + "Cryptography": "Awgelhan", + "Session key:": "Tasarut n tɣimit:", + "Bulk options": "Tixtiṛiyin s ubleɣ", + "Accept all %(invitedRooms)s invites": "Qbel akk tinubgiwin %(invitedRooms)s", + "Reject all %(invitedRooms)s invites": "Agi akk tinubgiwin %(invitedRooms)s", + "Key backup": "Araz n tsarut", + "Cross-signing": "Azmul anmidag", + "Security & Privacy": "Taɣellist & tbaḍnit", + "Where you’re logged in": "Ansi i d-tkecmeḍ", + "Learn more about how we use analytics.": "Issin ugar ɣef wamek i nesseqdac tasleḍt.", + "No media permissions": "Ulac tisirag n umidyat", + "Missing media permissions, click the button below to request.": "Ulac tisirag n umidyat, sit ɣef tqeffalt ddaw i usentem.", + "Request media permissions": "Suter tisirag n umidyat", + "No Audio Outputs detected": "Ulac tuffɣiwin n umeslaw i d-yettwafen", + "No Microphones detected": "Ulac isawaḍen i d-yettwafen", + "No Webcams detected": "Ulac tikamiṛatin i d-yettwafen", + "Audio Output": "Tuffɣa n umeslaw", + "View older messages in %(roomName)s.": "Senqed iznan iqburen deg %(roomName)s.", + "Room information": "Talɣut n texxamt", + "Developer options": "Tixtiṛiyin s uneflay", + "This room is bridging messages to the following platforms. Learn more.": "Taxxamt-a tettcuddu iznan ɣer tɣerɣar i d-iteddun. Issin ugar.", + "This room isn’t bridging messages to any platforms. Learn more.": "Taxxamt-a ur tettcuddu ara iznan ɣer tɣerɣar i d-iteddun. Issin ugar.", + "Bridges": "Tileggiyin", + "Room Addresses": "Tansiwin n texxamt", + "URL Previews": "Tiskanin n URL", + "Uploaded sound": "Ameslaw i d-yulin", + "Set a new custom sound": "Sbadu ameslaw udmawan amaynut", + "Change room avatar": "Beddel avaṭar n texxamt", + "Change room name": "Beddel isem n texxamt", + "Change history visibility": "Beddel amazray n texxamt", + "Modify widgets": "Snifel iwiǧiten", + "Unban": "Asefsex n tigtin", + "Error changing power level requirement": "Tuccḍa deg usnifel n tuttra n uswir afellay", + "Error changing power level": "Tuccḍa deg usnifel n uswir afellay", + "Notify everyone": "Selɣu yal yiwen", + "Send %(eventType)s events": "Azen tidyanin n %(eventType)s", + "Roles & Permissions": "Timlellay & Tisirag", + "Click here to fix": "Sit dagi i uṣeggem", + "To link to this room, please add an address.": "I ucuddu ɣer texxamt-a, ttxil-k·m rnu tansa.", + "Only people who have been invited": "Ala imdanen i d-yettusnubegten", + "Anyone who knows the room's link, apart from guests": "Yal win·tin yessnen aseɣwen n texxamt slid inebgawen", + "Anyone who knows the room's link, including guests": "Yal win·tin yessnen aseɣwen n texxamt rnu-d ɣer-sen inebgawen", + "Members only (since the point in time of selecting this option)": "Iɛeggalen kan (segmi yebda ufran n textiṛit-a)", + "Members only (since they were invited)": "Iɛeggalen kan (segmi ara d-ttwanecden)", + "Members only (since they joined)": "Iɛeggalen kan (segmi ara d-ttwarnun)", + "Encrypted": "Yettwawgelhen", + "Who can access this room?": "Anwa i izemren ad d-yernu ɣer texxamt-a?", + "Who can read history?": "Anwa i izemren ad d-iɣer amazray?", + "Unable to revoke sharing for email address": "Asefsex n beṭṭu n tansa n yimayl ur yeddi ara", + "Unable to share email address": "Beṭṭu n tansa n yimayl ur yeddi ara", + "Your email address hasn't been verified yet": "Tansa n yimayl-ik·im ur tettwasenqed ara akka ar tura", + "Unable to verify email address.": "Asenqed n tansa n yimayl ur yeddi ara.", + "Verify the link in your inbox": "Senqed aseɣwen deg tbewwaḍt-ik·im n yimayl", + "Revoke": "Ḥwi", + "Unable to revoke sharing for phone number": "Aḥwi n beṭṭu n tansa n yimayl ur yeddi ara", + "Unable to share phone number": "Beṭṭu n wuṭṭun n tilifun ur yeddi ara", + "Unable to verify phone number.": "Asenqed n wuṭṭun n tilifun ur yeddi ara.", + "Incorrect verification code": "Tangalt n usenqed d tarussint", + "Please enter verification code sent via text.": "Ttxil-k·m sekcem tangalt n usenqed i ak·am-d-yettwaznen s SMS.", + "Unable to remove contact information": "Tukksa n talɣut n unermas ur teddi ara", + "Invalid Email Address": "Tansa n yimayl d tarameɣtut", + "This doesn't appear to be a valid email address": "Tagi ur tettban ara d tansa n yimayl tameɣtut", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Izen n uḍris yettwazen ɣer +%(msisdn)s. Ttxil-k·m sekcem tangalt n usenqed yellan deg-s.", + "Cannot add any more widgets": "Ur yezmir ara ad yernu ugar n yiwiǧiten", + "Add a widget": "Rnu awiǧit", + "Drop File Here": "Sers afaylu dagi", + "Drop file here to upload": "Eǧǧ afaylu dagi i usali", + " (unsupported)": " ·(ur yettwasefrak ara)", + "Join as voice or video.": "Ttekki d taɣuct neɣ tavidyut.", + "Ongoing conference call%(supportedText)s.": "Asarag s usiwel iteddu%(supportedText)s.", + "This user has not verified all of their sessions.": "Aseqdac-a ur issenqed ara akk tiɣimiyin-ines.", + "You have not verified this user.": "Ur tesneqdeḍ aea aseqdac-a.", + "You have verified this user. This user has verified all of their sessions.": "Tesneqdeḍ aseqdac-a. Aseqdac-a issenqed akk tiɣimiyin-ines.", + "Someone is using an unknown session": "Yella win yesseqdacen tiɣimit tarussint", + "Everyone in this room is verified": "Yal yiwen deg taxxamt-a yettwasenqed", + "Mod": "Atrar", + "This event could not be displayed": "Tadyant-a ur tezmir ad d-tettwaskan", + "%(senderName)s sent an image": "%(senderName)s yuzen-d tugna", + "%(senderName)s sent a video": "%(senderName)s yuzen-d tavidyut", + "%(senderName)s uploaded a file": "%(senderName)s yessuli-d afaylu", + "Your key share request has been sent - please check your other sessions for key share requests.": "Asuter-ik·im n beṭṭ n tsarut yettwazen - ttxil-k·m senqed tiɣimiyin-ik·im-nniḍen i yisutar n beṭṭu n tsarut.", + "Re-request encryption keys from your other sessions.": "Suter i tikkelt-nniḍen tisura n uwgelhen seg tɣimiyin-ik·im tiyaḍ.", + "Encrypted by an unverified session": "Yettuwgelhen s tɣimit ur nettwasenqed ara", + "Unencrypted": "Ur yettwawgelhen ara", + "The authenticity of this encrypted message can't be guaranteed on this device.": "Asesteb n yizen-a awgelhen ur yettwaḍman ara deg yibenk-a.", + "Please select the destination room for this message": "Ttxil-k·m fren taxxamt n userken n yizen-a", + "Invited": "Yettwancad", + "Hangup": "Ɛelleq", + "Emoji picker": "Amefran n yimujit", + "The conversation continues here.": "Adiwenni yettkemmil dagi.", + "This room has been replaced and is no longer active.": "Taxxamt-a ad tettusmelsi, dayen d tarurmidt.", + "You do not have permission to post to this room": "Ur tesεiḍ ara tasiregt ad d-tsuffɣeḍ deg texxamt-a", + "Code block": "Iḥder n tengalt", + "Unpin Message": "Senser-d izen", + "Jump to message": "Ɛeddi ɣer yizen", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)sh", + "%(duration)sd": "%(duration)sd", + "Unknown for %(duration)s": "D arussin azal n %(duration)s", + "Offline": "Beṛṛa n tuqqna", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Iwala-t %(displayName)s (%(userName)s) ɣef %(dateTime)s", + "Room %(name)s": "Taxxamt %(name)s", + "No recently visited rooms": "Ulac taxxamt yemmeẓren melmi kan", + "No rooms to show": "Ulac tixxamin i uskan", + "Unnamed room": "Taxxamt war isem", + "World readable": "Amaḍal yettwaɣran", + "(~%(count)s results)|other": "(~%(count)s igmaḍ)", + "Share room": "Bḍu taxxamt", + "Invites": "Inced-d", + "Start chat": "Bdu adiwenni", + "Create new room": "Rnu taxxamt tamaynut", + "Explore public rooms": "Snirem tixxamin tizuyaz", + "Low priority": "Tazwart taddayt", + "Historical": "Amazray", + "Can't see what you’re looking for?": "Ur yezmir ara ad iwali acu i tettnadiḍ?", + "Explore all public rooms": "Snirem akk tixxamin tizuyaz", + "%(count)s results|other": "%(count)s yigmaḍ", + "Joining room …": "Rnu ɣer texxamt…", + "You were kicked from %(roomName)s by %(memberName)s": "Tettwasuffɣeḍ-d seg %(roomName)s sɣur %(memberName)s", + "Reason: %(reason)s": "Taɣzint: %(reason)s", + "You were banned from %(roomName)s by %(memberName)s": "Tettwaɛezleḍ-d seg %(roomName)s sɣur %(memberName)s", + "Something went wrong with your invite to %(roomName)s": "Yella wayen ur nteddu ara akken ilaq d tinubga-ik·im ɣer %(roomName)s", + "unknown error code": "Tangalt n tuccḍa tarussint", + "You can only join it with a working invite.": "Tzemreḍ kan ad ternuḍ ɣer-s ala s tinubga n uxeddim.", + "You can still join it because this is a public room.": "Mazal tzemreḍ ad ternuḍ ɣer-s acku taxxamt-a d tazayezt.", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Tinubga-a ɣer %(roomName)s tettwazen i %(email)s ur nettwacudd ara d umiḍan-ik·im", + "Link this email with your account in Settings to receive invites directly in %(brand)s.": "Qqen imayl-a ɣer umiḍan-ik·im deg yiɣewwaren i wakken ad d-tremseḍ tinubgiwin srid deg %(brand)s.", + "This invite to %(roomName)s was sent to %(email)s": "Tinubga-a ɣer %(roomName)s tettwazen i %(email)s", + "Use an identity server in Settings to receive invites directly in %(brand)s.": "Seqdec aqeddac n timagit deg yiɣewwaren i wakken ad d-tremseḍ tinubgiwin srid deg %(brand)s.", + "Share this email in Settings to receive invites directly in %(brand)s.": "Bḍu imayl-a deg yiɣewwaren i wakken ad d-tremseḍ tinubgiwin srid deg %(brand)s.", + "Do you want to chat with %(user)s?": "Tebɣiḍ ad temmeslayeḍ d %(user)s?", + " wants to chat": " yebɣa ad immeslay", + "Do you want to join %(roomName)s?": "Tebɣiḍ ad tettekkiḍ deg %(roomName)s?", + " invited you": " inced-ik·im", + "You're previewing %(roomName)s. Want to join it?": "Tessenqadeḍ %(roomName)s. Tebɣiḍ ad ternuḍ ɣur-s?", + "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s ur tezmir ara ad tettwasenqed. Tebɣiḍ ad ternuḍ ɣer-s?", + "Favourited": "Yettusmenyaf", + "Favourite": "Asmenyif", + "Low Priority": "Tazwart taddayt", + "%(count)s unread messages including mentions.|other": "%(count)s yiznan ur nettwaɣra ara rnu ɣer-sen ibdaren.", + "This room has already been upgraded.": "Taxxamt-a tettuleqqam yakan.", + "This room is running room version , which this homeserver has marked as unstable.": "Taxxamt-a tesedday lqem n texxamt , i yecreḍ uqeddac-a agejdan ur yerkid ara.", + "Only room administrators will see this warning": "Ala inedbalen kan n texxamt ara iwalin tuccḍa-a", + "Server unavailable, overloaded, or something else went wrong.": "Aqeddac ulac-it, neɣ iɛebba aṭas neɣ yella wayen ur nteddu ara akken ilaq.", + "You're all caught up.": "Tessawḍeḍ ad tqeḍɛeḍ kullec.", + "The server has denied your request.": "Aqeddac yugi asuter-ik·im.", + "Your area is experiencing difficulties connecting to the internet.": "Tamnaḍt-ik·im temlal-d uguren n tuqqna ɣer internet.", + "A connection error occurred while trying to contact the server.": "Tuccḍa deg tuqqna lawan n uneɛruḍ ad nnermes aqeddac.", + "The server is not configured to indicate what the problem is (CORS).": "Aqeddac ur yettusesteb ara i wakken ad d-imel anida-t wugur (CORPS).", + "Recent changes that have not yet been received": "Isnifal imaynuten ur d-newwiḍ ara akka ar tura", + "Sign out and remove encryption keys?": "Ffeɣ syen kkes tisura tiwgelhanin?", + "You have successfully set a password!": "Tesbaduḍ akken iwata awal uffir!", + "You have successfully set a password and an email address!": "Tesbaduḍ akken iwata awal uffird tansa n yimayl!", + "You can now return to your account after signing out, and sign in on other devices.": "Tzemreḍ tura ad tuɣaleḍ ɣer umiḍan-ik·im mbeɛd mi d-teffɣeḍ, syen kcem ɣer yibenkan-nniḍen.", + "Remember, you can always set an email address in user settings if you change your mind.": "Cfu, tzemreḍ melmi i ak-yehwa ad tesbaduḍ tansa n yimayl deg yiɣewwaren n useqdac ma yella tbeddleḍ ṛṛay-ik·im.", + "(HTTP status %(httpStatus)s)": "(HTTP addad %(httpStatus)s)", + "Please set a password!": "Ttxil-ik·im sbadu awal uffir!", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Ayagi ad ak·akem-yeǧǧ ad tuɣaleḍ ɣer umiḍan-ik·im mbeɛd mi d-teffɣeḍ, syen kcem ɣer yibenkan-nniḍen.", + "Share Room": "Bḍu taxxamt", + "Link to most recent message": "Aseɣwen n yizen akk aneggaru", + "Share Room Message": "Bḍu izen n texxamt", + "Command Help": "Tallalt n tiludna", + "Integration Manager": "Amsefrak n umsidef", + "Find others by phone or email": "Af-d wiyaḍ s tiliɣri neɣ s yimayl", + "Be found by phone or email": "Ad d-yettwaf s tiliɣri neɣ s yimayl", + "Upload files (%(current)s of %(total)s)": "Sali-d ifuyla (%(current)s ɣef %(total)s)", + "Liberate your communication": "Serreḥ i teywalt-ik·im", + "Explore Public Rooms": "Snirem tixxamin tizuyaz", + "Create a Group Chat": "Rnu adiwenni n ugraw", + "This room is not public. You will not be able to rejoin without an invite.": "Taxxamt-a mačči d tazayezt. Ur tezmireḍ ara ad ternuḍ ɣer-s war tinubga.", + "Are you sure you want to leave the room '%(roomName)s'?": "S tidet tebɣiḍ ad teǧǧeḍ taxxamt '%(roomName)s'?", + "For security, this session has been signed out. Please sign in again.": "Ɣef ssebba n tɣellist, taxxamt-a ad temdel. Ttxil-k·m ɛreḍ tikkelt-nniḍen.", + "Old cryptography data detected": "Ala isefka iweglehnen i d-iteffɣen", + "%(creator)s created and configured the room.": "%(creator)s yerna-d taxxamt syen yeswel taxxamt." } From 05d2bc80911bf968675bcbfe813d9fbe1d52aa6b Mon Sep 17 00:00:00 2001 From: Kahina Messaoudi Date: Sat, 22 Aug 2020 17:15:36 +0000 Subject: [PATCH 089/174] Translated using Weblate (Kabyle) Currently translated at 75.7% (1768 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 2c65421910..f91615e1d8 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -60,7 +60,7 @@ "What's New": "D acu-t umaynut", "Update": "Leqqem", "Restart": "Ales tanekra", - "Font size": "Tuɣzi n tsefsit", + "Font size": "Teɣzi n tsefsit", "Decline": "Agwi", "Accept": "Qbel", "or": "neɣ", @@ -441,7 +441,7 @@ "Please contact your homeserver administrator.": "Ttxil-k/m nermes anedbal-ik/im n usebter agejdan.", "Failed to join room": "Anekcum ɣer texxamt ur yeddi ara", "Custom user status messages": "Sagen addaden n yiznan n useqdac", - "Support adding custom themes": "Tallalt n tmerna n yisental udmawanen", + "Support adding custom themes": "Tallelt n tmerna n yisental udmawanen", "Use custom size": "Seqdec teɣzi tudmawant", "Show avatar changes": "Sken isnifal n avatar", "Always show encryption icons": "Sken yal tikkelt tignitin tiwgelhanen", @@ -532,8 +532,8 @@ "Session already verified!": "Tiɣimit tettwasenqed yakan!", "Verified key": "Tasarut tettwasenqed", "Displays information about a user": "Yeskan talɣut ɣef useqdac", - "Send a bug report with logs": "Azen aneqqis n wabug s yiɣƔisen", - "Logs sent": "Iɣmisen ttewaznen", + "Send a bug report with logs": "Azen aneqqis n ubug s yiɣmisen", + "Logs sent": "Iɣmisen yettwaznen", "Opens chat with the given user": "Yeldi adiwenni d useqdac i d-yettunefken", "Sends a message to the given user": "Yuzen iznan i useqdac i d-yettunefken", "Displays action": "Yeskan tigawt", @@ -541,14 +541,14 @@ "%(senderName)s invited %(targetName)s.": "%(senderName)s inced-d %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s yugi %(targetName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s kksen isem ara d-ibanen (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaqnu-ines.", + "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaɣnu-ines.", "%(senderName)s changed their profile picture.": "%(senderName)s ibeddel tawlaft n umaɣnu-ines.", "%(senderName)s set a profile picture.": "%(senderName)s yesbadu tawlaft n umaɣnu.", - "%(senderName)s made no change.": "%(senderName)s ur yegi ara ula d yiwen n ubeddel.", + "%(senderName)s made no change.": "%(senderName)s ur igi ara ula d yiwen n ubeddel.", "VoIP conference started.": "Asarag VoIP yebda.", "%(targetName)s joined the room.": "%(targetName)s yerna-d ɣer texxamt.", "VoIP conference finished.": "Asarag VoIP yekfa.", - "%(targetName)s rejected the invitation.": "%(targetName)s yeugi tinnubga.", + "%(targetName)s rejected the invitation.": "%(targetName)s yugi tinnubga.", "%(targetName)s left the room.": "%(targetName)s yeǧǧa texxamt.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s yeqbel %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s yekkes-d tinnubga n %(targetName)s.", @@ -583,7 +583,7 @@ "Other users may not trust it": "Iseqdacen-nniḍen yezmer ur tettamnen ara", "You joined the call": "Terniḍ ɣer usiwel", "%(senderName)s joined the call": "%(senderName)s yerna ɣer usiwel", - "Call in progress": "Asiwel la iteddu", + "Call in progress": "Asiwel la itteddu", "You left the call": "Teǧǧiḍ asiwel", "%(senderName)s left the call": "%(senderName)s yeǧǧa asiwel", "Call ended": "Asiwel yekfa", @@ -787,7 +787,7 @@ "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s yesbadu tansa tagejdant i texxamt-a s %(address)s.", "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yerna tansa-nniḍen %(addresses)s i texxamt-a.", "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s yekkes tansa-nni-nniḍen %(addresses)s i texxamt-a.", - "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yekkes tansa-nni tayeḍ %(addresses)s i texxamt-a.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yekkes tansa-nni-nniḍen %(addresses)s i texxamt-a.", "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s ibeddel tansa-nni tayeḍ n texxamt-a.", "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ibeddel tansa tagejdant d tansa-nni tayeḍ i texxamt-a.", "Sends a message as html, without interpreting it as markdown": "Yuzen izen d html war ma isegza-t s tukksa n tecreḍt", @@ -1801,5 +1801,20 @@ "Are you sure you want to leave the room '%(roomName)s'?": "S tidet tebɣiḍ ad teǧǧeḍ taxxamt '%(roomName)s'?", "For security, this session has been signed out. Please sign in again.": "Ɣef ssebba n tɣellist, taxxamt-a ad temdel. Ttxil-k·m ɛreḍ tikkelt-nniḍen.", "Old cryptography data detected": "Ala isefka iweglehnen i d-iteffɣen", - "%(creator)s created and configured the room.": "%(creator)s yerna-d taxxamt syen yeswel taxxamt." + "%(creator)s created and configured the room.": "%(creator)s yerna-d taxxamt syen yeswel taxxamt.", + "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Tzemreḍ ad tjerrdeḍ, maca kra n tmahilin ur ttilint ara almi yuɣal-d uqeddac n tmagit. Ma mazal tettwaliḍ alɣu-a, senqed tawila-inek•inem neɣ nermes anedbal n uqeddac.", + "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Tzemreḍ ad talseḍ awennez i wawal-ik•im uffir, maca kra n tmahilin ur ttilint ara almi yuɣal-d uqeddac n tmagit. Ma mazal tettwaliḍ alɣu-a, senqed tawila-inek•inem neɣ nermes anedbal n uqeddac.", + "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Tzemreḍ ad teqqneḍ, maca kra n tmahilin ur ttilint ara almi yuɣal-d uqeddac n tmagit. Ma mazal tettwaliḍ alɣu-a senqed tawila-inek•inem neɣ nermes anedbal n uqeddac.", + "Verify yourself & others to keep your chats safe": "Senqed iman-ik•im d wiyaḍ akken ad qqimen yidiwenniyen-ik•im d iɣellsanen", + "The person who invited you already left the room.": "Amdan i k•kem-iɛerḍen dayen yeǧǧa taxxamt.", + "The person who invited you already left the room, or their server is offline.": "Amdan i k•kem-iɛerḍen dayen yeǧǧa taxxamt, neɣ d aqeddac-is i d aruqqin.", + "Show info about bridges in room settings": "Sken-d tilɣa ɣef teqneṭrin deg yiɣewwaṛen n texxamt", + "Enable Emoji suggestions while typing": "Rmed asumer n yimujiten deg wakud n tira", + "Use a more compact ‘Modern’ layout": "Seqdec taneɣruft 'tatrart' yessden ugar", + "Show a placeholder for removed messages": "Sken-d iznan yettwakksen", + "Show join/leave messages (invites/kicks/bans unaffected)": "Sken iznan n tmerna d tuffɣa (tinubgiwin/asufeɣ/anfay ur ttwaḥsaben ara)", + "Enable automatic language detection for syntax highlighting": "Rmed tifin tawurmant n tutlayt i useɣti n tira", + "Show avatars in user and room mentions": "Sken ivataren deg ubdar n useqdac d texxamt", + "Never send encrypted messages to unverified sessions in this room from this session": "Ur ttɛawad ara ad d-tazneḍ iznan yettwawgelhen ɣer tɣimiyin ur nettwasenqed ara deg texxamt-a seg tɣimit-a", + "Enable URL previews by default for participants in this room": "Rmed taskant n URL amezwer i yimettekkiyen n texxamt-a" } From ef59b350e2911b3242c675d9caa05acdbd82ef01 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Sat, 22 Aug 2020 18:07:54 +0000 Subject: [PATCH 090/174] Translated using Weblate (Kabyle) Currently translated at 77.9% (1820 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 59 +++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index f91615e1d8..a1951e9cb2 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -60,7 +60,7 @@ "What's New": "D acu-t umaynut", "Update": "Leqqem", "Restart": "Ales tanekra", - "Font size": "Teɣzi n tsefsit", + "Font size": "Tuɣzi n tsefsit", "Decline": "Agwi", "Accept": "Qbel", "or": "neɣ", @@ -441,7 +441,7 @@ "Please contact your homeserver administrator.": "Ttxil-k/m nermes anedbal-ik/im n usebter agejdan.", "Failed to join room": "Anekcum ɣer texxamt ur yeddi ara", "Custom user status messages": "Sagen addaden n yiznan n useqdac", - "Support adding custom themes": "Tallelt n tmerna n yisental udmawanen", + "Support adding custom themes": "Tallalt n tmerna n yisental udmawanen", "Use custom size": "Seqdec teɣzi tudmawant", "Show avatar changes": "Sken isnifal n avatar", "Always show encryption icons": "Sken yal tikkelt tignitin tiwgelhanen", @@ -532,8 +532,8 @@ "Session already verified!": "Tiɣimit tettwasenqed yakan!", "Verified key": "Tasarut tettwasenqed", "Displays information about a user": "Yeskan talɣut ɣef useqdac", - "Send a bug report with logs": "Azen aneqqis n ubug s yiɣmisen", - "Logs sent": "Iɣmisen yettwaznen", + "Send a bug report with logs": "Azen aneqqis n wabug s yiɣƔisen", + "Logs sent": "Iɣmisen ttewaznen", "Opens chat with the given user": "Yeldi adiwenni d useqdac i d-yettunefken", "Sends a message to the given user": "Yuzen iznan i useqdac i d-yettunefken", "Displays action": "Yeskan tigawt", @@ -541,14 +541,14 @@ "%(senderName)s invited %(targetName)s.": "%(senderName)s inced-d %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s yugi %(targetName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s kksen isem ara d-ibanen (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaɣnu-ines.", + "%(senderName)s removed their profile picture.": "%(senderName)s yekkes tawlaft n umaqnu-ines.", "%(senderName)s changed their profile picture.": "%(senderName)s ibeddel tawlaft n umaɣnu-ines.", "%(senderName)s set a profile picture.": "%(senderName)s yesbadu tawlaft n umaɣnu.", - "%(senderName)s made no change.": "%(senderName)s ur igi ara ula d yiwen n ubeddel.", + "%(senderName)s made no change.": "%(senderName)s ur yegi ara ula d yiwen n ubeddel.", "VoIP conference started.": "Asarag VoIP yebda.", "%(targetName)s joined the room.": "%(targetName)s yerna-d ɣer texxamt.", "VoIP conference finished.": "Asarag VoIP yekfa.", - "%(targetName)s rejected the invitation.": "%(targetName)s yugi tinnubga.", + "%(targetName)s rejected the invitation.": "%(targetName)s yeugi tinnubga.", "%(targetName)s left the room.": "%(targetName)s yeǧǧa texxamt.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s yeqbel %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s yekkes-d tinnubga n %(targetName)s.", @@ -583,7 +583,7 @@ "Other users may not trust it": "Iseqdacen-nniḍen yezmer ur tettamnen ara", "You joined the call": "Terniḍ ɣer usiwel", "%(senderName)s joined the call": "%(senderName)s yerna ɣer usiwel", - "Call in progress": "Asiwel la itteddu", + "Call in progress": "Asiwel la iteddu", "You left the call": "Teǧǧiḍ asiwel", "%(senderName)s left the call": "%(senderName)s yeǧǧa asiwel", "Call ended": "Asiwel yekfa", @@ -787,7 +787,7 @@ "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s yesbadu tansa tagejdant i texxamt-a s %(address)s.", "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yerna tansa-nniḍen %(addresses)s i texxamt-a.", "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s yekkes tansa-nni-nniḍen %(addresses)s i texxamt-a.", - "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yekkes tansa-nni-nniḍen %(addresses)s i texxamt-a.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yekkes tansa-nni tayeḍ %(addresses)s i texxamt-a.", "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s ibeddel tansa-nni tayeḍ n texxamt-a.", "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ibeddel tansa tagejdant d tansa-nni tayeḍ i texxamt-a.", "Sends a message as html, without interpreting it as markdown": "Yuzen izen d html war ma isegza-t s tukksa n tecreḍt", @@ -1592,7 +1592,7 @@ "Your homeserver has exceeded one of its resource limits.": "Aqeddac-inek·inem agejdan iɛedda yiwet seg tlisa-ines tiɣbula.", "Contact your server admin.": "Nermes anedbal-inek·inem n uqeddac.", "To return to your account in future you need to set a password": "Akken ad tuɣaleḍ ɣer umiḍan-ik·im ɣer sdat tesriḍ ad tesbaduḍ awal uffir", - "New spinner design": "Afeṣṣel amaynut n usezzay", + "New spinner design": "Afeṣṣel amaynut n usezzay ", "Render simple counters in room header": "Err amsiḍen afessa ɣef uqerru n texxamt", "Multiple integration managers": "Imsefrak n waṭas n yimsidaf", "Try out new ways to ignore people (experimental)": "Ɛreḍ iberdan-nniḍen i tigtin n yimdanen (armitan)", @@ -1605,7 +1605,7 @@ "Use a system font": "Seqdec tasefsit n unagraw", "Size must be a number": "Teɣzi ilaq ad tili d uṭṭun", "Message layout": "Talɣa n yizen", - "Discovery": "Tagrut ", + "Discovery": "Tagrut", "Help & About": "Tallalt & Ɣef", "Homeserver is": "Aqeddac agejdan d", "Identity Server is": "Aqeddac n timagit d", @@ -1750,7 +1750,7 @@ "Reason: %(reason)s": "Taɣzint: %(reason)s", "You were banned from %(roomName)s by %(memberName)s": "Tettwaɛezleḍ-d seg %(roomName)s sɣur %(memberName)s", "Something went wrong with your invite to %(roomName)s": "Yella wayen ur nteddu ara akken ilaq d tinubga-ik·im ɣer %(roomName)s", - "unknown error code": "Tangalt n tuccḍa tarussint", + "unknown error code": "tangalt n tuccḍa tarussint", "You can only join it with a working invite.": "Tzemreḍ kan ad ternuḍ ɣer-s ala s tinubga n uxeddim.", "You can still join it because this is a public room.": "Mazal tzemreḍ ad ternuḍ ɣer-s acku taxxamt-a d tazayezt.", "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Tinubga-a ɣer %(roomName)s tettwazen i %(email)s ur nettwacudd ara d umiḍan-ik·im", @@ -1814,7 +1814,36 @@ "Show a placeholder for removed messages": "Sken-d iznan yettwakksen", "Show join/leave messages (invites/kicks/bans unaffected)": "Sken iznan n tmerna d tuffɣa (tinubgiwin/asufeɣ/anfay ur ttwaḥsaben ara)", "Enable automatic language detection for syntax highlighting": "Rmed tifin tawurmant n tutlayt i useɣti n tira", - "Show avatars in user and room mentions": "Sken ivataren deg ubdar n useqdac d texxamt", - "Never send encrypted messages to unverified sessions in this room from this session": "Ur ttɛawad ara ad d-tazneḍ iznan yettwawgelhen ɣer tɣimiyin ur nettwasenqed ara deg texxamt-a seg tɣimit-a", - "Enable URL previews by default for participants in this room": "Rmed taskant n URL amezwer i yimettekkiyen n texxamt-a" + "Show avatars in user and room mentions": "Sken ivaṭaren deg yibdaren n useqdac neɣ n texxamt", + "Never send encrypted messages to unverified sessions in this room from this session": "Ur ttazen ara akk iznan yettwawgelhen ɣer tɣimiyin ur nettusenqad ara seg tɣimit-a", + "Enable URL previews by default for participants in this room": "Rmed tiskanin n URL s wudem amezwer i yimttekkiyen deg texxamt-a", + "Allow Peer-to-Peer for 1:1 calls": "Sireg isawalen udem s udem i 1:1 ", + "Enable inline URL previews by default": "Rmed tiskanin n URL srid s wudem amezwer", + "Enable URL previews for this room (only affects you)": "Rmed tiskanin n URL i texxamt-a (i ak·akem-yeɛnan kan)", + "Enable widget screenshots on supported widgets": "Rmed tuṭṭfiwin n ugdil n uwiǧit deg yiwiǧiten yettwasferken", + "Identity Server (%(server)s)": "Aqeddac n timagit (%(server)s)", + "Identity Server": "Aqeddac n timagit", + "Enter a new identity server": "Sekcem aqeddac n timagit amaynut", + "No update available.": "Ulac lqem i yellan.", + "Hey you. You're the best!": "Kečč·kemm. Ulac win i ak·akem-yifen?", + "Use between %(min)s pt and %(max)s pt": "Seqdec gar %(min)s pt d %(max)s pt", + "Explore Room State": "Snirem addad n texxamt", + "Explore Account Data": "Snirem isefka n umiḍan", + "View Servers in Room": "Senqed iqeddacen deg texxamt", + "Toolbox": "Tabewwaḍt n yifecka", + "Developer Tools": "Ifecka n uneflay", + "An error has occurred.": "Tella-d tuccḍa.", + "Integrations are disabled": "Imsidaf ttwasensen", + "Integrations not allowed": "Imsidaf ur ttusirgen ara", + "a new master key signature": "tasarut tusligt tagejdant tamaynut", + "a new cross-signing key signature": "azmul amaynut n tsarut n uzmul amdigan", + "a device cross-signing signature": "azmul n uzmul amdigan n yibenk", + "a key signature": "azmul n tsarut", + "%(brand)s encountered an error during upload of:": "%(brand)s yemlal-d d tuccḍa mi ara d-yessalay:", + "Cancelled signature upload": "Asali n uzmul yettwasefsex", + "Unable to upload": "Yegguma ad d-yali", + "Signature upload failed": "Asali n uzmul ur yeddi ara", + "Incompatible local cache": "Tuffra tadigant ur temṣada ara", + "Room Settings - %(roomName)s": "Iɣewwaren n texxamt - %(roomName)s", + "The room upgrade could not be completed": "Aleqqem n texxamt yegguma ad yemmed" } From b6a3271ecc544434b95c7a400e57a7edf20dee9b Mon Sep 17 00:00:00 2001 From: Kahina Messaoudi Date: Sat, 22 Aug 2020 21:50:37 +0000 Subject: [PATCH 091/174] Translated using Weblate (Kabyle) Currently translated at 77.9% (1820 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index a1951e9cb2..7503f486ff 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -732,8 +732,8 @@ "System font name": "Isem n tsefsit n unagraw", "Send analytics data": "Azen isefka n tesleḍt", "Cancelling…": "Asefsex…", - "They match": "Mṣadan", - "They don't match": "Ur mṣadan ara", + "They match": "Msaḍan", + "They don't match": "Ur msaḍan ara", "Dog": "Aqjun", "Horse": "Aεewdiw", "Pig": "Ilef", @@ -1845,5 +1845,28 @@ "Signature upload failed": "Asali n uzmul ur yeddi ara", "Incompatible local cache": "Tuffra tadigant ur temṣada ara", "Room Settings - %(roomName)s": "Iɣewwaren n texxamt - %(roomName)s", - "The room upgrade could not be completed": "Aleqqem n texxamt yegguma ad yemmed" + "The room upgrade could not be completed": "Aleqqem n texxamt yegguma ad yemmed", + "Show a reminder to enable Secure Message Recovery in encrypted rooms": "Sken asmekti i urmed n tririt n yiznan iɣellsanen deg texxamin yettwawgelhen", + "Show hidden events in timeline": "Sken-d ineḍruyen yeffren deg uzray", + "Enable message search in encrypted rooms": "Rmed anadi n yiznan deg texxamin yettwawgelhen", + "Manually verify all remote sessions": "Senqed s ufus akk tiɣimiyin tinmeggagin", + "IRC display name width": "Tehri n yisem i d-yettwaseknen IRC", + "Collecting app version information": "Alqaḍ n telɣa n lqem n usnas", + "Uploading logs": "Asali n yiɣmisen", + "Downloading logs": "Asader n yiɣmisen", + "Messages in one-to-one chats": "Iznan deg yidiwenniyen usriden", + "Encrypted messages in one-to-one chats": "Iznan yettwawgelhen deg yidiwenniyen usriden", + "Encrypted messages in group chats": "Iznan yettwawgelhen deg yidiwenniyen n ugraw", + "Unknown caller": "Asiwel arussin", + "The other party cancelled the verification.": "Wayeḍ issefsex asenqed.", + "You've successfully verified this user.": "Tesneqdeḍ aseqdac-a akken iwata.", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Iznan iɣellsanen akked useqdac-a ttwawgelhen seg yixef ɣer yixef yerna yiwen ur yezmir ad ten-iɣeṛ.", + "Verify this session by completing one of the following:": "Senqed tiɣimit-a s usmad n tigawin-a:", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Sentem dakken imujiten seddaw ttbanen-d deg tɣimiyin i snat, s yiwen n umyizwer:", + "Verify this user by confirming the following emoji appear on their screen.": "Senqed aseqdac-a s usentem dakken imujiten-a ttbanen-d ɣef ugdil-is.", + "Verify this session by confirming the following number appears on its screen.": "Senqed tiɣimit-a s usentem dakken amḍan-a ittban-d ɣef ugdil-is.", + "Verify this user by confirming the following number appears on their screen.": "Senqed aseqdac-a s usentem dakken amḍan-a ittban-d ɣef ugdil-is.", + "Waiting for your other session to verify…": "Deg uraǧu n usenqed n tɣimit-ik•im-nniḍen…", + "Thumbs up": "Adebbuz d asawen", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Abeddel n wawal uffir ad yales awennez i tsura akk n uwgelhen seg yixef ɣer yixef deg tɣimiyin akk, d ayen ara yerren amazray n udiwenni ur yettwaɣer ara, anagar ma tsifḍeḍ tisura-inek•inem n uwgelhen seg tazwara ad tɛawdeḍ ad tent-tketreḍ. Ɣer sdat, aya ad yennerni." } From 7cb75ff26539866ae21d333e4242cf4dd9409b5c Mon Sep 17 00:00:00 2001 From: Jonathan Date: Sun, 23 Aug 2020 16:18:03 +0000 Subject: [PATCH 092/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 05b8775f6f..85ef8778c6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1633,7 +1633,7 @@ "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren", "Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehlezu den kürzlich gesichteteten Räumen über der Raumliste anzeigen", - "Use Single Sign On to continue": "Verwende Single-Sign-On um fortzufahren", + "Use Single Sign On to continue": "Verwende Single Sign on um fortzufahren", "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single-Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", "Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse", From 6ab14ab403ec75b1636cdefa9bc00affbb0c8913 Mon Sep 17 00:00:00 2001 From: toastbroot Date: Sun, 23 Aug 2020 16:18:09 +0000 Subject: [PATCH 093/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 85ef8778c6..4dc5fbcd6b 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1634,7 +1634,7 @@ "Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehlezu den kürzlich gesichteteten Räumen über der Raumliste anzeigen", "Use Single Sign On to continue": "Verwende Single Sign on um fortzufahren", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single-Sign-On, um deine Identität nachzuweisen.", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", "Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse", "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte Telefonnummer, indem du deine Identität mittels Single Sign-On nachweist.", From 1478d5997331df411483b7460d06f21ae92c273d Mon Sep 17 00:00:00 2001 From: aWeinzierl Date: Sun, 23 Aug 2020 16:26:24 +0000 Subject: [PATCH 094/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4dc5fbcd6b..1757dc0008 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1652,7 +1652,7 @@ "Manually Verify by Text": "Verifiziere manuell mit einem Text", "Interactively verify by Emoji": "Verifiziere interaktiv mit Emojis", "Support adding custom themes": "Unterstütze das Hinzufügen von benutzerdefinierten Designs", - "Ask this user to verify their session, or manually verify it below.": "Bitte diese/n Nutzer!n, seine/ihre Sitzung zu verifizieren, oder verifiziere diese unten manuell.", + "Ask this user to verify their session, or manually verify it below.": "Bitte diesen Nutzer, seine Sitzung zu verifizieren, oder verifiziere diesen unten manuell.", "a few seconds from now": "in ein paar Sekunden", "Manually verify all remote sessions": "Verifiziere alle Remotesitzungen", "Confirm the emoji below are displayed on both sessions, in the same order:": "Bestätige, dass die unten angezeigten Emojis auf beiden Sitzungen in der selben Reihenfolge angezeigt werden:", @@ -1724,7 +1724,7 @@ "Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion", "this room": "Dieser Raum", "View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.", - "Send a bug report with logs": "Sende Fehlermeldung mit Protokoll", + "Send a bug report with logs": "Sende einen Fehlerbericht mit Logs", "Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen", "Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen.", "You signed in to a new session without verifying it:": "Du hast dich in einer neuen Sitzung angemeldet ohne sie zu verifizieren:", From 943a71b698231102e19756ed2eda9bef1a717618 Mon Sep 17 00:00:00 2001 From: BenjaminVettori Date: Sun, 23 Aug 2020 16:28:28 +0000 Subject: [PATCH 095/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1757dc0008..84718631a4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1034,7 +1034,7 @@ "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s hat den Raum auf eingeladene User beschränkt.", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s änderte die Zutrittsregel auf '%(rule)s'", "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s erlaubte Gäste diesem Raum beizutreten.", - "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s hat verboten, dass Gäste diesem Raum beitreten.", + "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s hat Gästen verboten diesem Raum beizutreten.", "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s änderte den Gastzugriff auf '%(rule)s'", "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppiere & filtere Räume nach eigenen Tags (neu laden um Änderungen zu übernehmen)", "Unable to find a supported verification method.": "Konnte kein unterstützte Verifikationsmethode finden.", From 90a34f37c72869342c3a888d2fc563aaa4a9920e Mon Sep 17 00:00:00 2001 From: Bamstam Date: Sun, 23 Aug 2020 16:41:54 +0000 Subject: [PATCH 096/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 84718631a4..e57f776e98 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -572,7 +572,7 @@ "was unbanned %(count)s times|one": "wurde entbannt", "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)shat den Namen geändert", "%(items)s and %(count)s others|other": "%(items)s und %(count)s andere", - "%(items)s and %(count)s others|one": "%(items)s und noch jemand", + "%(items)s and %(count)s others|one": "%(items)s und ein weiteres Raum-Mitglied", "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Eine E-Mail wurde an %(emailAddress)s gesendet. Folge dem in der E-Mail enthaltenen Link und klicke dann unten.", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Die Sichtbarkeit von '%(roomName)s' in %(groupId)s konnte nicht aktualisiert werden.", "Visibility in Room List": "Sichtbarkeit in Raum-Liste", From 916820ba7e920235eed28eebd3b362568acdb51a Mon Sep 17 00:00:00 2001 From: aWeinzierl Date: Sun, 23 Aug 2020 16:42:03 +0000 Subject: [PATCH 097/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index e57f776e98..1459743271 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -572,7 +572,7 @@ "was unbanned %(count)s times|one": "wurde entbannt", "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)shat den Namen geändert", "%(items)s and %(count)s others|other": "%(items)s und %(count)s andere", - "%(items)s and %(count)s others|one": "%(items)s und ein weiteres Raum-Mitglied", + "%(items)s and %(count)s others|one": "%(items)s und ein weiteres Raummitglied", "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Eine E-Mail wurde an %(emailAddress)s gesendet. Folge dem in der E-Mail enthaltenen Link und klicke dann unten.", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Die Sichtbarkeit von '%(roomName)s' in %(groupId)s konnte nicht aktualisiert werden.", "Visibility in Room List": "Sichtbarkeit in Raum-Liste", @@ -1632,7 +1632,7 @@ "Make a copy of your recovery key": "Speichere deinen Wiederherstellungsschlüssel", "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren", "Show rooms with unread notifications first": "Räume mit nicht gelesenen Benachrichtungen zuerst zeigen", - "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehlezu den kürzlich gesichteteten Räumen über der Raumliste anzeigen", + "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehle zu den kürzlich gesichteteten Räumen über der Raumliste anzeigen", "Use Single Sign On to continue": "Verwende Single Sign on um fortzufahren", "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", From 7a187fa47ca217902eada238688542656516e39b Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sun, 23 Aug 2020 16:54:40 +0000 Subject: [PATCH 098/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1459743271..e9d2a3926c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1587,7 +1587,7 @@ "Reject & Ignore user": "Ablehnen & Nutzer ignorieren", "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", - "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Erlaube den Standard-Server zur Anrufunterstützung (turn.matrix.org) zu verwenden wenn dein Heimserver keinen eigenen anbietet (deine IP Adresse wird bei dem Anruf übermittelt)", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Auf den Server turn.matrix.org zurückgreifen, falls deine Heimserver keine Anruf-Assistenz anbietet (Deine IP-Adresse wird während eines Anrufs geteilt).", "Show more": "mehr", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Diese Sitzung speichert deine Schlüssel nicht, du kannst sie aber an die Schlüsselsicherung anschließen.", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbinde diese Sitzung mit deiner Schlüsselsicherung bevor du dich abmeldest, um den Verlust von Schlüsseln zu vermeiden.", From 761e88ce6f0e71af1cccae8271b0f2ac72905b36 Mon Sep 17 00:00:00 2001 From: aWeinzierl Date: Sun, 23 Aug 2020 16:54:46 +0000 Subject: [PATCH 099/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index e9d2a3926c..736f861f3c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1587,7 +1587,7 @@ "Reject & Ignore user": "Ablehnen & Nutzer ignorieren", "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", - "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Auf den Server turn.matrix.org zurückgreifen, falls deine Heimserver keine Anruf-Assistenz anbietet (Deine IP-Adresse wird während eines Anrufs geteilt).", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Auf den Server turn.matrix.org zurückgreifen, falls deine Heimserver keine Anruf-Assistenz anbietet (deine IP-Adresse wird während eines Anrufs geteilt).", "Show more": "mehr", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Diese Sitzung speichert deine Schlüssel nicht, du kannst sie aber an die Schlüsselsicherung anschließen.", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbinde diese Sitzung mit deiner Schlüsselsicherung bevor du dich abmeldest, um den Verlust von Schlüsseln zu vermeiden.", From 77decd4e097539b73a6fb681cdb9d7d0dc0cf4e4 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Sun, 23 Aug 2020 16:58:20 +0000 Subject: [PATCH 100/174] Translated using Weblate (German) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 736f861f3c..8aa0146c8c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1337,7 +1337,7 @@ "Use an identity server to invite by email. Manage in Settings.": "Nutze einen Identitätsserver, um über E-Mail Einladungen zu verschicken. Verwalte es in den Einstellungen.", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Versuche neue Möglichkeiten, um Menschen zu ignorieren (experimentell)", - "Send read receipts for messages (requires compatible homeserver to disable)": "Schicke Lesebestätigungen für Nachrichten (erfordert kompatiblen Heimserver zum Deaktivieren)", + "Send read receipts for messages (requires compatible homeserver to disable)": "Lesebestätigungen für Nachrichten senden (erfordert einen kompatiblen Heimserver zum deaktivieren)", "My Ban List": "Meine Bannliste", "This is your list of users/servers you have blocked - don't leave the room!": "Dies ist die Liste von Benutzer*innen/Servern, die du blockiert hast - verlasse den Raum nicht!", "Accept to continue:": "Akzeptiere , um fortzufahren:", From 21d2eb95cd484478e77396218a2acc2b24dddba7 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 24 Aug 2020 10:44:52 +0000 Subject: [PATCH 101/174] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 68 ++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index da53880409..beb465d9d5 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -1530,8 +1530,8 @@ "Backup has a valid signature from this session": "备份有来自此会话的有效签名", "Backup has an invalid signature from this session": "备份有来自此会话的无效签名", "Backup has a valid signature from verified session ": "备份有来自已验证的会话 有效签名", - "Backup has a valid signature from unverified session ": "备份有来自未验证的会话 无效签名", - "Backup has an invalid signature from verified session ": "备份有来自已验证的会话 无效签名", + "Backup has a valid signature from unverified session ": "备份有来自未验证会话 无效签名", + "Backup has an invalid signature from verified session ": "备份有来自已验证会话 无效签名", "Backup has an invalid signature from unverified session ": "备份有来自未验证的会话 无效签名", "Backup is not signed by any of your sessions": "备份没有被您的任何一个会话签名", "This backup is trusted because it has been restored on this session": "此备份是受信任的因为它被恢复到了此会话上", @@ -2307,9 +2307,67 @@ "Page Up": "Page Up", "Page Down": "Page Down", "Esc": "Esc", - "Enter": "Enter", - "Space": "Space", + "Enter": "回车", + "Space": "空格", "How fast should messages be downloaded.": "消息下载速度。", "IRC display name width": "IRC 显示名称宽度", - "When rooms are upgraded": "聊天室升级时间" + "When rooms are upgraded": "聊天室升级时间", + "Unexpected server error trying to leave the room": "试图离开聊天室时发生意外服务器错误", + "Error leaving room": "离开聊天室时出错", + "New spinner design": "新的下拉列表设计", + "Show message previews for reactions in DMs": "显示私聊消息预览以回复", + "Show message previews for reactions in all rooms": "显示所有聊天室的消息预览以回复", + "Uploading logs": "正在上传日志", + "Downloading logs": "正在下载日志", + "This bridge was provisioned by .": "桥接由 准备。", + "Workspace: %(networkName)s": "工作区:%(networkName)s", + "Channel: %(channelName)s": "频道:%(channelName)s", + "well formed": "格式正确", + "Master private key:": "主私钥:", + "Self signing private key:": "自签名私钥:", + "User signing private key:": "用户签名私钥:", + "Securely cache encrypted messages locally for them to appear in search results, using ": "在本地安全缓存已加密消息以使其出现在搜索结果中,使用 ", + " to store messages from ": " 存储来自 ", + "rooms.": "聊天室的消息。", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "此会话未备份您的密钥,但您已有备份,您可以继续并从中恢复和向其添加。", + "Invalid theme schema.": "无效主题方案。", + "Read Marker lifetime (ms)": "已读标记生存期 (ms)", + "Read Marker off-screen lifetime (ms)": "已读标记屏幕外生存期 (ms)", + "Unable to revoke sharing for email address": "无法撤消电子邮件地址共享", + "Revoke": "撤销", + "Unable to revoke sharing for phone number": "无法撤销电话号码共享", + "Mod": "管理员", + "Explore public rooms": "探索公共聊天室", + "Can't see what you’re looking for?": "看不到您要找的吗?", + "Explore all public rooms": "探索所有公共聊天室", + "%(count)s results|other": "%(count)s 个结果", + "You can only join it with a working invite.": "您只能通过有效邀请加入。", + "The session you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "您尝试验证的会话不支持 %(brand)s 支持的扫描二维码或表情符号验证。尝试使用其他客户端。", + "Language Dropdown": "语言下拉菜单", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s %(count)s 次未做更改", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s 未做更改", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s %(count)s 次未做更改", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s 未做更改", + "Preparing to download logs": "正在准备下载日志", + "Download logs": "下载日志", + "We couldn't create your DM. Please check the users you want to invite and try again.": "我们无法创建您的私聊。请检查您想要邀请的用户并重试。", + "%(brand)s encountered an error during upload of:": "%(brand)s 在上传此文件时出错:", + "Country Dropdown": "国家下拉菜单", + "Attach files from chat or just drag and drop them anywhere in a room.": "附加聊天中的文件,或将其拖放到聊天室的任何地方。", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "更改密码将重置所有会话上的所有端到端加密密钥,从而使加密的聊天记录不可读。在重置密码之前,请设置密钥备份或从其他会话导出聊天室密钥。", + "%(brand)s Android": "%(brand)s Android", + "Message downloading sleep time(ms)": "消息下载休眠时间 (ms)", + "Toggle Bold": "切换粗体", + "Toggle Italics": "切换斜体", + "Toggle Quote": "切换引用", + "Navigate recent messages to edit": "浏览最近的消息以进行编辑", + "Toggle microphone mute": "切换麦克风静音", + "Toggle video on/off": "切换视频开/关", + "Navigate up/down in the room list": "在聊天室列表中上/下导航", + "Previous/next unread room or DM": "上一个/下一个未读聊天室或私聊消息", + "Previous/next room or DM": "上一个/下一个聊天室或私聊消息", + "Toggle the top left menu": "切换左上方的菜单", + "Toggle right panel": "切换右侧面板", + "Toggle this dialog": "切换此对话框", + "End": "End" } From bdbe7cd7ec6cf7cab21d05d1004fceeeb3cb583d Mon Sep 17 00:00:00 2001 From: tusooa Date: Mon, 24 Aug 2020 11:08:59 +0000 Subject: [PATCH 102/174] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.9% (2333 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index beb465d9d5..f1a3af31d7 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -2369,5 +2369,7 @@ "Toggle the top left menu": "切换左上方的菜单", "Toggle right panel": "切换右侧面板", "Toggle this dialog": "切换此对话框", - "End": "End" + "End": "End", + "The server is not configured to indicate what the problem is (CORS).": "服务器没有配置为提示错误是什么(CORS)。", + "Activate selected button": "激活选择的按钮" } From e46074117a9b3d5efcba8a9e3b575c4fd472a6dc Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 22 Aug 2020 03:48:09 +0000 Subject: [PATCH 103/174] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2335 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index d5eacd1141..12437b8fa6 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2423,5 +2423,7 @@ "Explore all public rooms": "探索所有公開聊天室", "%(count)s results|other": "%(count)s 個結果", "Preparing to download logs": "正在準備下載紀錄檔", - "Download logs": "下載紀錄檔" + "Download logs": "下載紀錄檔", + "Unexpected server error trying to leave the room": "試圖離開聊天室時發生意外的伺服器錯誤", + "Error leaving room": "離開聊天室時發生錯誤" } From 4c812ded6920d7f7ca12816de9ecafd04936039d Mon Sep 17 00:00:00 2001 From: aWeinzierl Date: Sun, 23 Aug 2020 16:58:32 +0000 Subject: [PATCH 104/174] Translated using Weblate (German) Currently translated at 100.0% (2335 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 8aa0146c8c..c48de25af5 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1337,7 +1337,7 @@ "Use an identity server to invite by email. Manage in Settings.": "Nutze einen Identitätsserver, um über E-Mail Einladungen zu verschicken. Verwalte es in den Einstellungen.", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Versuche neue Möglichkeiten, um Menschen zu ignorieren (experimentell)", - "Send read receipts for messages (requires compatible homeserver to disable)": "Lesebestätigungen für Nachrichten senden (erfordert einen kompatiblen Heimserver zum deaktivieren)", + "Send read receipts for messages (requires compatible homeserver to disable)": "Lesebestätigungen für Nachrichten senden (Deaktivieren erfordert einen kompatiblen Heimserver)", "My Ban List": "Meine Bannliste", "This is your list of users/servers you have blocked - don't leave the room!": "Dies ist die Liste von Benutzer*innen/Servern, die du blockiert hast - verlasse den Raum nicht!", "Accept to continue:": "Akzeptiere , um fortzufahren:", @@ -1732,11 +1732,11 @@ "Upgrade": "Hochstufen", "Verify the new login accessing your account: %(name)s": "Verifiziere die neue Anmeldung an deinem Konto: %(name)s", "From %(deviceName)s (%(deviceId)s)": "Von %(deviceName)s (%(deviceId)s)", - "Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt cross-signing nicht.", + "Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt Cross-Signing nicht.", "Cross-signing and secret storage are enabled.": "Cross-signing und der sichere Speicher wurden eingerichtet.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine cross-signing Identität im sicheren Speicher aber diese Sitzung wird noch nicht vertraut.", - "Cross-signing and secret storage are not yet set up.": "Cross-signing und der sichere Speicher wurden noch nicht eingerichtet.", - "Reset cross-signing and secret storage": "Setze cross-signing und den sicheren Speicher zurück", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine Cross-Signing Identität im sicheren Speicher, aber dieser wird von dieser Sitzung noch nicht vertraut.", + "Cross-signing and secret storage are not yet set up.": "Cross-Signing und der sichere Speicher sind noch nicht eingerichtet.", + "Reset cross-signing and secret storage": "Setze Cross-Signing und den sicheren Speicher zurück", "Bootstrap cross-signing and secret storage": "Richte cross-signing und den sicheren Speicher ein", "unexpected type": "unbekannter Typ", "Cross-signing public keys:": "Öffentliche Cross-signing Schlüssel:", @@ -1754,7 +1754,7 @@ "exists": "existiert", "Delete sessions|other": "Lösche Sitzungen", "Delete sessions|one": "Lösche Sitzung", - "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Sitzungen eines Benutzers einzeln verifizieren. Geräten, die ein Benutzer als vertrauenswürdig markiert hat, wird nicht automatisch vertraut (cross-signing).", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Alle Sitzungen einzeln verifizieren, anstatt auch Sitzungen zu vertrauen, die durch Cross-Signing verifiziert sind.", "Securely cache encrypted messages locally for them to appear in search results, using ": "Der Zwischenspeicher für die lokale Suche in verschlüsselten Nachrichten benötigt ", " to store messages from ": " um Nachrichten aus ", "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "%(brand)s benötigt weitere Komponenten um verschlüsselte Nachrichten lokal zu durchsuchen. Wenn du diese Funktion testen möchtest kannst du dir deine eigene Version von %(brand)s Desktop mit der integrierten Suchfunktion bauen.", From 129bae6b5e36e5ab72ba9c68faa99d59b0b950b3 Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Sun, 23 Aug 2020 17:02:37 +0000 Subject: [PATCH 105/174] Translated using Weblate (German) Currently translated at 100.0% (2335 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c48de25af5..f5026a8ed4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1588,7 +1588,7 @@ "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Auf den Server turn.matrix.org zurückgreifen, falls deine Heimserver keine Anruf-Assistenz anbietet (deine IP-Adresse wird während eines Anrufs geteilt).", - "Show more": "mehr", + "Show more": "Mehr zeigen", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Diese Sitzung speichert deine Schlüssel nicht, du kannst sie aber an die Schlüsselsicherung anschließen.", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbinde diese Sitzung mit deiner Schlüsselsicherung bevor du dich abmeldest, um den Verlust von Schlüsseln zu vermeiden.", "This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde", @@ -1739,9 +1739,9 @@ "Reset cross-signing and secret storage": "Setze Cross-Signing und den sicheren Speicher zurück", "Bootstrap cross-signing and secret storage": "Richte cross-signing und den sicheren Speicher ein", "unexpected type": "unbekannter Typ", - "Cross-signing public keys:": "Öffentliche Cross-signing Schlüssel:", + "Cross-signing public keys:": "Öffentliche Cross-Signing-Schlüssel:", "in memory": "im Speicher", - "Cross-signing private keys:": "Private Cross-signing Schlüssel:", + "Cross-signing private keys:": "Private Cross-Signing-Schlüssel:", "in secret storage": "im sicheren Speicher", "Self signing private key:": "Selbst signierter privater Schlüssel:", "cached locally": "lokal zwischengespeichert", From 9efaa8590a26f494656e1986304a7d8dcf5a6af1 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Mon, 24 Aug 2020 07:51:57 +0000 Subject: [PATCH 106/174] Translated using Weblate (German) Currently translated at 100.0% (2335 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index f5026a8ed4..300d694ea3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1587,7 +1587,7 @@ "Reject & Ignore user": "Ablehnen & Nutzer ignorieren", "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändert eine Ausschluss-Regel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", - "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Auf den Server turn.matrix.org zurückgreifen, falls deine Heimserver keine Anruf-Assistenz anbietet (deine IP-Adresse wird während eines Anrufs geteilt).", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Auf den Server turn.matrix.org zurückgreifen, falls deine Heimserver keine Anruf-Assistenz anbietet (deine IP-Adresse wird während eines Anrufs geteilt)", "Show more": "Mehr zeigen", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Diese Sitzung speichert deine Schlüssel nicht, du kannst sie aber an die Schlüsselsicherung anschließen.", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbinde diese Sitzung mit deiner Schlüsselsicherung bevor du dich abmeldest, um den Verlust von Schlüsseln zu vermeiden.", @@ -2418,5 +2418,7 @@ "Explore all public rooms": "Erkunde alle öffentlichen Räume", "%(count)s results|other": "%(count)s Ergebnisse", "Preparing to download logs": "Bereite das Herunterladen der Protokolle vor", - "Download logs": "Protokolle herunterladen" + "Download logs": "Protokolle herunterladen", + "Unexpected server error trying to leave the room": "Unerwarteter Server-Fehler beim Versuch den Raum zu verlassen", + "Error leaving room": "Fehler beim Verlassen des Raums" } From 5628349a410437b87660a4b8581d175b2b70f8c8 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Sun, 23 Aug 2020 06:31:35 +0000 Subject: [PATCH 107/174] Translated using Weblate (Kabyle) Currently translated at 81.9% (1913 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 97 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 7503f486ff..0883775e19 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1817,7 +1817,7 @@ "Show avatars in user and room mentions": "Sken ivaṭaren deg yibdaren n useqdac neɣ n texxamt", "Never send encrypted messages to unverified sessions in this room from this session": "Ur ttazen ara akk iznan yettwawgelhen ɣer tɣimiyin ur nettusenqad ara seg tɣimit-a", "Enable URL previews by default for participants in this room": "Rmed tiskanin n URL s wudem amezwer i yimttekkiyen deg texxamt-a", - "Allow Peer-to-Peer for 1:1 calls": "Sireg isawalen udem s udem i 1:1 ", + "Allow Peer-to-Peer for 1:1 calls": "Sireg isawalen udem e wudem i 1:1", "Enable inline URL previews by default": "Rmed tiskanin n URL srid s wudem amezwer", "Enable URL previews for this room (only affects you)": "Rmed tiskanin n URL i texxamt-a (i ak·akem-yeɛnan kan)", "Enable widget screenshots on supported widgets": "Rmed tuṭṭfiwin n ugdil n uwiǧit deg yiwiǧiten yettwasferken", @@ -1825,7 +1825,7 @@ "Identity Server": "Aqeddac n timagit", "Enter a new identity server": "Sekcem aqeddac n timagit amaynut", "No update available.": "Ulac lqem i yellan.", - "Hey you. You're the best!": "Kečč·kemm. Ulac win i ak·akem-yifen?", + "Hey you. You're the best!": "Kečč·kemm. Ulac win i ak·akem-yifen!", "Use between %(min)s pt and %(max)s pt": "Seqdec gar %(min)s pt d %(max)s pt", "Explore Room State": "Snirem addad n texxamt", "Explore Account Data": "Snirem isefka n umiḍan", @@ -1868,5 +1868,96 @@ "Verify this user by confirming the following number appears on their screen.": "Senqed aseqdac-a s usentem dakken amḍan-a ittban-d ɣef ugdil-is.", "Waiting for your other session to verify…": "Deg uraǧu n usenqed n tɣimit-ik•im-nniḍen…", "Thumbs up": "Adebbuz d asawen", - "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Abeddel n wawal uffir ad yales awennez i tsura akk n uwgelhen seg yixef ɣer yixef deg tɣimiyin akk, d ayen ara yerren amazray n udiwenni ur yettwaɣer ara, anagar ma tsifḍeḍ tisura-inek•inem n uwgelhen seg tazwara ad tɛawdeḍ ad tent-tketreḍ. Ɣer sdat, aya ad yennerni." + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Abeddel n wawal uffir ad yales awennez i tsura akk n uwgelhen seg yixef ɣer yixef deg tɣimiyin akk, d ayen ara yerren amazray n udiwenni ur yettwaɣer ara, anagar ma tsifḍeḍ tisura-inek•inem n uwgelhen seg tazwara ad tɛawdeḍ ad tent-tketreḍ. Ɣer sdat, aya ad yennerni.", + "Forces the current outbound group session in an encrypted room to be discarded": "Ḥettem tiɣimit n ugraw ara d-yeffɣen akka tura deg texxamt tawgelhant ad tettwakkes", + "Unexpected server error trying to leave the room": "Tuccḍa n uqeddac ur nettwaṛǧa ara lawan n tuffɣa seg texxamt", + "Prompt before sending invites to potentially invalid matrix IDs": "Suter send tuzna n tnubgiwin i yisulayen i izmren ad ilin d arimeɣta", + "Show shortcuts to recently viewed rooms above the room list": "Sken inegzumen i texxamin i d-ibanen melmi kan nnig tebdart n texxamt", + "Send read receipts for messages (requires compatible homeserver to disable)": "Azen inagan n tɣuri i yiznan (yesra aqeddac agejdan yemṣadan i wakken ad yens)", + "Show previews/thumbnails for images": "Sken tiskanin/tinfulin i tugniwin", + "How fast should messages be downloaded.": "Acḥal i ilaq ad yili urured i wakken ad d-adren yiznan.", + "Enable experimental, compact IRC style layout": "Rmed aseflu n wanaw n IRC armitan, ussid ", + "Waiting for %(displayName)s to verify…": "Aṛaǧu n %(displayName)s i usenqed...", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Ḥrez iznan iwgelhanen idiganen s wudem awurman i wakken ad d-banen deg yigmaḍ n unadi, s useqdec ", + "Securely cache encrypted messages locally for them to appear in search results.": "Ḥrez iznan iwgelhanen idiganen s wudem awurman i wakken ad d-banen deg yigmaḍ n unadi.", + "The integration manager is offline or it cannot reach your homeserver.": "Amsefrak n umsidef ha-t-an beṛṛa n tuqqna neɣ ur yezmir ara ad yaweḍ ɣer uqeddac-ik·im agejdan.", + "This backup is trusted because it has been restored on this session": "Aḥraz yettwaḍman acku yuɣal-d seg tɣimit-a ", + "Back up your keys before signing out to avoid losing them.": "Ḥrez tisura-ik·im send tuffɣa i wakken ur ttruḥunt ara.", + "Error saving email notification preferences": "Tuccḍa deg usekles n yismenyaf n ulɣu n yimayl", + "An error occurred whilst saving your email notification preferences.": "Tella-d tuccḍa lawan n usekles n yismenyaf n ulɣu n yimayl.", + "Can't update user notification settings": "D awezɣi ad ttwaleqqmen iɣewwaren n yilɣa n useqdac", + "Messages containing keywords": "Iznan ideg llan awalen ufrinen", + "Notify for all other messages/rooms": "Ṭṭef-d ilɣa i meṛṛa iznan/tixxamin", + "Notify me for anything else": "Azen-iyi-d ilɣa i wayen akk ara yellan", + "All notifications are currently disabled for all targets.": "Meṛṛa ilɣa nsan akka tura i meṛṛa isaḍasen.", + "On": "Yermed", + "Noisy": "Sɛan ṣṣut", + "wait and try again later": "ṛǧu syen ɛreḍ tikkelt-nniḍen", + "You must specify an event type!": "Ilaq ad d-tferneḍ anaw n tedyant!", + "Failed to send custom event.": "Ur teddi ara tuzna n tedyant tudmawant.", + "Event Type": "Anaw n tedyant", + "State Key": "Tasarut n waddad", + "Event Content": "Agbur n tedyant", + "This session, or the other session": "Tiɣimita, neɣ tiɣimit tayeḍ", + "If you didn’t sign in to this session, your account may be compromised.": "Ma yella ur teqqineḍ ara ɣer tɣimit-a, amiḍan-ik·im yezmer ad yettwaker.", + "Please fill why you're reporting.": "Ttxil-k·m ini-aɣ-d ayɣer i d-tettazneḍ alɣu.", + "Report Content to Your Homeserver Administrator": "Ttxil-k·m azen aneqqis i unedbal-ik·im n usebter agejdan.", + "Wrong Recovery Key": "Mačči d tasarut-ik·im n uɛeddi tagi", + "Invalid Recovery Key": "Tasarut-ik·im n uɛeddi d tarameɣtut", + "Security Phrase": "Tafyirt n tɣellist", + "Restoring keys from backup": "Tiririt n tsura seg uḥraz", + "Fetching keys from server...": "Tiririt n tsura seg uḥraz...", + "%(completed)s of %(total)s keys restored": "%(completed)s n %(total)s tsura i yettwarran", + "Unable to load backup status": "Yegguma ad d-yali waddad n uḥraz", + "Recovery key mismatch": "Tasarut n tririt ur temṣada ara", + "No backup found!": "Ulac aḥraz yettwafen!", + "Failed to decrypt %(failedCount)s sessions!": "Awgelhen n tɣimiyin %(failedCount)s ur yeddi ara", + "Successfully restored %(sessionCount)s keys": "Tiririt n tsura n %(sessionCount)s yedda akken iwata", + "This looks like a valid recovery key!": "Ayagi yettban am wakken tasarut n tririt d tameɣtut!", + "Not a valid recovery key": "Tasarut n tririt mačči d tameɣtut", + "Are you sure you want to reject the invitation?": "S tidet tebɣiḍ ad tesfesxeḍ tinubga?", + "Resend %(unsentCount)s reaction(s)": "Ales tuzna n tsedmirt (tsedmirin) %(unsentCount)s", + "Forward Message": "Welleh izen", + "Pin Message": "Rzi izen", + "View Decrypted Source": "Senqed taɣbalut tawgelhent", + "Unhide Preview": "Sban-d taskant", + "Take picture": "Ṭṭef-d tawleft", + "Away": "Akin", + "This homeserver would like to make sure you are not a robot.": "Aqeddac-a aqejdan yesra ad iẓer ma mačči d aṛubut i telliḍ.", + "Country Dropdown": "Tabdart n udrurem n tmura", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "Tzemreḍ ad tesqedceḍ tixtiṛiyin n uqeddac udmawan i wakken ad teqqneḍ ɣer iqeddacen-nniḍen n Matrix s ufran n URL n uqeddac agejdan yemgaraden. Ayagi ad ak-yeǧǧ ad tesqedceḍ %(brand)s s umiḍan n Matrix yellan ɣef uqeddac agejdan yemgaraden.", + "Confirm your identity by entering your account password below.": "Sentem timagit-ik·im s usekcem n wawal uffir n umiḍan-ik·im ddaw.", + "Please review and accept all of the homeserver's policies": "Ttxil-k·m senqed syen qbel tisertiyin akk n uqeddac agejdan", + "Please review and accept the policies of this homeserver:": "Ttxil-k·m senqed syen qbel tisertiyin n uqeddac-a agejdan", + "An email has been sent to %(emailAddress)s": "Yettwazen yimayl ɣer %(emailAddress)s", + "Token incorrect": "Ajuṭu d arameɣtu", + "Identity Server URL": "URL n uqeddac n timagit", + "Other servers": "Iqeddacen wiya", + "Sign in to your Matrix account on %(serverName)s": "Qqen ɣer umiḍan-ik·im n Matrix deg %(serverName)s", + "Sorry, your browser is not able to run %(brand)s.": "Suref-aɣ, iminig-ik·im ur yezmir ara ad iseddu %(brand)s.", + "You must register to use this functionality": "Ilaq-ak·am ad teskelseḍ i wakken ad tesxedmeḍ tamahilt-a", + "No files visible in this room": "Ulac ifuyla i d-ibanen deg texxamt-a", + "Featured Rooms:": "Tixxamin i ifazen:", + "Upload avatar": "Sali-d avaṭar", + "Failed to forget room %(errCode)s": "Tatut n texxamt %(errCode)s ur teddi ara", + "Find a room… (e.g. %(exampleRoom)s)": "Af-d taxxamt… (am. %(exampleRoom)s)", + "Search failed": "Ur iddi ara unadi", + "No more results": "Ulac ugar n yigmaḍ", + "Fill screen": "Agdil aččuran", + "Uploading %(filename)s and %(count)s others|other": "Asali n %(filename)s d %(count)s wiyaḍ-nniḍen", + "Uploading %(filename)s and %(count)s others|zero": "Asali n %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Asali n %(filename)s d %(count)s wayeḍ-nniḍen", + "Security & privacy": "Taɣellist & tbaḍnit", + "User menu": "Umuɣ n useqdac", + "Could not load user profile": "Yegguma ad d-yali umaɣnu n useqdac", + "Session verified": "Tiɣimit tettwasenqed", + "Failed to send email": "Tuzna n yimayl ur teddi ara", + "New passwords must match each other.": "Awalen uffiren imaynuten ilaq ad mṣadan.", + "Your Matrix account on %(serverName)s": "Amiḍan-ik·im Matrix deg %(serverName)s", + "I have verified my email address": "Sneqdeɣ tansa-inu n yimayl", + "Return to login screen": "Uɣal ɣer ugdil n tuqqna", + "Incorrect username and/or password.": "Isem n uqeddac d/neɣ awal uffir d arameɣtu.", + "Registration Successful": "Asekles yemmed akken iwata", + "Save your Security Key": "Sekles tasarut-ik·im n tɣellist", + "Unable to set up secret storage": "Asbadu n uklas uffir d awezɣi" } From b821c294bf3a1262b364f76c47d303ea1717ca10 Mon Sep 17 00:00:00 2001 From: Kahina Messaoudi Date: Sun, 23 Aug 2020 18:06:16 +0000 Subject: [PATCH 108/174] Translated using Weblate (Kabyle) Currently translated at 81.9% (1913 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 0883775e19..861ed40033 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1959,5 +1959,7 @@ "Incorrect username and/or password.": "Isem n uqeddac d/neɣ awal uffir d arameɣtu.", "Registration Successful": "Asekles yemmed akken iwata", "Save your Security Key": "Sekles tasarut-ik·im n tɣellist", - "Unable to set up secret storage": "Asbadu n uklas uffir d awezɣi" + "Unable to set up secret storage": "Asbadu n uklas uffir d awezɣi", + "Paperclip": "Tamessakt n lkaɣeḍ", + "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Tettḥeqqeḍ? Ad tesruḥeḍ iznan-ik•im yettwawgelhen ma tisura-k•m ur klisent ara akken ilaq." } From 663481124cfd2c9aa146a75b8b9694c730352452 Mon Sep 17 00:00:00 2001 From: Imre Kristoffer Eilertsen Date: Sun, 23 Aug 2020 06:26:41 +0000 Subject: [PATCH 109/174] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 59.7% (1393 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index f0c9827c06..1f6720f613 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1407,5 +1407,14 @@ "Sign in to your Matrix account on %(serverName)s": "Logg inn på Matrix-kontoen din på %(serverName)s", "Sign in to your Matrix account on ": "Logg inn på Matrix-kontoen din på ", "If you've joined lots of rooms, this might take a while": "Hvis du har blitt med i mange rom, kan dette ta en stund", - "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Den nye økten din er nå verifisert. Den har tilgang til dine krypterte meldinger, og andre brukere vil se at den blir stolt på." + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Den nye økten din er nå verifisert. Den har tilgang til dine krypterte meldinger, og andre brukere vil se at den blir stolt på.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer, fra det tidspunktet de ble/blir invitert.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer, fra det tidspunktet de ble med.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde fremtidig romhistorikk synlig for alle rommedlemmer (%(visibility)s).", + "To return to your account in future you need to set a password": "For å komme tilbake til kontoen din senere, må du velge et passord", + "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Vennligst glem alle meldingene jeg har sendt når kontoen min er deaktivert (Advarsel: Dette vil føre til at fremtidige brukere ser en ufullstendig visning av samtaler)", + "To help us prevent this in future, please send us logs.": "For å hjelpe oss med å forhindre dette i fremtiden, vennligst send oss loggfiler.", + "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Ingen identitetstjener er satt opp, så du kan ikke bruke en E-postadresse til å tilbakestille passordet ditt senere." } From 758a06c03d7f37daa5aa0ec2689b19d306b02f1b Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Sat, 22 Aug 2020 13:10:02 +0000 Subject: [PATCH 110/174] Translated using Weblate (Russian) Currently translated at 100.0% (2335 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 80327bd1e6..bc4bd073d9 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2415,5 +2415,7 @@ "Explore all public rooms": "Просмотреть все публичные комнаты", "%(count)s results|other": "%(count)s результатов", "Preparing to download logs": "Подготовка к загрузке журналов", - "Download logs": "Скачать журналы" + "Download logs": "Скачать журналы", + "Unexpected server error trying to leave the room": "Неожиданная ошибка сервера при попытке покинуть комнату", + "Error leaving room": "Ошибка при выходе из комнаты" } From 2ea68577d243fe7852d8d99bdf67c2a2c5c98dc1 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Sun, 23 Aug 2020 17:26:03 +0000 Subject: [PATCH 111/174] Translated using Weblate (Swedish) Currently translated at 61.9% (1445 of 2335 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 133 ++++++++++++++++++++------------------- 1 file changed, 67 insertions(+), 66 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index b2c7623fca..0f9f367638 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -274,7 +274,7 @@ "Oct": "Okt", "Nov": "Nov", "Dec": "Dec", - "Invite to Community": "Bjud in till community", + "Invite to Community": "Bjud in till gemenskap", "Unable to enable Notifications": "Det går inte att aktivera aviseringar", "The information being sent to us to help make %(brand)s better includes:": "Informationen som skickas till oss för att förbättra %(brand)s inkluderar:", "VoIP is unsupported": "VoIP stöds ej", @@ -664,64 +664,64 @@ "collapse": "fäll ihop", "expand": "fäll ut", "In reply to ": "Som svar på ", - "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?": "Visa dessa rum för 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", + "Who would you like to add to this community?": "Vem vill du lägga till i denna gemenskap?", + "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 gemenskap kommer att vara synlig för alla som känner till gemenskaps-ID:t", + "Invite new community members": "Bjud in nya gemenskapsmedlemmar", + "Which rooms would you like to add to this community?": "Vilka rum vill du lägga till i denna gemenskap?", + "Show these rooms to non-members on the community page and room list?": "Visa dessa rum för icke-medlemmar på gemenskapssidan och -rumslistan?", + "Add rooms to the community": "Lägg till rum i gemenskapen", + "Add to community": "Lägg till i gemenskap", + "Failed to invite users to community": "Det gick inte att bjuda in användare till gemenskapen", "Mirror local video feed": "Speglad lokal-video", "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 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", - "

HTML for your community's page

\n

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

\n

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

\n": "

HTML för din community-sida

\n

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

\n

\n Du kan även använda 'img'-taggar\n

\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 name and avatar might not be seen by other users for up to 30 minutes.": "Det kan dröja upp till 30 minuter innan ändringar på communityns namn och avatar 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", - "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.
Click here to open settings and give it one!": "Din community har ingen lång beskrivning eller HTML-sida att visa för medlemmar.
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.", - "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", - "Your Communities": "Dina communityn", - "Did you know: you can use communities to filter your %(brand)s experience!": "Visste du att: du kan använda communityn för att filtrera din %(brand)s-upplevelse!", - "Error whilst fetching joined communities": "Fel vid hämtning av anslutna communityn", + "Invalid community ID": "Ogiltigt gemenskaps-ID", + "'%(groupId)s' is not a valid community ID": "%(groupId)s är inte ett giltigt gemenskaps-ID", + "New community ID (e.g. +foo:%(localDomain)s)": "Nytt gemenskaps-ID (t.ex. +foo:%(localDomain)s)", + "Remove from community": "Ta bort från gemenskapen", + "Disinvite this user from community?": "Ta bort användarens inbjudan till gemenskapen?", + "Remove this user from community?": "Ta bort användaren från gemenskapen?", + "Failed to remove user from community": "Det gick inte att ta bort användaren från gemenskapen", + "Filter community members": "Filtrera gemenskapsmedlemmar", + "Removing a room from the community will also remove it from the community page.": "Om du tar bort ett rum från gemenskapen tas det även bort från gemenskapens sida.", + "Failed to remove room from community": "Det gick inte att ta bort rummet från gemenskapen", + "Only visible to community members": "Endast synlig för gemenskapsmedlemmar", + "Filter community rooms": "Filtrera gemenskapsrum", + "Community IDs cannot be empty.": "Gemenskaps-ID kan inte vara tomt.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Gemenskaps-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 gemenskap skapades", + "Create Community": "Skapa gemenskap", + "Community Name": "Gemenskapsnamn", + "Community ID": "Gemenskaps-ID", + "View Community": "Visa gemenskap", + "

HTML for your community's page

\n

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

\n

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

\n": "

HTML för din gemenskapssida

\n

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

\n

\n Du kan även använda 'img'-taggar\n

\n", + "Add rooms to the community summary": "Lägg till rum i gemenskapsöversikten", + "Add users to the community summary": "Lägg till användare i gemenskapsöversikten", + "Failed to update community": "Det gick inte att uppdatera gemenskapen", + "Unable to join community": "Det gick inte att gå med i gemenskapen", + "Leave Community": "Lämna gemenskapen", + "Unable to leave community": "Det gick inte att lämna gemenskap", + "Community Settings": "Gemenskapsinställningar", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Det kan dröja upp till 30 minuter innan ändringar på gemenskapens namn och avatar 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 gemenskapsmedlemmar på gemenskapssidan. Gemenskapsmedlemmar kan gå med i rummen genom att klicka på dem.", + "Add rooms to this community": "Lägg till rum i denna gemenskap", + "%(inviter)s has invited you to join this community": "%(inviter)s har bjudit in dig till denna gemenskap", + "Join this community": "Gå med i denna gemenskap", + "Leave this community": "Lämna denna gemenskap", + "You are an administrator of this community": "Du är administratör för denna gemenskap", + "You are a member of this community": "Du är medlem i denna gemenskap", + "Who can join this community?": "Vem kan gå med i denna gemenskap?", + "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Din gemenskap har ingen lång beskrivning eller HTML-sida att visa för medlemmar.
Klicka här för att öppna inställningarna och lägga till det!", + "Community %(groupId)s not found": "Gemenskapen %(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 gemenskapsavatar 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 gemenskapen.", + "Create a new community": "Skapa en ny gemenskap", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Skapa en gemenskap för att gruppera användare och rum! Bygg en anpassad hemsida för att markera er plats i Matrix-universumet.", + "Invite to this community": "Bjud in till denna gemenskap", + "Something went wrong when trying to get your communities.": "Något gick fel vid hämtning av dina gemenskaper.", + "You're not currently a member of any communities.": "Du är för närvarande inte medlem i någon gemenskap.", + "Communities": "Gemenskaper", + "Your Communities": "Dina gemenskaper", + "Did you know: you can use communities to filter your %(brand)s experience!": "Visste du att: du kan använda gemenskaper för att filtrera din %(brand)s-upplevelse!", + "Error whilst fetching joined communities": "Fel vid hämtning av anslutna gemenskaper", "Featured Rooms:": "Utvalda rum:", "Featured Users:": "Utvalda användare:", "Everyone": "Alla", @@ -806,15 +806,15 @@ "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.", "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", - "Display your community flair in rooms configured to show it.": "Visa ditt community-emblem i rum som är konfigurerade för att visa det.", + "Showing flair for these communities:": "Visar emblem för dessa gemenskaper:", + "This room is not showing flair for any communities": "Detta rum visar inte emblem för några gemenskaper", + "Display your community flair in rooms configured to show it.": "Visa ditt gemenskapsemblem i rum som är konfigurerade för att visa det.", "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 Community": "Dela gemenskap", "Share Room Message": "Dela rumsmeddelande", "Link to selected message": "Länk till valt meddelande", "COPY": "KOPIERA", @@ -870,7 +870,7 @@ "Updating %(brand)s": "Uppdaterar %(brand)s", "Open Devtools": "Öppna Devtools", "Show developer tools": "Visa utvecklingsverktyg", - "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Du är administratör för denna community. Du kommer inte kunna gå med igen utan en inbjudan från en annan administratör.", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Du är administratör för denna gemenskap. Du kommer inte kunna gå med igen utan en inbjudan från en annan administratör.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Filen '%(fileName)s' överstiger denna hemserverns storleksgräns för uppladdningar", "Unable to load! Check your network connectivity and try again.": "Kan inte ladda! Kolla din nätverksuppkoppling och försök igen.", "Whether or not you're logged in (we don't record your username)": "Om du är inloggad eller inte (vi sparar inte ditt användarnamn)", @@ -933,7 +933,7 @@ "Show avatars in user and room mentions": "Visa avatarer i användar- och rumsnämningar", "Enable big emoji in chat": "Aktivera stor emoji i chatt", "Send typing notifications": "Skicka \"skriver\"-statusar", - "Enable Community Filter Panel": "Aktivera community-filterpanel", + "Enable Community Filter Panel": "Aktivera gemenskapsfilterpanel", "Allow Peer-to-Peer for 1:1 calls": "Tillåt peer-to-peer kommunikation för 1:1 samtal", "Messages containing my username": "Meddelanden som innehåller mitt användarnamn", "Messages containing @room": "Meddelanden som innehåller @room", @@ -1312,8 +1312,8 @@ "Sign in to your Matrix account on ": "Logga in med ditt Matrix-konto på ", "Please install Chrome, Firefox, or Safari for the best experience.": "Installera Chrome, Firefox, eller Safari för den bästa upplevelsen.", "Couldn't load page": "Det gick inte att ladda sidan", - "Want more than a community? Get your own server": "Vill du ha mer än en community? Skaffa din egen server", - "This homeserver does not support communities": "Denna hemserver stöder inte communityn", + "Want more than a community? Get your own server": "Vill du ha mer än en gemenskap? Skaffa din egen server", + "This homeserver does not support communities": "Denna hemserver stöder inte gemenskaper", "Explore": "Utforska", "Filter": "Filtrera", "Filter rooms…": "Filtrera rum…", @@ -1539,5 +1539,6 @@ "Riot is now Element!": "Riot är nu Element!", "Learn More": "Lär mer", "Sends a message as html, without interpreting it as markdown": "Skicka ett meddelande som html, utan att tolka det som markdown", - "Failed to set topic": "Misslyckades med att ställa in ämnet" + "Failed to set topic": "Misslyckades med att ställa in ämnet", + "Community Autocomplete": "Autokomplettering av gemenskaper" } From 2e2f60c20b2a42e902edadabb6bbcdfd5c0c4299 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 24 Aug 2020 16:11:35 +0100 Subject: [PATCH 112/174] Use updated `waitFor` API with well-known --- src/DeviceListener.ts | 4 ++-- src/utils/WellKnownUtils.ts | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/DeviceListener.ts b/src/DeviceListener.ts index 41daa74376..6b667ae54d 100644 --- a/src/DeviceListener.ts +++ b/src/DeviceListener.ts @@ -31,7 +31,7 @@ import { } from "./toasts/UnverifiedSessionToast"; import { privateShouldBeEncrypted } from "./createRoom"; import { isSecretStorageBeingAccessed, accessSecretStorage } from "./CrossSigningManager"; -import { ensureClientWellKnown, isSecureBackupRequired } from './utils/WellKnownUtils'; +import { isSecureBackupRequired } from './utils/WellKnownUtils'; import { isLoggedIn } from './components/structures/MatrixChat'; @@ -226,7 +226,7 @@ export default class DeviceListener { showSetupEncryptionToast(SetupKind.UPGRADE_ENCRYPTION); } else { // No cross-signing or key backup on account (set up encryption) - await ensureClientWellKnown(); + await cli.waitForClientWellKnown(); if (isSecureBackupRequired() && isLoggedIn()) { // If we're meant to set up, and Secure Backup is required, // trigger the flow directly without a toast once logged in. diff --git a/src/utils/WellKnownUtils.ts b/src/utils/WellKnownUtils.ts index 1fe28f2b0c..f16acdb408 100644 --- a/src/utils/WellKnownUtils.ts +++ b/src/utils/WellKnownUtils.ts @@ -23,14 +23,6 @@ export interface IE2EEWellKnown { default?: boolean; } -export async function ensureClientWellKnown() { - const cli = MatrixClientPeg.get(); - if (cli.haveAttemptedFetchingClientWellKnown()) return; - return new Promise(resolve => { - cli.once("WellKnown.attempted", resolve); - }); -} - export function getE2EEWellKnown(): IE2EEWellKnown { const clientWellKnown = MatrixClientPeg.get().getClientWellKnown(); if (clientWellKnown && clientWellKnown[E2EE_WK_KEY]) { From b601a025b58200ac04bedf738fdd9898c462a251 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 24 Aug 2020 16:33:23 +0100 Subject: [PATCH 113/174] Use `io.element` instead of `im.vector` --- src/utils/WellKnownUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/WellKnownUtils.ts b/src/utils/WellKnownUtils.ts index f16acdb408..46d9638ecd 100644 --- a/src/utils/WellKnownUtils.ts +++ b/src/utils/WellKnownUtils.ts @@ -16,7 +16,7 @@ limitations under the License. import {MatrixClientPeg} from '../MatrixClientPeg'; -const E2EE_WK_KEY = "im.vector.e2ee"; +const E2EE_WK_KEY = "io.element.e2ee"; const E2EE_WK_KEY_DEPRECATED = "im.vector.riot.e2ee"; export interface IE2EEWellKnown { From 35f19d53a54f0d090fac11c173a2ca55249bd219 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 24 Aug 2020 16:44:47 +0100 Subject: [PATCH 114/174] Mention issue for view state store --- src/components/structures/MatrixChat.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 9929cc523e..b1c3a1c16e 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -2088,7 +2088,9 @@ export default class MatrixChat extends React.PureComponent { export function isLoggedIn(): boolean { // JRS: Maybe we should move the step that writes this to the window out of - // `element-web` and into this file? + // `element-web` and into this file? Better yet, we should probably create a + // store to hold this state. + // See also https://github.com/vector-im/element-web/issues/15034. const app = window.matrixChat; return app && (app as MatrixChat).state.view === Views.LOGGED_IN; } From 1339014abef50524b6888434fcb88de0240792a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 24 Aug 2020 13:56:26 +0000 Subject: [PATCH 115/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2337 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 2eb000d7b5..d3f1fcff6e 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2422,5 +2422,7 @@ "Preparing to download logs": "Valmistun logikirjete allalaadimiseks", "Download logs": "Lae logikirjed alla", "Unexpected server error trying to leave the room": "Jututoast lahkumisel tekkis serveris ootamatu viga", - "Error leaving room": "Viga jututoast lahkumisel" + "Error leaving room": "Viga jututoast lahkumisel", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Kogukondade v2 prototüüp. Eeldab, et koduserver toetab sellist funktsionaalsust. Lahendus on esialgne ja katseline - kui kasutad, siis väga ettevaatlikult.", + "Explore rooms in %(communityName)s": "Uuri jututubasid %(communityName)s kogukonnas" } From f8d099f66b0f7cc54377820e8b8cc17126ce874d Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 24 Aug 2020 17:55:50 +0000 Subject: [PATCH 116/174] Translated using Weblate (Swedish) Currently translated at 62.3% (1455 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 117 ++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 0f9f367638..6f17b2f2cd 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -29,7 +29,7 @@ "Are you sure you want to reject the invitation?": "Är du säker på att du vill avböja inbjudan?", "%(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", + "Bans user with given id": "Bannar användaren med givet ID", "Ban": "Banna", "Attachment": "Bilaga", "Call Timeout": "Samtalstimeout", @@ -57,7 +57,7 @@ "/ddg is not a command": "/ddg är inte ett kommando", "Deactivate Account": "Inaktivera konto", "Decrypt %(text)s": "Dekryptera %(text)s", - "Deops user with given id": "Degraderar användare med givet id", + "Deops user with given id": "Degraderar användaren med givet ID", "Default": "Standard", "Disinvite": "Häv inbjudan", "Displays action": "Visar åtgärd", @@ -86,7 +86,7 @@ "Failed to send request.": "Det gick inte att sända begäran.", "Failed to set display name": "Det gick inte att ange visningsnamn", "Failed to unban": "Det gick inte att avbanna", - "Failed to verify email address: make sure you clicked the link in the email": "Det gick inte att bekräfta e-postadressen, klicka på länken i e-postmeddelandet", + "Failed to verify email address: make sure you clicked the link in the email": "Det gick inte att bekräfta e-postadressen: set till att du klickade på länken i e-postmeddelandet", "Favourite": "Favorit", "Accept": "Godkänn", "Access Token:": "Åtkomsttoken:", @@ -103,7 +103,7 @@ "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!", - "Failure to create room": "Det gick inte att skapa rum", + "Failure to create room": "Det gick inte att skapa rummet", "Favourites": "Favoriter", "Fill screen": "Fyll skärmen", "Filter room members": "Filtrera rumsmedlemmar", @@ -129,7 +129,7 @@ "%(senderName)s invited %(targetName)s.": "%(senderName)s bjöd in %(targetName)s.", "Invited": "Inbjuden", "Invites": "Inbjudningar", - "Invites user with given id to current room": "Bjuder in användare med givet id till nuvarande rum", + "Invites user with given id to current room": "Bjuder in användare med givet ID till detta rum", "Sign in with": "Logga in med", "Join as voice or video.": "Gå med som röst eller video.", "Join Room": "Gå med i rum", @@ -137,7 +137,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", @@ -185,7 +185,7 @@ "%(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", - "%(senderName)s requested a VoIP conference.": "%(senderName)s begärde en VoIP-konferens.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s begärde ett VoIP-gruppsamtal.", "Results from DuckDuckGo": "Resultat från DuckDuckGo", "Return to login screen": "Tillbaka till login-skärmen", "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s har inte tillstånd att skicka aviseringar - kontrollera webbläsarens inställningar", @@ -206,7 +206,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, 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 you hit a bug.": "Servern kan vara otillgänglig, överbelastad, eller så stötte du på en bugg.", + "Server may be unavailable, overloaded, or you hit a bug.": "Servern kan vara otillgänglig eller ö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.", @@ -235,13 +235,13 @@ "Edit": "Ändra", "Enable automatic language detection for syntax highlighting": "Aktivera automatisk språkdetektering för syntaxmarkering", "Publish this room to the public in %(domain)s's room directory?": "Publicera rummet i den offentliga rumskatalogen på %(domain)s?", - "AM": "AM", - "PM": "PM", + "AM": "FM", + "PM": "EM", "Submit": "Lämna in", "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": "Det angivna telefonnumret är ogiltigt", "This email address is already in use": "Den här e-postadressen används redan", - "This email address was not found": "Den här epostadressen finns inte", + "This email address was not found": "Den här e-postadressen finns inte", "The email address linked to your account must be entered.": "Epostadressen som är kopplad till ditt konto måste anges.", "Online": "Online", "Unnamed room": "Namnlöst rum", @@ -280,7 +280,7 @@ "VoIP is unsupported": "VoIP stöds ej", "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 need to be able to invite users to do that.": "Du behöver kunna bjuda in användare för att göra det där.", "You are not in this room.": "Du är inte i det här rummet.", "You do not have permission to do that in this room.": "Du har inte behörighet att göra det i det här rummet.", "Fetching third party location failed": "Det gick inte att hämta platsdata från tredje part", @@ -404,17 +404,17 @@ "The platform you're on": "Plattformen du använder", "Your homeserver's URL": "Din hemservers URL", "Every page you use in the app": "Varje sida du använder i appen", - "Whether or not you're using the Richtext mode of the Rich Text Editor": "Om du använder Richtext-läget i Rich-Text-editorn eller inte", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Om du använder Richtext-läget i Richtext-redigeraren eller inte", "e.g. ": "t.ex. ", - "Your device resolution": "Din enhetsupplösning", + "Your device resolution": "Din skärmupplösning", "You cannot place VoIP calls in this browser.": "Du kan inte ringa VoIP-samtal i den här webbläsaren.", - "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.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Din e-postadress verkar inte vara kopplad till något Matrix-ID på den här hemservern.", "Restricted": "Begränsad", - "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.", + "Failed to invite the following users to the %(roomName)s room:": "Det gick inte att bjuda in följande användare till rummet %(roomName)s:", + "Unable to create widget.": "Det gick inte att skapa widgeten.", "Ignored user": "Ignorerad användare", "You are now ignoring %(userId)s": "Du ignorerar nu %(userId)s", - "Unignored user": "Oignorerad användare", + "Unignored user": "Avignorerad 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.", @@ -550,7 +550,7 @@ "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.", "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", + "Stops ignoring a user, showing their messages going forward": "Slutar ignorera en användare och visar dess meddelanden framöver", "Opens the Developer Tools dialog": "Öppna dialogrutan Utvecklarverktyg", "Notify the whole room": "Meddela hela rummet", "Room Notification": "Rumsavisering", @@ -563,7 +563,7 @@ "(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.", + "Ongoing conference call%(supportedText)s.": "Pågående gruppsamtal%(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", @@ -610,11 +610,11 @@ "This room is not recognised.": "Detta rum känns inte igen.", "Usage": "Användning", "Verified key": "Verifierad nyckel", - "VoIP conference started.": "VoIP-konferens startad.", - "VoIP conference finished.": "VoIP-konferens avslutad.", + "VoIP conference started.": "VoIP-gruppsamtal startat.", + "VoIP conference finished.": "VoIP-gruppsamtal avslutat.", "%(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", + "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 datan bort innan den skickas till servern.", + "The remote side failed to pick up": "Mottagaren svarade inte", "Jump to read receipt": "Hoppa till läskvitto", "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", @@ -791,7 +791,7 @@ "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s 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", + "Analytics": "Statistik", "Send analytics data": "Skicka analysdata", "Passphrases must match": "Passfraser måste matcha", "Passphrase must not be empty": "Lösenfras får inte vara tom", @@ -825,7 +825,7 @@ "A call is currently being placed!": "Ett samtal håller på att upprättas!", "A call is already in progress!": "Ett samtal pågår redan!", "Permission Required": "Behörighet krävs", - "You do not have permission to start a conference call in this room": "Du har inte behörighet att starta ett konferenssamtal i detta rum", + "You do not have permission to start a conference call in this room": "Du har inte behörighet att starta ett gruppsamtal i detta rum", "This event could not be displayed": "Den här händelsen kunde inte visas", "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.": "I krypterade rum, som detta, är URL-förhandsvisning inaktiverad som standard för att säkerställa att din hemserver (där förhandsvisningar genereras) inte kan samla information om länkar du ser i rummet.", "The email field must not be blank.": "Epost-fältet får inte vara tomt.", @@ -875,10 +875,10 @@ "Unable to load! Check your network connectivity and try again.": "Kan inte ladda! Kolla din nätverksuppkoppling och försök igen.", "Whether or not you're logged in (we don't record your username)": "Om du är inloggad eller inte (vi sparar inte ditt användarnamn)", "Failed to invite users to the room:": "Kunde inte bjuda in användare till rummet:", - "Upgrades a room to a new version": "Uppgraderar ett num till en ny version", - "Gets or sets the room topic": "Ger eller sätter ämnet för ett rum", + "Upgrades a room to a new version": "Uppgraderar ett rum till en ny version", + "Gets or sets the room topic": "Hämtar eller sätter ämnet för ett rum", "This room has no topic.": "Det här rummet har inget ämne.", - "Sets the room name": "Sätter rumnamnet", + "Sets the room name": "Sätter rumsnamnet", "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s uppgraderade det här rummet.", "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s gjorde rummet publikt för alla som kan länken.", "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s har tillåtit gäster att gå med i rummet.", @@ -921,7 +921,7 @@ "Straight rows of keys are easy to guess": "Tangenter i rad på tangentbordet är enkla att gissa", "Short keyboard patterns are easy to guess": "Korta tangentbordsmönster är enkla att gissa", "There was an error joining the room": "Det gick fel när vi försökte gå med i rummet", - "Changes your display nickname in the current room only": "Ändrar ditt visningsnamn endast i det aktuella rummet", + "Changes your display nickname in the current room only": "Ändrar ditt visningsnamn endast i detta rum", "Use a longer keyboard pattern with more turns": "Använd ett längre tangentbordsmönster med fler varv", "Custom user status messages": "Anpassade användarstatusmeddelanden", "Enable Emoji suggestions while typing": "Aktivera Emoji-förslag medan du skriver", @@ -1062,7 +1062,7 @@ "Join millions for free on the largest public server": "Bli medlem gratis på den största offentliga servern", "Premium": "Premium", "Premium hosting for organisations Learn more": "Premium-hosting för organisationer Läs mer", - "Other": "Andra", + "Other": "Annat", "Find other public servers or use a custom server": "Hitta andra offentliga servrar eller använd en anpassad server", "Your Matrix account on %(serverName)s": "Ditt Matrix-konto på %(serverName)s", "Sign in instead": "Logga in istället", @@ -1160,7 +1160,7 @@ "Unable to load backup status": "Det går inte att ladda backupstatus", "Guest": "Gäst", "Could not load user profile": "Kunde inte ladda användarprofil", - "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Om du använder 'breadcrumbs' eller inte (avatarer ovanför rumslistan)", + "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Om du använder 'brödsmulor' eller inte (avatarer ovanför rumslistan)", "Replying With Files": "Svarar med filer", "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Just nu är det inte möjligt att svara med en fil. Vill du ladda upp filen utan att svara?", "The file '%(fileName)s' failed to upload.": "Filen '%(fileName)s' kunde inte laddas upp.", @@ -1208,19 +1208,19 @@ "Upload %(count)s other files|one": "Ladda upp %(count)s annan fil", "Cancel All": "Avbryt alla", "Upload Error": "Uppladdningsfel", - "Name or Matrix ID": "Namn eller Martix-ID", + "Name or Matrix ID": "Namn eller Matrix-ID", "Your %(brand)s is misconfigured": "%(brand)s är felkonfigurerat", "Call failed due to misconfigured server": "Anrop misslyckades på grund av felkonfigurerad server", "Try using turn.matrix.org": "Prova att använda turn.matrix.org", "The server does not support the room version specified.": "Servern stöder inte den angivna rumsversionen.", "Messages": "Meddelanden", "Actions": "Åtgärder", - "Sends a message as plain text, without interpreting it as markdown": "Skickar ett meddelande som vanlig text, utan att tolka det som markdown", + "Sends a message as plain text, without interpreting it as markdown": "Skickar ett meddelande som vanlig text, utan att tolka det som Markdown", "You do not have the required permissions to use this command.": "Du har inte de behörigheter som krävs för att använda det här kommandot.", - "Changes your avatar in this current room only": "Ändrar din avatar endast i det aktuella rummet", + "Changes your avatar in this current room only": "Ändrar din avatar endast i detta rum", "Changes your avatar in all rooms": "Ändrar din avatar i alla rum", "Use an identity server": "Använd en identitetsserver", - "Unbans user with given ID": "Avbannar användare med givet id", + "Unbans user with given ID": "Avbannar användaren med givet ID", "Sends the given message coloured as a rainbow": "Skickar angivet meddelandet färgat som en regnbåge", "Sends the given emote coloured as a rainbow": "Skickar angiven emoji färgad som en regnbåge", "Displays list of commands with usages and descriptions": "Visar lista över kommandon med beskrivningar", @@ -1320,9 +1320,9 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Be administratören för din hemserver (%(homeserverDomain)s) att konfigurera en TURN-server för att samtal ska fungera pålitligt.", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativt kan du testa att använda den offentliga servern turn.matrix.org, men det är inte lika pålitligt och det kommer att dela din IP-adress med den servern. Du kan också hantera detta under Inställningar.", "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Varning: Uppgradering av ett rum flyttar inte automatiskt rumsmedlemmar till den nya versionen av rummet. Vi lägger ut en länk till det nya rummet i den gamla versionen av rummet - rumsmedlemmar måste klicka på den här länken för att gå med i det nya rummet.", - "Changes the avatar of the current room": "Ändrar avataren i det aktuella rummet", - "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Använd en identitetsserver för att bjuda in via epost. Klicka på Fortsätt för att använda standardidentitetsservern (%(defaultIdentityServerName)s) eller hantera det i Inställningar.", - "Use an identity server to invite by email. Manage in Settings.": "Använd en identitetsserver för att bjuda in via epost. Hantera det i inställningar.", + "Changes the avatar of the current room": "Ändrar avataren i detta rum", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Använd en identitetsserver för att bjuda in via e-post. Klicka på Fortsätt för att använda standardidentitetsservern (%(defaultIdentityServerName)s) eller hantera det i Inställningar.", + "Use an identity server to invite by email. Manage in Settings.": "Använd en identitetsserver för att bjuda in via e-post. Hantera det i inställningar.", "Unexpected error resolving homeserver configuration": "Oväntat fel vid inläsning av hemserverkonfiguration", "Unexpected error resolving identity server configuration": "Oväntat fel vid inläsning av identitetsserverkonfiguration", "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Tillåt samtalsserver turn.matrix.org som reserv när din hemserver inte erbjuder en (din IP-adress delades under ett samtal)", @@ -1332,8 +1332,8 @@ "All keys backed up": "Alla nycklar säkerhetskopierade", "Add Email Address": "Lägg till e-postadress", "Add Phone Number": "Lägg till telefonnummer", - "Identity server has no terms of service": "Identitetsserver har inga användarvillkor", - "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Den här åtgärden kräver åtkomst till standardidentitetsservern för att validera en e-postadress eller telefonnummer, men servern har inga användarvillkor.", + "Identity server has no terms of service": "Identitetsservern har inga användarvillkor", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Den här åtgärden kräver åtkomst till standardidentitetsservern för att validera en e-postadress eller ett telefonnummer, men servern har inga användarvillkor.", "Trust": "Förtroende", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Testa nya sätt att ignorera personer (experimentalt)", @@ -1458,7 +1458,7 @@ "Your user agent": "Din användaragent", "If you cancel now, you won't complete verifying the other user.": "Om du avbryter nu kommer du inte att verifiera den andra användaren.", "If you cancel now, you won't complete verifying your other session.": "Om du avbryter nu kommer du inte att verifiera din andra session.", - "Cancel entering passphrase?": "Avbryta att ange lösenfras?", + "Cancel entering passphrase?": "Avbryta inmatning av lösenfras?", "Setting up keys": "Sätter upp nycklar", "Verify this session": "Verifiera denna session", "Encryption upgrade available": "Krypteringsuppgradering tillgänglig", @@ -1466,8 +1466,8 @@ "Sign In or Create Account": "Logga in eller skapa konto", "Use your account or create a new one to continue.": "Använd ditt konto eller skapa ett nytt för att fortsätta.", "Create Account": "Skapa konto", - "Verifies a user, session, and pubkey tuple": "Verifierar en användar-, session- och pubkey-tupel", - "Unknown (user, session) pair:": "Okänt par (användare, session):", + "Verifies a user, session, and pubkey tuple": "Verifierar en användar-, sessions- och pubkey-tupel", + "Unknown (user, session) pair:": "Okänt (användare, session)-par:", "Session already verified!": "Sessionen är redan verifierad!", "WARNING: Session already verified, but keys do NOT MATCH!": "VARNING: Sessionen har redan verifierats, men nycklarna MATCHAR INTE!", "Unable to revoke sharing for email address": "Det gick inte att återkalla delning för e-postadress", @@ -1522,23 +1522,28 @@ "Space": "Space", "End": "End", "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Du har blivit utloggad från alla dina sessioner och kommer inte längre att motta pushnotiser. För att återaktivera pushnotiser, logga in igen på varje enhet.", - "Use Single Sign On to continue": "Använd Engångs Inloggning för att fortsätta", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Bekräfta att du lägger till e-postadressen genom att använda Engångs Inloggning för att bevisa din identitet.", - "Single Sign On": "Engångs Inloggning", - "Confirm adding email": "Bekräfta att du lägger till e-posten", - "Click the button below to confirm adding this email address.": "Klicka på knappen nedan för att bekräfta att du lägger till e-postadressen.", - "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekräfta att du lägger till telefon numret genom att använda Engångs Inloggning för att bevisa din identitet.", - "Confirm adding phone number": "Bekräfta att du lägger till telefon numret", - "Click the button below to confirm adding this phone number.": "Klicka på knappen nedan för att bekräfta att du lägger till telefon numret.", - "Are you sure you want to cancel entering passphrase?": "Är du säker på att du bill avbryta inmatning av lösenordet?", + "Use Single Sign On to continue": "Använd single sign-on för att fortsätta", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Bekräfta tilläggning av e-postadressen genom att använda single sign-on för att bevisa din identitet.", + "Single Sign On": "Single sign-on", + "Confirm adding email": "Bekräfta tilläggning av e-postadressen", + "Click the button below to confirm adding this email address.": "Klicka på knappen nedan för att bekräfta tilläggning av e-postadressen.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekräfta tilläggning av telefonnumret genom att använda single sign-on för att bevisa din identitet.", + "Confirm adding phone number": "Bekräfta tilläggning av telefonnumret", + "Click the button below to confirm adding this phone number.": "Klicka på knappen nedan för att bekräfta tilläggning av telefonnumret.", + "Are you sure you want to cancel entering passphrase?": "Är du säker på att du vill avbryta inmatning av lösenfrasen?", "Go Back": "Gå tillbaka", - "Room name or address": "Rum namn eller adress", + "Room name or address": "Rummets namn eller adress", "%(name)s is requesting verification": "%(name)s begär verifiering", "Use your account to sign in to the latest version": "Använd ditt konto för att logga in till den senaste versionen", "We’re excited to announce Riot is now Element": "Vi är glada att meddela att Riot är nu Element", "Riot is now Element!": "Riot är nu Element!", "Learn More": "Lär mer", - "Sends a message as html, without interpreting it as markdown": "Skicka ett meddelande som html, utan att tolka det som markdown", + "Sends a message as html, without interpreting it as markdown": "Skicka ett meddelande som HTML, utan att tolka det som Markdown", "Failed to set topic": "Misslyckades med att ställa in ämnet", - "Community Autocomplete": "Autokomplettering av gemenskaper" + "Community Autocomplete": "Autokomplettering av gemenskaper", + "Joins room with given address": "Går med i rummet med den givna adressen", + "Unrecognised room address:": "Okänd rumsadress:", + "Command failed": "Kommandot misslyckades", + "Could not find user in room": "Kunde inte hitta användaren i rummet", + "Please supply a widget URL or embed code": "Ange en widget-URL eller inbäddningskod" } From a3eb4e0417e6c2fab9fa9389844de93879e1fe75 Mon Sep 17 00:00:00 2001 From: stuve20 Date: Mon, 24 Aug 2020 18:40:19 +0000 Subject: [PATCH 117/174] Translated using Weblate (Swedish) Currently translated at 62.3% (1455 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 6f17b2f2cd..e1b109c11c 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -608,7 +608,7 @@ "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", + "Usage": "Användande", "Verified key": "Verifierad nyckel", "VoIP conference started.": "VoIP-gruppsamtal startat.", "VoIP conference finished.": "VoIP-gruppsamtal avslutat.", From 44246dc96b7440385f2df6a08e6471d585bcb798 Mon Sep 17 00:00:00 2001 From: purjolini Date: Mon, 24 Aug 2020 18:53:47 +0000 Subject: [PATCH 118/174] Translated using Weblate (Swedish) Currently translated at 62.3% (1455 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index e1b109c11c..13560c2cdd 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1545,5 +1545,6 @@ "Unrecognised room address:": "Okänd rumsadress:", "Command failed": "Kommandot misslyckades", "Could not find user in room": "Kunde inte hitta användaren i rummet", - "Please supply a widget URL or embed code": "Ange en widget-URL eller inbäddningskod" + "Please supply a widget URL or embed code": "Ange en widget-URL eller inbäddningskod", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VARNING: NYCKEL VARIFIERING MYSSLYCKADES! Den signerade nyckeln för %(userId)s och session %(deviceId)s är \"%(fprint)s\" vilket inte matchar nyckel \"%(fingerprint)s\". Det kan betyda att kommunikationen är övervakad!" } From 186374a95061cd26c1192324b0b441f50d75eaa6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 24 Aug 2020 21:08:07 +0100 Subject: [PATCH 119/174] BaseAvatar avoid initial render with default avatar --- src/components/views/avatars/BaseAvatar.tsx | 41 +++++++++++---------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/components/views/avatars/BaseAvatar.tsx b/src/components/views/avatars/BaseAvatar.tsx index 4c6fde19eb..7860857c55 100644 --- a/src/components/views/avatars/BaseAvatar.tsx +++ b/src/components/views/avatars/BaseAvatar.tsx @@ -42,34 +42,35 @@ interface IProps { className?: string; } +const calculateUrls = (url, urls) => { + // work out the full set of urls to try to load. This is formed like so: + // imageUrls: [ props.url, ...props.urls ] + + let _urls = []; + if (!SettingsStore.getValue("lowBandwidth")) { + _urls = urls || []; + + if (url) { + _urls.unshift(url); // put in urls[0] + } + } + + // deduplicate URLs + return Array.from(new Set(_urls)); +}; + const useImageUrl = ({url, urls}): [string, () => void] => { - const [imageUrls, setUrls] = useState([]); - const [urlsIndex, setIndex] = useState(); + const [imageUrls, setUrls] = useState(calculateUrls(url, urls)); + const [urlsIndex, setIndex] = useState(0); const onError = useCallback(() => { setIndex(i => i + 1); // try the next one }, []); - const memoizedUrls = useMemo(() => urls, [JSON.stringify(urls)]); // eslint-disable-line react-hooks/exhaustive-deps useEffect(() => { - // work out the full set of urls to try to load. This is formed like so: - // imageUrls: [ props.url, ...props.urls ] - - let _urls = []; - if (!SettingsStore.getValue("lowBandwidth")) { - _urls = memoizedUrls || []; - - if (url) { - _urls.unshift(url); // put in urls[0] - } - } - - // deduplicate URLs - _urls = Array.from(new Set(_urls)); - + setUrls(calculateUrls(url, urls)); setIndex(0); - setUrls(_urls); - }, [url, memoizedUrls]); // eslint-disable-line react-hooks/exhaustive-deps + }, [url, JSON.stringify(urls)]); // eslint-disable-line react-hooks/exhaustive-deps const cli = useContext(MatrixClientContext); const onClientSync = useCallback((syncState, prevState) => { From eab4e5ae6502443b01441bb4e12deec958e7b348 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 25 Aug 2020 07:17:00 +0000 Subject: [PATCH 120/174] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2337 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 12437b8fa6..ad845dfb78 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2425,5 +2425,8 @@ "Preparing to download logs": "正在準備下載紀錄檔", "Download logs": "下載紀錄檔", "Unexpected server error trying to leave the room": "試圖離開聊天室時發生意外的伺服器錯誤", - "Error leaving room": "離開聊天室時發生錯誤" + "Error leaving room": "離開聊天室時發生錯誤", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "社群 v2 原型。需要相容的家伺服器。高度實驗性,小心使用。", + "Explore rooms in %(communityName)s": "在 %(communityName)s 中探索聊天室", + "Set up Secure Backup": "設定安全備份" } From 310ff1c93894ecbbe1a603445c397d1f386cf156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 24 Aug 2020 17:19:46 +0000 Subject: [PATCH 121/174] Translated using Weblate (Estonian) Currently translated at 100.0% (2337 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index d3f1fcff6e..8a0ba7f54b 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2424,5 +2424,6 @@ "Unexpected server error trying to leave the room": "Jututoast lahkumisel tekkis serveris ootamatu viga", "Error leaving room": "Viga jututoast lahkumisel", "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Kogukondade v2 prototüüp. Eeldab, et koduserver toetab sellist funktsionaalsust. Lahendus on esialgne ja katseline - kui kasutad, siis väga ettevaatlikult.", - "Explore rooms in %(communityName)s": "Uuri jututubasid %(communityName)s kogukonnas" + "Explore rooms in %(communityName)s": "Uuri jututubasid %(communityName)s kogukonnas", + "Set up Secure Backup": "Võta kasutusele turvaline varundus" } From 1f6370ca983510ce96026e5f3e9769183d6d3c6f Mon Sep 17 00:00:00 2001 From: XoseM Date: Tue, 25 Aug 2020 05:31:49 +0000 Subject: [PATCH 122/174] Translated using Weblate (Galician) Currently translated at 100.0% (2337 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 7843a416df..0f2c83fd55 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2422,5 +2422,8 @@ "Preparing to download logs": "Preparándose para descargar rexistro", "Download logs": "Descargar rexistro", "Unexpected server error trying to leave the room": "Fallo non agardado no servidor ó intentar saír da sala", - "Error leaving room": "Erro ó saír da sala" + "Error leaving room": "Erro ó saír da sala", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototipos de Comunidades v2. Require un servidor compatible. Característica experimental - usa con tino.", + "Explore rooms in %(communityName)s": "Explorar salas en %(communityName)s", + "Set up Secure Backup": "Configurar Copia de apoio Segura" } From 1251d9216d3d1fa63c17133e639bdad63bb1f34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C5=A0uklje?= Date: Mon, 24 Aug 2020 19:01:59 +0000 Subject: [PATCH 123/174] Translated using Weblate (Slovenian) Currently translated at 0.5% (12 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sl/ --- src/i18n/strings/sl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sl.json b/src/i18n/strings/sl.json index 764b80e449..985e4a39d1 100644 --- a/src/i18n/strings/sl.json +++ b/src/i18n/strings/sl.json @@ -9,5 +9,7 @@ "Sign In": "Prijava", "powered by Matrix": "poganja Matrix", "Custom Server Options": "Možnosti strežnika po meri", - "Your language of choice": "Vaš jezik po izbiri" + "Your language of choice": "Vaš jezik po izbiri", + "Use Single Sign On to continue": "Uporabi Single Sign On za prijavo", + "Confirm adding this email address by using Single Sign On to prove your identity.": "" } From fad4fe5c7d3f1acf41220e3e4bc70227ae4cf419 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 24 Aug 2020 18:54:57 +0000 Subject: [PATCH 124/174] Translated using Weblate (Swedish) Currently translated at 63.1% (1475 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 44 +++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 13560c2cdd..58279124fc 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -203,7 +203,7 @@ "Seen by %(userName)s at %(dateTime)s": "Sedd av %(userName)s %(dateTime)s", "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.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s bjöd in %(targetDisplayName)s att gå med i rummet.", "Server error": "Serverfel", "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 you hit a bug.": "Servern kan vara otillgänglig eller överbelastad, eller så stötte du på en bugg.", @@ -609,10 +609,10 @@ "Missing roomId.": "Rums-ID saknas.", "This room is not recognised.": "Detta rum känns inte igen.", "Usage": "Användande", - "Verified key": "Verifierad nyckel", + "Verified key": "Verifierade nyckeln", "VoIP conference started.": "VoIP-gruppsamtal startat.", "VoIP conference finished.": "VoIP-gruppsamtal avslutat.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s satte framtida rumshistorik till okänd synlighet (%(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 datan bort innan den skickas till servern.", "The remote side failed to pick up": "Mottagaren svarade inte", "Jump to read receipt": "Hoppa till läskvitto", @@ -880,11 +880,11 @@ "This room has no topic.": "Det här rummet har inget ämne.", "Sets the room name": "Sätter rumsnamnet", "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s uppgraderade det här rummet.", - "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s gjorde rummet publikt för alla som kan länken.", + "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s gjorde rummet publikt för alla som har länken.", "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s har tillåtit gäster att gå med i rummet.", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s ändrade regeln för att gå med till %(rule)s", "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s har nekat gäster att gå med i rummet.", - "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s ändrade gäst-åtkomst till %(rule)s", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s ändrade gäståtkomst till %(rule)s", "%(displayName)s is typing …": "%(displayName)s skriver …", "%(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 …", @@ -1221,9 +1221,9 @@ "Changes your avatar in all rooms": "Ändrar din avatar i alla rum", "Use an identity server": "Använd en identitetsserver", "Unbans user with given ID": "Avbannar användaren med givet ID", - "Sends the given message coloured as a rainbow": "Skickar angivet meddelandet färgat som en regnbåge", - "Sends the given emote coloured as a rainbow": "Skickar angiven emoji färgad som en regnbåge", - "Displays list of commands with usages and descriptions": "Visar lista över kommandon med beskrivningar", + "Sends the given message coloured as a rainbow": "Skickar angivet meddelande i regnbågsfärg", + "Sends the given emote coloured as a rainbow": "Skickar angiven emoji i regnbågsfärg", + "Displays list of commands with usages and descriptions": "Visar lista över kommandon med användande beskrivningar", "%(senderName)s made no change.": "%(senderName)s gjorde ingen ändring.", "Cannot reach homeserver": "Kan inte nå hemservern", "Ensure you have a stable internet connection, or get in touch with the server admin": "Se till att du har en stabil internetanslutning, eller kontakta serveradministratören", @@ -1354,8 +1354,8 @@ "Connecting to integration manager...": "Ansluter till integrationshanterare...", "Cannot connect to integration manager": "Det går inte att ansluta till integrationshanterare", "The integration manager is offline or it cannot reach your homeserver.": "Integrationshanteraren är offline eller kan inte nå din hemserver.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Använd en Integrationshanterare (%(serverName)s) för att hantera bots, widgets och klistermärkespaket.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Använd en Integrationshanterare för att hantera bots, widgets och klistermärkespaket.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare (%(serverName)s) för att hantera bottar, widgets och dekalpaket.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Använd en integrationshanterare för att hantera bottar, widgets och dekalpaket.", "Manage integrations": "Hantera integrationer", "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationshanterare får konfigurationsdata och kan ändra widgetar, skicka ruminbjudningar och ställa in behörighetsnivåer via ditt konto.", "Close preview": "Stäng förhandsvisning", @@ -1519,7 +1519,7 @@ "Page Down": "Page Down", "Esc": "Esc", "Enter": "Enter", - "Space": "Space", + "Space": "Mellanslag", "End": "End", "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Du har blivit utloggad från alla dina sessioner och kommer inte längre att motta pushnotiser. För att återaktivera pushnotiser, logga in igen på varje enhet.", "Use Single Sign On to continue": "Använd single sign-on för att fortsätta", @@ -1546,5 +1546,25 @@ "Command failed": "Kommandot misslyckades", "Could not find user in room": "Kunde inte hitta användaren i rummet", "Please supply a widget URL or embed code": "Ange en widget-URL eller inbäddningskod", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VARNING: NYCKEL VARIFIERING MYSSLYCKADES! Den signerade nyckeln för %(userId)s och session %(deviceId)s är \"%(fprint)s\" vilket inte matchar nyckel \"%(fingerprint)s\". Det kan betyda att kommunikationen är övervakad!" + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VARNING: NYCKELVERIFIERING MISSLYCKADES! Den signerade nyckeln för %(userId)s och sessionen %(deviceId)s är \"%(fprint)s\" vilket inte matchar den givna nyckeln \"%(fingerprint)s\". Detta kan betyda att kommunikationen är övervakad!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Signeringsnyckeln du gav matchar signeringsnyckeln du fick av %(userId)ss session %(deviceId)s. Sessionen markerades som verifierad.", + "Displays information about a user": "Visar information om en användare", + "Send a bug report with logs": "Skicka en buggrapport med loggar", + "Opens chat with the given user": "Öppnar en chatt med den valda användaren", + "Sends a message to the given user": "Skickar ett meddelande till den valda användaren", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s bytte rummets namn från %(oldRoomName)s till %(newRoomName)s.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s lade till de alternativa adresserna %(addresses)s till det här rummet.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s lade till den alternativa adressen %(addresses)s till det här rummet.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s tog bort de alternativa adresserna %(addresses)s från det här rummet.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s tog bort den alternativa adressen %(addresses)s från det här rummet.", + "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s ändrade de alternativa adresserna för det här rummet.", + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ändrade huvudadressen och de alternativa adresserna för det här rummet.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s ändrade adresserna för det här rummet.", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s tog bort en bannregel som matchar %(glob)s", + "%(senderName)s updated an invalid ban rule": "%(senderName)s uppdaterade en ogiltig bannregel", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s uppdaterade regeln som bannar användare som matchar %(glob)s på grund av %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s uppdaterade regeln som bannar rum som matchar %(glob)s på grund av %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s uppdaterade regeln som bannar servrar som matchar %(glob)s på grund av %(reason)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s uppdaterade en bannregel som matchar %(glob)s på grund av %(reason)s", + "Use bots, bridges, widgets and sticker packs": "Använd bottar, bryggor, widgets och dekalpaket" } From a732c55797599446c131e46ccc937859978ce5c6 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 21 Aug 2020 18:22:05 +0100 Subject: [PATCH 125/174] Add secret storage readiness checks This visits all places that were checking for cross-siging readiness and adapts them to also check for secret storage readiness if needed. Part of https://github.com/vector-im/element-web/issues/13895 --- src/DeviceListener.ts | 6 +++++- .../views/settings/CrossSigningPanel.js | 16 ++++++++++++---- src/i18n/strings/en_EN.json | 3 ++- src/rageshake/submit-rageshake.ts | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/DeviceListener.ts b/src/DeviceListener.ts index 6b667ae54d..b05f0fcd68 100644 --- a/src/DeviceListener.ts +++ b/src/DeviceListener.ts @@ -207,9 +207,13 @@ export default class DeviceListener { // (we add a listener on sync to do once check after the initial sync is done) if (!cli.isInitialSyncComplete()) return; + // JRS: This will change again in the next PR which moves secret storage + // later in the process. const crossSigningReady = await cli.isCrossSigningReady(); + const secretStorageReady = await cli.isSecretStorageReady(); + const allSystemsReady = crossSigningReady && secretStorageReady; - if (this.dismissedThisDeviceToast || crossSigningReady) { + if (this.dismissedThisDeviceToast || allSystemsReady) { hideSetupEncryptionToast(); } else if (this.shouldShowSetupEncryptionToast()) { // make sure our keys are finished downloading diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index 1c6baee9af..847bcf3da3 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -89,6 +89,7 @@ export default class CrossSigningPanel extends React.PureComponent { const homeserverSupportsCrossSigning = await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing"); const crossSigningReady = await cli.isCrossSigningReady(); + const secretStorageReady = await cli.isSecretStorageReady(); this.setState({ crossSigningPublicKeysOnDevice, @@ -101,6 +102,7 @@ export default class CrossSigningPanel extends React.PureComponent { secretStorageKeyInAccount, homeserverSupportsCrossSigning, crossSigningReady, + secretStorageReady, }); } @@ -151,6 +153,7 @@ export default class CrossSigningPanel extends React.PureComponent { secretStorageKeyInAccount, homeserverSupportsCrossSigning, crossSigningReady, + secretStorageReady, } = this.state; let errorSection; @@ -166,14 +169,19 @@ export default class CrossSigningPanel extends React.PureComponent { summarisedStatus =

{_t( "Your homeserver does not support cross-signing.", )}

; - } else if (crossSigningReady) { + } else if (crossSigningReady && secretStorageReady) { summarisedStatus =

✅ {_t( - "Cross-signing and secret storage are enabled.", + "Cross-signing and secret storage are ready for use.", + )}

; + } else if (crossSigningReady && !secretStorageReady) { + summarisedStatus =

✅ {_t( + "Cross-signing is ready for use, but secret storage is " + + "currently not being used to backup your keys.", )}

; } else if (crossSigningPrivateKeysInStorage) { summarisedStatus =

{_t( - "Your account has a cross-signing identity in secret storage, but it " + - "is not yet trusted by this session.", + "Your account has a cross-signing identity in secret storage, " + + "but it is not yet trusted by this session.", )}

; } else { summarisedStatus =

{_t( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c12b57c033..dc2669e20f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -645,7 +645,8 @@ "Confirm password": "Confirm password", "Change Password": "Change Password", "Your homeserver does not support cross-signing.": "Your homeserver does not support cross-signing.", - "Cross-signing and secret storage are enabled.": "Cross-signing and secret storage are enabled.", + "Cross-signing and secret storage are ready for use.": "Cross-signing and secret storage are ready for use.", + "Cross-signing is ready for use, but secret storage is currently not being used to backup your keys.": "Cross-signing is ready for use, but secret storage is currently not being used to backup your keys.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Reset cross-signing and secret storage": "Reset cross-signing and secret storage", diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index 74292749b9..448562b68a 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -115,6 +115,7 @@ async function collectBugReport(opts: IOpts = {}, gzipLogs = true) { body.append("cross_signing_supported_by_hs", String(await client.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing"))); body.append("cross_signing_ready", String(await client.isCrossSigningReady())); + body.append("secret_storage_ready", String(await client.isSecretStorageReady())); } } From d1150cd115906a1598988bc8cb6d8f34ba383753 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 11:01:51 +0000 Subject: [PATCH 126/174] Translated using Weblate (Swedish) Currently translated at 64.0% (1495 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 58279124fc..dcd0a8732a 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -659,8 +659,8 @@ "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sändrade sin avatar", "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sändrade sin avatar %(count)s gånger", "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sä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", + "%(items)s and %(count)s others|other": "%(items)s och %(count)s till", + "%(items)s and %(count)s others|one": "%(items)s och en till", "collapse": "fäll ihop", "expand": "fäll ut", "In reply to ": "Som svar på ", @@ -788,11 +788,11 @@ "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Glöm alla meddelanden som jag har skickat när mitt konto inaktiveras (Varning: 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:", "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.", - "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s 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.", + "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s samlar in anonym statistik 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 i våran statistik.", + "Learn more about how we use analytics.": "Läs mer om hur vi använder statistik.", "Analytics": "Statistik", - "Send analytics data": "Skicka analysdata", + "Send analytics data": "Skicka statistik", "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", @@ -840,7 +840,7 @@ "System Alerts": "Systemvarningar", "Sorry, your homeserver is too old to participate in this room.": "Tyvärr, din hemserver är för gammal för att delta i detta rum.", "Please contact your homeserver administrator.": "Vänligen kontakta din hemserver-administratör.", - "Please contact your service administrator to continue using the service.": "Kontakta din serviceadministratör för att fortsätta använda tjänsten.", + "Please contact your service administrator to continue using the service.": "Kontakta din tjänstadministratör för att fortsätta använda tjänsten.", "This homeserver has hit its Monthly Active User limit.": "Hemservern har nått sin månatliga gräns för användaraktivitet.", "This homeserver has exceeded one of its resource limits.": "Hemservern har överskridit en av sina resursgränser.", "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Ditt meddelande skickades inte för hemservern har nått sin månatliga gräns för användaraktivitet. Kontakta din serviceadministratör för att fortsätta använda servicen.", @@ -861,7 +861,7 @@ "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Hindra användare från att prata i den gamla rumsversionen och posta ett meddelande som rekommenderar användare att flytta till det nya rummet", "Put a link back to the old room at the start of the new room so people can see old messages": "Sätta en länk tillbaka till det gamla rummet i början av det nya rummet så att folk kan se gamla meddelanden", "Forces the current outbound group session in an encrypted room to be discarded": "Tvingar den aktuella utgående gruppsessionen i ett krypterat rum att överges", - "Unable to connect to Homeserver. Retrying...": "Det gick inte att ansluta till hemserver. Försöker igen ...", + "Unable to connect to Homeserver. Retrying...": "Det gick inte att ansluta till hemservern. Försöker igen…", "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s satte huvudadressen för detta rum till %(address)s.", "%(senderName)s removed the main address for this room.": "%(senderName)s tog bort huvudadressen för detta rum.", "Add some now": "Lägg till några nu", @@ -1209,7 +1209,7 @@ "Cancel All": "Avbryt alla", "Upload Error": "Uppladdningsfel", "Name or Matrix ID": "Namn eller Matrix-ID", - "Your %(brand)s is misconfigured": "%(brand)s är felkonfigurerat", + "Your %(brand)s is misconfigured": "Din %(brand)s är felkonfigurerad", "Call failed due to misconfigured server": "Anrop misslyckades på grund av felkonfigurerad server", "Try using turn.matrix.org": "Prova att använda turn.matrix.org", "The server does not support the room version specified.": "Servern stöder inte den angivna rumsversionen.", @@ -1227,7 +1227,7 @@ "%(senderName)s made no change.": "%(senderName)s gjorde ingen ändring.", "Cannot reach homeserver": "Kan inte nå hemservern", "Ensure you have a stable internet connection, or get in touch with the server admin": "Se till att du har en stabil internetanslutning, eller kontakta serveradministratören", - "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Be din %(brand)s-administratör att kontrollera din konfiguration efter felaktiga eller duplicerade poster.", + "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Be din %(brand)s-administratör att kolla din konfiguration efter felaktiga eller duplicerade poster.", "Cannot reach identity server": "Kan inte nå identitetsservern", "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kan registrera dig, men vissa funktioner kommer inte att vara tillgängliga förrän identitetsservern är online igen. Om du fortsätter att se den här varningen, kontrollera din konfiguration eller kontakta en serveradministratör.", "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kan återställa ditt lösenord, men vissa funktioner kommer inte att vara tillgängliga förrän identitetsservern är online igen. Om du fortsätter att se den här varningen, kontrollera din konfiguration eller kontakta en serveradministratör.", @@ -1566,5 +1566,23 @@ "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s uppdaterade regeln som bannar rum som matchar %(glob)s på grund av %(reason)s", "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s uppdaterade regeln som bannar servrar som matchar %(glob)s på grund av %(reason)s", "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s uppdaterade en bannregel som matchar %(glob)s på grund av %(reason)s", - "Use bots, bridges, widgets and sticker packs": "Använd bottar, bryggor, widgets och dekalpaket" + "Use bots, bridges, widgets and sticker packs": "Använd bottar, bryggor, widgets och dekalpaket", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s skapade en regel som bannar användare som matchar %(glob)s på grund av %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s skapade en regel som bannar rum som matchar %(glob)s på grund av %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s skapade en regel som bannar servrar som matchar %(glob)s på grund av %(reason)s", + "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s skapade en bannregel som matchar %(glob)s på grund av %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändrade en regel som bannade användare som matchade %(oldGlob)s till att matcha %(newGlob)s på grund av %(reason)s", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändrade en regel som bannade rum som matchade %(oldGlob)s till att matcha %(newGlob)s på grund av %(reason)s", + "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ändrade en regel som bannade servrar som matchade %(oldGlob)s till att matcha %(newGlob)s på grund av %(reason)s", + "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s uppdaterade en bannregel som matchade %(oldGlob)s till att matcha %(newGlob)s på grund av %(reason)s", + "Light": "Ljust", + "Dark": "Mörkt", + "You signed in to a new session without verifying it:": "Du loggade in i en ny session utan att verifiera den:", + "Verify your other session using one of the options below.": "Verifiera din andra session med ett av alternativen nedan.", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) loggade in i en ny session utan att verifiera den:", + "Ask this user to verify their session, or manually verify it below.": "Be den här användaren att verifiera sin session, eller verifiera den manuellt nedan.", + "Not Trusted": "Inte betrodd", + "Manually Verify by Text": "Verifiera manuellt med text", + "Interactively verify by Emoji": "Verifiera interaktivt med emoji", + "Done": "Klar" } From 6929b9af4140be6ac5a6f9f713335129e8354390 Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:02:28 +0000 Subject: [PATCH 127/174] Translated using Weblate (Swedish) Currently translated at 64.0% (1495 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index dcd0a8732a..883b26f601 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1584,5 +1584,6 @@ "Not Trusted": "Inte betrodd", "Manually Verify by Text": "Verifiera manuellt med text", "Interactively verify by Emoji": "Verifiera interaktivt med emoji", - "Done": "Klar" + "Done": "Klar", + "a few seconds ago": "Några sekunder sedan" } From d77d17d36c8043cface4ff6dcc6575748dda20fd Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:02:34 +0000 Subject: [PATCH 128/174] Translated using Weblate (Swedish) Currently translated at 64.0% (1496 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 883b26f601..2144ccaa3b 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1585,5 +1585,5 @@ "Manually Verify by Text": "Verifiera manuellt med text", "Interactively verify by Emoji": "Verifiera interaktivt med emoji", "Done": "Klar", - "a few seconds ago": "Några sekunder sedan" + "a few seconds ago": "några sekunder sedan" } From 58cbcb6cb4dd3151d6f4f6e4e5b566315e84cc6d Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:02:41 +0000 Subject: [PATCH 129/174] Translated using Weblate (Swedish) Currently translated at 64.0% (1496 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 2144ccaa3b..a91df57eae 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1585,5 +1585,6 @@ "Manually Verify by Text": "Verifiera manuellt med text", "Interactively verify by Emoji": "Verifiera interaktivt med emoji", "Done": "Klar", - "a few seconds ago": "några sekunder sedan" + "a few seconds ago": "några sekunder sedan", + "about a minute ago": "ca en minut sedan" } From aa84aae75b204bceaca1b65e37a7ddb3a24a3994 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:03:47 +0000 Subject: [PATCH 130/174] Translated using Weblate (Swedish) Currently translated at 64.1% (1497 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 a91df57eae..677daa7fb7 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1586,5 +1586,5 @@ "Interactively verify by Emoji": "Verifiera interaktivt med emoji", "Done": "Klar", "a few seconds ago": "några sekunder sedan", - "about a minute ago": "ca en minut sedan" + "about a minute ago": "cirka en minut sedan" } From d95ea83f5173ed92729c7d73d92ff09c92b73750 Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:03:56 +0000 Subject: [PATCH 131/174] Translated using Weblate (Swedish) Currently translated at 64.1% (1497 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 677daa7fb7..c3a1fc1499 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1586,5 +1586,6 @@ "Interactively verify by Emoji": "Verifiera interaktivt med emoji", "Done": "Klar", "a few seconds ago": "några sekunder sedan", - "about a minute ago": "cirka en minut sedan" + "about a minute ago": "cirka en minut sedan", + "%(num)s minutes ago": "minuter sedan" } From 13b5f8c844955e84e117006c0d36abd55ac035ff Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:04:06 +0000 Subject: [PATCH 132/174] Translated using Weblate (Swedish) Currently translated at 64.1% (1498 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 c3a1fc1499..c7822b1100 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1587,5 +1587,5 @@ "Done": "Klar", "a few seconds ago": "några sekunder sedan", "about a minute ago": "cirka en minut sedan", - "%(num)s minutes ago": "minuter sedan" + "%(num)s minutes ago": "%(num)s minuter sedan" } From a2917edd79c0a014d98a34b14aa81adcc286e378 Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:04:52 +0000 Subject: [PATCH 133/174] Translated using Weblate (Swedish) Currently translated at 64.1% (1498 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index c7822b1100..43ce727fd9 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1587,5 +1587,6 @@ "Done": "Klar", "a few seconds ago": "några sekunder sedan", "about a minute ago": "cirka en minut sedan", - "%(num)s minutes ago": "%(num)s minuter sedan" + "%(num)s minutes ago": "%(num)s minuter sedan", + "about an hour ago": "runt en timme sedan" } From db56eea18d13a240612c2a9e116d0954a7cc2846 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:04:57 +0000 Subject: [PATCH 134/174] Translated using Weblate (Swedish) Currently translated at 64.1% (1499 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 43ce727fd9..e812cc9e9c 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1588,5 +1588,5 @@ "a few seconds ago": "några sekunder sedan", "about a minute ago": "cirka en minut sedan", "%(num)s minutes ago": "%(num)s minuter sedan", - "about an hour ago": "runt en timme sedan" + "about an hour ago": "cirka en timme sedan" } From 654b861dfd8c47c06010ca61d92ea4cb4e800952 Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:05:04 +0000 Subject: [PATCH 135/174] Translated using Weblate (Swedish) Currently translated at 64.1% (1499 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index e812cc9e9c..b71cfb5575 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1588,5 +1588,6 @@ "a few seconds ago": "några sekunder sedan", "about a minute ago": "cirka en minut sedan", "%(num)s minutes ago": "%(num)s minuter sedan", - "about an hour ago": "cirka en timme sedan" + "about an hour ago": "cirka en timme sedan", + "%(num)s hours ago": "timmar sedan" } From 9ff3944adf7fffa183170dcd2eddfd7df09634bc Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:05:10 +0000 Subject: [PATCH 136/174] Translated using Weblate (Swedish) Currently translated at 64.2% (1500 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 b71cfb5575..f31c835cdc 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1589,5 +1589,5 @@ "about a minute ago": "cirka en minut sedan", "%(num)s minutes ago": "%(num)s minuter sedan", "about an hour ago": "cirka en timme sedan", - "%(num)s hours ago": "timmar sedan" + "%(num)s hours ago": "%(num)s timmar sedan" } From d88444e45ff0f128fa2ac60a76341378af7caa7c Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:05:18 +0000 Subject: [PATCH 137/174] Translated using Weblate (Swedish) Currently translated at 64.2% (1500 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index f31c835cdc..5ddb1745a9 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1589,5 +1589,6 @@ "about a minute ago": "cirka en minut sedan", "%(num)s minutes ago": "%(num)s minuter sedan", "about an hour ago": "cirka en timme sedan", - "%(num)s hours ago": "%(num)s timmar sedan" + "%(num)s hours ago": "%(num)s timmar sedan", + "about a day ago": "runt en dag sedan" } From aabe21c38af8b473d8d88be51bc0f8769c9b21b3 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:05:23 +0000 Subject: [PATCH 138/174] Translated using Weblate (Swedish) Currently translated at 64.2% (1501 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 5ddb1745a9..48ff697bc7 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1590,5 +1590,5 @@ "%(num)s minutes ago": "%(num)s minuter sedan", "about an hour ago": "cirka en timme sedan", "%(num)s hours ago": "%(num)s timmar sedan", - "about a day ago": "runt en dag sedan" + "about a day ago": "cirka en dag sedan" } From e8b5ebf8eea71aaa62465ada65b9769ba7dfa8d0 Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:05:26 +0000 Subject: [PATCH 139/174] Translated using Weblate (Swedish) Currently translated at 64.2% (1501 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 48ff697bc7..ac99e1cf00 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1590,5 +1590,6 @@ "%(num)s minutes ago": "%(num)s minuter sedan", "about an hour ago": "cirka en timme sedan", "%(num)s hours ago": "%(num)s timmar sedan", - "about a day ago": "cirka en dag sedan" + "about a day ago": "cirka en dag sedan", + "%(num)s days ago": "dagar sedan" } From a50fac3a6bd5e27b6130502136c8fc2fdc2beabd Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:05:31 +0000 Subject: [PATCH 140/174] Translated using Weblate (Swedish) Currently translated at 64.3% (1502 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-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 ac99e1cf00..aa6511be83 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1591,5 +1591,5 @@ "about an hour ago": "cirka en timme sedan", "%(num)s hours ago": "%(num)s timmar sedan", "about a day ago": "cirka en dag sedan", - "%(num)s days ago": "dagar sedan" + "%(num)s days ago": "%(num)s dagar sedan" } From 66ca67bc67866893f038239ca79e31aeaab79482 Mon Sep 17 00:00:00 2001 From: purjolini Date: Tue, 25 Aug 2020 15:06:39 +0000 Subject: [PATCH 141/174] Translated using Weblate (Swedish) Currently translated at 64.3% (1502 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index aa6511be83..73e32d98ae 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1591,5 +1591,6 @@ "about an hour ago": "cirka en timme sedan", "%(num)s hours ago": "%(num)s timmar sedan", "about a day ago": "cirka en dag sedan", - "%(num)s days ago": "%(num)s dagar sedan" + "%(num)s days ago": "%(num)s dagar sedan", + "a few seconds from now": "några sekunder från nu" } From 2d4ac548d0e709b594c08d0358fbea0d364f044f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 24 Aug 2020 19:19:28 -0600 Subject: [PATCH 142/174] Override invite metadata if the server wants a group profile --- src/components/views/rooms/RoomPreviewBar.js | 28 +++++- src/components/views/rooms/RoomTile.tsx | 28 ++++-- src/stores/CommunityPrototypeStore.ts | 100 +++++++++++++++++++ 3 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 src/stores/CommunityPrototypeStore.ts diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js index d52bbbb0d0..dc3893785d 100644 --- a/src/components/views/rooms/RoomPreviewBar.js +++ b/src/components/views/rooms/RoomPreviewBar.js @@ -26,6 +26,8 @@ import classNames from 'classnames'; import { _t } from '../../../languageHandler'; import SdkConfig from "../../../SdkConfig"; import IdentityAuthClient from '../../../IdentityAuthClient'; +import {CommunityPrototypeStore} from "../../../stores/CommunityPrototypeStore"; +import {UPDATE_EVENT} from "../../../stores/AsyncStore"; const MessageCase = Object.freeze({ NotLoggedIn: "NotLoggedIn", @@ -100,6 +102,7 @@ export default createReactClass({ componentDidMount: function() { this._checkInvitedEmail(); + CommunityPrototypeStore.instance.on(UPDATE_EVENT, this._onCommunityUpdate); }, componentDidUpdate: function(prevProps, prevState) { @@ -108,6 +111,10 @@ export default createReactClass({ } }, + componentWillUnmount: function() { + CommunityPrototypeStore.instance.off(UPDATE_EVENT, this._onCommunityUpdate); + }, + _checkInvitedEmail: async function() { // If this is an invite and we've been told what email address was // invited, fetch the user's account emails and discovery bindings so we @@ -143,6 +150,13 @@ export default createReactClass({ } }, + _onCommunityUpdate: function (roomId) { + if (this.props.room && this.props.room.roomId !== roomId) { + return; + } + this.forceUpdate(); // we have nothing to update + }, + _getMessageCase() { const isGuest = MatrixClientPeg.get().isGuest(); @@ -219,8 +233,15 @@ export default createReactClass({ } }, + _communityProfile: function() { + if (this.props.room) return CommunityPrototypeStore.instance.getInviteProfile(this.props.room.roomId); + return {displayName: null, avatarMxc: null}; + }, + _roomName: function(atStart = false) { - const name = this.props.room ? this.props.room.name : this.props.roomAlias; + let name = this.props.room ? this.props.room.name : this.props.roomAlias; + const profile = this._communityProfile(); + if (profile.displayName) name = profile.displayName; if (name) { return name; } else if (atStart) { @@ -439,7 +460,10 @@ export default createReactClass({ } case MessageCase.Invite: { const RoomAvatar = sdk.getComponent("views.avatars.RoomAvatar"); - const avatar = ; + const oobData = Object.assign({}, this.props.oobData, { + avatarUrl: this._communityProfile().avatarMxc, + }); + const avatar = ; const inviteMember = this._getInviteMember(); let inviterElement; diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index 0c99b98e1a..a09853d762 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -27,7 +27,7 @@ import defaultDispatcher from '../../../dispatcher/dispatcher'; import { Key } from "../../../Keyboard"; import ActiveRoomObserver from "../../../ActiveRoomObserver"; import { _t } from "../../../languageHandler"; -import { ChevronFace, ContextMenuTooltipButton, MenuItemRadio } from "../../structures/ContextMenu"; +import { ChevronFace, ContextMenuTooltipButton } from "../../structures/ContextMenu"; import { DefaultTagID, TagID } from "../../../stores/room-list/models"; import { MessagePreviewStore, ROOM_PREVIEW_CHANGED } from "../../../stores/room-list/MessagePreviewStore"; import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar"; @@ -47,8 +47,11 @@ import { PROPERTY_UPDATED } from "../../../stores/local-echo/GenericEchoChamber" import IconizedContextMenu, { IconizedContextMenuCheckbox, IconizedContextMenuOption, - IconizedContextMenuOptionList, IconizedContextMenuRadio + IconizedContextMenuOptionList, + IconizedContextMenuRadio } from "../context_menus/IconizedContextMenu"; +import { CommunityPrototypeStore, IRoomProfile } from "../../../stores/CommunityPrototypeStore"; +import { UPDATE_EVENT } from "../../../stores/AsyncStore"; interface IProps { room: Room; @@ -101,6 +104,7 @@ export default class RoomTile extends React.PureComponent { this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); this.roomProps = EchoChamber.forRoom(this.props.room); this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate); + CommunityPrototypeStore.instance.on(UPDATE_EVENT, this.onCommunityUpdate); } private onNotificationUpdate = () => { @@ -140,6 +144,7 @@ export default class RoomTile extends React.PureComponent { defaultDispatcher.unregister(this.dispatcherRef); MessagePreviewStore.instance.off(ROOM_PREVIEW_CHANGED, this.onRoomPreviewChanged); this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); + CommunityPrototypeStore.instance.off(UPDATE_EVENT, this.onCommunityUpdate); } private onAction = (payload: ActionPayload) => { @@ -150,6 +155,11 @@ export default class RoomTile extends React.PureComponent { } }; + private onCommunityUpdate = (roomId: string) => { + if (roomId !== this.props.room.roomId) return; + this.forceUpdate(); // we don't have anything to actually update + }; + private onRoomPreviewChanged = (room: Room) => { if (this.props.room && room.roomId === this.props.room.roomId) { // generatePreview() will return nothing if the user has previews disabled @@ -461,11 +471,21 @@ export default class RoomTile extends React.PureComponent { 'mx_RoomTile_minimized': this.props.isMinimized, }); + let roomProfile: IRoomProfile = {displayName: null, avatarMxc: null}; + if (this.props.tag === DefaultTagID.Invite) { + roomProfile = CommunityPrototypeStore.instance.getInviteProfile(this.props.room.roomId); + } + + let name = roomProfile.displayName || this.props.room.name; + if (typeof name !== 'string') name = ''; + name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon + const roomAvatar = ; let badge: React.ReactNode; @@ -482,10 +502,6 @@ export default class RoomTile extends React.PureComponent { ); } - let name = this.props.room.name; - if (typeof name !== 'string') name = ''; - name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon - let messagePreview = null; if (this.showMessagePreview && this.state.messagePreview) { messagePreview = ( diff --git a/src/stores/CommunityPrototypeStore.ts b/src/stores/CommunityPrototypeStore.ts new file mode 100644 index 0000000000..581f8a97c8 --- /dev/null +++ b/src/stores/CommunityPrototypeStore.ts @@ -0,0 +1,100 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { AsyncStoreWithClient } from "./AsyncStoreWithClient"; +import defaultDispatcher from "../dispatcher/dispatcher"; +import { ActionPayload } from "../dispatcher/payloads"; +import { Room } from "matrix-js-sdk/src/models/room"; +import { EffectiveMembership, getEffectiveMembership } from "../utils/membership"; +import SettingsStore from "../settings/SettingsStore"; +import * as utils from "matrix-js-sdk/src/utils"; +import { UPDATE_EVENT } from "./AsyncStore"; + +interface IState { + // nothing of value - we use account data +} + +export interface IRoomProfile { + displayName: string; + avatarMxc: string; +} + +export class CommunityPrototypeStore extends AsyncStoreWithClient { + private static internalInstance = new CommunityPrototypeStore(); + + private constructor() { + super(defaultDispatcher, {}); + } + + public static get instance(): CommunityPrototypeStore { + return CommunityPrototypeStore.internalInstance; + } + + protected async onAction(payload: ActionPayload): Promise { + if (!this.matrixClient || !SettingsStore.getValue("feature_communities_v2_prototypes")) { + return; + } + + if (payload.action === "MatrixActions.Room.myMembership") { + const room: Room = payload.room; + const membership = getEffectiveMembership(payload.membership); + const oldMembership = getEffectiveMembership(payload.oldMembership); + if (membership === oldMembership) return; + + if (membership === EffectiveMembership.Invite) { + try { + const path = utils.encodeUri("/rooms/$roomId/group_info", {$roomId: room.roomId}); + const profile = await this.matrixClient._http.authedRequest( + undefined, "GET", path, + undefined, undefined, + {prefix: "/_matrix/client/unstable/im.vector.custom"}); + // we use global account data because per-room account data on invites is unreliable + await this.matrixClient.setAccountData("im.vector.group_info." + room.roomId, profile); + } catch (e) { + console.warn("Non-fatal error getting group information for invite:", e); + } + } + } else if (payload.action === "MatrixActions.accountData") { + if (payload.event_type.startsWith("im.vector.group_info.")) { + this.emit(UPDATE_EVENT, payload.event_type.substring("im.vector.group_info.".length)); + } + } + } + + public getInviteProfile(roomId: string): IRoomProfile { + if (!this.matrixClient) return {displayName: null, avatarMxc: null}; + const room = this.matrixClient.getRoom(roomId); + if (SettingsStore.getValue("feature_communities_v2_prototypes")) { + const data = this.matrixClient.getAccountData("im.vector.group_info." + roomId); + if (data && data.getContent()) { + return {displayName: data.getContent().name, avatarMxc: data.getContent().avatar_url}; + } + } + return {displayName: room.name, avatarMxc: room.avatar_url}; + } + + protected async onReady(): Promise { + for (const room of this.matrixClient.getRooms()) { + const myMember = room.currentState.getMembers().find(m => m.userId === this.matrixClient.getUserId()); + if (!myMember) continue; + if (getEffectiveMembership(myMember.membership) === EffectiveMembership.Invite) { + // Fake an update for anything that might have started listening before the invite + // data was available (eg: RoomPreviewBar after a refresh) + this.emit(UPDATE_EVENT, room.roomId); + } + } + } +} From 65fe562cbf54db4b8da8ef67d15a659dea225ef8 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 24 Aug 2020 22:38:24 -0600 Subject: [PATCH 143/174] Select new tag after creating the group --- src/components/views/dialogs/CreateGroupDialog.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/views/dialogs/CreateGroupDialog.js b/src/components/views/dialogs/CreateGroupDialog.js index d8a8b96961..2b22054947 100644 --- a/src/components/views/dialogs/CreateGroupDialog.js +++ b/src/components/views/dialogs/CreateGroupDialog.js @@ -88,6 +88,13 @@ export default createReactClass({ action: 'view_room', room_id: result.room_id, }); + + // Ensure the tag gets selected now that we've created it + dis.dispatch({action: 'deselect_tags'}, true); + dis.dispatch({ + action: 'select_tag', + tag: result.group_id, + }); } else { dis.dispatch({ action: 'view_group', From 8feda74156263680e0f39c46cffb6a271503ab35 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 24 Aug 2020 22:40:43 -0600 Subject: [PATCH 144/174] Wire up TagPanel's create button to the dialog --- src/components/structures/TagPanel.js | 24 +++++++++++++++++++----- src/i18n/strings/en_EN.json | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 3acec417f2..4acbc49d4d 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -146,6 +146,24 @@ const TagPanel = createReactClass({ mx_TagPanel_items_selected: itemsSelected, }); + let createButton = ( + + ); + + if (SettingsStore.getValue("feature_communities_v2_prototypes")) { + createButton = ( + + ); + } + return

{ clearButton } @@ -168,11 +186,7 @@ const TagPanel = createReactClass({ { this.renderGlobalIcon() } { tags }
- + {createButton}
{ provided.placeholder }
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c12b57c033..d052ba5a51 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2091,6 +2091,7 @@ "Click to mute video": "Click to mute video", "Click to unmute audio": "Click to unmute audio", "Click to mute audio": "Click to mute audio", + "Create community": "Create community", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.", "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.", "Failed to load timeline position": "Failed to load timeline position", From 7c1a9993e3c47c90abb6ec7557578908d5f96901 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 25 Aug 2020 13:58:15 -0600 Subject: [PATCH 145/174] Add new create group dialog --- res/css/_components.scss | 2 + .../dialogs/_PrototypeCreateGroupDialog.scss | 102 ++++++++ res/css/views/elements/_InfoTooltip.scss | 34 +++ res/img/element-icons/add-photo.svg | 5 + res/img/element-icons/info.svg | 4 + src/components/structures/MatrixChat.tsx | 6 +- src/components/views/dialogs/IDialogProps.ts | 19 ++ .../dialogs/PrototypeCreateGroupDialog.tsx | 217 ++++++++++++++++++ .../views/dialogs/ServerOfflineDialog.tsx | 4 +- src/components/views/dialogs/ShareDialog.tsx | 4 +- src/components/views/elements/InfoTooltip.tsx | 73 ++++++ src/i18n/strings/en_EN.json | 9 + 12 files changed, 474 insertions(+), 5 deletions(-) create mode 100644 res/css/views/dialogs/_PrototypeCreateGroupDialog.scss create mode 100644 res/css/views/elements/_InfoTooltip.scss create mode 100644 res/img/element-icons/add-photo.svg create mode 100644 res/img/element-icons/info.svg create mode 100644 src/components/views/dialogs/IDialogProps.ts create mode 100644 src/components/views/dialogs/PrototypeCreateGroupDialog.tsx create mode 100644 src/components/views/elements/InfoTooltip.tsx diff --git a/res/css/_components.scss b/res/css/_components.scss index 5145133127..60725ff5d4 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -72,6 +72,7 @@ @import "./views/dialogs/_KeyboardShortcutsDialog.scss"; @import "./views/dialogs/_MessageEditHistoryDialog.scss"; @import "./views/dialogs/_NewSessionReviewDialog.scss"; +@import "./views/dialogs/_PrototypeCreateGroupDialog.scss"; @import "./views/dialogs/_RoomSettingsDialog.scss"; @import "./views/dialogs/_RoomSettingsDialogBridges.scss"; @import "./views/dialogs/_RoomUpgradeDialog.scss"; @@ -106,6 +107,7 @@ @import "./views/elements/_FormButton.scss"; @import "./views/elements/_IconButton.scss"; @import "./views/elements/_ImageView.scss"; +@import "./views/elements/_InfoTooltip.scss"; @import "./views/elements/_InlineSpinner.scss"; @import "./views/elements/_ManageIntegsButton.scss"; @import "./views/elements/_PowerSelector.scss"; diff --git a/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss b/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss new file mode 100644 index 0000000000..a0f505b1ff --- /dev/null +++ b/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss @@ -0,0 +1,102 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_PrototypeCreateGroupDialog { + .mx_Dialog_content { + display: flex; + flex-direction: row; + margin-bottom: 12px; + + .mx_PrototypeCreateGroupDialog_colName { + flex-basis: 66.66%; + padding-right: 100px; + + .mx_Field input { + font-size: $font-16px; + line-height: $font-20px; + } + + .mx_PrototypeCreateGroupDialog_subtext { + display: block; + color: $muted-fg-color; + margin-bottom: 16px; + + &:last-child { + margin-top: 16px; + } + + &.mx_PrototypeCreateGroupDialog_subtext_error { + color: $warning-color; + } + } + + .mx_PrototypeCreateGroupDialog_communityId { + position: relative; + + .mx_InfoTooltip { + float: right; + } + } + + .mx_AccessibleButton { + display: block; + height: 32px; + font-size: $font-16px; + line-height: 32px; + } + } + + .mx_PrototypeCreateGroupDialog_colAvatar { + flex-basis: 33.33%; + + .mx_PrototypeCreateGroupDialog_avatarContainer { + margin-top: 12px; + margin-bottom: 20px; + + .mx_PrototypeCreateGroupDialog_avatar, + .mx_PrototypeCreateGroupDialog_placeholderAvatar { + width: 96px; + height: 96px; + border-radius: 96px; + } + + .mx_PrototypeCreateGroupDialog_placeholderAvatar { + background-color: #368BD6; // hardcoded for both themes + + &::before { + display: inline-block; + background-color: #fff; // hardcoded because the background is + mask-repeat: no-repeat; + mask-size: 96px; + width: 96px; + height: 96px; + mask-position: center; + content: ''; + vertical-align: middle; + mask-image: url('$(res)/img/element-icons/add-photo.svg'); + } + } + } + + .mx_PrototypeCreateGroupDialog_tip { + &>b, &>span { + display: block; + color: $muted-fg-color; + } + } + } + } +} diff --git a/res/css/views/elements/_InfoTooltip.scss b/res/css/views/elements/_InfoTooltip.scss new file mode 100644 index 0000000000..5858a60629 --- /dev/null +++ b/res/css/views/elements/_InfoTooltip.scss @@ -0,0 +1,34 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_InfoTooltip_icon { + width: 16px; + height: 16px; + display: inline-block; +} + +.mx_InfoTooltip_icon::before { + display: inline-block; + background-color: $muted-fg-color; + mask-repeat: no-repeat; + mask-size: 16px; + width: 16px; + height: 16px; + mask-position: center; + content: ''; + vertical-align: middle; + mask-image: url('$(res)/img/element-icons/info.svg'); +} diff --git a/res/img/element-icons/add-photo.svg b/res/img/element-icons/add-photo.svg new file mode 100644 index 0000000000..bde5253bea --- /dev/null +++ b/res/img/element-icons/add-photo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/res/img/element-icons/info.svg b/res/img/element-icons/info.svg new file mode 100644 index 0000000000..b5769074ab --- /dev/null +++ b/res/img/element-icons/info.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index a10af429b9..2b764d00c9 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -77,6 +77,7 @@ import ErrorDialog from "../views/dialogs/ErrorDialog"; import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore"; import { SettingLevel } from "../../settings/SettingLevel"; import { leaveRoomBehaviour } from "../../utils/membership"; +import PrototypeCreateGroupDialog from "../views/dialogs/PrototypeCreateGroupDialog"; /** constants for MatrixChat.state.view */ export enum Views { @@ -620,7 +621,10 @@ export default class MatrixChat extends React.PureComponent { this.createRoom(payload.public); break; case 'view_create_group': { - const CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog"); + let CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog") + if (SettingsStore.getValue("feature_communities_v2_prototypes")) { + CreateGroupDialog = PrototypeCreateGroupDialog; + } Modal.createTrackedDialog('Create Community', '', CreateGroupDialog); break; } diff --git a/src/components/views/dialogs/IDialogProps.ts b/src/components/views/dialogs/IDialogProps.ts new file mode 100644 index 0000000000..1027ca7607 --- /dev/null +++ b/src/components/views/dialogs/IDialogProps.ts @@ -0,0 +1,19 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +export interface IDialogProps { + onFinished: (bool) => void; +} diff --git a/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx b/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx new file mode 100644 index 0000000000..7427b2737c --- /dev/null +++ b/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx @@ -0,0 +1,217 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React, { ChangeEvent } from 'react'; +import BaseDialog from "./BaseDialog"; +import { _t } from "../../../languageHandler"; +import { IDialogProps } from "./IDialogProps"; +import Field from "../elements/Field"; +import AccessibleButton from "../elements/AccessibleButton"; +import { MatrixClientPeg } from "../../../MatrixClientPeg"; +import InfoTooltip from "../elements/InfoTooltip"; +import dis from "../../../dispatcher/dispatcher"; + +interface IProps extends IDialogProps { +} + +interface IState { + name: string; + localpart: string; + error: string; + busy: boolean; + avatarFile: File; + avatarPreview: string; +} + +export default class PrototypeCreateGroupDialog extends React.PureComponent { + private avatarUploadRef: React.RefObject = React.createRef(); + + constructor(props: IProps) { + super(props); + + this.state = { + name: "", + localpart: "", + error: null, + busy: false, + avatarFile: null, + avatarPreview: null, + }; + } + + private onNameChange = (ev: ChangeEvent) => { + const localpart = (ev.target.value || "").toLowerCase().replace(/[^a-z0-9.\-_]/g, '-'); + this.setState({name: ev.target.value, localpart}); + }; + + private onSubmit = async (ev) => { + ev.preventDefault(); + ev.stopPropagation(); + + if (this.state.busy) return; + + // We'll create the community now to see if it's taken, leaving it active in + // the background for the user to look at while they invite people. + this.setState({busy: true}); + try { + let avatarUrl = null; + if (this.state.avatarFile) { + avatarUrl = await MatrixClientPeg.get().uploadContent(this.state.avatarFile); + } + + const result = await MatrixClientPeg.get().createGroup({ + localpart: this.state.localpart, + profile: { + name: this.state.name, + avatar_url: avatarUrl, + }, + }); + + // Ensure the tag gets selected now that we've created it + dis.dispatch({action: 'deselect_tags'}, true); + dis.dispatch({ + action: 'select_tag', + tag: result.group_id, + }); + + if (result.room_id) { + dis.dispatch({ + action: 'view_room', + room_id: result.room_id, + }); + } else { + dis.dispatch({ + action: 'view_group', + group_id: result.group_id, + group_is_new: true, + }); + } + + // TODO: Show invite dialog + } catch (e) { + console.error(e); + this.setState({ + busy: false, + error: _t( + "There was an error creating your community. The name may be taken or the " + + "server is unable to process your request.", + ), + }); + } + }; + + private onAvatarChanged = (e: ChangeEvent) => { + if (!e.target.files || !e.target.files.length) { + this.setState({avatarFile: null}); + } else { + this.setState({busy: true}); + const file = e.target.files[0]; + const reader = new FileReader(); + reader.onload = (ev: ProgressEvent) => { + this.setState({avatarFile: file, busy: false, avatarPreview: ev.target.result as string}); + }; + reader.readAsDataURL(file); + } + }; + + private onChangeAvatar = () => { + if (this.avatarUploadRef.current) this.avatarUploadRef.current.click(); + }; + + public render() { + let communityId = null; + if (this.state.localpart) { + communityId = ( + + {_t("Community ID: +:%(domain)s", { + domain: MatrixClientPeg.getHomeserverName(), + }, { + localpart: () => {this.state.localpart}, + })} + + + ); + } + + let helpText = ( + + {_t("You can change this later if needed.")} + + ); + if (this.state.error) { + helpText = ( + + {this.state.error} + + ); + } + + let preview = ; + if (!this.state.avatarPreview) { + preview =
+ } + + return ( + +
+
+
+ + {helpText} + + {/*nbsp is to reserve the height of this element when there's nothing*/} +  {communityId} + + + {_t("Create")} + +
+
+ + + {preview} + +
+ {_t("PRO TIP")} + + {_t("An image will help people identify your community.")} + +
+
+
+
+
+ ); + } +} diff --git a/src/components/views/dialogs/ServerOfflineDialog.tsx b/src/components/views/dialogs/ServerOfflineDialog.tsx index f6767dcb8d..81f628343b 100644 --- a/src/components/views/dialogs/ServerOfflineDialog.tsx +++ b/src/components/views/dialogs/ServerOfflineDialog.tsx @@ -27,9 +27,9 @@ import Spinner from "../elements/Spinner"; import AccessibleButton from "../elements/AccessibleButton"; import { UPDATE_EVENT } from "../../../stores/AsyncStore"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - onFinished: (bool) => void; +interface IProps extends IDialogProps { } export default class ServerOfflineDialog extends React.PureComponent { diff --git a/src/components/views/dialogs/ShareDialog.tsx b/src/components/views/dialogs/ShareDialog.tsx index dc2a987f13..22f83d391c 100644 --- a/src/components/views/dialogs/ShareDialog.tsx +++ b/src/components/views/dialogs/ShareDialog.tsx @@ -31,6 +31,7 @@ import {toRightOf} from "../../structures/ContextMenu"; import {copyPlaintext, selectText} from "../../../utils/strings"; import StyledCheckbox from '../elements/StyledCheckbox'; import AccessibleTooltipButton from '../elements/AccessibleTooltipButton'; +import { IDialogProps } from "./IDialogProps"; const socials = [ { @@ -60,8 +61,7 @@ const socials = [ }, ]; -interface IProps { - onFinished: () => void; +interface IProps extends IDialogProps { target: Room | User | Group | RoomMember | MatrixEvent; permalinkCreator: RoomPermalinkCreator; } diff --git a/src/components/views/elements/InfoTooltip.tsx b/src/components/views/elements/InfoTooltip.tsx new file mode 100644 index 0000000000..645951aab9 --- /dev/null +++ b/src/components/views/elements/InfoTooltip.tsx @@ -0,0 +1,73 @@ +/* +Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> +Copyright 2019 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import classNames from 'classnames'; + +import AccessibleButton from "./AccessibleButton"; +import Tooltip from './Tooltip'; +import { _t } from "../../../languageHandler"; + +interface ITooltipProps { + tooltip?: React.ReactNode; + tooltipClassName?: string; +} + +interface IState { + hover: boolean; +} + +export default class InfoTooltip extends React.PureComponent { + constructor(props: ITooltipProps) { + super(props); + this.state = { + hover: false, + }; + } + + onMouseOver = () => { + this.setState({ + hover: true, + }); + }; + + onMouseLeave = () => { + this.setState({ + hover: false, + }); + }; + + render() { + const {tooltip, children, tooltipClassName} = this.props; + const title = _t("Information"); + + // Tooltip are forced on the right for a more natural feel to them on info icons + const tip = this.state.hover ? :
; + return ( +
+ + {children} + {tip} +
+ ); + } +} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d052ba5a51..9a246a421d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1484,6 +1484,7 @@ "Rotate Right": "Rotate Right", "Rotate clockwise": "Rotate clockwise", "Download this file": "Download this file", + "Information": "Information", "Language Dropdown": "Language Dropdown", "Manage Integrations": "Manage Integrations", "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", @@ -1728,6 +1729,14 @@ "Use this session to verify your new one, granting it access to encrypted messages:": "Use this session to verify your new one, granting it access to encrypted messages:", "If you didn’t sign in to this session, your account may be compromised.": "If you didn’t sign in to this session, your account may be compromised.", "This wasn't me": "This wasn't me", + "There was an error creating your community. The name may be taken or the server is unable to process your request.": "There was an error creating your community. The name may be taken or the server is unable to process your request.", + "Community ID: +:%(domain)s": "Community ID: +:%(domain)s", + "Use this when referencing your community to others. The community ID cannot be changed.": "Use this when referencing your community to others. The community ID cannot be changed.", + "You can change this later if needed.": "You can change this later if needed.", + "What's the name of your community or team?": "What's the name of your community or team?", + "Enter name": "Enter name", + "PRO TIP": "PRO TIP", + "An image will help people identify your community.": "An image will help people identify your community.", "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.", "Report bugs & give feedback": "Report bugs & give feedback", From 56c7f8698330569367de839f45f36c944eff6f16 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 25 Aug 2020 21:02:32 -0600 Subject: [PATCH 146/174] Add an invite users to community step to dialog flow --- res/css/_components.scss | 1 + .../_PrototypeCommunityInviteDialog.scss | 88 ++++++ src/RoomInvite.js | 16 +- src/components/views/dialogs/InviteDialog.js | 4 +- .../PrototypeCommunityInviteDialog.tsx | 252 ++++++++++++++++++ .../dialogs/PrototypeCreateGroupDialog.tsx | 9 +- src/i18n/strings/en_EN.json | 12 +- 7 files changed, 371 insertions(+), 11 deletions(-) create mode 100644 res/css/views/dialogs/_PrototypeCommunityInviteDialog.scss create mode 100644 src/components/views/dialogs/PrototypeCommunityInviteDialog.tsx diff --git a/res/css/_components.scss b/res/css/_components.scss index 60725ff5d4..88fbbb5c3e 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -72,6 +72,7 @@ @import "./views/dialogs/_KeyboardShortcutsDialog.scss"; @import "./views/dialogs/_MessageEditHistoryDialog.scss"; @import "./views/dialogs/_NewSessionReviewDialog.scss"; +@import "./views/dialogs/_PrototypeCommunityInviteDialog.scss"; @import "./views/dialogs/_PrototypeCreateGroupDialog.scss"; @import "./views/dialogs/_RoomSettingsDialog.scss"; @import "./views/dialogs/_RoomSettingsDialogBridges.scss"; diff --git a/res/css/views/dialogs/_PrototypeCommunityInviteDialog.scss b/res/css/views/dialogs/_PrototypeCommunityInviteDialog.scss new file mode 100644 index 0000000000..8d2ff598d8 --- /dev/null +++ b/res/css/views/dialogs/_PrototypeCommunityInviteDialog.scss @@ -0,0 +1,88 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_PrototypeCommunityInviteDialog { + &.mx_Dialog_fixedWidth { + width: 360px; + } + + .mx_Dialog_content { + margin-bottom: 0; + + .mx_PrototypeCommunityInviteDialog_people { + position: relative; + margin-bottom: 4px; + + .mx_AccessibleButton { + display: inline-block; + background-color: $focus-bg-color; // XXX: Abuse of variables + border-radius: 4px; + padding: 3px 5px; + font-size: $font-12px; + float: right; + } + } + + .mx_PrototypeCommunityInviteDialog_morePeople { + margin-top: 8px; + } + + .mx_PrototypeCommunityInviteDialog_person { + position: relative; + margin-top: 4px; + + & > * { + vertical-align: middle; + } + + .mx_Checkbox { + position: absolute; + right: 0; + top: calc(50% - 8px); // checkbox is 16px high + width: 16px; // to force a square + } + + .mx_PrototypeCommunityInviteDialog_personIdentifiers { + display: inline-block; + + & > * { + display: block; + } + + .mx_PrototypeCommunityInviteDialog_personName { + font-weight: 600; + font-size: $font-14px; + color: $primary-fg-color; + margin-left: 7px; + } + + .mx_PrototypeCommunityInviteDialog_personId { + font-size: $font-12px; + color: $muted-fg-color; + margin-left: 7px; + } + } + } + + .mx_PrototypeCommunityInviteDialog_primaryButton { + display: block; + font-size: $font-13px; + line-height: 20px; + height: 20px; + margin-top: 24px; + } + } +} diff --git a/src/RoomInvite.js b/src/RoomInvite.js index 839d677069..3347a8288d 100644 --- a/src/RoomInvite.js +++ b/src/RoomInvite.js @@ -23,6 +23,7 @@ import Modal from './Modal'; import * as sdk from './'; import { _t } from './languageHandler'; import {KIND_DM, KIND_INVITE} from "./components/views/dialogs/InviteDialog"; +import PrototypeCommunityInviteDialog from "./components/views/dialogs/PrototypeCommunityInviteDialog"; /** * Invites multiple addresses to a room @@ -56,6 +57,13 @@ export function showRoomInviteDialog(roomId) { ); } +export function showCommunityRoomInviteDialog(roomId, communityName) { + Modal.createTrackedDialog( + 'Invite Users to Community', '', PrototypeCommunityInviteDialog, {communityName, roomId}, + /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, + ); +} + /** * Checks if the given MatrixEvent is a valid 3rd party user invite. * @param {MatrixEvent} event The event to check @@ -77,7 +85,7 @@ export function isValid3pidInvite(event) { export function inviteUsersToRoom(roomId, userIds) { return inviteMultipleToRoom(roomId, userIds).then((result) => { const room = MatrixClientPeg.get().getRoom(roomId); - return _showAnyInviteErrors(result.states, room, result.inviter); + showAnyInviteErrors(result.states, room, result.inviter); }).catch((err) => { console.error(err.stack); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); @@ -88,7 +96,7 @@ export function inviteUsersToRoom(roomId, userIds) { }); } -function _showAnyInviteErrors(addrs, room, inviter) { +export function showAnyInviteErrors(addrs, room, inviter) { // Show user any errors const failedUsers = Object.keys(addrs).filter(a => addrs[a] === 'error'); if (failedUsers.length === 1 && inviter.fatal) { @@ -100,6 +108,7 @@ function _showAnyInviteErrors(addrs, room, inviter) { title: _t("Failed to invite users to the room:", {roomName: room.name}), description: inviter.getErrorText(failedUsers[0]), }); + return false; } else { const errorList = []; for (const addr of failedUsers) { @@ -118,8 +127,9 @@ function _showAnyInviteErrors(addrs, room, inviter) { title: _t("Failed to invite the following users to the %(roomName)s room:", {roomName: room.name}), description, }); + return false; } } - return addrs; + return true; } diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index c90811ed5a..6cd0b22505 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -327,7 +327,7 @@ export default class InviteDialog extends React.PureComponent { this.state = { targets: [], // array of Member objects (see interface above) filterText: "", - recents: this._buildRecents(alreadyInvited), + recents: InviteDialog.buildRecents(alreadyInvited), numRecentsShown: INITIAL_ROOMS_SHOWN, suggestions: this._buildSuggestions(alreadyInvited), numSuggestionsShown: INITIAL_ROOMS_SHOWN, @@ -344,7 +344,7 @@ export default class InviteDialog extends React.PureComponent { this._editorRef = createRef(); } - _buildRecents(excludedTargetIds: Set): {userId: string, user: RoomMember, lastActive: number} { + static buildRecents(excludedTargetIds: Set): {userId: string, user: RoomMember, lastActive: number} { const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room // Also pull in all the rooms tagged as DefaultTagID.DM so we don't miss anything. Sometimes the diff --git a/src/components/views/dialogs/PrototypeCommunityInviteDialog.tsx b/src/components/views/dialogs/PrototypeCommunityInviteDialog.tsx new file mode 100644 index 0000000000..08d3f0208a --- /dev/null +++ b/src/components/views/dialogs/PrototypeCommunityInviteDialog.tsx @@ -0,0 +1,252 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React, { ChangeEvent, FormEvent } from 'react'; +import BaseDialog from "./BaseDialog"; +import { _t } from "../../../languageHandler"; +import { IDialogProps } from "./IDialogProps"; +import Field from "../elements/Field"; +import AccessibleButton from "../elements/AccessibleButton"; +import { MatrixClientPeg } from "../../../MatrixClientPeg"; +import InfoTooltip from "../elements/InfoTooltip"; +import dis from "../../../dispatcher/dispatcher"; +import {showCommunityRoomInviteDialog} from "../../../RoomInvite"; +import { arrayFastClone } from "../../../utils/arrays"; +import SdkConfig from "../../../SdkConfig"; +import { RoomMember } from "matrix-js-sdk/src/models/room-member"; +import InviteDialog from "./InviteDialog"; +import BaseAvatar from "../avatars/BaseAvatar"; +import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; +import {inviteMultipleToRoom, showAnyInviteErrors} from "../../../RoomInvite"; +import {humanizeTime} from "../../../utils/humanize"; +import StyledCheckbox from "../elements/StyledCheckbox"; +import Modal from "../../../Modal"; +import ErrorDialog from "./ErrorDialog"; + +interface IProps extends IDialogProps { + roomId: string; + communityName: string; +} + +interface IPerson { + userId: string; + user: RoomMember; + lastActive: number; +} + +interface IState { + emailTargets: string[]; + userTargets: string[]; + showPeople: boolean; + people: IPerson[]; + numPeople: number; + busy: boolean; +} + +export default class PrototypeCommunityInviteDialog extends React.PureComponent { + constructor(props: IProps) { + super(props); + + this.state = { + emailTargets: [], + userTargets: [], + showPeople: false, + people: this.buildSuggestions(), + numPeople: 5, // arbitrary default + busy: false, + }; + } + + private buildSuggestions(): IPerson[] { + const alreadyInvited = new Set([MatrixClientPeg.get().getUserId(), SdkConfig.get()['welcomeUserId']]); + if (this.props.roomId) { + const room = MatrixClientPeg.get().getRoom(this.props.roomId); + if (!room) throw new Error("Room ID given to InviteDialog does not look like a room"); + room.getMembersWithMembership('invite').forEach(m => alreadyInvited.add(m.userId)); + room.getMembersWithMembership('join').forEach(m => alreadyInvited.add(m.userId)); + // add banned users, so we don't try to invite them + room.getMembersWithMembership('ban').forEach(m => alreadyInvited.add(m.userId)); + } + + return InviteDialog.buildRecents(alreadyInvited); + } + + private onSubmit = async (ev: FormEvent) => { + ev.preventDefault(); + ev.stopPropagation(); + + this.setState({busy: true}); + try { + const targets = [...this.state.emailTargets, ...this.state.userTargets]; + const result = await inviteMultipleToRoom(this.props.roomId, targets); + const room = MatrixClientPeg.get().getRoom(this.props.roomId); + const success = showAnyInviteErrors(result.states, room, result.inviter); + if (success) { + this.props.onFinished(true); + } else { + this.setState({busy: false}); + } + } catch (e) { + this.setState({busy: false}); + console.error(e); + Modal.createTrackedDialog('Failed to invite', '', ErrorDialog, { + title: _t("Failed to invite"), + description: ((e && e.message) ? e.message : _t("Operation failed")), + }); + } + }; + + private onAddressChange = (ev: ChangeEvent, index: number) => { + const targets = arrayFastClone(this.state.emailTargets); + if (index >= targets.length) { + targets.push(ev.target.value); + } else { + targets[index] = ev.target.value; + } + this.setState({emailTargets: targets}); + }; + + private onAddressBlur = (index: number) => { + const targets = arrayFastClone(this.state.emailTargets); + if (index >= targets.length) return; // not important + if (targets[index].trim() === "") { + targets.splice(index, 1); + this.setState({emailTargets: targets}); + } + }; + + private onShowPeopleClick = () => { + this.setState({showPeople: !this.state.showPeople}); + }; + + private setPersonToggle = (person: IPerson, selected: boolean) => { + const targets = arrayFastClone(this.state.userTargets); + if (selected && !targets.includes(person.userId)) { + targets.push(person.userId); + } else if (!selected && targets.includes(person.userId)) { + targets.splice(targets.indexOf(person.userId), 1); + } + this.setState({userTargets: targets}); + }; + + private renderPerson(person: IPerson, key: any) { + const avatarSize = 36; + return ( +
+ +
+ {person.user.name} + {person.userId} +
+ this.setPersonToggle(person, e.target.checked)} /> +
+ ); + } + + private onShowMorePeople = () => { + this.setState({numPeople: this.state.numPeople + 5}); // arbitrary increase + }; + + public render() { + const emailAddresses = []; + this.state.emailTargets.forEach((address, i) => { + emailAddresses.push( + this.onAddressChange(e, i)} + label={_t("Email address")} + placeholder={_t("Email address")} + onBlur={() => this.onAddressBlur(i)} + /> + ); + }); + + // Push a clean input + emailAddresses.push( + this.onAddressChange(e, emailAddresses.length)} + label={emailAddresses.length > 0 ? _t("Add another email") : _t("Email address")} + placeholder={emailAddresses.length > 0 ? _t("Add another email") : _t("Email address")} + /> + ); + + let peopleIntro = null; + let people = []; + if (this.state.showPeople) { + const humansToPresent = this.state.people.slice(0, this.state.numPeople); + humansToPresent.forEach((person, i) => { + people.push(this.renderPerson(person, i)); + }); + if (humansToPresent.length < this.state.people.length) { + people.push( + {_t("Show more")} + ); + } + } + if (this.state.people.length > 0) { + peopleIntro = ( +
+ {_t("People you know on %(brand)s", {brand: SdkConfig.get().brand})} + + {this.state.showPeople ? _t("Hide") : _t("Show")} + +
+ ); + } + + let buttonText = _t("Skip"); + const targetCount = this.state.userTargets.length + this.state.emailTargets.length; + if (targetCount > 0) { + buttonText = _t("Send %(count)s invites", {count: targetCount}); + } + + return ( + +
+
+ {emailAddresses} + {peopleIntro} + {people} + {buttonText} +
+
+
+ ); + } +} diff --git a/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx b/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx index 7427b2737c..8978b9cf0d 100644 --- a/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx +++ b/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx @@ -23,6 +23,7 @@ import AccessibleButton from "../elements/AccessibleButton"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import InfoTooltip from "../elements/InfoTooltip"; import dis from "../../../dispatcher/dispatcher"; +import {showCommunityRoomInviteDialog} from "../../../RoomInvite"; interface IProps extends IDialogProps { } @@ -67,7 +68,7 @@ export default class PrototypeCreateGroupDialog extends React.PureComponent:%(domain)s": "Community ID: +:%(domain)s", "Use this when referencing your community to others. The community ID cannot be changed.": "Use this when referencing your community to others. The community ID cannot be changed.", @@ -1783,9 +1792,7 @@ "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.", "Verification Pending": "Verification Pending", "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.", - "Email address": "Email address", "This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.", - "Skip": "Skip", "A username can only contain lower case letters, numbers and '=_-./'": "A username can only contain lower case letters, numbers and '=_-./'", "Username not available": "Username not available", "Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s", @@ -1898,7 +1905,6 @@ "Set status": "Set status", "Set a new status...": "Set a new status...", "View Community": "View Community", - "Hide": "Hide", "Reload": "Reload", "Take picture": "Take picture", "Remove for everyone": "Remove for everyone", From 5ea11e90b2d5289619b42390b439605832067fee Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 25 Aug 2020 21:17:35 -0600 Subject: [PATCH 147/174] Appease the style linter --- res/css/views/dialogs/_PrototypeCreateGroupDialog.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss b/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss index a0f505b1ff..3235575a88 100644 --- a/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss +++ b/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss @@ -74,7 +74,7 @@ limitations under the License. } .mx_PrototypeCreateGroupDialog_placeholderAvatar { - background-color: #368BD6; // hardcoded for both themes + background-color: #368bd6; // hardcoded for both themes &::before { display: inline-block; @@ -92,7 +92,7 @@ limitations under the License. } .mx_PrototypeCreateGroupDialog_tip { - &>b, &>span { + & > b, & > span { display: block; color: $muted-fg-color; } From c9e967f05cb3abd9884064bcfb5f7dabaae8f0b7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 25 Aug 2020 14:23:18 -0600 Subject: [PATCH 148/174] Don't override UserMenu with group changes --- src/components/structures/UserMenu.tsx | 43 ++------------------------ 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/src/components/structures/UserMenu.tsx b/src/components/structures/UserMenu.tsx index 839d4bccda..30be71abcb 100644 --- a/src/components/structures/UserMenu.tsx +++ b/src/components/structures/UserMenu.tsx @@ -42,9 +42,6 @@ import IconizedContextMenu, { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../views/context_menus/IconizedContextMenu"; -import TagOrderStore from "../../stores/TagOrderStore"; -import * as fbEmitter from "fbemitter"; -import FlairStore from "../../stores/FlairStore"; interface IProps { isMinimized: boolean; @@ -55,16 +52,11 @@ type PartialDOMRect = Pick; interface IState { contextMenuPosition: PartialDOMRect; isDarkTheme: boolean; - selectedCommunityProfile: { - displayName: string; - avatarMxc: string; - }; } export default class UserMenu extends React.Component { private dispatcherRef: string; private themeWatcherRef: string; - private tagStoreRef: fbEmitter.EventSubscription; private buttonRef: React.RefObject = createRef(); constructor(props: IProps) { @@ -73,7 +65,6 @@ export default class UserMenu extends React.Component { this.state = { contextMenuPosition: null, isDarkTheme: this.isUserOnDarkTheme(), - selectedCommunityProfile: null, }; OwnProfileStore.instance.on(UPDATE_EVENT, this.onProfileUpdate); @@ -86,7 +77,6 @@ export default class UserMenu extends React.Component { public componentDidMount() { this.dispatcherRef = defaultDispatcher.register(this.onAction); this.themeWatcherRef = SettingsStore.watchSetting("theme", null, this.onThemeChanged); - this.tagStoreRef = TagOrderStore.addListener(this.onTagStoreUpdate); } public componentWillUnmount() { @@ -103,25 +93,6 @@ export default class UserMenu extends React.Component { return theme === "dark"; } - private onTagStoreUpdate = async () => { - if (!SettingsStore.getValue("feature_communities_v2_prototypes")) { - return; - } - - const selectedId = TagOrderStore.getSelectedTags()[0]; - if (!selectedId) { - this.setState({selectedCommunityProfile: null}); - return; - } - - // For some reason the group's profile info isn't on the js-sdk Group object but - // is in the flair store, so get it from there. - const profile = await FlairStore.getGroupProfileCached(MatrixClientPeg.get(), selectedId); - const displayName = profile.name || selectedId; - const avatarMxc = profile.avatarUrl; - this.setState({selectedCommunityProfile: {displayName, avatarMxc}}); - }; - private onProfileUpdate = async () => { // the store triggered an update, so force a layout update. We don't // have any state to store here for that to magically happen. @@ -324,18 +295,8 @@ export default class UserMenu extends React.Component { public render() { const avatarSize = 32; // should match border-radius of the avatar - let displayName = OwnProfileStore.instance.displayName || MatrixClientPeg.get().getUserId(); - let avatarUrl = OwnProfileStore.instance.getHttpAvatarUrl(avatarSize); - - if (this.state.selectedCommunityProfile) { - displayName = this.state.selectedCommunityProfile.displayName - const mxc = this.state.selectedCommunityProfile.avatarMxc; - if (mxc) { - avatarUrl = MatrixClientPeg.get().mxcUrlToHttp(mxc, avatarSize, avatarSize); - } else { - avatarUrl = null; - } - } + const displayName = OwnProfileStore.instance.displayName || MatrixClientPeg.get().getUserId(); + const avatarUrl = OwnProfileStore.instance.getHttpAvatarUrl(avatarSize); let name = {displayName}; let buttons = ( From 20c562c2086fed80fd4dfa111c4e7e7f06507e85 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 25 Aug 2020 21:45:38 -0600 Subject: [PATCH 149/174] Change user avatar to a home icon --- res/css/structures/_TagPanel.scss | 44 +++++++++++++++++-- res/img/element-icons/home.svg | 3 ++ src/components/views/elements/TagTile.js | 4 +- src/components/views/elements/UserTagTile.tsx | 31 ++++--------- 4 files changed, 54 insertions(+), 28 deletions(-) create mode 100644 res/img/element-icons/home.svg diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index 6c85341aaf..e7f67c8ace 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -75,6 +75,7 @@ limitations under the License. .mx_TagPanel .mx_TagTile { // opacity: 0.5; position: relative; + padding: 3px; } .mx_TagPanel .mx_TagTile:focus, .mx_TagPanel .mx_TagTile:hover, @@ -82,6 +83,45 @@ limitations under the License. // opacity: 1; } +.mx_TagPanel .mx_TagTile.mx_TagTile_selected_prototype { + background-color: $primary-bg-color; + border-radius: 6px; +} + +.mx_TagTile_selected_prototype { + .mx_TagTile_homeIcon::before { + background-color: $primary-fg-color; // dark-on-light + } +} + +.mx_TagTile:not(.mx_TagTile_selected_prototype) .mx_TagTile_homeIcon { + background-color: $icon-button-color; // XXX: Variable abuse + border-radius: 48px; + + &::before { + background-color: $primary-bg-color; // light-on-grey + } +} + +.mx_TagTile_homeIcon { + width: 32px; + height: 32px; + position: relative; + + &::before { + mask-image: url('$(res)/img/element-icons/home.svg'); + mask-position: center; + mask-repeat: no-repeat; + width: 21px; + height: 21px; + content: ''; + display: inline-block; + position: absolute; + top: calc(50% - 10.5px); + left: calc(50% - 10.5px); + } +} + .mx_TagPanel .mx_TagTile_plus { margin-bottom: 12px; height: 32px; @@ -116,10 +156,6 @@ limitations under the License. border-radius: 0 3px 3px 0; } -.mx_TagPanel .mx_TagTile.mx_TagTile_large.mx_TagTile_selected::before { - left: -10px; -} - .mx_TagPanel .mx_TagTile.mx_AccessibleButton:focus { filter: none; } diff --git a/res/img/element-icons/home.svg b/res/img/element-icons/home.svg new file mode 100644 index 0000000000..d65812cafd --- /dev/null +++ b/res/img/element-icons/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/views/elements/TagTile.js b/src/components/views/elements/TagTile.js index 49b336a577..562a478976 100644 --- a/src/components/views/elements/TagTile.js +++ b/src/components/views/elements/TagTile.js @@ -141,9 +141,11 @@ export default createReactClass({ profile.avatarUrl, avatarHeight, avatarHeight, "crop", ) : null; + const isPrototype = SettingsStore.getValue("feature_communities_v2_prototypes"); const className = classNames({ mx_TagTile: true, - mx_TagTile_selected: this.props.selected, + mx_TagTile_selected: this.props.selected && !isPrototype, + mx_TagTile_selected_prototype: this.props.selected && isPrototype, }); const badge = TagOrderStore.getGroupBadge(this.props.tag); diff --git a/src/components/views/elements/UserTagTile.tsx b/src/components/views/elements/UserTagTile.tsx index c652423753..635c537324 100644 --- a/src/components/views/elements/UserTagTile.tsx +++ b/src/components/views/elements/UserTagTile.tsx @@ -16,16 +16,14 @@ limitations under the License. import React from "react"; import defaultDispatcher from "../../../dispatcher/dispatcher"; -import { OwnProfileStore } from "../../../stores/OwnProfileStore"; -import { UPDATE_EVENT } from "../../../stores/AsyncStore"; import * as fbEmitter from "fbemitter"; import TagOrderStore from "../../../stores/TagOrderStore"; import AccessibleTooltipButton from "./AccessibleTooltipButton"; -import BaseAvatar from "../avatars/BaseAvatar"; -import { MatrixClientPeg } from "../../../MatrixClientPeg"; import classNames from "classnames"; +import { _t } from "../../../languageHandler"; -interface IProps{} +interface IProps { +} interface IState { selected: boolean; @@ -43,18 +41,13 @@ export default class UserTagTile extends React.PureComponent { } public componentDidMount() { - OwnProfileStore.instance.on(UPDATE_EVENT, this.onProfileUpdate); this.tagStoreRef = TagOrderStore.addListener(this.onTagStoreUpdate); } public componentWillUnmount() { - OwnProfileStore.instance.off(UPDATE_EVENT, this.onProfileUpdate); + this.tagStoreRef.remove(); } - private onProfileUpdate = () => { - this.forceUpdate(); - }; - private onTagStoreUpdate = () => { const selected = TagOrderStore.getSelectedTags().length === 0; this.setState({selected}); @@ -71,27 +64,19 @@ export default class UserTagTile extends React.PureComponent { public render() { // XXX: We reuse TagTile classes for ease of demonstration - we should probably generify // TagTile instead if we continue to use this component. - const avatarHeight = 36; - const name = OwnProfileStore.instance.displayName || MatrixClientPeg.get().getUserId(); const className = classNames({ mx_TagTile: true, - mx_TagTile_selected: this.state.selected, - mx_TagTile_large: true, + mx_TagTile_selected_prototype: this.state.selected, + mx_TagTile_home: true, }); return (
- +
); From 55001f319327d16acbbed92ecdd1da023bd3c52b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 25 Aug 2020 21:52:48 -0600 Subject: [PATCH 150/174] Select the general chat for a community when viewing it --- src/stores/TagOrderStore.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/stores/TagOrderStore.js b/src/stores/TagOrderStore.js index 2b72a963b0..f02fce0769 100644 --- a/src/stores/TagOrderStore.js +++ b/src/stores/TagOrderStore.js @@ -166,6 +166,25 @@ class TagOrderStore extends Store { selectedTags: newTags, }); + if (!allowMultiple && newTags.length === 1) { + // We're in prototype behaviour: select the general chat for the community + const rooms = GroupStore.getGroupRooms(newTags[0]) + .map(r => MatrixClientPeg.get().getRoom(r.roomId)) + .filter(r => !!r); + let chat = rooms.find(r => { + const idState = r.currentState.getStateEvents("im.vector.general_chat", ""); + if (!idState || idState.getContent()['groupId'] !== newTags[0]) return false; + return true; + }); + if (!chat) chat = rooms[0]; + if (chat) { + dis.dispatch({ + action: 'view_room', + room_id: chat.roomId, + }); + } + } + Analytics.trackEvent('FilterStore', 'select_tag'); } break; From c68636bd32c4d2bae47d8efc5d7020542232f48a Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 25 Aug 2020 21:59:09 -0600 Subject: [PATCH 151/174] i18n updates --- src/i18n/strings/en_EN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c12b57c033..1fed9e0619 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1555,6 +1555,7 @@ "And %(count)s more...|other": "And %(count)s more...", "ex. @bob:example.com": "ex. @bob:example.com", "Add User": "Add User", + "Home": "Home", "Enter a server name": "Enter a server name", "Looks good": "Looks good", "Can't find this server or its room list": "Can't find this server or its room list", @@ -2097,7 +2098,6 @@ "Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others", "Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other", - "Home": "Home", "Switch to light mode": "Switch to light mode", "Switch to dark mode": "Switch to dark mode", "Switch theme": "Switch theme", From a5606c505192002e8811d4ac9daf437691caaa70 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 25 Aug 2020 08:46:59 +0000 Subject: [PATCH 152/174] Translated using Weblate (Albanian) Currently translated at 99.7% (2331 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 726508ebb2..c156e3bad3 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2417,5 +2417,10 @@ "Explore all public rooms": "Eksploroni krejt dhomat publike", "%(count)s results|other": "%(count)s përfundime", "Preparing to download logs": "Po bëhet gati për shkarkim regjistrash", - "Download logs": "Shkarko regjistra" + "Download logs": "Shkarko regjistra", + "Unexpected server error trying to leave the room": "Gabim i papritur shërbyesi në përpjekje për dalje nga dhoma", + "Error leaving room": "Gabim në dalje nga dhoma", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototipe bashkësie v2. Lyp shërbyes Home të përputhshëm. Tejet eksperimentale - përdoreni me kujdes.", + "Explore rooms in %(communityName)s": "Eksploroni dhoma në %(communityName)s", + "Set up Secure Backup": "Ujdisni Kopjeruajtje të Sigurt" } From 252e5e6aff416fc2be3782c96a2bf8c798282c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanislav=20Luke=C5=A1?= Date: Tue, 25 Aug 2020 21:16:13 +0000 Subject: [PATCH 153/174] Translated using Weblate (Czech) Currently translated at 93.2% (2179 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 51 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 7f799072cb..4d9d27363f 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2164,5 +2164,54 @@ "Add users and servers you want to ignore here. Use asterisks to have %(brand)s match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Sem přídejte servery a uživatele, které chcete ignorovat. Hvězdička pro %(brand)s zastupuje libovolný počet kterýchkoliv znaků. Např. @bot:* bude ignorovat všechny uživatele se jménem „bot“ na kterémkoliv serveru.", "Signature upload success": "Podpis úspěšně nahrán", "Signature upload failed": "Podpis se nepodařilo nahrát", - "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Je-li jiná verze programu %(brand)s stále otevřená na jiné kartě, tak ji prosím zavřete, neboť užívání programu %(brand)s stejným hostitelem se zpožděným nahráváním současně povoleným i zakázaným bude působit problémy." + "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Je-li jiná verze programu %(brand)s stále otevřená na jiné kartě, tak ji prosím zavřete, neboť užívání programu %(brand)s stejným hostitelem se zpožděným nahráváním současně povoleným i zakázaným bude působit problémy.", + "Unexpected server error trying to leave the room": "Neočekávaná chyba serveru při odcházení z místnosti", + "The person who invited you already left the room.": "Uživatel který vás pozval už místnosti není.", + "The person who invited you already left the room, or their server is offline.": "Uživatel který vás pozvat už odešel z místnosti a nebo je jeho server offline.", + "You left the call": "Odešli jste z hovoru", + "%(senderName)s left the call": "%(senderName)s opustil/a hovor", + "Call ended": "Hovor skončil", + "You started a call": "Začali jste hovor", + "%(senderName)s started a call": "%(senderName)s začal/a hovor", + "Waiting for answer": "Čekání na odpověď", + "%(senderName)s is calling": "%(senderName)s volá", + "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s", + "%(senderName)s: %(message)s": "%(senderName)s: %(message)s", + "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", + "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", + "Change notification settings": "Upravit nastavení oznámení", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototyp komunit verze 2. Vyžaduje kompatibilní domovský server. Experimentální - používejte opatrně.", + "Use custom size": "Použít vlastní velikost", + "Use a more compact ‘Modern’ layout": "Používat kompaktní ‘Moderní’ vzhled", + "Use a system font": "Používat systémové nastavení písma", + "System font name": "Jméno systémového písma", + "Uploading logs": "Nahrávání záznamů", + "Downloading logs": "Stahování záznamů", + "Unknown caller": "Neznámý volající", + "Incoming voice call": "Příchozí hovor", + "Incoming video call": "Příchozí videohovor", + "Incoming call": "Příchozí hovor", + "Your server isn't responding to some requests.": "Váš server neodpovídá na některé požadavky.", + "Master private key:": "Hlavní soukromý klíč:", + "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s nemůže v prohlížeči lokálně bezpečně uložit zprávy. Použijte %(brand)s Desktop aby fungovalo vyhledávání v šifrovaných zprávách.", + "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Váš administrátor vypnul šifrování ve výchozím nastavení soukromých místností a přímých chatů.", + "To link to this room, please add an address.": "Přidejte prosím místnosti adresu aby na ní šlo odkazovat.", + "The authenticity of this encrypted message can't be guaranteed on this device.": "Pravost této šifrované zprávy nelze na tomto zařízení ověřit.", + "Emoji picker": "Výběr emoji", + "No recently visited rooms": "Žádné nedávno navštívené místnosti", + "People": "Lidé", + "Explore public rooms": "Prozkoumat veřejné místnosti", + "Custom Tag": "Vlastní štítek", + "Can't see what you’re looking for?": "Nikde nevidíte co hledáte?", + "Explore all public rooms": "Prozkoumat všechny veřejné místnosti", + "%(count)s results|other": "%(count)s výsledků", + "Preparing to download logs": "Příprava na stažení záznamů", + "Download logs": "Stáhnout záznamy", + "a new cross-signing key signature": "nový podpis klíče pro cross-signing", + "a key signature": "podpis klíče", + "%(brand)s encountered an error during upload of:": "%(brand)s narazil na chybu při nahrávání:", + "Upload completed": "Nahrávání dokončeno", + "Cancelled signature upload": "Nahrávání podpisu zrušeno", + "Unable to upload": "Nelze nahrát", + "Server isn't responding": "Server neodpovídá" } From efdffb096d5ae85bf6bea0c27a23dcd08c9299d8 Mon Sep 17 00:00:00 2001 From: Michael Albert Date: Tue, 25 Aug 2020 08:40:38 +0000 Subject: [PATCH 154/174] Translated using Weblate (German) Currently translated at 100.0% (2337 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 300d694ea3..9515a57f8f 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2420,5 +2420,8 @@ "Preparing to download logs": "Bereite das Herunterladen der Protokolle vor", "Download logs": "Protokolle herunterladen", "Unexpected server error trying to leave the room": "Unerwarteter Server-Fehler beim Versuch den Raum zu verlassen", - "Error leaving room": "Fehler beim Verlassen des Raums" + "Error leaving room": "Fehler beim Verlassen des Raums", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Communities v2 Prototyp. Benötigt einen kompatiblen Heimserver. Höchst experimentell - mit Vorsicht verwenden.", + "Explore rooms in %(communityName)s": "Erkunde Räume in %(communityName)s", + "Set up Secure Backup": "Sicherung einrichten" } From bd434bcf8870fbec6a7ef1b23784e8bb0abb0c49 Mon Sep 17 00:00:00 2001 From: notramo Date: Tue, 25 Aug 2020 09:00:19 +0000 Subject: [PATCH 155/174] Translated using Weblate (Hungarian) Currently translated at 99.5% (2325 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index d2581b4405..71dab37a55 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1630,7 +1630,7 @@ "%(role)s in %(roomName)s": "%(role)s a szobában: %(roomName)s", "Messages in this room are end-to-end encrypted.": "Az üzenetek a szobában végponttól végpontig titkosítottak.", "Security": "Biztonság", - "Verify": "Ellenőriz", + "Verify": "Ellenőrzés", "Any of the following data may be shared:": "Az alábbi adatok közül bármelyik megosztásra kerülhet:", "Your display name": "Megjelenítési neved", "Your avatar URL": "Profilképed URL-je", @@ -2234,7 +2234,7 @@ "Emoji picker": "Emodzsi választó", "No recently visited rooms": "Nincsenek nemrégiben meglátogatott szobák", "People": "Emberek", - "Sort by": "Rendezve:", + "Sort by": "Rendezés", "Unread rooms": "Olvasatlan szobák", "Always show first": "Mindig az elsőt mutatja", "Show": "Mutat", From 5857ebcb03ddd1d4e03608d3a8d029d0365adced Mon Sep 17 00:00:00 2001 From: ziriSut Date: Tue, 25 Aug 2020 08:12:34 +0000 Subject: [PATCH 156/174] Translated using Weblate (Kabyle) Currently translated at 86.6% (2025 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 115 +++++++++++++++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 861ed40033..9af55c0793 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -1961,5 +1961,118 @@ "Save your Security Key": "Sekles tasarut-ik·im n tɣellist", "Unable to set up secret storage": "Asbadu n uklas uffir d awezɣi", "Paperclip": "Tamessakt n lkaɣeḍ", - "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Tettḥeqqeḍ? Ad tesruḥeḍ iznan-ik•im yettwawgelhen ma tisura-k•m ur klisent ara akken ilaq." + "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Tettḥeqqeḍ? Ad tesruḥeḍ iznan-ik•im yettwawgelhen ma tisura-k•m ur klisent ara akken ilaq.", + "Cactus": "Akermus", + "Enter keywords separated by a comma:": "Sekcem awalen uffiren gar-asen tafrayt:", + "Add an email address to configure email notifications": "Rnu tansa n yimayl i uswel n yilɣa s yimayl", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Ilɣa deg wawalen-a ufranen i d-iteddun ṭṭafaren ilugan ur yezmiren ara ad d-ttwaskanen ara da:", + "Unable to fetch notification target list": "D awazɣi ad d-nerr tabdart n yisaḍasen n yilɣa", + "There are advanced notifications which are not shown here.": "Llan yilɣa leqqayen ur d-nettwaskan ara da.", + "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Ahat tsewleḍ-ten deg yimsaɣ-nniḍen mačči deg %(brand)s. Ur tezmireḍ ara ad ten-tṣeggmeḍ deg %(brand)s maca mazal-iten teddun.", + "Show message in desktop notification": "Sken-d iznan deg yilɣa n tnarit", + "Identity Server URL must be HTTPS": "URL n uqeddac n timagit ilaq ad yili d HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Aqeddac n timagit mačči d ameɣtu (status code %(code)s)", + "Could not connect to Identity Server": "Ur izmir ara ad yeqqen ɣer uqeddac n timagit", + "Disconnect from the identity server and connect to instead?": "Ffeɣ seg tuqqna n uqeddac n timagit syen qqen ɣer deg wadeg-is?", + "Terms of service not accepted or the identity server is invalid.": "Tiwtilin n uqeddac ur ttwaqbalent ara neɣ aqeddac n timagit d arameɣtu.", + "The identity server you have chosen does not have any terms of service.": "Aqeddac n timagit i tferneḍ ulac akk ɣer-s tiwtilin n uqeddac.", + "Disconnect identity server": "Ffeɣ seg tuqqna n uqeddac n timagit", + "Disconnect from the identity server ?": "Ffeɣ seg tuqqna n uqeddac n timagi t?", + "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Ilaq-ak·am ad tekkseḍ isefka-inek·inem udmawanen seg uqeddac n timagit send ad teffɣeḍ seg tuqqna. Nesḥassef, aqeddac n timagit akka tura ha-t beṛṛa n tuqqna neɣ awwaḍ ɣer-s ulamek.", + "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "senqed izegrar n yiming-ik·im i kra n wayen i izemren ad isewḥel aqeddac n timagit (am Privacy Badger)", + "contact the administrators of identity server ": "nermes inedbalen n uqeddac n timagit ", + "You are still sharing your personal data on the identity server .": "Mazal-ik·ikem tbeṭṭuḍ isefka-inek·inem udmawanen ɣef uqeddac n timagit .", + "Error encountered (%(errorDetail)s).": "Tuccaḍ i d-yettwamuggren (%(errorDetail)s).", + "Custom font size can only be between %(min)s pt and %(max)s pt": "Teɣzi n tsefsit tudmawant tezmer kan ad tili gar %(min)s pt d %(max)s pt", + "Error downloading theme information.": "Tuccḍa deg usali n telɣut n usentel.", + "Set the name of a font installed on your system & %(brand)s will attempt to use it.": "Sbadu isem n tsefsit yettwasbedden ɣef unagraw-ik·im & %(brand)s ad yeɛreḍ ad t-isseqdec.", + "Appearance Settings only affect this %(brand)s session.": "Ala iɣewwaren n urwes i izemren ad beddlen kra deg tɣimit-a %(brand)s.", + "Deactivating your account is a permanent action - be careful!": "Asensi n umiḍan-inek·inem d ayen ara yilin i lebda - Ɣur-k·m!", + "For help with using %(brand)s, click here.": "I tallalt n useqdec n %(brand)s, sit dagi.", + "For help with using %(brand)s, click here or start a chat with our bot using the button below.": "I tallalt ɣef useqdec n %(brand)s, sit dagi neɣ bdu adiwenni d wabuṭ-nneɣ s useqdec n tqeffalt ddaw.", + "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.": "Ma yella tuzneḍ ugur deg Github, iɣmisen n temseɣtit zemren ad aɣ-ɛiwnen ad negzu ugur. Iɣmisen n temseɣtit deg-sen isefka n useqdec n usnas am yisem n useqdec, am yisulayen neɣ am yismawen i yettunefken i texxamin neɣ i yigrawen ɣer wuɣur terziḍ d yismawen n useqdac n yiseqdacen-nniḍen. Ulac deg-sen iznan.", + "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "I wakken ad d-tazneḍ ugur n tɣellist i icudden ɣer Matrix, ttxil-k·m ɣer tasertit n ukcaf n tɣellist deg Matrix.org.", + "Add users and servers you want to ignore here. Use asterisks to have %(brand)s match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Rnu dagi iseqdacen d yiqeddacen i tebɣiḍ ad tzegleḍ. Seqdec izamelen n yitran i wakken %(brand)s ad yemṣada d yal asekkil. D amedya, @bot:* izeggel akk iseqdacen i yesɛan isem \"abuṭ\" ɣef yal aqeddac.", + "Subscribing to a ban list will cause you to join it!": "Amulteɣ ɣer tebdart n tegtin ad ak·akem-yawi ad tettekkiḍ deg-s!", + "If this isn't what you want, please use a different tool to ignore users.": "Ma yella ayagi mačči d ayen i tebɣiḍ, ttxil-k·m seqdec afecku-nniḍen i wakken ad tzegleḍ iseqdacen.", + "Room ID or address of ban list": "Asulay n texxamt neɣ tansa n tebdart n tegtin", + "Start automatically after system login": "Bdu s wudem awurman seld tuqqna ɣer unagraw", + "Always show the window menu bar": "Afeggag n wumuɣ n usfaylu eǧǧ-it yettban", + "Show tray icon and minimize window to it on close": "Sken tagnit n ufeggag n waddad, tsemziḍ asfaylu n umdal", + "Read Marker lifetime (ms)": "Ɣer tanzagt n tudert n tecreḍt (ms)", + "Read Marker off-screen lifetime (ms)": "Ɣer tanzagt n tudert n tecreḍt beṛṛa n ugdil (ms)", + "Unignore": "Ur yettwazgel ara", + "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Anedbal-ik·im n uqeddac issens awgelhen seg yixef ɣer yixef s wudem amezwer deg texxamin tusligin & yiznan usriden.", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Sefrek ismawen syen ffeɣ seg tɣimiyin-ik·im ddaw neɣ senqed-itent deg umaɣnu-ik·im n useqdac.", + "A session's public name is visible to people you communicate with": "Isem n tiɣimit tazayezt yettban i yimdanen wukud tettmeslayeḍ", + "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s ileqqeḍ tasleḍt tudrigt i wakken ad aɣ-iɛawen ad nesnerni asnas.", + "You have ignored this user, so their message is hidden. Show anyways.": "Tzegleḍ useqdac-a, ihi iznan-ines ffren. Ɣas akken sken-iten-id.", + "You cancelled verifying %(name)s": "Tesfesxeḍ asenqed n %(name)s", + "Declining …": "Tigtin...", + "You sent a verification request": "Tuzneḍ asuter n usenqed", + "Error decrypting video": "Tuccḍa deg uwgelhen n tvidyut", + "Reactions": "Tisedmirin", + " reacted with %(content)s": " isedmer s %(content)s", + "reacted with %(shortName)s": "issedmer s %(shortName)s", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ibeddel avaṭar i %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s yekkes avaṭar n texxamt.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s ibeddel avaṭar n texxamt i ", + "This room is a continuation of another conversation.": "Taxxamt-a d akemmel n udiwenni-nniḍen.", + "Click here to see older messages.": "Sit da i wakken ad twaliḍ iznan iqdimen.", + "Failed to copy": "Anɣal ur yeddi ara", + "Edited at %(date)s": "Yettwaẓreg deg %(date)s", + "Click to view edits": "Sit i wakken ad twaliḍ aseẓreg", + "Edited at %(date)s. Click to view edits.": "Yettwaẓreg deg %(date)s. Sit i wakken ad twaliḍ iseẓrag.", + "Failed to load group members": "Ur yeddi ara usali n yiɛeggalen n ugraw", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Tebɣiḍ s tidet ad tekkseḍ '%(roomName)s' seg %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "Tukksa n texxamt seg temɣiwent ad tt-yekkes ula seg usebter n temɣiwent.", + "Failed to remove room from community": "Tukksa n texxamt seg temɣiwent ur yeddi ara", + "Failed to remove '%(roomName)s' from %(groupId)s": "Ur teddi ara tukksa n '%(roomName)s' seg %(groupId)s", + "Something went wrong!": "Yella wayen ur nteddu ara akken iwata!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Abani n '%(roomName)s' deg %(groupId)s yegguma ad ttuleqqem.", + "Visible to everyone": "Iban i medden akk", + "Something went wrong when trying to get your communities.": "Yella wayen ur nteddu ara akken deg uneɛruḍ n wawwaḍ ɣer temɣiwnin-ik·im.", + "Display your community flair in rooms configured to show it.": "Sken lbenna n temɣiwent-ik·im deg texxamin yettusewlen ad ttwaskanent.", + "You're not currently a member of any communities.": "Akka tura ur telliḍ d aɛeggal ula deg yiwet temɣiwent.", + "Frequently Used": "Yettuseqdac s waṭas", + "Quick Reactions": "Tisedmirin tiruradin", + "Unknown Address": "D tansa tarussint", + "Any of the following data may be shared:": "Yal yiwen seg yisefka i d-iteddun zemren ad ttwabḍun:", + "Invite anyway and never warn me again": "Ɣas akken nced-d yerna ur iyi-id-ttɛeggin ara akk", + "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Ttxil-k·m ini-aɣ-d acu ur nteddu ara akken ilaq neɣ, akken i igerrez, rnu ugur deg Github ara ad d-igelmen ugur.", + "Preparing to download logs": "Aheyyi i usali n yiɣmisen", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Ulac ula d yiwen da! Tebɣiḍ ad d-necdeḍ wiyaḍ neɣ aḥbas n uɛeggen ɣef texxamt tilemt?", + "You seem to be in a call, are you sure you want to quit?": "Tettbaneḍ aql-ak·akem deg useiwel, tebɣiḍ s tidet ad teffɣeḍ?", + "Failed to load timeline position": "Asali n yideg n tesnakudt ur yeddi ara", + "Sign in instead": "Kcem axiṛ", + "Invalid homeserver discovery response": "Tiririt n usnirem n uqeddac agejdan d tarameɣtut", + "Failed to get autodiscovery configuration from server": "Awway n uswel n usnirem awurman seg uqeddac ur yeddi ara", + "Invalid base_url for m.homeserver": "D arameɣtu base_url i m.homeserver", + "Homeserver URL does not appear to be a valid Matrix homeserver": "URL n uqeddac agejdan ur yettban ara d aqeddac agejdan n Matrix ameɣtu", + "Invalid identity server discovery response": "Tiririt n usnirem n uqeddac n timagitn d tarameɣtut", + "Identity server URL does not appear to be a valid identity server": "URL n uqeddac n timagit ur yettban ara d aqeddac n timagit ameɣtu", + "This homeserver does not support login using email address.": "Aqeddac-a agejdan ur yessefrak ara inekcum s useqdec n tansa n yimayl.", + "Please contact your service administrator to continue using this service.": "Ttxil-k·m nermes anedbal-ik·im n uqeddac i wakken ad tkemmleḍ aseqdec n yibenk-a.", + "Failed to fetch avatar URL": "Tiririt n URL ur teddi ara", + "Unable to query for supported registration methods.": "Anadi n tarrayin n usekles yettusefraken d awezi.", + "Registration has been disabled on this homeserver.": "Aklas yensa deg uqeddac-a agejdan.", + "This server does not support authentication with a phone number.": "Aqeddac-a ur yessefrak ara asesteb s wuṭṭun n tilifun.", + "You can now close this window or log in to your new account.": "Tzemreḍ tura ad tmedleḍ asfaylu-a neɣ kcem ɣer umiḍan-ik·im amaynut.", + "Use Recovery Key or Passphrase": "Seqdec tasarut tuffirt neɣ tafyirt tuffirt n uεeddi", + "This requires the latest %(brand)s on your other devices:": "Ayagi yesra %(brand)s tineggura ɣef yibenkan-ik·im wiyaḍ:", + "or another cross-signing capable Matrix client": "neɣ amsaɣ-nniḍen n Matrix yemṣadan d uzmul amdigan", + "Your new session is now verified. Other users will see it as trusted.": "Tiɣimit-ik·im tamaynut tettwasenqed tura. Ad tt-walin wiyaḍ tettwaḍman.", + "Failed to re-authenticate due to a homeserver problem": "Allus n usesteb ur yeddi ara ssebbba n wugur deg uqeddac agejdan", + "Enter your password to sign in and regain access to your account.": "Sekcem awal-ik·im uffir i wakken ad teqqneḍ syen ad tkecmeḍ i tikkelt tayeḍ ɣer umiḍan-ik·im.", + "Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Seqdec tafyirt tuffirt i tessneḍ kan kečč·kemm, syen sekles ma tebɣiḍ tasarut n tɣellist i useqdec-ines i uḥraz.", + "Restore your key backup to upgrade your encryption": "Err-d aḥraz n tsarut-ik·im akken ad tleqqmeḍ awgelhen-ik·im", + "You'll need to authenticate with the server to confirm the upgrade.": "Ad teḥqiǧeḍ asesteb s uqeddac i wakken ad tesnetmeḍ lqem.", + "Unable to query secret storage status": "Tuttra n waddad n uklas uffir ur teddi ara", + "You can also set up Secure Backup & manage your keys in Settings.": "Tzemreḍ daɣen aḥraz uffir & tesferkeḍ tisura-ik·im deg yiɣewwaren.", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Ad d-terreḍ anɣal awgelhan n tsura-ik·im ɣef uqeddac-nneɣ. Ḥrez aḥrazen s tefyirt tuffirt n uɛeddi.", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "War aswel n Secure Message Recovery, ur tettizmireḍ ara ad d-terreḍ amazray-ik·im n yiznan iwgelhanen ma yella teffɣeḍ neɣ tesqedceḍ tiɣimit-nniḍen.", + "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "War aswel n Secure Message Recovery, ad tmedleḍ amazray-ik·im n yiznan uffiren ma yella teffɣeḍ.", + "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ma yella ur tesbaduḍ ara tarrayt n tririt tamaynut, yezmer ad yili umaker ara iɛerḍen ad yekcem ɣer umiḍan-ik·im. Beddel awal uffir n umiḍan-ik·im syen sbadu tarrayt n tririt tamaynut din din deg yiɣewwaren.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Tiɣimit-a tufa-d tafyirt-ik·im tuffirt n tririt d tsarut-ik·im n yiznan uffiren ttwakksent.", + "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ma yella ur tekkiseḍ ara tarrayt n tririt tamaynut, yezmer ad yili umaker ara iɛerḍen ad yekcem ɣer umiḍan-ik·im. Beddel awal uffir n umiḍan-ik·im syen sbadu tarrayt n tririt tamaynut din din deg yiɣewwaren." } From de233090eced848cfe924ca082168b2e8ba6f517 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Tue, 25 Aug 2020 13:53:36 +0000 Subject: [PATCH 157/174] Translated using Weblate (Russian) Currently translated at 100.0% (2337 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index bc4bd073d9..e0be2f9820 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2417,5 +2417,8 @@ "Preparing to download logs": "Подготовка к загрузке журналов", "Download logs": "Скачать журналы", "Unexpected server error trying to leave the room": "Неожиданная ошибка сервера при попытке покинуть комнату", - "Error leaving room": "Ошибка при выходе из комнаты" + "Error leaving room": "Ошибка при выходе из комнаты", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Прототипы сообщества v2. Требуется совместимый домашний сервер. Очень экспериментально - используйте с осторожностью.", + "Explore rooms in %(communityName)s": "Посмотреть комнаты в %(communityName)s", + "Set up Secure Backup": "Настроить безопасное резервное копирование" } From b1f7a161275a418424ebfefde95a891cbeaae4c8 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 25 Aug 2020 15:06:45 +0000 Subject: [PATCH 158/174] Translated using Weblate (Swedish) Currently translated at 67.6% (1579 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 163 ++++++++++++++++++++++++++++----------- 1 file changed, 118 insertions(+), 45 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 73e32d98ae..9dd4c69840 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -12,7 +12,7 @@ "Microphone": "Mikrofon", "Camera": "Kamera", "Advanced": "Avancerat", - "Always show message timestamps": "Visa alltid tidsstämpel för meddelanden", + "Always show message timestamps": "Visa alltid tidsstämplar för meddelanden", "Authentication": "Autentisering", "%(items)s and %(lastItem)s": "%(items)s och %(lastItem)s", "and %(count)s others...|other": "och %(count)s andra...", @@ -25,7 +25,7 @@ "An error has occurred.": "Ett fel har inträffat.", "Are you sure?": "Är du säker?", "Are you sure you want to leave the room '%(roomName)s'?": "Vill du lämna rummet '%(roomName)s'?", - "Autoplay GIFs and videos": "Spela automatiskt upp GIFar och videor", + "Autoplay GIFs and videos": "Spela automatiskt upp GIF:ar och videor", "Are you sure you want to reject the invitation?": "Är du säker på att du vill avböja inbjudan?", "%(senderName)s banned %(targetName)s.": "%(senderName)s bannade %(targetName)s.", "Banned users": "Bannade användare", @@ -212,7 +212,7 @@ "%(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 timestamps in 12 hour format (e.g. 2:30pm)": "Visa tidsstämplar i 12-timmarsformat (t.ex. 2:30pm)", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Visa tidsstämplar i 12-timmarsformat (t.ex. 2:30em)", "Signed Out": "Loggade ut", "Sign in": "Logga in", "Sign out": "Logga ut", @@ -320,7 +320,7 @@ "An error occurred whilst saving your email notification preferences.": "Ett fel uppstod då epostaviseringsinställningarna sparades.", "Explore Room State": "Utforska rumläget", "Source URL": "Käll-URL", - "Failed to add tag %(tagName)s to room": "Det gick inte att lägga till \"%(tagName)s\" till rummet", + "Failed to add tag %(tagName)s to room": "Det gick inte att lägga till etiketten \"%(tagName)s\" till rummet", "Filter results": "Filtrera resultaten", "Members": "Medlemmar", "No update available.": "Ingen uppdatering tillgänglig.", @@ -383,7 +383,7 @@ "Off": "Av", "%(brand)s does not know how to join a room on this network": "%(brand)s kan inte gå med i ett rum på det här nätverket", "Mentions only": "Endast omnämnande", - "Failed to remove tag %(tagName)s from room": "Det gick inte att radera taggen %(tagName)s från rummet", + "Failed to remove tag %(tagName)s from room": "Det gick inte att radera etiketten %(tagName)s från rummet", "You can now return to your account after signing out, and sign in on other devices.": "Du kan nu återgå till ditt konto efter att ha loggat ut och logga in på andra enheter.", "Enable email notifications": "Aktivera epostaviseringar", "Download this file": "Ladda ner filen", @@ -517,7 +517,7 @@ "%(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 ": "%(senderDisplayName)s ändrade rummets avatar till ", - "Automatically replace plain text Emoji": "Ersätt text-emojis automatiskt", + "Automatically replace plain text Emoji": "Ersätt automatiskt textemotikoner med emojier", "%(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", @@ -615,7 +615,7 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s satte framtida rumshistorik till okänd synlighet (%(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 datan bort innan den skickas till servern.", "The remote side failed to pick up": "Mottagaren svarade inte", - "Jump to read receipt": "Hoppa till läskvitto", + "Jump to read receipt": "Hoppa till läsindikation", "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", @@ -672,7 +672,7 @@ "Add rooms to the community": "Lägg till rum i gemenskapen", "Add to community": "Lägg till i gemenskap", "Failed to invite users to community": "Det gick inte att bjuda in användare till gemenskapen", - "Mirror local video feed": "Speglad lokal-video", + "Mirror local video feed": "Spegla den lokala videoströmmen", "Community Invites": "Community-inbjudningar", "Invalid community ID": "Ogiltigt gemenskaps-ID", "'%(groupId)s' is not a valid community ID": "%(groupId)s är inte ett giltigt gemenskaps-ID", @@ -741,7 +741,7 @@ "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.", "unknown caller": "okänd uppringare", "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.", - "Enable inline URL previews by default": "Aktivera URL-förhandsvisning som standard", + "Enable inline URL previews by default": "Aktivera inbäddad 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 enabled URL previews by default.": "Du har aktiverat URL-förhandsvisning som standard.", @@ -797,7 +797,7 @@ "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", + "Message Pinning": "Fastnålning av meddelanden", "Unpin Message": "Ta bort fastnålning", "No pinned messages.": "Inga fastnålade meddelanden.", "Pinned Messages": "Fastnålade meddelanden", @@ -838,8 +838,8 @@ "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "När någon postar en URL i sitt meddelande, kan URL-förhandsvisning ge mer information om länken, såsom titel, beskrivning, och en bild från webbplatsen.", "You can't send any messages until you review and agree to our terms and conditions.": "Du kan inte skicka några meddelanden innan du granskar och godkänner våra villkor.", "System Alerts": "Systemvarningar", - "Sorry, your homeserver is too old to participate in this room.": "Tyvärr, din hemserver är för gammal för att delta i detta rum.", - "Please contact your homeserver administrator.": "Vänligen kontakta din hemserver-administratör.", + "Sorry, your homeserver is too old to participate in this room.": "Tyvärr, din hemserver är för gammal för att delta i det här rummet.", + "Please contact your homeserver administrator.": "Vänligen kontakta din hemserveradministratör.", "Please contact your service administrator to continue using the service.": "Kontakta din tjänstadministratör för att fortsätta använda tjänsten.", "This homeserver has hit its Monthly Active User limit.": "Hemservern har nått sin månatliga gräns för användaraktivitet.", "This homeserver has exceeded one of its resource limits.": "Hemservern har överskridit en av sina resursgränser.", @@ -869,7 +869,7 @@ "Before submitting logs, you must create a GitHub issue to describe your problem.": "Innan du skickar in loggar måste du skapa en GitHub-bugg för att beskriva problemet.", "Updating %(brand)s": "Uppdaterar %(brand)s", "Open Devtools": "Öppna Devtools", - "Show developer tools": "Visa utvecklingsverktyg", + "Show developer tools": "Visa utvecklarverktyg", "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Du är administratör för denna gemenskap. Du kommer inte kunna gå med igen utan en inbjudan från en annan administratör.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Filen '%(fileName)s' överstiger denna hemserverns storleksgräns för uppladdningar", "Unable to load! Check your network connectivity and try again.": "Kan inte ladda! Kolla din nätverksuppkoppling och försök igen.", @@ -889,19 +889,19 @@ "%(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 …", "%(names)s and %(lastPerson)s are typing …": "%(names)s och %(lastPerson)s skriver …", - "Unrecognised address": "Okänd address", - "You do not have permission to invite people to this room.": "Du har inte tillåtelse att bjuda in användare till det här rummet.", - "User %(user_id)s does not exist": "Användare %(user_id)s existerar inte", - "User %(user_id)s may or may not exist": "Användare %(user_id)s existerar möjligtvis", - "Unknown server error": "Okänt server-fel", - "Use a few words, avoid common phrases": "Använd ett par ord, undvik vanliga fraser", - "No need for symbols, digits, or uppercase letters": "Symboler, siffror eller stora bokstäver krävs ej", + "Unrecognised address": "Okänd adress", + "You do not have permission to invite people to this room.": "Du har inte behörighet att bjuda in användare till det här rummet.", + "User %(user_id)s does not exist": "Användaren %(user_id)s existerar inte", + "User %(user_id)s may or may not exist": "Användaren %(user_id)s kanske eller kanske inte existerar", + "Unknown server error": "Okänt serverfel", + "Use a few words, avoid common phrases": "Använd några ord, undvik vanliga fraser", + "No need for symbols, digits, or uppercase letters": "Specialtecken, siffror eller stora bokstäver behövs inte", "Avoid repeated words and characters": "Undvik upprepade ord och bokstäver", "Avoid sequences": "Undvik sekvenser", - "Avoid recent years": "Undvik senare år", + "Avoid recent years": "Undvik nyliga år", "Avoid years that are associated with you": "Undvik årtal som associeras med dig", "Avoid dates and years that are associated with you": "Undvik datum och årtal som associeras med dig", - "Capitalization doesn't help very much": "Kapitalisering hjälper inte särskilt mycket", + "Capitalization doesn't help very much": "Versaler hjälper inte särskilt mycket", "All-uppercase is almost as easy to guess as all-lowercase": "Endast stora bokstäver är nästan lika enkelt att gissa som endast små bokstäver", "Reversed words aren't much harder to guess": "Ord skrivna baklänges är inte mycket svårare att gissa", "Predictable substitutions like '@' instead of 'a' don't help very much": "Förutsägbara ersättningar som '@' istället för 'a' hjälper inte särskilt mycket", @@ -909,32 +909,32 @@ "Repeats like \"aaa\" are easy to guess": "Upprepningar som \"aaa\" är enkla att gissa", "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "Upprepningar som \"abcabcabc\" är bara aningen svårare att gissa än \"abc\"", "Sequences like abc or 6543 are easy to guess": "Sekvenser som abc eller 6543 är enkla att gissa", - "Recent years are easy to guess": "Senare årtal är enka att gissa", + "Recent years are easy to guess": "Nyliga årtal är enkla att gissa", "Dates are often easy to guess": "Datum är ofta enkla att gissa", - "This is a top-10 common password": "Det här är ett av de topp 10 vanligaste lösenorden", - "This is a top-100 common password": "Det här är ett av de topp 100 vanligaste lösenorden", + "This is a top-10 common password": "Det här är ett av de 10 vanligaste lösenorden", + "This is a top-100 common password": "Det här är ett av de 100 vanligaste lösenorden", "This is a very common password": "Det här är ett väldigt vanligt lösenord", "This is similar to a commonly used password": "Det här liknar ett vanligt lösenord", "A word by itself is easy to guess": "Enstaka ord är enkla att gissa", "Names and surnames by themselves are easy to guess": "Enstaka för- och efternamn är enkla att gissa", - "Common names and surnames are easy to guess": "Vanliga namn och efternamn är enkla att gissa", - "Straight rows of keys are easy to guess": "Tangenter i rad på tangentbordet är enkla att gissa", + "Common names and surnames are easy to guess": "Vanliga för- och efternamn är enkla att gissa", + "Straight rows of keys are easy to guess": "Raka rader på tangentbordet är enkla att gissa", "Short keyboard patterns are easy to guess": "Korta tangentbordsmönster är enkla att gissa", - "There was an error joining the room": "Det gick fel när vi försökte gå med i rummet", + "There was an error joining the room": "Ett fel inträffade vid försök att gå med i rummet", "Changes your display nickname in the current room only": "Ändrar ditt visningsnamn endast i detta rum", - "Use a longer keyboard pattern with more turns": "Använd ett längre tangentbordsmönster med fler varv", + "Use a longer keyboard pattern with more turns": "Använd ett längre tangentbordsmönster med fler riktningsbyten", "Custom user status messages": "Anpassade användarstatusmeddelanden", - "Enable Emoji suggestions while typing": "Aktivera Emoji-förslag medan du skriver", + "Enable Emoji suggestions while typing": "Aktivera emojiförslag medan du skriver", "Show a placeholder for removed messages": "Visa en platshållare för borttagna meddelanden", "Show join/leave messages (invites/kicks/bans unaffected)": "Visa \"gå med\"/lämna-meddelanden (inbjudningar/kickningar/banningar opåverkat)", "Show avatar changes": "Visa avatarändringar", "Show display name changes": "Visa visningsnamnsändringar", - "Show read receipts sent by other users": "Visa läskvitton som skickats av andra användare", - "Show avatars in user and room mentions": "Visa avatarer i användar- och rumsnämningar", - "Enable big emoji in chat": "Aktivera stor emoji i chatt", + "Show read receipts sent by other users": "Visa läsindikationer som skickats av andra användare", + "Show avatars in user and room mentions": "Visa avatarer i användar- och rumsbenämningar", + "Enable big emoji in chat": "Aktivera stora emojier i chatt", "Send typing notifications": "Skicka \"skriver\"-statusar", "Enable Community Filter Panel": "Aktivera gemenskapsfilterpanel", - "Allow Peer-to-Peer for 1:1 calls": "Tillåt peer-to-peer kommunikation för 1:1 samtal", + "Allow Peer-to-Peer for 1:1 calls": "Tillåt peer-to-peer-kommunikation för 1:1-samtal", "Messages containing my username": "Meddelanden som innehåller mitt användarnamn", "Messages containing @room": "Meddelanden som innehåller @room", "Encrypted messages in one-to-one chats": "Krypterade meddelanden i privata chattar", @@ -1081,9 +1081,9 @@ "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s aktiverade emblem för %(groups)s i detta rum.", "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s inaktiverade emblem för %(groups)s i detta rum.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s aktiverade emblem för %(newGroups)s och inaktiverade emblem för %(oldGroups)s i detta rum.", - "User %(userId)s is already in the room": "Användare %(userId)s är redan i rummet", - "The user must be unbanned before they can be invited.": "Användare behöver avbannas innan de kan bjudas in.", - "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppera och filtrera rum med anpassade taggar (ladda om för att visa ändringar)", + "User %(userId)s is already in the room": "Användaren %(userId)s är redan i rummet", + "The user must be unbanned before they can be invited.": "Användaren behöver avbannas innan den kan bjudas in.", + "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppera och filtrera rum med anpassade etiketter (ladda om för att visa ändringar)", "Render simple counters in room header": "Rendera enkla räknare i rumsrubriken", "Yes": "Ja", "No": "Nej", @@ -1124,7 +1124,7 @@ "Please supply a https:// or http:// widget URL": "Ange en widget-URL med https:// eller http://", "You cannot modify widgets in this room.": "Du kan inte ändra widgets i detta rum.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s återkallade inbjudan för %(targetDisplayName)s att gå med i rummet.", - "Show a reminder to enable Secure Message Recovery in encrypted rooms": "Visa en påminnelse för att sätta på säker meddelande återhämtning i krypterade rum", + "Show a reminder to enable Secure Message Recovery in encrypted rooms": "Visa en påminnelse att sätta på säker meddelandeåterställning i krypterade rum", "The other party cancelled the verification.": "Den andra parten avbröt verifieringen.", "Verified!": "Verifierad!", "You've successfully verified this user.": "Du har verifierat den här användaren.", @@ -1237,7 +1237,7 @@ "Multiple integration managers": "Flera integrationshanterare", "Show hidden events in timeline": "Visa dolda händelser i tidslinjen", "Low bandwidth mode": "Läge för låg bandbredd", - "Send read receipts for messages (requires compatible homeserver to disable)": "Skicka läskvitton för meddelanden (kräver kompatibel hemserver för att inaktivera)", + "Send read receipts for messages (requires compatible homeserver to disable)": "Skicka läsindikationer för meddelanden (kräver kompatibel hemserver för att inaktivera)", "When rooms are upgraded": "När rum uppgraderas", "Accept to continue:": "Acceptera för att fortsätta:", "ID": "ID", @@ -1304,7 +1304,7 @@ "Join the conversation with an account": "Gå med i konversationen med ett konto", "Sign Up": "Registrera dig", "Sign In": "Logga in", - "Prompt before sending invites to potentially invalid matrix IDs": "Fråga innan inbjudningar skickas till potentiellt ogiltiga matrix-IDn", + "Prompt before sending invites to potentially invalid matrix IDs": "Fråga innan inbjudningar skickas till potentiellt ogiltiga Matrix-ID:n", "Show all": "Visa alla", "reacted with %(shortName)s": "reagerade med %(shortName)s", "Edited at %(date)s. Click to view edits.": "Ändrad %(date)s. Klicka för att visa ändringar.", @@ -1325,7 +1325,7 @@ "Use an identity server to invite by email. Manage in Settings.": "Använd en identitetsserver för att bjuda in via e-post. Hantera det i inställningar.", "Unexpected error resolving homeserver configuration": "Oväntat fel vid inläsning av hemserverkonfiguration", "Unexpected error resolving identity server configuration": "Oväntat fel vid inläsning av identitetsserverkonfiguration", - "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Tillåt samtalsserver turn.matrix.org som reserv när din hemserver inte erbjuder en (din IP-adress delades under ett samtal)", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Tillåt assistansservern turn.matrix.org för samtal som reserv när din hemserver inte erbjuder en (din IP-adress kommer delas under ett samtal)", "Unable to load key backup status": "Det går inte att ladda status för nyckelsäkerhetskopiering", "Restore from Backup": "Återställ från säkerhetskopiering", "Backing up %(sessionsRemaining)s keys...": "Säkerhetskopierar %(sessionsRemaining)s nycklar...", @@ -1336,8 +1336,8 @@ "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Den här åtgärden kräver åtkomst till standardidentitetsservern för att validera en e-postadress eller ett telefonnummer, men servern har inga användarvillkor.", "Trust": "Förtroende", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", - "Try out new ways to ignore people (experimental)": "Testa nya sätt att ignorera personer (experimentalt)", - "Show previews/thumbnails for images": "Visa förhandsvisning/tumnagel för bilder", + "Try out new ways to ignore people (experimental)": "Testa nya sätt att ignorera personer (experimentellt)", + "Show previews/thumbnails for images": "Visa förhandsvisning/miniatyr för bilder", "Custom (%(level)s)": "Anpassad (%(level)s)", "Error upgrading room": "Fel vid uppgradering av rum", "Double check that your server supports the room version chosen and try again.": "Dubbelkolla att din server stöder den valda rumsversionen och försök igen.", @@ -1462,7 +1462,7 @@ "Setting up keys": "Sätter upp nycklar", "Verify this session": "Verifiera denna session", "Encryption upgrade available": "Krypteringsuppgradering tillgänglig", - "Set up encryption": "Ställ in kryptering", + "Set up encryption": "Sätt upp kryptering", "Sign In or Create Account": "Logga in eller skapa konto", "Use your account or create a new one to continue.": "Använd ditt konto eller skapa ett nytt för att fortsätta.", "Create Account": "Skapa konto", @@ -1592,5 +1592,78 @@ "%(num)s hours ago": "%(num)s timmar sedan", "about a day ago": "cirka en dag sedan", "%(num)s days ago": "%(num)s dagar sedan", - "a few seconds from now": "några sekunder från nu" + "a few seconds from now": "om några sekunder", + "about a minute from now": "om cirka en minut", + "%(num)s minutes from now": "om %(num)s minuter", + "about an hour from now": "om cirka en timme", + "%(num)s hours from now": "om %(num)s timmar", + "about a day from now": "om cirka en dag", + "%(num)s days from now": "om %(num)s dagar", + "Unexpected server error trying to leave the room": "Oväntat serverfel vid försök att lämna rummet", + "Error leaving room": "Fel när rummet lämnades", + "Help us improve %(brand)s": "Hjälp oss att förbättra %(brand)s", + "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Skicka anonym användningsdata vilken hjälper oss att förbättra %(brand)s. Detta kommer att använda en kaka.", + "I want to help": "Jag vill hjälpa till", + "Review where you’re logged in": "Granska var du är inloggad", + "Verify all your sessions to ensure your account & messages are safe": "Verifiera alla dina sessioner för att försäkra att ditt konto och dina meddelanden är säkra", + "Review": "Granska", + "Later": "Senare", + "Your homeserver has exceeded its user limit.": "Din hemserver har överskridit sin användargräns.", + "Your homeserver has exceeded one of its resource limits.": "Din hemserver har överskridit en av sina resursgränser.", + "Contact your server admin.": "Kontakta din serveradministratör.", + "Ok": "OK", + "Set password": "Sätt lösenord", + "To return to your account in future you need to set a password": "För att komma tillbaka till ditt konto i framtiden behöver du sätta ett lösenord", + "Set up": "Sätt upp", + "Upgrade": "Uppgradera", + "Verify": "Verifiera", + "Verify yourself & others to keep your chats safe": "Verifiera dig själv och andra för att hålla dina chattar säkra", + "Other users may not trust it": "Andra användare kanske inta litar på den", + "New login. Was this you?": "Ny inloggning. Var det du?", + "Verify the new login accessing your account: %(name)s": "Verifiera den nya inloggningen på ditt konto: %(name)s", + "Restart": "Starta om", + "Upgrade your %(brand)s": "Uppgradera din %(brand)s", + "A new version of %(brand)s is available!": "En ny version av %(brand)s är tillgänglig!", + "The person who invited you already left the room.": "Personen som bjöd in dig har redan lämnat rummet.", + "The person who invited you already left the room, or their server is offline.": "Personen som bjöd in dig har redan lämnat rummet, eller så är deras server offline.", + "You joined the call": "Du gick med i samtalet", + "%(senderName)s joined the call": "%(senderName)s gick med i samtalet", + "Call in progress": "Samtal pågår", + "You left the call": "Du lämnade samtalet", + "%(senderName)s left the call": "%(senderName)s lämnade samtalet", + "Call ended": "Samtalet avslutades", + "You started a call": "Du startade ett samtal", + "%(senderName)s started a call": "%(senderName)s startade ett samtal", + "Waiting for answer": "Väntar på svar", + "%(senderName)s is calling": "%(senderName)s ringer", + "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s", + "%(senderName)s: %(message)s": "%(senderName)s: %(message)s", + "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", + "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", + "Change notification settings": "Ändra aviseringsinställningar", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Gemenskap-v2-prototyper. Kräver kompatibel hemserver. Väldigt experimentellt - använd varsamt.", + "New spinner design": "Ny spinnerdesign", + "Support adding custom themes": "Stöd tilläggning av anpassade teman", + "Show message previews for reactions in DMs": "Visa meddelandeförhandsvisningar för reaktioner i DM:er", + "Show message previews for reactions in all rooms": "Visa meddelandeförhandsvisningar för reaktioner i alla rum", + "Enable advanced debugging for the room list": "Aktivera avancerad avbuggning för rumslistan", + "Show info about bridges in room settings": "Visa info om bryggor i rumsinställningar", + "Font size": "Teckenstorlek", + "Use custom size": "Använd anpassad storlek", + "Use a more compact ‘Modern’ layout": "Använd ett mer kompakt ‘modernt’ arrangemang", + "Show typing notifications": "Visa \"skriver\"-statusar", + "Use a system font": "Använd systemets teckensnitt", + "System font name": "Namn på systemets teckensnitt", + "Never send encrypted messages to unverified sessions from this session": "Skicka aldrig krypterade meddelanden till overifierade sessioner från den här sessionen", + "Never send encrypted messages to unverified sessions in this room from this session": "Skicka aldrig krypterade meddelanden till overifierade sessioner i det här rummet från den här sessionen", + "Order rooms by name": "Sortera rum efter namn", + "Show rooms with unread notifications first": "Visa rum med olästa aviseringar först", + "Show shortcuts to recently viewed rooms above the room list": "Visa genvägar till nyligen visade rum över rumslistan", + "Enable message search in encrypted rooms": "Aktivera meddelandesökning i krypterade rum", + "How fast should messages be downloaded.": "Hur snabbt ska meddelanden laddas ner.", + "Manually verify all remote sessions": "Verifiera alla fjärrsessioner manuellt", + "IRC display name width": "Bredd för IRC-visningsnamn", + "Enable experimental, compact IRC style layout": "Aktivera experimentellt kompakt IRC-likt arrangemang", + "Uploading logs": "Laddar upp loggar", + "Downloading logs": "Laddar ner loggar" } From 85c1e41def4a0d1ccbc1e622e219f24189c9aa0f Mon Sep 17 00:00:00 2001 From: strix aluco Date: Tue, 25 Aug 2020 23:08:31 +0000 Subject: [PATCH 159/174] Translated using Weblate (Ukrainian) Currently translated at 51.7% (1209 of 2337 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 62bfe2f1ab..4499d6d124 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -812,7 +812,7 @@ "Submit debug logs": "Надіслати журнал зневадження", "Clear cache and reload": "Очистити кеш та перезавантажити", "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "Щоб повідомити про проблеми безпеки Matrix, будь ласка, прочитайте Політику розкриття інформації Matrix.org.", - "FAQ": "Часті питання", + "FAQ": "ЧаПи", "Keyboard Shortcuts": "Гарячі клавіші", "Versions": "Версії", "%(brand)s version:": "версія %(brand)s:", From 0c67a42b0f16283bb7354b5868246240d308feeb Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 26 Aug 2020 08:42:26 -0600 Subject: [PATCH 160/174] Make padding only on the prototype tag panel --- res/css/structures/_TagPanel.scss | 4 ++++ src/components/views/elements/TagTile.js | 1 + src/components/views/elements/UserTagTile.tsx | 1 + 3 files changed, 6 insertions(+) diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index e7f67c8ace..2683a32dae 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -75,8 +75,12 @@ limitations under the License. .mx_TagPanel .mx_TagTile { // opacity: 0.5; position: relative; +} + +.mx_TagPanel .mx_TagTile.mx_TagTile_prototype { padding: 3px; } + .mx_TagPanel .mx_TagTile:focus, .mx_TagPanel .mx_TagTile:hover, .mx_TagPanel .mx_TagTile.mx_TagTile_selected { diff --git a/src/components/views/elements/TagTile.js b/src/components/views/elements/TagTile.js index 562a478976..db5eedc274 100644 --- a/src/components/views/elements/TagTile.js +++ b/src/components/views/elements/TagTile.js @@ -144,6 +144,7 @@ export default createReactClass({ const isPrototype = SettingsStore.getValue("feature_communities_v2_prototypes"); const className = classNames({ mx_TagTile: true, + mx_TagTile_prototype: isPrototype, mx_TagTile_selected: this.props.selected && !isPrototype, mx_TagTile_selected_prototype: this.props.selected && isPrototype, }); diff --git a/src/components/views/elements/UserTagTile.tsx b/src/components/views/elements/UserTagTile.tsx index 635c537324..912f54edc7 100644 --- a/src/components/views/elements/UserTagTile.tsx +++ b/src/components/views/elements/UserTagTile.tsx @@ -66,6 +66,7 @@ export default class UserTagTile extends React.PureComponent { // TagTile instead if we continue to use this component. const className = classNames({ mx_TagTile: true, + mx_TagTile_prototype: true, mx_TagTile_selected_prototype: this.state.selected, mx_TagTile_home: true, }); From 3e7d82b42137febf3961a87d9df3e3def3ee9760 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 26 Aug 2020 08:48:01 -0600 Subject: [PATCH 161/174] Change tip copy --- src/components/views/dialogs/PrototypeCreateGroupDialog.tsx | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx b/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx index 8978b9cf0d..d37301b573 100644 --- a/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx +++ b/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx @@ -206,7 +206,7 @@ export default class PrototypeCreateGroupDialog extends React.PureComponent
- {_t("PRO TIP")} + {_t("Add image (optional)")} {_t("An image will help people identify your community.")} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b42a5fadd3..c24a5537a3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1744,7 +1744,7 @@ "You can change this later if needed.": "You can change this later if needed.", "What's the name of your community or team?": "What's the name of your community or team?", "Enter name": "Enter name", - "PRO TIP": "PRO TIP", + "Add image (optional)": "Add image (optional)", "An image will help people identify your community.": "An image will help people identify your community.", "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.", From 82b015bd5f84b2c8ecaee14d572c6f1b8a3b7657 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 26 Aug 2020 08:50:32 -0600 Subject: [PATCH 162/174] Rename components to match prior convention --- res/css/_components.scss | 4 +-- ...s => _CommunityPrototypeInviteDialog.scss} | 16 ++++----- ...s => _CreateCommunityPrototypeDialog.scss} | 22 ++++++------ src/RoomInvite.js | 4 +-- src/components/structures/MatrixChat.tsx | 4 +-- ...tsx => CommunityPrototypeInviteDialog.tsx} | 18 +++++----- ...tsx => CreateCommunityPrototypeDialog.tsx} | 24 ++++++------- src/i18n/strings/en_EN.json | 36 +++++++++---------- 8 files changed, 64 insertions(+), 64 deletions(-) rename res/css/views/dialogs/{_PrototypeCommunityInviteDialog.scss => _CommunityPrototypeInviteDialog.scss} (82%) rename res/css/views/dialogs/{_PrototypeCreateGroupDialog.scss => _CreateCommunityPrototypeDialog.scss} (79%) rename src/components/views/dialogs/{PrototypeCommunityInviteDialog.tsx => CommunityPrototypeInviteDialog.tsx} (94%) rename src/components/views/dialogs/{PrototypeCreateGroupDialog.tsx => CreateCommunityPrototypeDialog.tsx} (88%) diff --git a/res/css/_components.scss b/res/css/_components.scss index 88fbbb5c3e..24d2ffa2b0 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -61,7 +61,9 @@ @import "./views/dialogs/_BugReportDialog.scss"; @import "./views/dialogs/_ChangelogDialog.scss"; @import "./views/dialogs/_ChatCreateOrReuseChatDialog.scss"; +@import "./views/dialogs/_CommunityPrototypeInviteDialog.scss"; @import "./views/dialogs/_ConfirmUserActionDialog.scss"; +@import "./views/dialogs/_CreateCommunityPrototypeDialog.scss"; @import "./views/dialogs/_CreateGroupDialog.scss"; @import "./views/dialogs/_CreateRoomDialog.scss"; @import "./views/dialogs/_DeactivateAccountDialog.scss"; @@ -72,8 +74,6 @@ @import "./views/dialogs/_KeyboardShortcutsDialog.scss"; @import "./views/dialogs/_MessageEditHistoryDialog.scss"; @import "./views/dialogs/_NewSessionReviewDialog.scss"; -@import "./views/dialogs/_PrototypeCommunityInviteDialog.scss"; -@import "./views/dialogs/_PrototypeCreateGroupDialog.scss"; @import "./views/dialogs/_RoomSettingsDialog.scss"; @import "./views/dialogs/_RoomSettingsDialogBridges.scss"; @import "./views/dialogs/_RoomUpgradeDialog.scss"; diff --git a/res/css/views/dialogs/_PrototypeCommunityInviteDialog.scss b/res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss similarity index 82% rename from res/css/views/dialogs/_PrototypeCommunityInviteDialog.scss rename to res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss index 8d2ff598d8..beae03f00f 100644 --- a/res/css/views/dialogs/_PrototypeCommunityInviteDialog.scss +++ b/res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -.mx_PrototypeCommunityInviteDialog { +.mx_CommunityPrototypeInviteDialog { &.mx_Dialog_fixedWidth { width: 360px; } @@ -22,7 +22,7 @@ limitations under the License. .mx_Dialog_content { margin-bottom: 0; - .mx_PrototypeCommunityInviteDialog_people { + .mx_CommunityPrototypeInviteDialog_people { position: relative; margin-bottom: 4px; @@ -36,11 +36,11 @@ limitations under the License. } } - .mx_PrototypeCommunityInviteDialog_morePeople { + .mx_CommunityPrototypeInviteDialog_morePeople { margin-top: 8px; } - .mx_PrototypeCommunityInviteDialog_person { + .mx_CommunityPrototypeInviteDialog_person { position: relative; margin-top: 4px; @@ -55,21 +55,21 @@ limitations under the License. width: 16px; // to force a square } - .mx_PrototypeCommunityInviteDialog_personIdentifiers { + .mx_CommunityPrototypeInviteDialog_personIdentifiers { display: inline-block; & > * { display: block; } - .mx_PrototypeCommunityInviteDialog_personName { + .mx_CommunityPrototypeInviteDialog_personName { font-weight: 600; font-size: $font-14px; color: $primary-fg-color; margin-left: 7px; } - .mx_PrototypeCommunityInviteDialog_personId { + .mx_CommunityPrototypeInviteDialog_personId { font-size: $font-12px; color: $muted-fg-color; margin-left: 7px; @@ -77,7 +77,7 @@ limitations under the License. } } - .mx_PrototypeCommunityInviteDialog_primaryButton { + .mx_CommunityPrototypeInviteDialog_primaryButton { display: block; font-size: $font-13px; line-height: 20px; diff --git a/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss b/res/css/views/dialogs/_CreateCommunityPrototypeDialog.scss similarity index 79% rename from res/css/views/dialogs/_PrototypeCreateGroupDialog.scss rename to res/css/views/dialogs/_CreateCommunityPrototypeDialog.scss index 3235575a88..81babc4c38 100644 --- a/res/css/views/dialogs/_PrototypeCreateGroupDialog.scss +++ b/res/css/views/dialogs/_CreateCommunityPrototypeDialog.scss @@ -14,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -.mx_PrototypeCreateGroupDialog { +.mx_CreateCommunityPrototypeDialog { .mx_Dialog_content { display: flex; flex-direction: row; margin-bottom: 12px; - .mx_PrototypeCreateGroupDialog_colName { + .mx_CreateCommunityPrototypeDialog_colName { flex-basis: 66.66%; padding-right: 100px; @@ -29,7 +29,7 @@ limitations under the License. line-height: $font-20px; } - .mx_PrototypeCreateGroupDialog_subtext { + .mx_CreateCommunityPrototypeDialog_subtext { display: block; color: $muted-fg-color; margin-bottom: 16px; @@ -38,12 +38,12 @@ limitations under the License. margin-top: 16px; } - &.mx_PrototypeCreateGroupDialog_subtext_error { + &.mx_CreateCommunityPrototypeDialog_subtext_error { color: $warning-color; } } - .mx_PrototypeCreateGroupDialog_communityId { + .mx_CreateCommunityPrototypeDialog_communityId { position: relative; .mx_InfoTooltip { @@ -59,21 +59,21 @@ limitations under the License. } } - .mx_PrototypeCreateGroupDialog_colAvatar { + .mx_CreateCommunityPrototypeDialog_colAvatar { flex-basis: 33.33%; - .mx_PrototypeCreateGroupDialog_avatarContainer { + .mx_CreateCommunityPrototypeDialog_avatarContainer { margin-top: 12px; margin-bottom: 20px; - .mx_PrototypeCreateGroupDialog_avatar, - .mx_PrototypeCreateGroupDialog_placeholderAvatar { + .mx_CreateCommunityPrototypeDialog_avatar, + .mx_CreateCommunityPrototypeDialog_placeholderAvatar { width: 96px; height: 96px; border-radius: 96px; } - .mx_PrototypeCreateGroupDialog_placeholderAvatar { + .mx_CreateCommunityPrototypeDialog_placeholderAvatar { background-color: #368bd6; // hardcoded for both themes &::before { @@ -91,7 +91,7 @@ limitations under the License. } } - .mx_PrototypeCreateGroupDialog_tip { + .mx_CreateCommunityPrototypeDialog_tip { & > b, & > span { display: block; color: $muted-fg-color; diff --git a/src/RoomInvite.js b/src/RoomInvite.js index 3347a8288d..420561ea41 100644 --- a/src/RoomInvite.js +++ b/src/RoomInvite.js @@ -23,7 +23,7 @@ import Modal from './Modal'; import * as sdk from './'; import { _t } from './languageHandler'; import {KIND_DM, KIND_INVITE} from "./components/views/dialogs/InviteDialog"; -import PrototypeCommunityInviteDialog from "./components/views/dialogs/PrototypeCommunityInviteDialog"; +import CommunityPrototypeInviteDialog from "./components/views/dialogs/CommunityPrototypeInviteDialog"; /** * Invites multiple addresses to a room @@ -59,7 +59,7 @@ export function showRoomInviteDialog(roomId) { export function showCommunityRoomInviteDialog(roomId, communityName) { Modal.createTrackedDialog( - 'Invite Users to Community', '', PrototypeCommunityInviteDialog, {communityName, roomId}, + 'Invite Users to Community', '', CommunityPrototypeInviteDialog, {communityName, roomId}, /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, ); } diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 2b764d00c9..9d51062b7d 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -77,7 +77,7 @@ import ErrorDialog from "../views/dialogs/ErrorDialog"; import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore"; import { SettingLevel } from "../../settings/SettingLevel"; import { leaveRoomBehaviour } from "../../utils/membership"; -import PrototypeCreateGroupDialog from "../views/dialogs/PrototypeCreateGroupDialog"; +import CreateCommunityPrototypeDialog from "../views/dialogs/CreateCommunityPrototypeDialog"; /** constants for MatrixChat.state.view */ export enum Views { @@ -623,7 +623,7 @@ export default class MatrixChat extends React.PureComponent { case 'view_create_group': { let CreateGroupDialog = sdk.getComponent("dialogs.CreateGroupDialog") if (SettingsStore.getValue("feature_communities_v2_prototypes")) { - CreateGroupDialog = PrototypeCreateGroupDialog; + CreateGroupDialog = CreateCommunityPrototypeDialog; } Modal.createTrackedDialog('Create Community', '', CreateGroupDialog); break; diff --git a/src/components/views/dialogs/PrototypeCommunityInviteDialog.tsx b/src/components/views/dialogs/CommunityPrototypeInviteDialog.tsx similarity index 94% rename from src/components/views/dialogs/PrototypeCommunityInviteDialog.tsx rename to src/components/views/dialogs/CommunityPrototypeInviteDialog.tsx index 08d3f0208a..7a500cd053 100644 --- a/src/components/views/dialogs/PrototypeCommunityInviteDialog.tsx +++ b/src/components/views/dialogs/CommunityPrototypeInviteDialog.tsx @@ -56,7 +56,7 @@ interface IState { busy: boolean; } -export default class PrototypeCommunityInviteDialog extends React.PureComponent { +export default class CommunityPrototypeInviteDialog extends React.PureComponent { constructor(props: IProps) { super(props); @@ -145,7 +145,7 @@ export default class PrototypeCommunityInviteDialog extends React.PureComponent< private renderPerson(person: IPerson, key: any) { const avatarSize = 36; return ( -
+
-
- {person.user.name} - {person.userId} +
+ {person.user.name} + {person.userId}
this.setPersonToggle(person, e.target.checked)} />
@@ -206,14 +206,14 @@ export default class PrototypeCommunityInviteDialog extends React.PureComponent< {_t("Show more")} ); } } if (this.state.people.length > 0) { peopleIntro = ( -
+
{_t("People you know on %(brand)s", {brand: SdkConfig.get().brand})} {this.state.showPeople ? _t("Hide") : _t("Show")} @@ -230,7 +230,7 @@ export default class PrototypeCommunityInviteDialog extends React.PureComponent< return ( @@ -242,7 +242,7 @@ export default class PrototypeCommunityInviteDialog extends React.PureComponent< {buttonText}
diff --git a/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx b/src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx similarity index 88% rename from src/components/views/dialogs/PrototypeCreateGroupDialog.tsx rename to src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx index d37301b573..5f8321fd7d 100644 --- a/src/components/views/dialogs/PrototypeCreateGroupDialog.tsx +++ b/src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx @@ -37,7 +37,7 @@ interface IState { avatarPreview: string; } -export default class PrototypeCreateGroupDialog extends React.PureComponent { +export default class CreateCommunityPrototypeDialog extends React.PureComponent { private avatarUploadRef: React.RefObject = React.createRef(); constructor(props: IProps) { @@ -138,7 +138,7 @@ export default class PrototypeCreateGroupDialog extends React.PureComponent + {_t("Community ID: +:%(domain)s", { domain: MatrixClientPeg.getHomeserverName(), }, { @@ -155,32 +155,32 @@ export default class PrototypeCreateGroupDialog extends React.PureComponent + {_t("You can change this later if needed.")} ); if (this.state.error) { helpText = ( - + {this.state.error} ); } - let preview = ; + let preview = ; if (!this.state.avatarPreview) { - preview =
+ preview =
} return (
-
+
{helpText} - + {/*nbsp is to reserve the height of this element when there's nothing*/}  {communityId} @@ -196,16 +196,16 @@ export default class PrototypeCreateGroupDialog extends React.PureComponent
-
+
- + {preview} -
+
{_t("Add image (optional)")} {_t("An image will help people identify your community.")} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c24a5537a3..f3cd1d80b7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1598,6 +1598,15 @@ "Unable to load commit detail: %(msg)s": "Unable to load commit detail: %(msg)s", "Unavailable": "Unavailable", "Changelog": "Changelog", + "Email address": "Email address", + "Add another email": "Add another email", + "People you know on %(brand)s": "People you know on %(brand)s", + "Hide": "Hide", + "Show": "Show", + "Skip": "Skip", + "Send %(count)s invites|other": "Send %(count)s invites", + "Send %(count)s invites|one": "Send %(count)s invite", + "Invite people to join %(communityName)s": "Invite people to join %(communityName)s", "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", "Removing…": "Removing…", "Destroy cross-signing keys?": "Destroy cross-signing keys?", @@ -1608,6 +1617,15 @@ "Clear all data in this session?": "Clear all data in this session?", "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.", "Clear all data": "Clear all data", + "There was an error creating your community. The name may be taken or the server is unable to process your request.": "There was an error creating your community. The name may be taken or the server is unable to process your request.", + "Community ID: +:%(domain)s": "Community ID: +:%(domain)s", + "Use this when referencing your community to others. The community ID cannot be changed.": "Use this when referencing your community to others. The community ID cannot be changed.", + "You can change this later if needed.": "You can change this later if needed.", + "What's the name of your community or team?": "What's the name of your community or team?", + "Enter name": "Enter name", + "Create": "Create", + "Add image (optional)": "Add image (optional)", + "An image will help people identify your community.": "An image will help people identify your community.", "Community IDs cannot be empty.": "Community IDs cannot be empty.", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community IDs may only contain characters a-z, 0-9, or '=_-./'", "Something went wrong whilst creating your community": "Something went wrong whilst creating your community", @@ -1616,7 +1634,6 @@ "Example": "Example", "Community ID": "Community ID", "example": "example", - "Create": "Create", "Please enter a name for the room": "Please enter a name for the room", "Set a room address to easily share your room with other people.": "Set a room address to easily share your room with other people.", "This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.", @@ -1729,23 +1746,6 @@ "Use this session to verify your new one, granting it access to encrypted messages:": "Use this session to verify your new one, granting it access to encrypted messages:", "If you didn’t sign in to this session, your account may be compromised.": "If you didn’t sign in to this session, your account may be compromised.", "This wasn't me": "This wasn't me", - "Email address": "Email address", - "Add another email": "Add another email", - "People you know on %(brand)s": "People you know on %(brand)s", - "Hide": "Hide", - "Show": "Show", - "Skip": "Skip", - "Send %(count)s invites|other": "Send %(count)s invites", - "Send %(count)s invites|one": "Send %(count)s invite", - "Invite people to join %(communityName)s": "Invite people to join %(communityName)s", - "There was an error creating your community. The name may be taken or the server is unable to process your request.": "There was an error creating your community. The name may be taken or the server is unable to process your request.", - "Community ID: +:%(domain)s": "Community ID: +:%(domain)s", - "Use this when referencing your community to others. The community ID cannot be changed.": "Use this when referencing your community to others. The community ID cannot be changed.", - "You can change this later if needed.": "You can change this later if needed.", - "What's the name of your community or team?": "What's the name of your community or team?", - "Enter name": "Enter name", - "Add image (optional)": "Add image (optional)", - "An image will help people identify your community.": "An image will help people identify your community.", "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.", "Report bugs & give feedback": "Report bugs & give feedback", From fd71bca7c0af97ab496a3d320900498256af0dc4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 26 Aug 2020 10:33:05 -0600 Subject: [PATCH 163/174] Change menu label if in a community --- src/components/views/rooms/RoomList.tsx | 5 ++++- src/i18n/strings/en_EN.json | 1 + src/stores/TagOrderStore.js | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/RoomList.tsx b/src/components/views/rooms/RoomList.tsx index 3274e0e49f..92c5982276 100644 --- a/src/components/views/rooms/RoomList.tsx +++ b/src/components/views/rooms/RoomList.tsx @@ -45,6 +45,7 @@ import { arrayFastClone, arrayHasDiff } from "../../../utils/arrays"; import { objectShallowClone, objectWithOnly } from "../../../utils/objects"; import { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../context_menus/IconizedContextMenu"; import AccessibleButton from "../elements/AccessibleButton"; +import TagOrderStore from "../../../stores/TagOrderStore"; interface IProps { onKeyDown: (ev: React.KeyboardEvent) => void; @@ -129,7 +130,9 @@ const TAG_AESTHETICS: { }} /> { e.preventDefault(); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d6ba736a76..da4e298f0f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1121,6 +1121,7 @@ "Rooms": "Rooms", "Add room": "Add room", "Create new room": "Create new room", + "Explore community rooms": "Explore community rooms", "Explore public rooms": "Explore public rooms", "Low priority": "Low priority", "System Alerts": "System Alerts", diff --git a/src/stores/TagOrderStore.js b/src/stores/TagOrderStore.js index f02fce0769..2eb35e6dc2 100644 --- a/src/stores/TagOrderStore.js +++ b/src/stores/TagOrderStore.js @@ -285,6 +285,13 @@ class TagOrderStore extends Store { getSelectedTags() { return this._state.selectedTags; } + + getSelectedPrototypeTag() { + if (SettingsStore.getValue("feature_communities_v2_prototypes")) { + return this.getSelectedTags()[0]; + } + return null; // no selection as far as this function is concerned + } } if (global.singletonTagOrderStore === undefined) { From c28134eb11bb3f1fab540c83cf9a512d1209f3e0 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 26 Aug 2020 10:53:06 -0600 Subject: [PATCH 164/174] Associate created rooms with the selected community --- src/components/views/dialogs/CreateRoomDialog.js | 13 ++++++++++++- src/createRoom.ts | 6 ++++++ src/i18n/strings/en_EN.json | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index ce7ac6e59c..9726c44fac 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -25,6 +25,8 @@ import { _t } from '../../../languageHandler'; import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {Key} from "../../../Keyboard"; import {privateShouldBeEncrypted} from "../../../createRoom"; +import TagOrderStore from "../../../stores/TagOrderStore"; +import GroupStore from "../../../stores/GroupStore"; export default createReactClass({ displayName: 'CreateRoomDialog', @@ -70,6 +72,10 @@ export default createReactClass({ opts.encryption = this.state.isEncrypted; } + if (TagOrderStore.getSelectedPrototypeTag()) { + opts.associatedWithCommunity = TagOrderStore.getSelectedPrototypeTag(); + } + return opts; }, @@ -212,7 +218,12 @@ export default createReactClass({ ; } - const title = this.state.isPublic ? _t('Create a public room') : _t('Create a private room'); + let title = this.state.isPublic ? _t('Create a public room') : _t('Create a private room'); + if (TagOrderStore.getSelectedPrototypeTag()) { + const summary = GroupStore.getSummary(TagOrderStore.getSelectedPrototypeTag()); + const name = summary?.profile?.name || TagOrderStore.getSelectedPrototypeTag(); + title = _t("Create a room in %(communityName)s", {communityName: name}); + } return ( { } else { return Promise.resolve(); } + }).then(() => { + if (opts.associatedWithCommunity) { + return GroupStore.addRoomToGroup(opts.associatedWithCommunity, roomId, false); + } }).then(function() { // NB createRoom doesn't block on the client seeing the echo that the // room has been created, so we race here with the client knowing that diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index da4e298f0f..0ec12a4d6a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1643,6 +1643,7 @@ "Enable end-to-end encryption": "Enable end-to-end encryption", "Create a public room": "Create a public room", "Create a private room": "Create a private room", + "Create a room in %(communityName)s": "Create a room in %(communityName)s", "Name": "Name", "Topic (optional)": "Topic (optional)", "Make this room public": "Make this room public", From 027f263589a767830120b18b83829d8ca8c42bab Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 26 Aug 2020 11:01:58 -0600 Subject: [PATCH 165/174] Remove prototype code from CreateGroupDialog The prototype code paths prevent users from ending up here, so we don't need custom code. --- .../views/dialogs/CreateGroupDialog.js | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/components/views/dialogs/CreateGroupDialog.js b/src/components/views/dialogs/CreateGroupDialog.js index 2b22054947..10285ccee0 100644 --- a/src/components/views/dialogs/CreateGroupDialog.js +++ b/src/components/views/dialogs/CreateGroupDialog.js @@ -83,25 +83,11 @@ export default createReactClass({ localpart: this.state.groupId, profile: profile, }).then((result) => { - if (result.room_id) { - dis.dispatch({ - action: 'view_room', - room_id: result.room_id, - }); - - // Ensure the tag gets selected now that we've created it - dis.dispatch({action: 'deselect_tags'}, true); - dis.dispatch({ - action: 'select_tag', - tag: result.group_id, - }); - } else { - dis.dispatch({ - action: 'view_group', - group_id: result.group_id, - group_is_new: true, - }); - } + dis.dispatch({ + action: 'view_group', + group_id: result.group_id, + group_is_new: true, + }); this.props.onFinished(true); }).catch((e) => { this.setState({createError: e}); From 4f29770adb8880e451067d58574b6d1f06e02de1 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 26 Aug 2020 11:02:14 -0600 Subject: [PATCH 166/174] Force the GroupStore to update after creating a prototype community --- .../views/dialogs/CreateCommunityPrototypeDialog.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx b/src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx index 5f8321fd7d..58412c23d6 100644 --- a/src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx +++ b/src/components/views/dialogs/CreateCommunityPrototypeDialog.tsx @@ -24,6 +24,7 @@ import { MatrixClientPeg } from "../../../MatrixClientPeg"; import InfoTooltip from "../elements/InfoTooltip"; import dis from "../../../dispatcher/dispatcher"; import {showCommunityRoomInviteDialog} from "../../../RoomInvite"; +import GroupStore from "../../../stores/GroupStore"; interface IProps extends IDialogProps { } @@ -92,6 +93,8 @@ export default class CreateCommunityPrototypeDialog extends React.PureComponent< this.props.onFinished(true); if (result.room_id) { + // Force the group store to update as it might have missed the general chat + await GroupStore.refreshGroupRooms(result.group_id); dis.dispatch({ action: 'view_room', room_id: result.room_id, From 4a807f9385fd3e755b46b897761f77cac1107e63 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 27 Aug 2020 13:41:03 +0100 Subject: [PATCH 167/174] Migrate to new, separate APIs for cross-signing and secret storage This migrates to the new JS SDK APIs, which now use separate paths for cross-signing and secret storage setup. There should be no functional change here. Part of https://github.com/vector-im/element-web/issues/13895 --- src/CrossSigningManager.js | 6 ++++-- .../dialogs/secretstorage/CreateSecretStorageDialog.js | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index da09a436e9..a7b494dc26 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -239,7 +239,7 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f } } else { const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); - await cli.bootstrapSecretStorage({ + await cli.bootstrapCrossSigning({ authUploadDeviceSigningKeys: async (makeRequest) => { const { finished } = Modal.createTrackedDialog( 'Cross-signing keys dialog', '', InteractiveAuthDialog, @@ -254,7 +254,9 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f throw new Error("Cross-signing key upload auth canceled"); } }, - getBackupPassphrase: promptForBackupPassphrase, + }); + await cli.bootstrapSecretStorage({ + getKeyBackupPassphrase: promptForBackupPassphrase, }); } diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 47faa35df4..19c0c79448 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -282,15 +282,20 @@ export default class CreateSecretStorageDialog extends React.PureComponent { try { if (force) { console.log("Forcing secret storage reset"); // log something so we can debug this later - await cli.bootstrapSecretStorage({ + await cli.bootstrapCrossSigning({ authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + setupNewCrossSigning: true, + }); + await cli.bootstrapSecretStorage({ createSecretStorageKey: async () => this._recoveryKey, setupNewKeyBackup: true, setupNewSecretStorage: true, }); } else { - await cli.bootstrapSecretStorage({ + await cli.bootstrapCrossSigning({ authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + }); + await cli.bootstrapSecretStorage({ createSecretStorageKey: async () => this._recoveryKey, keyBackupInfo: this.state.backupInfo, setupNewKeyBackup: !this.state.backupInfo, From 3a98b4b4e948b9993d8f063049c5338e42fefd21 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 27 Aug 2020 13:50:50 +0100 Subject: [PATCH 168/174] Rename reset secret storage prop The bare word `force` has bothered me, so this adds a tiny amount more meaning. --- src/CrossSigningManager.js | 2 +- .../secretstorage/CreateSecretStorageDialog.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index a7b494dc26..b15290b9c3 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -218,7 +218,7 @@ export async function accessSecretStorage(func = async () => { }, forceReset = f const { finished } = Modal.createTrackedDialogAsync('Create Secret Storage dialog', '', import("./async-components/views/dialogs/secretstorage/CreateSecretStorageDialog"), { - force: forceReset, + forceReset, }, null, /* priority = */ false, diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 19c0c79448..00216e3765 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -56,12 +56,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent { static propTypes = { hasCancel: PropTypes.bool, accountPassword: PropTypes.string, - force: PropTypes.bool, + forceReset: PropTypes.bool, }; static defaultProps = { hasCancel: true, - force: false, + forceReset: false, }; constructor(props) { @@ -118,8 +118,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo) ); - const { force } = this.props; - const phase = (backupInfo && !force) ? PHASE_MIGRATE : PHASE_CHOOSE_KEY_PASSPHRASE; + const { forceReset } = this.props; + const phase = (backupInfo && !forceReset) ? PHASE_MIGRATE : PHASE_CHOOSE_KEY_PASSPHRASE; this.setState({ phase, @@ -277,11 +277,11 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const cli = MatrixClientPeg.get(); - const { force } = this.props; + const { forceReset } = this.props; try { - if (force) { - console.log("Forcing secret storage reset"); // log something so we can debug this later + if (forceReset) { + console.log("Forcing cross-signing and secret storage reset"); await cli.bootstrapCrossSigning({ authUploadDeviceSigningKeys: this._doBootstrapUIAuth, setupNewCrossSigning: true, From 13e9f7b9128b99c11970d4ca76ffd0063b085c02 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 27 Aug 2020 13:18:52 -0600 Subject: [PATCH 169/174] Update home icon --- res/css/structures/_TagPanel.scss | 13 +++++++------ res/img/element-icons/home.svg | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index 2683a32dae..dc27da7102 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -99,11 +99,11 @@ limitations under the License. } .mx_TagTile:not(.mx_TagTile_selected_prototype) .mx_TagTile_homeIcon { - background-color: $icon-button-color; // XXX: Variable abuse + background-color: $roomheader-addroom-bg-color; border-radius: 48px; &::before { - background-color: $primary-bg-color; // light-on-grey + background-color: $roomheader-addroom-fg-color; } } @@ -116,13 +116,14 @@ limitations under the License. mask-image: url('$(res)/img/element-icons/home.svg'); mask-position: center; mask-repeat: no-repeat; - width: 21px; - height: 21px; + mask-size: 21px; content: ''; display: inline-block; + width: 32px; + height: 32px; position: absolute; - top: calc(50% - 10.5px); - left: calc(50% - 10.5px); + top: calc(50% - 16px); + left: calc(50% - 16px); } } diff --git a/res/img/element-icons/home.svg b/res/img/element-icons/home.svg index d65812cafd..a6c15456ff 100644 --- a/res/img/element-icons/home.svg +++ b/res/img/element-icons/home.svg @@ -1,3 +1,3 @@ - + From be1de1d2952e845542b45c900d0235e2d8039114 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 27 Aug 2020 13:49:40 -0600 Subject: [PATCH 170/174] Update create room dialog copy --- .../views/dialogs/CreateRoomDialog.js | 38 ++++++++++++++++--- src/i18n/strings/en_EN.json | 8 ++-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 9726c44fac..d334438d58 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -184,18 +184,25 @@ export default createReactClass({ const LabelledToggleSwitch = sdk.getComponent('views.elements.LabelledToggleSwitch'); const RoomAliasField = sdk.getComponent('views.elements.RoomAliasField'); - let publicPrivateLabel; let aliasField; if (this.state.isPublic) { - publicPrivateLabel = (

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

); const domain = MatrixClientPeg.get().getDomain(); aliasField = (
this._aliasFieldRef = ref} onChange={this.onAliasChange} domain={domain} value={this.state.alias} />
); - } else { - publicPrivateLabel = (

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

); + } + + let publicPrivateLabel =

{_t( + "Private rooms can be found and joined by invitation only. Public rooms can be " + + "found and joined by anyone.", + )}

; + if (TagOrderStore.getSelectedPrototypeTag()) { + publicPrivateLabel =

{_t( + "Private rooms can be found and joined by invitation only. Public rooms can be " + + "found and joined by anyone in this community.", + )}

; } let e2eeSection; @@ -218,6 +225,19 @@ export default createReactClass({ ; } + let federateLabel = _t( + "You might enable this if the room will be only be used for collaborating with internal " + + "teams on your homeserver. This setting cannot be changed later.", + ); + if (SdkConfig.get().default_federate === false) { + // We only change the label if the default setting is different to avoid jarring text changes to the + // user. They will have read the implications of turning this off/on, so no need to rephrase for them. + federateLabel = _t( + "You might disable this if the room will be used for collaborating with external " + + "teams who have their own homeserver. This setting cannot be changed later.", + ); + } + let title = this.state.isPublic ? _t('Create a public room') : _t('Create a private room'); if (TagOrderStore.getSelectedPrototypeTag()) { const summary = GroupStore.getSummary(TagOrderStore.getSelectedPrototypeTag()); @@ -238,7 +258,15 @@ export default createReactClass({ { aliasField }
{ this.state.detailsOpen ? _t('Hide advanced') : _t('Show advanced') } - + +

{federateLabel}

diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 0ec12a4d6a..b92af49fad 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1637,10 +1637,12 @@ "Community ID": "Community ID", "example": "example", "Please enter a name for the room": "Please enter a name for the room", - "Set a room address to easily share your room with other people.": "Set a room address to easily share your room with other people.", - "This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.", "You can’t disable this later. Bridges & most bots won’t work yet.": "You can’t disable this later. Bridges & most bots won’t work yet.", "Enable end-to-end encryption": "Enable end-to-end encryption", + "You might enable this if the room will be only be used for collaborating with internal teams on your homeserver. This setting cannot be changed later.": "You might enable this if the room will be only be used for collaborating with internal teams on your homeserver. This setting cannot be changed later.", + "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This setting cannot be changed later.": "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This setting cannot be changed later.", "Create a public room": "Create a public room", "Create a private room": "Create a private room", "Create a room in %(communityName)s": "Create a room in %(communityName)s", @@ -1649,7 +1651,7 @@ "Make this room public": "Make this room public", "Hide advanced": "Hide advanced", "Show advanced": "Show advanced", - "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)", + "Block anyone not part of %(serverName)s from ever joining this room.": "Block anyone not part of %(serverName)s from ever joining this room.", "Create Room": "Create Room", "Sign out": "Sign out", "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this", From bbd343f414fec4cd1035d053c49556cf048175a3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 27 Aug 2020 14:17:55 -0600 Subject: [PATCH 171/174] Fix clicking the background of the tag panel not clearing the filter Fixes https://github.com/vector-im/element-web/issues/12988 --- src/components/structures/TagPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 4acbc49d4d..40b5d04a0a 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -164,7 +164,7 @@ const TagPanel = createReactClass({ ); } - return
+ return
{ clearButton }
From 3c176f762ed9d20f8ffe6529ce23c5a200451308 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 27 Aug 2020 14:26:55 -0600 Subject: [PATCH 172/174] Remove disabled clear button from tag panel + dead code --- res/css/structures/_TagPanel.scss | 19 ------------------- src/components/structures/TagPanel.js | 21 --------------------- 2 files changed, 40 deletions(-) diff --git a/res/css/structures/_TagPanel.scss b/res/css/structures/_TagPanel.scss index 2683a32dae..0c8857e1ef 100644 --- a/res/css/structures/_TagPanel.scss +++ b/res/css/structures/_TagPanel.scss @@ -30,25 +30,6 @@ limitations under the License. cursor: pointer; } -.mx_TagPanel .mx_TagPanel_clearButton_container { - /* Constant height within flex mx_TagPanel */ - height: 70px; - width: 56px; - - flex: none; - - justify-content: center; - align-items: flex-start; - - display: none; -} - -.mx_TagPanel .mx_TagPanel_clearButton object { - /* Same as .mx_SearchBox padding-top */ - margin-top: 24px; - pointer-events: none; -} - .mx_TagPanel .mx_TagPanel_divider { height: 0px; width: 90%; diff --git a/src/components/structures/TagPanel.js b/src/components/structures/TagPanel.js index 40b5d04a0a..a714b126ec 100644 --- a/src/components/structures/TagPanel.js +++ b/src/components/structures/TagPanel.js @@ -95,11 +95,6 @@ const TagPanel = createReactClass({ } }, - onCreateGroupClick(ev) { - ev.stopPropagation(); - dis.dispatch({action: 'view_create_group'}); - }, - onClearFilterClick(ev) { dis.dispatch({action: 'deselect_tags'}); }, @@ -117,9 +112,7 @@ const TagPanel = createReactClass({ render() { const DNDTagTile = sdk.getComponent('elements.DNDTagTile'); - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const ActionButton = sdk.getComponent('elements.ActionButton'); - const TintableSvg = sdk.getComponent('elements.TintableSvg'); const tags = this.state.orderedTags.map((tag, index) => { return 0; - - let clearButton; - if (itemsSelected) { - clearButton = - - ; - } - const classes = classNames('mx_TagPanel', { mx_TagPanel_items_selected: itemsSelected, }); @@ -165,9 +147,6 @@ const TagPanel = createReactClass({ } return
-
- { clearButton } -
Date: Fri, 28 Aug 2020 12:10:17 +0100 Subject: [PATCH 173/174] Add secret storage cache callback to avoid prompts This supplies a cache callback to the JS SDK so that we can be notified if a new storage key is created e.g. by resetting secret storage. This allows it to be supplied automatically in case it's needed in the same user operation, as it is when resetting both secret storage and cross-signing together. --- src/CrossSigningManager.js | 27 +++++++++++-------- .../CreateSecretStorageDialog.js | 8 +++--- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index b15290b9c3..0353bfc5ae 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -69,19 +69,19 @@ async function getSecretStorageKey({ keys: keyInfos }, ssssItemName) { if (keyInfoEntries.length > 1) { throw new Error("Multiple storage key requests not implemented"); } - const [name, info] = keyInfoEntries[0]; + const [keyId, keyInfo] = keyInfoEntries[0]; // Check the in-memory cache - if (isCachingAllowed() && secretStorageKeys[name]) { - return [name, secretStorageKeys[name]]; + if (isCachingAllowed() && secretStorageKeys[keyId]) { + return [keyId, secretStorageKeys[keyId]]; } const inputToKey = async ({ passphrase, recoveryKey }) => { if (passphrase) { return deriveKey( passphrase, - info.passphrase.salt, - info.passphrase.iterations, + keyInfo.passphrase.salt, + keyInfo.passphrase.iterations, ); } else { return decodeRecoveryKey(recoveryKey); @@ -93,10 +93,10 @@ async function getSecretStorageKey({ keys: keyInfos }, ssssItemName) { AccessSecretStorageDialog, /* props= */ { - keyInfo: info, + keyInfo, checkPrivateKey: async (input) => { const key = await inputToKey(input); - return await MatrixClientPeg.get().checkSecretStorageKey(key, info); + return await MatrixClientPeg.get().checkSecretStorageKey(key, keyInfo); }, }, /* className= */ null, @@ -118,11 +118,15 @@ async function getSecretStorageKey({ keys: keyInfos }, ssssItemName) { const key = await inputToKey(input); // Save to cache to avoid future prompts in the current session - if (isCachingAllowed()) { - secretStorageKeys[name] = key; - } + cacheSecretStorageKey(keyId, key); - return [name, key]; + return [keyId, key]; +} + +function cacheSecretStorageKey(keyId, key) { + if (isCachingAllowed()) { + secretStorageKeys[keyId] = key; + } } const onSecretRequested = async function({ @@ -170,6 +174,7 @@ const onSecretRequested = async function({ export const crossSigningCallbacks = { getSecretStorageKey, + cacheSecretStorageKey, onSecretRequested, }; diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 00216e3765..0a1a0b02b3 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -282,15 +282,15 @@ export default class CreateSecretStorageDialog extends React.PureComponent { try { if (forceReset) { console.log("Forcing cross-signing and secret storage reset"); - await cli.bootstrapCrossSigning({ - authUploadDeviceSigningKeys: this._doBootstrapUIAuth, - setupNewCrossSigning: true, - }); await cli.bootstrapSecretStorage({ createSecretStorageKey: async () => this._recoveryKey, setupNewKeyBackup: true, setupNewSecretStorage: true, }); + await cli.bootstrapCrossSigning({ + authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + setupNewCrossSigning: true, + }); } else { await cli.bootstrapCrossSigning({ authUploadDeviceSigningKeys: this._doBootstrapUIAuth, From f038103f97b0b9625a711e7a839420b2c7fc475c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 28 Aug 2020 09:47:36 -0600 Subject: [PATCH 174/174] Fix copy --- src/components/views/dialogs/CreateRoomDialog.js | 6 +++--- src/i18n/strings/en_EN.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index d334438d58..4890626527 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -226,15 +226,15 @@ export default createReactClass({ } let federateLabel = _t( - "You might enable this if the room will be only be used for collaborating with internal " + - "teams on your homeserver. This setting cannot be changed later.", + "You might enable this if the room will only be used for collaborating with internal " + + "teams on your homeserver. This cannot be changed later.", ); if (SdkConfig.get().default_federate === false) { // We only change the label if the default setting is different to avoid jarring text changes to the // user. They will have read the implications of turning this off/on, so no need to rephrase for them. federateLabel = _t( "You might disable this if the room will be used for collaborating with external " + - "teams who have their own homeserver. This setting cannot be changed later.", + "teams who have their own homeserver. This cannot be changed later.", ); } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b92af49fad..f65e75d2b9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1641,8 +1641,8 @@ "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.", "You can’t disable this later. Bridges & most bots won’t work yet.": "You can’t disable this later. Bridges & most bots won’t work yet.", "Enable end-to-end encryption": "Enable end-to-end encryption", - "You might enable this if the room will be only be used for collaborating with internal teams on your homeserver. This setting cannot be changed later.": "You might enable this if the room will be only be used for collaborating with internal teams on your homeserver. This setting cannot be changed later.", - "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This setting cannot be changed later.": "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This setting cannot be changed later.", + "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.", + "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.": "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.", "Create a public room": "Create a public room", "Create a private room": "Create a private room", "Create a room in %(communityName)s": "Create a room in %(communityName)s",