From 985007a1c18241efb96b956a5b9e0f56ad70eeba Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sat, 26 Feb 2022 10:46:51 +0000 Subject: [PATCH 001/152] Translated using Weblate (Czech) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- vector/src/main/res/values-cs/strings.xml | 43 ++--------------------- 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 9d0220f3a6..cf022172c2 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -38,7 +38,6 @@ Telefonní číslo Pozvání do místnosti %1$s a %2$s - Prázdná místnost %s povýšili tuto místnost. %1$s zrušili pozvánku do místnosti pro %2$s @@ -260,7 +259,6 @@ Trvalý odkaz Zobrazit dešifrovaný zdroj Nahlásit obsah - Odhlásit Hlasový hovor Video hovor @@ -281,7 +279,6 @@ Pouze kontakty Matrix Žádné výsledky Místnosti - Komunity Odeslat záznamy Odeslat záznamy zřícení @@ -334,8 +331,6 @@ \nPřejete si nějaké přidat nyní\? Omlouváme se, ale nebyla nalezena žádná externí aplikace pro dokončení této akce. Šifrovaná zpráva - - Prosím, přečtěte si a souhlaste s pravidly tohoto serveru: Neobsahuje platný JSON Znovu požádat o šifrovací klíče z vašich ostatních relací. @@ -360,10 +355,7 @@ Hovor probíhá… Protější strana hovor nepřijala. Informace - - ${app_name} potřebuje oprávnění pro přístup k Vašemu mikrofonu pro uskutečnění hlasových hovorů. - ANO NE Pokračovat @@ -373,16 +365,11 @@ Odmítnout Zobrazit členy Přejít na nepřečtené - %d člen %d členové %d členů - - - - Opustit místnost Opravdu chcete opustit tuto místnost\? PŘÍMÉ KONVERZACE @@ -431,8 +418,6 @@ ${app_name} potřebuje oprávnění pro přístup k Vaší kameře a mikrofonu pro uskutečnění video hovoru. \n \nProsím, povolte přístup na následující hlášce abyste mohli uskutečnit hovor. - - Tuto změnu nelze zvrátit, protože povyšujete uživatele na stejnou úroveň, jakou máte vy. \nOpravdu to chcete udělat\? Toto by mohlo znamenat, že někdo škodlivě zachytává Vaši komunikaci nebo že Váš telefon nedůvěřuje certifikátu poskytnutému vzdáleným serverem. @@ -440,12 +425,9 @@ Certifikát se změnil z toho, kterému Váš telefon důvěřoval. Toto je VELMI NEOBVYKLÉ. Je doporučeno, abyste NEPŘIJALI tento nový certifikát. Certifikát se změnil z původně důvěryhodného na nyní nedůvěryhodný. Server patrně obnovil svůj certifikát. Kontaktujte administrátora kvůli očekávanému otisku. Přijměte certifikát pouze pokud administrátor serveru publikoval otisk, který odpovídá tomu uvedenému výše. - Vyhledat Filtrovat členy místnosti Žádné výsledky - - Všechny zprávy Přidat na domovskou obrazovku Obrázek profilu @@ -462,7 +444,6 @@ Označit za přečtené Žádný Zrušit - Přihlásit se se single sign-on To není platná adresa Matrix serveru Domovský server není dostupný na této adrese, zkontrolujte ji prosím @@ -553,7 +534,6 @@ Neobdržíte oznámení o příchozích zprávách, je-li aplikace na pozadí. Start při zavádění Čas požadavku na sync vypršel - Prodleva mezi jednotlivými syncy Verze Verze olm @@ -603,7 +583,6 @@ Deaktivovat můj účet Objevování Správa Vašich nastavení pro objevování. - Analýza Odeslat analytická data ${app_name} sbírá anonymní analytická data pro vylepšení aplikace. @@ -612,7 +591,6 @@ Aktualizovat veřejné jméno Viděn naposledy %1$s @ %2$s - Ověření Přihlášen jako Domovský server @@ -661,7 +639,6 @@ Toto jsou experimentální funkce, které mohou selhat neočekávanými způsoby. Použijte obezřetně. Nastavit jako hlavní adresu Odebrat jako hlavní adresu - Motiv vzhledu Chyba dešifrování Veřejné jméno @@ -672,7 +649,6 @@ Export klíčů do místního souboru Export Prosím, vytvořte frázi k zašifrování exportovaných klíčů. Pro import klíčů budete muset zadat stejnou přístupovou frázi. - Obnovení zašifrovaných zpráv Správa zálohy klíčů Import E2E klíčů místností @@ -721,7 +697,6 @@ Importovat e2e klíče ze souboru \"%1$s\". Potvrďte porovnáním následujícího s nastavením uživatele ve svých dalších relacích: Pokud se neshodují, zabezpečení Vaší komunikace může být ohroženo. - Vybrat adresář místností Název serveru Všechny místnosti na serveru %s @@ -731,7 +706,6 @@ %d nepřečtené oznámené zprávy %d nepřečtených oznámených zpráv - %d místnost %d místnosti @@ -834,8 +808,6 @@ Úvod Místnosti Pozvaní - - %2$s Vás vykopnul z %1$s %2$s Vám zakázal %1$s Důvod: %1$s @@ -899,7 +871,6 @@ Uložit klíč obnovy Sdílet Uložit jako soubor - Záloha již existuje na Vašem domovském serveru Vypadá to, že jste již nastavili zálohu klíče z jiné relace. Chcete ji nahradit zálohou, již právě provádíte\? Nahradit @@ -942,7 +913,6 @@ Kontroluji stav zálohy Smazat zálohu Smazat Vaše zálohované šifrovací klíče ze serveru\? Ke čtení šifrované historie zpráv již nebude moci použít klíč obnovy. - Nikdy neztraťte šifrované zprávy Použíjte zálohu klíče Nový bezpečný klíč zpráv @@ -950,11 +920,8 @@ Verze Algoritmus Podpis - Ověřeno! Rozumím - - Žádost na ověření %s chce ověřit Vaši relaci Neznámá chyba @@ -1107,7 +1074,6 @@ Obsah byl nahlášen jako nepatřičný. \n \nPokud si dále nepřejete vidět obsah tohoto uživatele, můžete jej ignorovat a tím skrýt jejich zprávy. - Ignorovat uživatele Všechny zprávy (hlučné) Všechny zprávy @@ -1295,7 +1261,6 @@ Ověřit %s Ověřeno %s Čekám na %s… - Zprávy v této místnosti nejsou koncově šifrovány. Zprávy v této místnosti jsou koncově šifrovány. \n @@ -1443,7 +1408,6 @@ Vytiskněte a uložte na bezpečném místě Uložte je na USB nebo zálohový disk Nahrajte do svého osobního úložiště v cloudu - Šifrování zapnuto Zprávy v této místnosti jsou koncově šifrovány. Zjistěte více a ověřte uživatele v jejich profilech. Šifrování není zapnuto @@ -1855,7 +1819,6 @@ Skrýt pokročilé Ukázat pokročilé %1$d z %2$d - Udělit souhlas Zrušit můj souhlas Udělili jste souhlas pro odeslání emailových adres a telefonních čísel na tento server pro identity za účelem nalezení dalších uživatelů podle svých kontaktů. @@ -1948,8 +1911,6 @@ Při přepojování hovoru došlo k chybě Připojit Nejprve se poraďte - - Probíhající hovor (%1$s) Při vyhledávání telefonního čísla došlo k chybě Číselník @@ -2149,7 +2110,6 @@ Zadejte název nového serveru, který chcete prozkoumat. Přidat nový server Váš server - Omlouváme se, došlo k chybě během pokusu o přistoupení: %s Adresa prostoru Prohlédnout a spravovat adresy tohoto prostoru. @@ -2354,7 +2314,6 @@ Otázka nebo téma hlasování Vytvořit hlasování Hlasování - Odeslat e-maily a telefonní čísla na %s Vaše kontakty jsou soukromé. Pro zjištění uživatelů z vašich kontaktů, potřebujeme vaše svolení k odeslání informací o kontaktech na váš server identit. Relace byla odhlášena! @@ -2505,4 +2464,6 @@ %1$d dalších Zobrazit méně + %1$s, %2$s a další + %1$s a %2$s \ No newline at end of file From f507c6c4a9a4e07a9a0760abbd7f32398d8c29b7 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Sat, 26 Feb 2022 10:36:50 +0000 Subject: [PATCH 002/152] Translated using Weblate (Hungarian) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- vector/src/main/res/values-hu/strings.xml | 41 ++--------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 40121e2d1a..000da846b8 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -39,7 +39,6 @@ Meghívó egy szobába %1$s és %2$s Üres szoba - Induló szinkronizáció: \nFiók betöltése… Induló szinkronizáció: @@ -179,7 +178,6 @@ Törlés Átnevezés Tartalom Bejelentése - vagy Meghívás Kijelentkezés @@ -202,7 +200,6 @@ Csak Matrix névjegyek Nincs találat Szobák - Naplófájlok küldése Összeomlásnaplók küldése Képernyőkép küldése @@ -230,11 +227,9 @@ Ez nem tűnik érvényes e-mail címnek Ez az e-mail cím már használatban van. Elfelejtetted a jelszavad? - A Matrix-kiszolgáló szeretné ellenőrizni, hogy nem vagy robot Meg kell adnod a fiókodhoz tartozó e-mail-címet. Az e-mail-címed ellenőrzés sikertelen: győződj meg róla, hogy rákattintottál az e-mailben található hivatkozásra - Adj meg egy érvényes URL-t Hibás JSON Nem tartalmazott érvényes JSON-t @@ -250,14 +245,10 @@ Hívás folyamatban… A hívott fél nem vette fel. Információ - - A ${app_name}nek engedélyre van szüksége a mikrofon eléréséhez, hogy hanghívás tudjon indítani. - A ${app_name}nek engedélyre van szüksége a mikrofonod és kamerád eléréséhez, hogy videohívást tudj indítani. \n \nEngedélyezd a hozzáférést a következő felugró ablakon, hogy hívást tudj indítani. - IGEN NEM Folytatás @@ -265,7 +256,6 @@ Csatlakozás Elutasítás Ugrás az olvasatlanra - Szoba elhagyása Biztos el akarod hagyni a szobát? KÖZVETLEN CSEVEGÉSEK @@ -292,7 +282,6 @@ A tanúsítvány eltér attól, amit a telefonoddal megbízhatónak jelöltél. Ez RENDKÍVÜL SZOKATLAN. Javasoljuk, hogy NE FOGADD EL ezt az új tanúsítványt. Egy korábban megbízhatónak jelölt tanúsítvány megváltozott. Lehet, hogy a szerver frissítette a tanúsítványát. Lépj kapcsolatba a szerver adminisztrátorával és egyeztesd az ujjlenyomatot. Csak akkor fogadd el a tanúsítványt, ha a szerver adminisztrátortól kapott ujjlenyomat megegyezik a fentivel. - Keresés Szobatagok szűrése Nincs találat @@ -337,7 +326,6 @@ Nyilvános Név frissítése Legutóbb láttuk %1$s @ %2$s - Azonosítás Bejelentkezve mint Matrix szerver @@ -366,7 +354,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< Ezek kísérleti funkciók, ezek elromolhatnak nem számított módokon. Használd elővigyázatossággal. Fő címnek állítás Kiszedés fő címek közül - Visszafejtés hiba Nyilvános név Munkamenet-azonosító @@ -377,7 +364,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< Exportálás Írj be jelmondatot Ellenőrizd a jelmondatot - E2E szoba kulcsok importálása Szoba kulcsok importálása Kulcsok importálás helyi fájlból @@ -389,7 +375,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< Hitelesítés Hogy ellenőrizni lehessen, hogy ez a munkamenet megbízható, kérlek használj más kommunikáció módot a tulajdonossal (pl.: személyesen vagy telefonon keresztül) és kérdezd meg hogy a kulcs amit lát a Felhasználói Beállítások alatt megegyezik-e az alábbi kulccsal: Ha nem egyeznek, akkor a kommunikáció biztonsága kompromittálva lehet. A jövőben ez a hitelesítési mód kényelmesebbé lesz téve. - Válassz egy szoba könyvtárat Szerver neve Összes szoba a %s szerveren @@ -473,7 +458,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< %d tagság változás Tagok listázása - %d tag %d tag @@ -482,13 +466,10 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< %d új üzenet %d új üzenet - - %d olvasatlan üzenet %d olvasatlan üzenet - %d szoba %d szoba @@ -544,16 +525,10 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés A beszélgetés itt folytatódik Ez a szoba egy másik beszélgetés folytatása Régebbi üzenetek megjelenítéséhez kattints ide - - - - %d kiválasztva %d kiválasztva - - Rendszerriasztások vedd fel a kapcsolatot a szolgáltatás adminisztrátorával Ez a Matrix szerver túllépte valamely erőforrás korlátot így néhány felhasználó nem tud majd bejelentkezni. @@ -680,7 +655,6 @@ Helyezd biztonságba a kulcsokat, hogy ne vesszenek el. Kész Visszaállítási Kulcs mentése Mentés fájlba - Kérlek, készíts egy másolatot! Visszaállítási Kulcs megosztása… Visszaállítási Kulcs készítése jelmondatból, ez néhány másodpercet igénybe vehet. @@ -774,7 +748,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Üzenet küldése Enter billentyűvel Az Enter billentyű a virtuális billentyűzeten elküldi az üzenetet és nem új sort szúr be A jelszó nem érvényes - Média Alapértelmezett tömörítés Válassz @@ -811,8 +784,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Mellőz Ellenőrizve! Értem - - Ellenőrzési kérés %s szeretné ellenőrizni a munkamenetedet Ismeretlen Hiba @@ -909,7 +880,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Nincs Visszavonás Bontás - Nem érhető el Matrix-kiszolgáló ezen a címen, ellenőrizd Háttér Szinkronizálási Mód Optimalizált akkumulátor használat @@ -920,7 +890,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze \nEz befolyásolja a rádió és az akkumulátor használatot, és folyamatosan egy értesítés fog megjelenni arról, hogy a ${app_name} figyel a neki küldött eseményekre. Nincs szinkroniziálás a háttérben Nem leszel értesítve az érkező üzenetekről, ha az alkalmazás csak a háttérben fut. - Felderítés Felderítési beállítások megváltoztatása. Nem használsz Azonosítási Szervert @@ -990,7 +959,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Ez a tartalom nem idevalónak lett bejelentve. \n \n Ha nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra. - Integrációk Botok, hidak, kisalkalmazások és matrica csomagok kezeléséhez használj Integrációs Menedzsert. \n @@ -1207,7 +1175,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Ellenőrzés: %s Ellenőrizve: %s Várakozás %s felhasználóra… - Az üzenetek a szobában nincsenek végponttól végpontig titkosítva. A szobában az üzenetek végponttól végpontig titkosítva vannak. \n @@ -1353,7 +1320,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Nyomtasd ki és tárold valahol biztonságos helyen Mentsd el egy USB kulcsra vagy mentő eszközre Másold fel a személyes felhő tárhelyedre - Titkosítás bekapcsolva 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ók profiljait! Titkosítás nincs engedélyezve @@ -1674,7 +1640,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze QR kód Meghívás QR kóddal A QR kód beolvasásához szükség van kamera hozzáférésre. - Elutasítás Fogadás Nincsen jogosultságod konferenciahívás indításához @@ -1939,8 +1904,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Átadás Kapcsolódás Először tájékozódj - - Aktív hívás (%1$s) A telefonszám megkeresésekor hiba történt Tárcsázó számlap @@ -2110,7 +2073,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Add meg a felfedezni kívánt új szerver nevét. Új szerver hozzáadása Matrix szervered - Bocsánat, hiba történt a csatlakozáskor ide: %s Tér cím Tér címek megjelenítése és kezelése. @@ -2298,7 +2260,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Matrix szerver kiválasztása A matrix szervert nem sikerül elérni ezen az URL-en: %s. Ellenőrizd a kapcsolatodat vagy add meg a matrix szervert kézzel. Értesítések figyelése - A névjegyeid személyes adatok. Ahhoz, hogy a névjegyzéked alapján megtalálhass felhasználókat, szükségünk van az engedélyedre, hogy a névjegy adatokat elküldhessük az azonosítási szolgáltatásnak. Legalább %1$s válasz szükséges @@ -2456,4 +2417,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze %d szerver jogosultság változott %d szerver jogosultság változott + %1$s, %2$s és még mások + %1$s és %2$s \ No newline at end of file From ff08ed322fa892a024c877c0f73c0c160f94fde0 Mon Sep 17 00:00:00 2001 From: Linerly Date: Sat, 26 Feb 2022 00:00:43 +0000 Subject: [PATCH 003/152] Translated using Weblate (Indonesian) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/id/ --- vector/src/main/res/values-in/strings.xml | 45 +---------------------- 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index 097efda7a6..d7856089e8 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -3,7 +3,6 @@ Undangan Ruangan %1$s dan %2$s Ruangan kosong - Pengaturan OK Batal @@ -85,9 +84,7 @@ Nama server Pilih direktori ruang Terverifikasi - Gandakan ke clipboard - Kirim tampilan layar Mohon uraikan kutu tersebut. Apa yang Anda lakukan\? Apa yang Anda harapkan terjadi\? Apa yang sebenarnya terjadi\? Catat dari klien akan dikirim bersama laporan gangguan ini untuk mendalami kendala yang Anda temukan. Laporan gangguan ini, termasuk catat dan tangkapan layar, tidak akan terlihat secara umum. Jika Anda hanya ingin mengirimkan tulisan di atas, silakan hapus centang: @@ -96,20 +93,15 @@ Kemajuan (%s%%) Nama Pengguna Nama pengguna dan/atau kata sandi salah - Anda perlu memasukkan alamat email yang tertaut pada akun. Verifikasi alamat email gagal: pastikan tautan yang termuat di email telah diklik - JSON amburadul Tidak berisi JSON yang sah Pengajuan yang dikirimkan terlalu banyak Panggilan Video Masuk Panggilan Suara Masuk Panggilan Sedang Berlangsung… - - ${app_name} membutuhkan permisi atas akses mikrofon Anda untuk melakukan panggilan audio. - ${app_name} membutuhkan izin untuk mengakses kamera dan mikrofon Anda untuk melakukan panggilan video. \n \nHarap berikan akses pada halaman berikut ini untuk melakukan panggilan. @@ -142,19 +134,11 @@ %d perubahan keanggotaan Panggilan - - Daftar Anggota Arahkan ke pesan yang belum dibaca - - %d anggota - - - - Tinggalkan ruang Apa benar Anda ingin meninggalkan ruangan ini\? PERCAKAPAN LANGSUNG @@ -189,12 +173,9 @@ %d terpilih - Cari Saring anggota ruang Tidak ada hasil - - Semua pesan Tambahkan ke Layar Utama Gambar Profil @@ -263,8 +244,6 @@ Beranda Ruangan Telah Diundang - - Anda telah dikeluarkan dari %1$s oleh %2$s Anda telah dicekal dari %1$s oleh %2$s Alasan: %1$s @@ -303,13 +282,11 @@ Apabila cocok, tekan tombol verifikasi berikut. Apabila tidak, seseorang sedang menyadap perangkat ini dan mungkin perlu diblokir. Di masa mendatang proses verifikasi ini akan dimutakhirkan. - Semua ruangan dalam server %s Semua ruangan bawaan %s %d pesan pemberitahuan yang belum dibaca - Singkapan Riwayat Ruangan Siapa yang dapat membaca riwayat\? Siapapun @@ -323,7 +300,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Ini adalah fitur uji coba dan mungkin rusak tanpa terduga. Hati-hati menggunakannya. Tentukan sebagai alamat utama Tidak tentukan sebagai alamat utama - Tema Kesalahan dekripsi Nama perangkat @@ -335,7 +311,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Ekspor Masukkan kata sandi Tegaskan kata sandi - Mendengarkan peristiwa Pemberitahuan pihak ketiga Hak cipta @@ -371,7 +346,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Nama Perangkat Terakhir terlihat %1$s @ %2$s - Otentikasi Masuk sebagai Homeserver @@ -663,7 +637,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Gagal membuat koneksi real-time. \nSilakan minta administrator homeserver Anda untuk mengkonfigurasi server TURN agar panggilan untuk bekerja dengan andal. ${app_name} Panggilan Gagal - URL API homeserver Kirim riwayat permintaan pemberian kunci Space @@ -1011,7 +984,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Integrasi dinonaktifkan Pengelola integrasi Izinkan integrasi - Ini akan menggantikan Kunci atau Frasa Anda saat ini. Buat Kunci Keamanan baru atau atur Frasa Keamanan baru untuk cadangan yang ada. Lindungi dari kehilangan akses ke pesan & data terenkripsi dengan mencadangkan kunci enkripsi di server Anda. @@ -1032,7 +1004,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. %d detik - Anda tidak akan diberitahu tentang pesan masuk saat aplikasi berada di latar belakang. Tidak ada sinkronisasi latar belakang ${app_name} akan disinkronkan di latar belakang secara berkala pada waktu yang tepat (dapat dikonfigurasi). @@ -1076,7 +1047,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Memutuskan sambungan dari server identitas Anda akan membuat Anda tidak dapat ditemukan oleh pengguna lain dan Anda tidak akan dapat mengundang orang lain melalui email atau nomor telepon. Kirim email dan nomor telepon Anda telah memberikan persetujuan untuk mengirim email dan nomor telepon ke server identitas ini untuk menemukan pengguna lain dari kontak Anda. - Anda sedang berbagi email atau nomor telepon di server identitas %1$s. Anda harus menyambungkan kembali ke %2$s untuk berhenti membagikannya. Setujui Persyaratan Layanan server identitas (%s) agar Anda dapat ditemukan melalui email atau nomor telepon. Kami mengirimi Anda email konfirmasi ke %s, periksa email Anda dan klik tautan konfirmasi @@ -1147,7 +1117,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Semua pesan Semua pesan (brisik) Abaikan pengguna - Konten ini telah dilaporkan sebagai tidak pantas. \n \nJika Anda tidak ingin melihat konten dari pengguna ini, Anda dapat mengabaikan pengguna itu untuk menyembunyikan pesan dari pengguna. @@ -1295,11 +1264,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Kesalahan Tidak Diketahui %s ingin memverifikasi sesi Anda Permintaan Verifikasi - - Saya mengerti Terverifikasi! - Tanda Tangan Algoritma Versi @@ -1316,7 +1282,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Jangan kehilangan pesan terenkripsi Lindungi dari kehilangan akses ke pesan & data terenkripsi Cadangan Aman - Hapus kunci enkripsi yang sudah dicadangkan dari server\? Anda akan tidak dapat menggunakan kunci pemulihan untuk membaca riwayat pesan terenkripsi. Hapus Cadangan Memeriksa status cadangan @@ -1364,7 +1329,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Sepertinya Anda telah menyiapkan cadangan kunci dari sesi lain. Apakah Anda ingin menggantinya dengan yang Anda buat\? Cadangan sudah ada di homeserver Anda Kunci pemulihan telah disimpan. - Simpan sebagai File Bagikan Simpan Kunci Pemulihan @@ -1543,7 +1507,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. \nPesan Anda diamankan dengan kunci dan hanya Anda dan penerima memiliki kunci unik untuk mengakses mereka. Pesan ini tidak terenkripsi secara ujung-ke-ujung. Pesan di ruangan ini tidak terenkripsi secara ujung-ke-ujung. - Menunggu untuk %s… Diverifikasi %s Verifikasi %s @@ -1733,7 +1696,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tingkatkan Mohon sabar, ini mungkin membutuhkan waktu yang lama. Bergabung ke ruangan yang diganti - Ruangan Tanpa Nama Beberapa ruangan mungkin disembunyikan karena mereka privat dan Anda membutuhkan undangan. Beberapa ruangan mungkin disembunyikan karena mereka privat dan Anda membutuhkan undangan. @@ -2086,7 +2048,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Jika Anda batalkan, Anda mungkin kehilangan pesan terenkripsi dan data Anda jika Anda kehilangan akses ke login Anda. \n \nAnda juga dapat mengatur Cadangan Aman dan kelola kunci Anda di Pengaturan. - Salin ke penyimpanan awan pribadi Anda Simpan di flashdisk atau penyimpanan cadangan Cetak dan simpan di tempat yang aman @@ -2179,8 +2140,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. %1$d panggilan aktif · - - Panggilan aktif (%1$s) Ada sebuah kesalahan saat mencari nomor telepon Tombol penyetel @@ -2275,7 +2234,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Pertanyaan atau topik poll Buat Poll Poll - Kirim email dan nomor telepon ke %s Kontak Anda privat. Untuk menemukan pengguna dari kontak Anda, kami membutuhkan izin untuk mengirim info kontak ke server identitas Anda. Sesinya telah dikeluarkan! @@ -2321,7 +2279,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. di sini Bantu kami mengidentifikasi masalah-masalah dan membuat ${app_name} lebih baik dengan membagikan data penggunaan anonim. Untuk memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda. \n -\n \nAnda dapat membaca semua kebijakan kami %s. Bantu buat ${app_name} lebih baik Aktifkan @@ -2415,4 +2372,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. %d perubahan ACL server + %1$s, %2$s dan lainnya + %1$s dan %2$s \ No newline at end of file From 91418493a6501b115decb219cf80276662a44807 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sun, 27 Feb 2022 07:09:54 +0000 Subject: [PATCH 004/152] Translated using Weblate (Japanese) Currently translated at 97.4% (2103 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- vector/src/main/res/values-ja/strings.xml | 138 +++++++++++++++------- 1 file changed, 97 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index d249aeb745..0d35cc8c99 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -23,7 +23,6 @@ ルームへの招待 %1$sと%2$s 空のルーム - %1$sが今後のルーム履歴を%2$sに見えるように設定しました。 ルームのメンバー全員(招待された時点から) ルームのメンバー全員(参加した時点から) @@ -86,7 +85,6 @@ 招待中 低優先度 会話 - 不具合を報告 不具合の内容と状況の説明をお願いします。何をしましたか?何が起こるべきでしたか?実際に起こった事象は何でしょうか? ここに不具合の内容を記述 @@ -173,7 +171,6 @@ 最後のオンライン日時 %1$s @ %2$s 認証 - ログイン中のアカウント 言語を選択 言語 @@ -220,11 +217,9 @@ ルーム サインアウト 送信 - このホームサーバーは、あなたがロボットではないことの確認を求めています アカウントに登録されたメールアドレスの入力が必要です。 メールアドレスの確認に失敗しました:電子メールのリンクをクリックしたことを確認してください - 不正な形式のJSON 有効なJSONを含んでいませんでした ログイン要求が多すぎます @@ -256,7 +251,6 @@ %sの全てのメッセージを表示しますか? \n \nこの操作はアプリを再起動するため、時間がかかる場合があります。 - 外観 公開端末名 ルームのエンドツーエンド暗号鍵をエクスポート @@ -272,14 +266,10 @@ Matrixの連絡先のみ 通信先が通話の受取に失敗しました。 情報 - - ${app_name}は、音声通話を実行するためにマイクへアクセスするための許可を必要としています。 - ${app_name}はビデオ通話を行うためにカメラとマイクにアクセスする許可を必要としています。 \n \n通話をするためには、次のポップアップでアクセスを許可してください。 - 発言を通報 写真を撮影 動画を撮影 @@ -289,7 +279,6 @@ リクエストの送信に失敗しました。 ウィジェットを作成できません。 ウィジェットをこのルームから削除してもよろしいですか? - 一致していない場合は、あなたのコミュニケーションの安全性が損なわれている可能性があります。 このセッションでは、未検証のセッションに対して暗号化されたメッセージを送信しない。 認証済のセッションに対してのみ暗号化 @@ -306,7 +295,6 @@ 通知あり(音量大) 通知あり(サイレント) 不具合の報告 - このユーザーにあなたと同じ権限を与えます。この変更は取り消せません。 \nよろしいですか? 信用する @@ -318,7 +306,6 @@ 証明書はあなたの電話により信頼されていたものから変更されています。これはきわめて異常な事態です。この新しい証明書を承認しないことを強く推奨します。 証明書は以前信頼されていたものから信頼されていないものへと変更されています。サーバーがその証明書を更新した可能性があります。サーバーの管理者に連絡して、適切なフィンガープリントを確認してください。 サーバーの管理者が上のフィンガープリントと一致するものを発行した場合に限り、証明書を承認してください。 - 検索 このアプリの情報をシステム設定で表示。 アプリの情報 @@ -355,7 +342,6 @@ ホーム画面にショートカットを作成 インラインURLプレビュー コミュニティーのアバター - 暗号鍵を要求している新しいセッション \'%s\' を追加しました。 未認証のセッション \'%s\' が暗号鍵を要求しています。 作成 @@ -370,15 +356,12 @@ %d個のメンバーシップの変更 メンバーを表示 - %d名のメンバー %d件の新しいメッセージ - - アバター スタンプを送る ダウンロード @@ -392,10 +375,6 @@ 申し訳ありません、この操作を完了するための外部アプリが見つかりません。 あなたの他のセッションに暗号鍵を再要求する。 鍵をこのセッションに送信できるように、メッセージを復号化できる他の端末で${app_name}を起動してください。 - - - - %d個選択済 @@ -408,7 +387,6 @@ %d件の通知された未読メッセージ - %d個のルーム @@ -430,8 +408,6 @@ 表示するニックネームを変更 Markdown書式の入/切 Matrixアプリの管理を修正するには - - %1$sのホームサーバーの使用を継続するには、利用規約を確認し、同意する必要があります。 エラー 今すぐ確認 @@ -472,13 +448,11 @@ 会話から追放 鍵のバックアップ 鍵のバックアップを使用 - 詳細な通知設定 バックグラウンド同期モード バッテリーを考慮して最適化 リアルタイム性を重視して最適化 バックグラウンド同期を行わない - 入力中通知を送信 文字入力中であることを他のメンバーに伝えます。 開封確認メッセージを表示 @@ -732,7 +706,7 @@ QRコード QRコードによる追加 コードを共有 - ${app_name} で会話しましょう:%s + ${app_name}で話しましょう:%s 友達を招待 既知のユーザー 無効なQRコード(無効なURI)! @@ -812,7 +786,6 @@ ビデオ通話が行われています… 有効な認証情報がないため、権限がありません ${app_name} 呼び出し失敗 - ルームディレクトリの全てのルームを表示(露骨なコンテンツのあるルームを含む)する。 露骨なコンテンツのあるルームを表示 ルームディレクトリ @@ -970,7 +943,6 @@ %1$sがルームのアバターを削除しました ルームの説明を削除しました ルーム名を削除しました - ディスカバリー設定を管理します。 ディスカバリー(発見) これにより、現在のキーまたはフレーズが置き換えられます。 @@ -1101,7 +1073,6 @@ 鍵のバックアップで管理 鍵のバックアップを使用 暗号化されたメッセージとデータへのアクセスが失われるのを防ぎましょう - バックアップされた暗号鍵をサーバーから削除しますか?今後、現在のリカバリーキーを使って、暗号化されたメッセージの履歴を読むことができなくなります。 バックアップを削除 バックアップの状態を確認しています @@ -1151,7 +1122,6 @@ 別のセッションで鍵のバックアップを既に設定しているようです。上書きしますか? ホームサーバーにバックアップが存在しています リカバリーキーが保存されました。 - リカバリーキーを保存 コピーをしました リカバリーキーはパスワードマネージャー(もしくは金庫)のような、非常に安全な場所で保管してください @@ -1363,11 +1333,8 @@ 不明なエラー このルームを含む参加済のスペース このルームにアクセスできるスペースを決定します。スペースが選択されると、そのメンバーはルーム名を見つけて参加できます。 - - 了解 完了しました! - メッセージの新しい鍵 暗号化されたメッセージを決して失わないために セキュアバックアップ @@ -1418,7 +1385,6 @@ この操作を実行するための権限がありません。システム設定から権限を付与してください。 IDサーバーに接続できませんでした IDサーバーのURLを入力 - 同意する 同意を撤回 あなたの連絡先から他のユーザーを発見するために、メールアドレスや電話番号をこのIDサーバーに送信することに同意しています。 @@ -1642,7 +1608,7 @@ あなたの非公開スペース あなたの公開スペース 自分のみ - スレッドでディスカッションを整理して管理 + スレッドで議論を整理して管理 %sを待機しています… この端末でスキャン 認証を送信済 @@ -1744,7 +1710,6 @@ このファイルは大きすぎてアップロードできません。 この情報の送信に同意しますか? 連絡先を発見するには、連絡先のデータ(電話番号や電子メール)をあなたのIDサーバーに送信する必要があります。プライバシーの保護のため、データは送信前にハッシュ化されます。 - メールアドレスと電話番号を%sに送信 このIDサーバーはポリシーを提供していません IDサーバーのポリシーを隠す @@ -1886,7 +1851,6 @@ 自分の会話は、自分のもの。 %1$sがこのルームを「招待者のみ参加可能」に設定しました。 選択したメッセージをネタバレとして送信 - %1$sはこのルームを「リンクを知っている人が参加可能」に設定しました。 初めに設定画面でIDサーバーの利用規約を承認してください。 初めにIDサーバーを設定してください。 @@ -1910,7 +1874,7 @@ \nアップグレードは通常、ルームがサーバー上で処理される仕方にだけ影響します。 一度有効にしたルームの暗号化は無効にすることはできません。暗号化されたルームで送信されたメッセージは、サーバーからは見ることができず、そのルームのメンバーだけが見ることができます。暗号化を有効にすると、多くのボットやブリッジが正常に動作しなくなる場合があります。 %sして、このルームを皆に紹介しましょう。 - このコードを皆と共有し、スキャンして追加してもらい、会話を始めましょう。 + このコードを共有し、スキャンして追加してもらい、会話を始めましょう。 正当な参加者が%sにアクセスできることを確認してください。 参加者を追加 @@ -2183,7 +2147,6 @@ 暗号化されたメッセージにアクセスするには、あなたの他のセッションからログインを検証し、本人確認を行う必要があります。 詳しく知る セキュリティーを高めるために、使い捨てコードが一致しているのを確認して、%sを検証しましょう。 - 暗号化の設定が正しくありません。 暗号化を復元 暗号化を有効な状態に取り戻すために、管理者に連絡してください。 @@ -2228,7 +2191,7 @@ %1$sの権限レベルを変更しました。 誰と使いますか? どんなスペースを作りますか? - あなたとチームメイトの非公開のスペース + 自分と仲間の非公開のスペース ルームを整理するためのプライベートスペース ここが会話のスタート地点です。 ここが%sのスタート地点です。 @@ -2266,4 +2229,97 @@ 全てリセット 連絡先 検証がキャンセルされました。再び検証を開始することができます。 + 押し続けて録音し、離すと送信 + セキュリティー向上のため、PINコードを選択してください + + %d個のサーバーアクセス制御リストの変更 + + 置き換えられたルームに参加 + このルームが発見できません。存在することを確認してください。 + 指紋や顔画像など、端末に固有の生体認証を有効にしてください。 + 絵文字で検証 + テキストで検証 + すべてのセッションを検証し、アカウントとメッセージが安全であることを確認してください + ログインしている場所を確認 + 復旧用の手段を全て無くしてしまいましたか?全てリセットする + 、あるいはクロス署名に対応した他のMatrixのクライアント + どのような議論を%sで行いたいですか? + クロス署名の設定に失敗しました + 履歴とメッセージが消去され、信頼済の端末、信頼済のユーザーが取り消されます + 全てをリセットすると + 最新の${app_name}を他の端末で、${app_name} ウェブ版、${app_name} デスクトップ版、${app_name} iOS、${app_name} Android、あるいはクロス署名に対応した他のMatrixのクライアントでご使用ください + スライドして通話を終了 + 電話番号を検索する際にエラーが発生しました + 着信を拒否しました + それぞれにルームを作りましょう。後から追加することもできます(既にあるルームも追加できます)。 + 分かるように特徴を記入してください。これはいつでも変更できます。 + 目立つように特徴を記入してください。これはいつでも変更できます。 + 未読のメッセージ数のみを通知に表示。 + 2分間${app_name}を使用しないと、PINコードが要求されます。 + 🔐️ ${app_name}で話しましょう + 個人情報保護の観点から、${app_name}はハッシュ化されたメールアドレスと電話番号の送信のみをサポートしています。 + アプリの名前を変更しました!アプリは最新版で、アカウントにはログイン済です。 + ステートイベントを送信 + ステートイベント + カスタムのステートイベントを送信 + ステートイベントを送信しました! + 続行するには名前を付けてください。 + どんな作業に取り組みますか? + + あと%1$d件 + + Matrix上の連絡先を検索 + 通話の転送中にエラーが発生しました + 2分後にPINコードを要求 + ルーム名やメッセージの内容などの詳細を表示。 + エラーが多すぎます。ログアウトしました + 警告!もう一度誤ったコードを入力すると、ログアウトします! + + コードが誤っています。残りの試行回数は%d回です + + プッシュ通知を有効にするには、設定を確認してください + リンク %1$s は別のサイトに移動します:%2$s +\n +\n続行してよろしいですか? + このリンクを再確認してください + ログインを検証してください:%1$s + 機密ストレージのアクセスに失敗しました + この設定を有効にすると、全てのアクティビティーにFLAG_SECUREを追加します。変更を有効にするにはアプリケーションの再起動が必要です。 + このアカウントは無効化されています。 + 個人のクラウドストレージにコピーしましょう + 印刷して安全な場所に保管しましょう + %2$sと%1$sが設定されました。 +\n +\n安全な場所で保管してください!それらは、アクティブなセッションを全て失ってしまった際、暗号化されたメッセージや安全な情報のロックを解除するために必要となります。 + 作成したアイデンティティーキーを公開しています + アプリケーションのスクリーンショットを防ぐ + 続行するには%1$sか%2$sを使用してください。 + エラーのためメッセージが送信されませんでした + %sにいない人を探していますか? + 直接${app_name}で招待を受け取るには、設定画面から%sしてください。 + PINコードを入力しなければ${app_name}のロックを解除することはできません。 + ${app_name}を開く際にはPINコードの入力が必要です。 + あなたがブロックされているルームを開くことはできません。 + PINコードの検証に失敗しました。新しいコードを入力してください。 + 端末の連絡先がありません + 暗号化の履歴を待機しています + 送信者があなたのセッションを信頼していないため、このメッセージにアクセスすることができません + 送信者によりブロックされているため、このメッセージにアクセスすることができません + このメッセージを待機しています。時間がかかる可能性があります + ルームの設定の変更に成功しました + 確認のため、セキュリティーフレーズを再入力してください。 + ホームサーバー(%1$s)が、IDサーバーに%2$sを設定するよう提案しています + IDサーバー %s から切断しますか? + ダイレクトメッセージを作成できませんでした。招待したユーザーを確認し、もう一度やり直してください。 + セキュリティーフレーズ + 自分と仲間 + メッセージの種類がありません + 絵文字の一覧を閉じる + 絵文字の一覧を開く + 認証に失敗しました + 復旧を設定しています。 + このセッションは、他のセッションと検証を共有することができません。 +\n検証は端末に保存され、新しいバージョンのアプリで共有されます。 + %1$s、%2$s他 + %1$sと%2$s \ No newline at end of file From a4d9b4d5a80046d35ee7e71cb24aee3e14059b34 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Sat, 26 Feb 2022 00:11:55 +0000 Subject: [PATCH 005/152] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- vector/src/main/res/values-pt-rBR/strings.xml | 43 +------------------ 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index b603364d4e..b9e2fa3791 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -39,7 +39,6 @@ Convite de Sala %1$s e %2$s Sala vazia - Seu convite %1$s criou a sala Você criou a sala @@ -244,7 +243,6 @@ Deletar Renomear Reportar Conteúdo - ou Convidar Fazer signout @@ -267,7 +265,6 @@ Contatos de Matrix somente Nenhum resultado Salas - Enviar logs Enviar crash logs Enviar screenshot @@ -295,11 +292,9 @@ Isto não parece com um endereço de email válido Este endereço de email já está definido. Esqueceu senha\? - Este servidorcasa gostaria de assegurar que você não é um robô O endereço de email linkado a sua conta deve ser entrado. Falha para verificar endereço de email: assegure-se que clicou no link no email - Por favor entre um URL válido JSON malformado Não continha JSON válido @@ -315,14 +310,10 @@ Chamada Em Progresso… O lado remoto falhou para atender. Informação - - ${app_name} precisa de permissão para acessar seu microfone para performar chamadas de áudio. - ${app_name} precisa de permissão para acessar sua câmera e seu microfone para performar chamadas de vídeo. \n \nPor favor permita acesso no próximo pop-up para ser capaz de fazer a chamada. - SIM NÃO Continuar @@ -330,7 +321,6 @@ Juntar-se Rejeitar Pular para não-lida(s) - Sair de sala Você tem certeza que você quer sair da sala\? Mensagens Diretas @@ -357,7 +347,6 @@ O certificado tem mudado de um que era confiado por seu telefone. Isto é ALTAMENTE INCOMUM. É recomendado que você NÃO ACEITE este novo certificado. O certificado tem mudado de um previamente confiado para um que não é confiado. O servidor pode ter renovado seu certificado. Contacte o/a administrador(a) de servidor para a impressão digital esperada. Somente aceite o certificado se o/a administrador(a) de servidor tem publicado uma impressão digital que corresponde com a acima. - Pesquisar Filtrar membros de sala Nenhum resultado @@ -402,7 +391,6 @@ Atualizar Nome Público Visto por último %1$s @ %2$s - Autenticação Feito login como Servidorcasa @@ -433,7 +421,6 @@ Estes são recursos experimentais que podem quebrar de maneiras inesperadas. Use com cuidado. Definir como endereço principal Des-definir como endereço principal - Erro de decriptação Nome público ID de sessão @@ -444,7 +431,6 @@ Exportar Entrar frasepasse Confirmar frasepasse - Importar chaves de sala E2E Importar chaves de sala Importar as chaves de um arquivo local @@ -456,7 +442,6 @@ Verificar Confirme ao comparar o seguinte com as Configurações de Usuária(o) em sua outra sessão: Se não correspondem, a segurança de sua comunicação pode estar comprometida. - Selecionar um diretório de salas Nome de servidor Todas as salas em servidor %s @@ -532,7 +517,6 @@ Você foi expulsa(o) de %1$s por %2$s Você foi banida(o) de %1$s por %2$s Razão: %1$s - %d membro %d membros @@ -541,8 +525,6 @@ %d nova mensagem %d novas mensagens - - %d mudança de filiação %d mudanças de filiação @@ -552,7 +534,6 @@ %d mensagem notificada não-lida %d mensagens notificadas não-lidas - %d sala %d salas @@ -576,10 +557,6 @@ Desculpe, nenhum aplicativo externo tem sido encontrado para completar esta ação. Re-requisitar chaves de encriptação de suas outras sessões. Por favor lance ${app_name} num outro dispositivo que possa decriptar a mensagem para que ele possa enviar as chaves para esta sessão. - - - - %d selecionada %d selecionadas @@ -603,8 +580,6 @@ Muda seu apelido de exibição Ativar/Desativar markdown Para consertar gerenciamento de Apps Matrix - - Para continuar usando o servidorcasa %1$s você deve revisar e aceitar os termos e condições. Revisar agora Desativar Conta @@ -690,7 +665,6 @@ Convites, remoções e bans são desafetados. Mostrar eventos de conta Inclui mudanças de avatar e nome de exibição. - Restrições de background estão desabilitadas para ${app_name}. Este teste devia ser rodado usando dados móveis (sem Wi-Fi). \n%1$s Restrições de background estão habilitadas para ${app_name}. @@ -757,7 +731,6 @@ Copiar Sucesso Notificações - Chamada ${app_name} Falhou Falha para estabelecer conexão em tempo real. \nPor favor peça ao/à administrador(a) de seu servidorcasa para configurar um servidor TURN a fim que chamadas funcionem confiavelmente. @@ -805,7 +778,6 @@ \nIsto vai impactar uso de rádio e bateria, vai ter uma notificação permanente exibida declarando que ${app_name} está à escuta por eventos. Sem sinc em background Você não vai ser notificada(o) sobre mensagens entrantes quando o app está em background. - Integrações Use um gerenciador de integrações para gerenciar bots, bridges, widgets e pacotes de stickers. \nGerenciadores de integrações recebem dados de configuração, e podem modificar widgets, enviar convites de sala e definir níveis de poder em seu nome. @@ -921,7 +893,6 @@ Salvar Chave de Recuperação Compartilhar Salvar como Arquivo - A chave de recuperação tem sido salva. Um backup já existe em seu servidorcasa Parece que você já tem configurado backup de chave de uma outra sessão. Você quer substituí-lo pelo que você está criando\? @@ -975,7 +946,6 @@ Checando estado de backup Deletar Backup Deletar suas chaves de encriptação, das quais foi feito backup, do servidor\? Você não vai ser mais capaz de usar sua chave de recuperação para ler histórico de mensagens encriptadas. - Backup Seguro Salvaguardar-se contra perda de acesso a mensagens & dados encriptados Nunca perca mensagens encriptadas @@ -991,11 +961,8 @@ Versão Algoritmo - Verificada(o)! Entendido - - Requisição de Verificação %s quer verificar sua sessão Erro Desconhecido @@ -1159,7 +1126,6 @@ Este conteúdo foi reportado como inapropriado. \n \nSe você não quer ver mais nada de conteúdo desta(e) usuária(o), você pode ignorá-la(o) para esconder mensagens dela(e). - Ignorar usuária(o) Todas as mensagens (barulhento) Todas as mensagens @@ -1363,7 +1329,6 @@ Verificar %s Verificou %s Esperando por %s… - Mensagens nesta sala não são encriptadas ponta-a-ponta. Mensagens nesta sala são encriptadas ponta-a-ponta. \n @@ -1521,7 +1486,6 @@ Mensagem… Usar Arquivo Checando Chave de backup - Se você cancelar agora, você pode perder mensagens & dados encriptados se você perder acesso a seus logins. \n \nVocê também pode configurar Backup Seguro & gerenciar suas chaves em Configurações. @@ -1823,7 +1787,6 @@ Você poderia habilitar isto se a sala vai somente ser usada para colaborar com times internos em seu servidorcasa. Isto não poder ser mudado mais tarde. Bloquear qualquer pessoa que não é parte de %s de jamais se juntar a esta sala %1$d de %2$d - Dar consentimento Revogar meu consentimento Você tem dado seu consentimento para enviar emails e números de telefone para este servidor de identidade para descobrir outras(os) usuárias(os) de seus contatos. @@ -1913,8 +1876,6 @@ Transferir Conectar Consultar primeiro - - Chamada ativa (%1$s) Houve um erro ao procurar o número de telefone Pad de disco @@ -2112,7 +2073,6 @@ Enviar vídeo com o tamanho original Enviar vídeos com o tamanho original - Desculpe, um erro ocorreu enquanto tentando se juntar: %s Endereço de espaço Ver e gerenciar endereços deste espaço. @@ -2313,7 +2273,6 @@ Sondar pergunta ou tópico Criar Sondagem Sondagem - Enviar emails e números de telefone para %s Seus contatos são privados. Para descobrir usuárias(os) de seus contatos, você precisa de permissão para enviar info de contato a seu servidor de identidade. O signout desta sessão tem sido feito! @@ -2458,4 +2417,6 @@ %d mudança de ACLs de servidor %d mudanças de ACLs de servidor + %1$s, %2$s e outras(os) + %1$s e %2$s \ No newline at end of file From 8597d1144239ea11ed55fb3f8bb40f02274e8b20 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Fri, 25 Feb 2022 19:15:18 +0000 Subject: [PATCH 006/152] Translated using Weblate (Slovak) Currently translated at 98.8% (2132 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- vector/src/main/res/values-sk/strings.xml | 43 ++--------------------- 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index d9d9c7b1cd..18af56a598 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -39,7 +39,6 @@ Pozvanie do miestnosti %1$s a %2$s Prázdna miestnosť - %s aktualizoval/a túto miestnosť. Úvodná synchronizácia: \nPrebieha import účtu… @@ -197,7 +196,6 @@ Vymazať Premenovať Nahlásiť obsah - alebo Pozvať Odhlásiť sa @@ -220,7 +218,6 @@ Len Matrix kontakty Žiadne výsledky Miestnosti - Odoslať záznamy Odoslať záznamy o zlyhaní Odoslať snímku obrazovky @@ -248,11 +245,9 @@ Zdá sa, že toto nie je platná emailová adresa Táto emailová adresa sa už používa. Zabudli ste heslo? - Tento domovský server by sa rád uistil, že nieste robot Musíte zadať emailovú adresu prepojenú s vašim účtom. Nepodarilo sa overiť emailovú adresu: Uistite sa, že ste správne klikli na odkaz v emailovej správe - Zadajte platnú adresu URL Chybné údaje vo formáte JSON Neplatné údaje vo formáte JSON @@ -269,14 +264,10 @@ Prebiehajúci hovor… Vzdialenej strane sa nepodarilo prijať hovor. Informácia - - Aby ste mohli uskutočňovať audio hovory, ${app_name} potrebuje prístup k mikrofónu vašeho zariadenia. - ${app_name} potrebuje povolenie na prístup k vašej kamere a mikrofónu na uskutočňovanie videohovorov. \n \nPovoľte prístup v ďalších vyskakovacích oknách, aby ste mohli uskutočniť hovor. - ÁNO NIE Pokračovať @@ -284,7 +275,6 @@ Vstúpiť Odmietnuť Preskočiť na neprečítanú správu - Opustiť miestnosť Ste si istí, že chcete opustiť miestnosť? PRIAME KONVERZÁCIE @@ -311,7 +301,6 @@ Certifikát sa zmenil na iný, ktorému tento telefón dôveroval. Toto je VEĽMI NEZVYČAJNÉ. Odporúča sa, aby ste tento nový certifikát NEPRIJALI. Certifikát sa zmenil z predtým dôveryhodného na nedôveryhodný. Server mohol obnoviť svoj certifikát. Obráťte sa na správcu servera, aby vám poskytol očakávaný odtlačok. Dôverujte certifikátu len v prípade, že správca servera zverejnil odtlačok zhodný s odtlačkom zobrazeným vyššie. - Hľadať Filtrovať členov v miestnosti Žiadne výsledky @@ -364,7 +353,6 @@ Aktualizovať verejné meno Naposledy videné %1$s @ %2$s - Overenie Prihlásený ako Domovský server @@ -402,7 +390,6 @@ Tieto funkcie sú experimentálne a môžu sa nečakane pokaziť. Pri používaní buďte opatrní. Nastaviť ako hlavnú adresu Zrušiť nastavenie ako hlavnej adresy - Vzhľad Chyba dešifrovania Verejné meno @@ -414,7 +401,6 @@ Exportovať Zadajte prístupovú frázu Potvrďte prístupovú frázu - Importovať šifrovacie kľúče miestnosti Importovať kľúče miestnosti Importovať kľúče z lokálneho súboru @@ -426,7 +412,6 @@ Overiť Ak chcete overiť, či táto relácia je skutočne dôveryhodná, kontaktujte jeho vlastníka iným spôsobom (napr. osobne alebo cez telefón) a opýtajte sa ho, či kľúč, ktorý má zobrazený v Nastaveniach, sa zhoduje s kľúčom zobrazeným nižšie: Ak sa kľúče zhodujú, stlačte tlačidlo Overiť nižšie. Ak sa nezhodujú, niekto ďalší odpočúva toto zariadenie a mali by ste ho pridať na čiernu listinu. - Vyberte adresár miestností Názov servera Všetky miestnosti na serveri %s @@ -488,7 +473,6 @@ %d zmien členstva Zobraziť členov - 1 člen %d členovia @@ -499,14 +483,11 @@ %d nové správy %d nových správ - - 1 neprečítaná správa %d neprečítané správy %d neprečítaných správ - 1 miestnosť %d miestnosti @@ -546,10 +527,6 @@ Nebola nájdená žiadna vhodná aplikácia na dokončenie tejto akcie. Prosím, vložte svoje heslo. Ak je to možné, prosím popis napíšte v angličtine. - - - - 1 vybratý %d vybratí @@ -569,8 +546,6 @@ Mení vaše zobrazované meno / prezývku Zapnutie/vypnutie formátovanie textu markdown Užitočné na opravu spravovania Matrix aplikácií - - Táto miestnosť bola nahradená inou a nie je viac aktívna. Konverzácia pokračuje tu Táto miestnosť je pokračovaním predchádzajúcej konverzácii @@ -662,7 +637,6 @@ Pozvania, odstránenia a zákazy nie sú ovplyvnené. Zobrazovať udalosti účtu Zahŕňa zmeny zobrazovaného mena a obrázka v profile. - Heslo Spustiť predvolený fotoaparát v systéme namiesto zobrazenia vlastnej vstavanej obrazovky. Príkaz \"%s\" vyžaduje viac argumentov, alebo nie sú všetky zadané správne. @@ -735,7 +709,6 @@ Zrušiť Odpojiť sa Odmietnuť - Toto nie je platná adresa Matrix serveru Domovský server je nedostupný na tejto URL adrese, preverte to prosím Relácie @@ -799,7 +772,6 @@ \nBude to mať vplyv na používanie rádia a batérie, bude sa zobrazovať trvalé oznámenie, že ${app_name} počúva udalosti. Žiadna synchronizácia na pozadí Nebudete dostávať oznámenia o prichádzajúcich správach, keď aplikácia pracuje na pozadí. - Integrácie Použite správcu integrácií na nastavenie botov, premostení, widgetov a balíčkov s nálepkami. \nSprávcovia integrácie dostávajú konfiguračné údaje a môžu vo vašom mene upravovať widgety, posielať pozvánky do miestnosti a nastavovať úrovne oprávnení. @@ -897,7 +869,6 @@ Uložiť kľúč obnovenia Zdieľať Uložiť ako súbor - Kľúč obnovenia bol uložený. Záloha už existuje na vašom domovskom serveri Zdá sa, že ste si už zálohovanie kľúčov nastavili z inej relácie. Chcete ho nahradiť zálohou, ktorú vytvárate teraz\? @@ -953,7 +924,6 @@ Zisťovanie stavu zálohovania Vymazať zálohu Vymazať vaše zálohované šifrovacie kľúče z domovského servera\? Na čítanie histórie zašifrovaných správ už nebudete môcť použiť kľúč na obnovenie. - Bezpečné zálohovanie Zabezpečte sa proti strate šifrovaných správ a údajov Nikdy neprídete o šifrované správy @@ -971,11 +941,8 @@ Verzia Algoritmus Podpis - Overené! Rozumiem - - Žiadosť o overenie %s chce overiť vašu reláciu Neznáma chyba @@ -1381,7 +1348,6 @@ Nastavenia miestnosti Verzia miestnosti Nová hodnota - Číselník Zavolať späť Vyčistiť históriu @@ -1680,7 +1646,6 @@ Otvoriť ponuku vytvorenia miestnosti Zdá sa, že serveru trvá príliš dlho, kým odpovie, čo môže byť spôsobené buď zlým pripojením, alebo chybou servera. Skúste to o chvíľu znova. Súhlasíte so zaslaním týchto informácií\? - Preskočiť na potvrdenie o prečítaní Vlastné (%1$d) v %2$s Predvolené v %1$s @@ -1783,7 +1748,6 @@ Žiadna odpoveď Podržali ste hovor Automaticky aktualizovať nadradený priestor - Niektoré miestnosti môžu byť skryté, pretože sú súkromné a potrebujete pozvánku. Tento priestor nemá žiadne miestnosti Pre viac informácií sa obráťte na správcu domovského servera @@ -1906,7 +1870,6 @@ Zmienky a kľúčové slová Iba zmienky a kľúčové slová Medzinárodné telefónne čísla musia začínať znakom \"+\" - Ak chcete zistiť existujúce kontakty, potrebujete odoslať kontaktné informácie (e-maily a telefónne čísla) na server totožností. Pred odoslaním vaše údaje zahašujeme kvôli ochrane osobných údajov. Odoslať e-maily a telefónne čísla na %s Dali ste súhlas na odosielanie e-mailov a telefónnych čísel na tento server totožností na objavenie ďalších používateľov z vašich kontaktov. @@ -1965,7 +1928,6 @@ \n \nZastaviť proces zmeny hesla\? Zabudli ste alebo ste stratili všetky možnosti obnovy\? Obnovte všetko - Použite prístupovú frázu na obnovenie alebo kľúč Použite najnovšiu aplikáciu ${app_name} na svojich ostatných zariadeniach: Použite najnovšiu aplikáciu ${app_name} na svojich ostatných zariadeniach, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} pre Android alebo iného klienta Matrix podporujúceho krížové podpisovanie @@ -1994,7 +1956,6 @@ %1$d aktívne hovory · %1$d aktívnych hovorov · - Prebiehajúci hovor (%1$s) Pri vyhľadávaní telefónneho čísla došlo k chybe Žiadna odpoveď @@ -2164,7 +2125,6 @@ Táto relácia nemôže zdieľať toto overenie s vašimi ostatnými reláciami. \nOverenie bude uložené lokálne a zdieľané v budúcej verzii aplikácie. Akcie správcu - Zobrazujú sa len prvé výsledky, zadajte ďalšie písmená… Zatraste telefónom a otestujte prah detekcie Prahová hodnota detekcie @@ -2184,7 +2144,6 @@ Zadajte kľúčové slová pre vyhľadanie reakcie. Odobrať z nízkej priority Pridať k nízkej priorite - Na pokračovanie použite %1$s alebo %2$s. Ak chcete pokračovať, zadajte prístupovú frázu pre zálohovanie kľúčov. Generovanie kľúča SSSS z prístupovej frázy %s @@ -2476,4 +2435,6 @@ %d zmeny ACL servera %d zmien ACL servera + %1$s, %2$s a ďalší + %1$s a %2$s \ No newline at end of file From 8c6b15a1ede171c2438f37b56f0d674914e07454 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 25 Feb 2022 20:26:59 +0000 Subject: [PATCH 007/152] Translated using Weblate (Swedish) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/ --- vector/src/main/res/values-sv/strings.xml | 57 ++++++----------------- 1 file changed, 15 insertions(+), 42 deletions(-) diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 38f7a60928..69c25ebba3 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -88,7 +88,6 @@ Telefonnummer Rumsinbjudan %1$s och %2$s - Tomt rum Inledande synk: \nImporterar konto… @@ -264,7 +263,6 @@ Återkalla Koppla ifrån Rapportera innehåll - eller Bjud in Godkänn @@ -296,7 +294,6 @@ Bara Matrix-kontakter Inga resultat Rum - Gemenskaper Skicka loggar Skicka kraschloggar @@ -322,7 +319,6 @@ Skicka röst Är du säker på att du vill starta ett röstsamtal\? Är du säker på att du vill skapa ett videosamtal\? - Skicka filer Skicka dekal Ta foto eller video @@ -339,11 +335,9 @@ Det här ser inte ut som en giltig e-postadress Den här e-postadressen är redan definierad. Glömt lösenordet\? - Denna hemserver skulle vilja verifiera att du inte är en robot Du måste skriva in e-postadressen länkad till ditt konto. Misslyckades att verifiera e-postadressen: se till att du klickade på länken i e-brevet - Vänligen granska och acceptera villkoren för denna hemserver: Vänligen skriv in en giltig URL Det här är inte en giltig Matrixserveradress @@ -374,14 +368,10 @@ Videosamtal pågår… Den andra parten svarade inte. Information - - ${app_name} behöver tillstånd att komma åt din mikrofon för hålla röstsamtal. - ${app_name} behöver tillstånd att komma åt din kamera och mikrofon för att kunna utföra videosamtal. \n \nVänligen ge tillstånd i nästa popup för att kunna utföra samtalet. - JA NEJ Fortsätt @@ -390,16 +380,10 @@ Avslå Lista medlemmar Hoppa till oläst - - %d medlem %d medlemmar - - - - Lämna rum Är du säker på att du vill lämna rummet\? DIREKTCHATT @@ -409,8 +393,6 @@ Kicka Ignorera Filtrera rumsmedlemmar - - Fäst rum med missade aviseringar Fäst rum med olästa meddelanden Alla rum på %s-servern @@ -420,7 +402,6 @@ %d rum Rum - Detta kommer att göra ditt konto permanent oanvändbart. Du kommer inte kunna logga in, och ingen kommer kunna registrera sig med samma användar-ID. Detta kommer att få ditt konto att lämna alla rum det är med i, och det kommer att ta bort din kontoinformation från din identitetsserver. Den här handlingen går inte att ångra. \n \nAtt inaktivera ditt konto får oss normalt inte att glömma meddelanden du har skickat. Om du skulle vilja att vi glömmer dina meddelanden, markera rutan nedan. @@ -456,7 +437,6 @@ Meddelanden som innehåller mitt visningsnamn Användarinställningar Innehåller byten av avatar eller visningsnamn. - Lösenord Byt lösenord Nuvarande lösenord @@ -473,7 +453,6 @@ Din återställningsnyckel är ett skyddsnät - du kan använda den för att återfå åtkomst till dina krypterade meddelanden om du skulle glömma din lösenfras. \nLagra din återställningsnyckel på något säkert ställe, t.ex. en lösenordshanterare (eller ett kassaskåp) Lagra din återställningsnyckel på något säkert ställe, t.ex. en lösenordshanterare (eller ett kassaskåp) - Byt nätverk Alla gemenskaper Allmänt @@ -483,7 +462,6 @@ Meddelanden i det här rummet är totalsträckskrypterade. Lär dig mer och verifiera användare i deras profiler. Avignorera Kunde inte verifiera den externa serverns identitet. - Alla meddelanden Lägg till e-postadress Lägg till telefonnummer @@ -541,7 +519,6 @@ Inaktivera mitt konto Upptäckbarhet Hantera dina upptäckbarhetsinställningar. - Inloggad som Hemserver Identitetsserver @@ -714,7 +691,6 @@ Använd den här sessionen för att verifiera din nya och ge den tillgång till krypterade meddelanden. Om du avbryter så kommer du inte kunna läsa krypterade meddelanden på den här enheten, och andra användare kommer inte att lita på den Om du avbryter så kommer du inte kunna läsa krypterade meddelanden på din nya enhet, och andra användare kommer inte att lita på den - När jag bjuds in till ett rum Samtalsinbjudningar Meddelanden skickade av en bott @@ -755,15 +731,12 @@ Integrationer är avstängda Aktivera \'Tillåt integrationer\' I inställningarna för att göra detta. Exportera nycklarna till en lokal fil - Importera nycklarna från en lokal fil - Välj en rumskatalog %d oläst aviserat meddelande %d olästa aviserade meddelanden - %1$s: %2$d meddelande %1$s: %2$d meddelanden @@ -783,7 +756,6 @@ Krypterat meddelande kontakta din tjänstadministratör Spara som fil - Radera dina säkerhetskopierade krypteringsnycklar från servern\? Du kommer inte längre kunna använda din återställningsnyckel för att läsa krypterad meddelandehistorik. Skydda dig mot att tappa åtkomst till krypterade meddelanden och data Nya säkra meddelandenycklar @@ -1013,7 +985,6 @@ Sätt upp säker säkerhetskopiering Alla nycklar säkerhetskopierade Algoritm - %s vill verifiera din session Visa borttagna meddelanden Visa en platshållare för borttagna meddelanden @@ -1029,7 +1000,6 @@ %1$s, %2$s och %3$d annan har läst %1$s, %2$s och %3$d andra har läst - Du ignorerar inga användare Annan Om du har skapat ett konto på en hemserver så kan du använda ditt Matrix-ID (t.ex. @användare:domän.com) och lösenord nedan. @@ -1124,7 +1094,6 @@ Du kommer inte att bli aviserad om inkommande meddelanden när appen är i bakgrunden. Starta vid boot Timeout för synkbegäran - Fördröjning mellan varje synkronisering Lokala kontakter Kontaktbehörighet @@ -1172,7 +1141,6 @@ Rummets interna ID Sätt som huvudadress Avsätt som huvudadress - Avkrypteringsfel Publikt namn Nycklar framgångsrikt importerade @@ -1253,7 +1221,6 @@ Skapa Hem Bjöd in - Du har blivit utsparkad från %1$s av %2$s Du har blivit bannad från %1$s av %2$s Orsak: %1$s @@ -1319,10 +1286,8 @@ Säkerhetskopierar %d nycklar… Signatur - Verifierad! Jag förstår - Verifieringsbegäran Okänt fel Det verkar som att du försöker ansluta till en annan hemserver. Vill du logga ut\? @@ -1525,7 +1490,6 @@ Verifiera %s Verifierade %s Väntar på %s… - Säkerhet Adminhandlingar Lämnar rummet… @@ -1830,7 +1794,6 @@ Dölj avancerat Visa avancerat %1$d av %2$d - Ge samtycke Återkalla mitt samtycke Du har gett samtycke att skicka e-postadresser och telefonnummer till den här identitetsservern för att upptäcka andra användare baserat på dina kontakter. @@ -1914,8 +1877,6 @@ Flytta Anslut Rådfråga först - - Aktivt samtal (%1$s) Ett fel inträffade när telefonnumret slogs upp Knappsats @@ -2003,7 +1964,7 @@ Jag och mina teamkamrater Att privat utrymme för att organisera dina rum Bara jag - Det till att rätt personer har åtkomst till %s. Du kan ändra detta senare. + Det till att rätt personer har åtkomst till %s. Vem jobbar du med\? För att gå med i ett existerande utrymme så behöver du en inbjudan. Detta kan ändras senare @@ -2112,7 +2073,6 @@ Ange namnet för en ny server du vill utforska. Lägg till en ny server Din server - För att utföra detta, vänligen ge kameraåtkomst från systeminställningarna. Vissa behörigheter saknas för att utföra detta, vänligen ge behörighet från systeminställningarna. Observera att uppgradering kommer att göra en ny version av rummet. Alla nuvarande meddelanden kommer att vara kvar i det här arkiverade rummet. @@ -2313,7 +2273,6 @@ Omröstningens fråga eller ämne Skapa omröstning Omröstning - Skicka e-postadresser och telefonnummer till %s Dina kontakter är privata. För att upptäcka användare från dina kontakter så behöver vi ditt tillstånd att skicka kontaktinfo till din identitetsserver. Sessionen har loggats ut! @@ -2446,4 +2405,18 @@ Kopiera länk till tråd Visa i rum Visa trådar + Rumsaviseringar + Användare + Avisera hela rummet + + %1$d till + %1$d till + + Visa mindre + %1$s, %2$s och fler + %1$s och %2$s + + %d server-ACL-ändring + %d server-ACL-ändringar + \ No newline at end of file From a4f04b704fbae4796c1592c678a9b3f19bae88c8 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 25 Feb 2022 22:42:34 +0000 Subject: [PATCH 008/152] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 35 ++--------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 066a40fdf4..2f34fc66fb 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -39,7 +39,6 @@ Помилка Matrix Адреса електронної пошти Номер телефону - %s оновлює цю кімнату. Початкове налаштування: \nІмпортування даних облікового запису @@ -164,7 +163,6 @@ Видалити Перейменувати Поскаржитись на вміст - або Запрошення Вийти з облікового запису @@ -187,7 +185,6 @@ Лише Matrix-контакти Немає результатів Кімнати - Надіслати журнали Надіслати журнали помилок Надіслати знімок екрана @@ -235,7 +232,6 @@ Інформація Для здійснення аудіодзвінків потрібен доступ до мікрофону. Для здійснення відеодзвінків потрібен доступ до камери та мікрофону.\n\nБудь ласка, надайте його у наступних виринаючих вікнах, щоб мати змогу їх здійснити. - ТАК НІ Продовжити @@ -269,7 +265,6 @@ Сертифікат почав відрізнятися від того, якому довіряв ваш телефон. Це ДУЖЕ НЕЗВИЧНО. Наполегливо радимо НЕ ПРИЙМАТИ цей новий сертифікат. Сертифікат змінився з довіреного на недовірений. Сервер міг оновити свій сертифікат. Зв\'яжіться з адміністратором сервера, щоб отримати дійсний відбиток. Приймайте сертифікат лише у випадку збігу відбитку вище з відбитком, оприлюдненим адміністратором сервера. - Пошук Фільтр переліку користувачів Тут порожньо @@ -370,7 +365,6 @@ Експорт Введіть парольну фразу Підтвердіть парольну фразу - Імпортувати E2E ключі кімнати Імпортувати ключі кімнати Імпортувати ключі з локального файлу @@ -382,7 +376,6 @@ Звірити Підтвердьте, порівнявши вказане за допомогою налаштувань користувача в іншому сеансі: Якщо вони відрізняються, безпека вашого зв\'язку може бути під загрозою. - Вибір каталогу кімнат Ім\'я сервера Всі кімнати на сервері %s @@ -439,7 +432,6 @@ У вас поки що не має наліпок. \n \nДодати зараз\? - %d учасник %d учасники @@ -466,18 +458,12 @@ Помилка Системні сповіщення Якщо можливо, будь ласка, напишіть опис англійською. - - - - %d вибрано %d вибрано %d вибрано %d вибрано - - Попередній перегляд посилань Попередній перегляд медіа перед надсиланням ${app_name} збирає анонімну аналітику, щоб ми могли вдосконалювати цей додаток. @@ -490,7 +476,6 @@ %d непрочитаних сповіщень - %d кімната %d кімнати @@ -522,8 +507,6 @@ Домівка Кімнати Запрошено - - %2$s вилучає вас із %1$s %2$s блокує вас у %1$s Причина: %1$s @@ -753,7 +736,6 @@ Не вдалося встановити зв’язок у режимі реального часу. \nПопросіть адміністратора вашого домашнього сервера налаштувати сервер TURN для надійної роботи викликів. ${app_name} не вдалося здійснити виклик - Більше немає результатів Відкликати публікування Додати @@ -784,7 +766,6 @@ Схоже у вас вже є резервна копія ключа налаштування з іншого сеансу. Хочете замінити його тим, який ви створюєте\? Резервна копія вже існує на вашому homeserver Ключ відновлення збережено. - Зберегти як файл Поділитися Зберегти ключ відновлення @@ -932,7 +913,6 @@ Інтеграцію вимкнено Керування інтеграцією Дозволити інтеграції - Це замінить ваш поточний ключ або фразу. Створіть новий ключ безпеки або встановіть нову фразу безпеки для наявної резервної копії. Захистіться від втрати доступу до зашифрованих повідомлень і даних створенням резервної копії ключів шифрування на своєму сервері. @@ -950,7 +930,6 @@ %d секунд %d секунд - Ви не отримуватимете сповіщення про вхідні повідомлення, коли програма перебуває у фоновому режимі. Немає фонової синхронізації ${app_name} періодично синхронізуватиметься у фоновому режимі в певний час (налаштовується). @@ -1273,9 +1252,7 @@ Ви утримали виклик %s утримали виклик Утримати - Активний виклик (%1$s) - Змінити мережу Змінити Push-сповіщення вимкнено @@ -1372,7 +1349,6 @@ Зазначте адресу сервера ідентифікації Неможливо під\'єднатись до сервера ідентифікації Зазначте адресу сервера ідентифікації - Повторити Від\'єднання від вашого сервера ідентифікації означатиме, що ви не будете виявними для інших користувачів та не зможете запрошувати інших через електронну пошту або номер телефону. Ви наразі не використовуєте жодного сервера ідентифікації. Для того, щоб виявляти інших та бути виявним для знайомих вам наявних контактів, налаштуйте такий сервер нижче. @@ -1786,8 +1762,6 @@ %s хоче звірити ваш сеанс Запит перевірки Запит перевірки - - Зрозуміло Резервні копії всіх ключів створено Резервне копіювання ключів. Це може тривати кілька хвилин… @@ -1823,14 +1797,12 @@ Перегляд реакцій Тут буде показано ваші кімнати. Натисніть + унизу праворуч, щоб знайти наявні або створити власні. Схоже, ви намагаєтесь під\'єднатися до іншого домашнього сервера. Бажаєте вийти\? - Резервне копіювання %d ключа… Резервне копіювання %d ключів… Резервне копіювання %d ключів… Резервне копіювання %d ключів… - Додати наявну кімнату до простору Створити простір Лише я @@ -1844,7 +1816,6 @@ Сталася помилка пошуку номера телефона Ви відхилили цей виклик Ваша книга контактів порожня - Закрити нагадування про резервне копіювання ключів Схоже, що відповідь сервера надто тривала, це може бути спричинено або поганим з’єднанням, або помилкою сервера. Повторіть спробу через деякий час. Повторіть спробу, коли погодитесь з умовами свого домашнього сервера. @@ -2285,7 +2256,6 @@ \n \nБажаєте зайти через вебклієнт\? Щоб знайти наявні контакти, надішліть дані контактів (е-пошти й номери телефонів) серверу ідентифікації. Ми хешуємо ваші дані перед надсиланням для приватності. - Ваші контакти приватні. Щоб дізнаватись про користувачів, відповідних вашим контактам, дозвольте нам надсилати дані ваших контактів серверу ідентифікації. Надіслати електронні адреси та номери телефонів %s Сеанс завершено! @@ -2337,7 +2307,6 @@ Кімната — версії %s, яку домашній сервер позначив нестабільною. Поліпшення кімнати — серйозна операція. Її зазвичай радять, коли кімната нестабільна через вади, брак функціоналу чи вразливості безпеки. \nЗазвичай це впливає лише на деталі опрацювання кімнати сервером. - Деяких кімнат може бути не видно, бо вони закриті й потребують запрошення. Деяких кімнат може бути не видно, бо вони закриті й потребують запрошення. \nУ вас нема дозволу додавати кімнати. @@ -2382,14 +2351,12 @@ Якщо скасуєте це й загубите пристрій, то втратите зашифровані повідомлення й дані. \n \nВвімкнути захищене резервне копіювання й керувати своїми ключами можна в налаштуваннях. - Скасування залишить %1$s (%2$s) без звірки. У їхньому користувацькому профілі можна почати заново. Звірте цим сеансом свій новий. Це надасть йому доступ до зашифрованих повідомлень. Надіслані цьому сеансу й цим сеансом повідомлення позначатимуться застереженнями, поки цей користувач йому не довірить. Або ви можете власноруч звірити сеанс. Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Не вдалося поширити звірку цього сеансу з вашими іншими. \nЗвірка збережеться локально, її поширить майбутня версія застосунку. - Можете ввімкнути це, якщо в кімнаті співпрацюватимуть лише внутрішні команди на вашому домашньому сервері. Цього більше не можна буде змінити. Цей сеанс — користувача %1$s, а ви надаєте облікові дані користувача %2$s. Це не підтримується в ${app_name}. \nБудь ласка, спершу очистіть дані, а тоді ввійдіть в інший обліковий запис. @@ -2542,4 +2509,6 @@ І ще %1$d Згорнути + %1$s, %2$s та інші + %1$s і %2$s \ No newline at end of file From 1f6275762ecf8507a7413acbf9f37cddb7d1c1f0 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 25 Feb 2022 20:29:56 +0000 Subject: [PATCH 009/152] Translated using Weblate (Swedish) Currently translated at 100.0% (51 of 51 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/ --- fastlane/metadata/android/sv-SE/changelogs/40104000.txt | 2 ++ fastlane/metadata/android/sv-SE/changelogs/40104020.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40104000.txt create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40104020.txt diff --git a/fastlane/metadata/android/sv-SE/changelogs/40104000.txt b/fastlane/metadata/android/sv-SE/changelogs/40104000.txt new file mode 100644 index 0000000000..6bce52ba36 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40104000.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Initial implementation av trådmeddelanden. Meddelandebubblor. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.4.0 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40104020.txt b/fastlane/metadata/android/sv-SE/changelogs/40104020.txt new file mode 100644 index 0000000000..e3b5d4cd1c --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40104020.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: lägg till stöd för @room och slutna omröstningar, och många andra små ändringar. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.4.2 From 329ce7736ca0d3572ff9f0a64929e5cf57511236 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sat, 26 Feb 2022 08:39:52 +0000 Subject: [PATCH 010/152] Translated using Weblate (Japanese) Currently translated at 54.9% (28 of 51 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/ja/ --- fastlane/metadata/android/ja-JP/changelogs/40101040.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40101100.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103070.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103080.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103120.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40104000.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40104020.txt | 2 ++ 9 files changed, 18 insertions(+) create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40101040.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40101100.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103070.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103080.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103120.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40104000.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40104020.txt diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101040.txt b/fastlane/metadata/android/ja-JP/changelogs/40101040.txt new file mode 100644 index 0000000000..2dc1cdb781 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40101040.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:パフォーマンスの向上と不具合の修正 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.4 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101100.txt b/fastlane/metadata/android/ja-JP/changelogs/40101100.txt new file mode 100644 index 0000000000..2f720498ec --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40101100.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:テーマ、スタイルの更新と、スペースに関する新機能。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.10 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103070.txt b/fastlane/metadata/android/ja-JP/changelogs/40103070.txt new file mode 100644 index 0000000000..09c44e990d --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103070.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:主に通知に関する不具合の修正。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.7-RC2 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103080.txt b/fastlane/metadata/android/ja-JP/changelogs/40103080.txt new file mode 100644 index 0000000000..7c37f5a756 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103080.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:不具合の修正 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.8 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103100.txt b/fastlane/metadata/android/ja-JP/changelogs/40103100.txt new file mode 100644 index 0000000000..76c28cdd90 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103100.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:投票機能のサポート(実験的)。URL プレビューの新規デザイン。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103110.txt b/fastlane/metadata/android/ja-JP/changelogs/40103110.txt new file mode 100644 index 0000000000..5295af5833 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103110.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:不具合の修正 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103120.txt b/fastlane/metadata/android/ja-JP/changelogs/40103120.txt new file mode 100644 index 0000000000..3859bee8d5 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103120.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:不具合の修正 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.12 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40104000.txt b/fastlane/metadata/android/ja-JP/changelogs/40104000.txt new file mode 100644 index 0000000000..22a205dc37 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40104000.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:スレッド機能の実装、吹き出しメッセージ。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.4.0 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40104020.txt b/fastlane/metadata/android/ja-JP/changelogs/40104020.txt new file mode 100644 index 0000000000..e792008faf --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40104020.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:@roomの対応、非公開の投票など。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.4.2 From 12ea262ebc3d9e960a0dd8ee97468bedd3629c0b Mon Sep 17 00:00:00 2001 From: oksya8and8 Date: Mon, 28 Feb 2022 20:45:22 +0000 Subject: [PATCH 011/152] Translated using Weblate (Japanese) Currently translated at 98.0% (2116 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- vector/src/main/res/values-ja/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index 0d35cc8c99..2c17a90df8 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -2322,4 +2322,5 @@ \n検証は端末に保存され、新しいバージョンのアプリで共有されます。 %1$s、%2$s他 %1$sと%2$s + 自分と相手を認証してチャットを安全に保ちます \ No newline at end of file From 2673f6715a317fef69cc115119e288a3ce7530db Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Mon, 28 Feb 2022 20:44:45 +0000 Subject: [PATCH 012/152] Translated using Weblate (Japanese) Currently translated at 98.0% (2116 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- vector/src/main/res/values-ja/strings.xml | 68 +++++++++++++---------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index 2c17a90df8..fe125881f4 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -79,7 +79,7 @@ クリップボードへコピー 警告 お気に入り - 知人 + メンバー ルーム ルーム名で絞り込む 招待中 @@ -713,7 +713,7 @@ これを行うには設定から「インテグレーションを許可」を有効にしてください。 インテグレーションが無効になっています インテグレーションマネージャー - インテグレーション(統合)を許可 + インテグレーションを許可 FCMトークンが正常に取得されました: \n%1$s Firebaseトークン @@ -957,8 +957,8 @@ /confettiコマンドを使用するか、❄️または🎉を含むメッセージを送信 チャットでエフェクトを表示 ホームサーバーがこの機能をサポートしている場合は、チャット内のリンクをプレビューします。 - ボット、ブリッジ、ウィジェット、ステッカーパックの管理をします。 -\nインテグレーションマネージャーは、構成データを受信し、ユーザーに代わってウィジェットの変更、ルーム招待の送信、権限の設定などを行うことができます。 + ボット、ブリッジ、ウィジェット、ステッカーパックを管理します。 +\nインテグレーションマネージャーは、構成データを受信し、ユーザーに代わってウィジェットの変更や、ルーム招待の送信、権限の設定などを行うことができます。 インテグレーション(統合) アプリがバックグラウンドにある場合、着信メッセージは通知されません。 ${app_name}は正確な時間に定期的にバックグラウンドで同期します(構成可能)。 @@ -1296,7 +1296,7 @@ プッシュ通知に関するルール あなたは既にこのルームを見ています! その他のサードパーティーの使用に関する掲示 - Matrix SDKバージョン + Matrix SDKのバージョン ファイル\"%1$s\"からエンドツーエンド暗号鍵をインポートします。 鍵のバックアップデータの取得中にエラーが発生しました 信頼情報の取得中にエラーが発生しました @@ -1314,7 +1314,7 @@ お待ち下さい… ネットワークがありません。インターネット接続を確認してください。 不正な形式のイベントです。表示できません - ルーム管理者によってモデレートされたイベント + ルームの管理者によってモデレートされたイベント リアクション リアクションを見る リアクションを追加 @@ -1463,7 +1463,7 @@ コンテンツが報告されました ヘルプとサポート ヘルプ - ${app_name}のポリシー + ${app_name}の運営方針 ここ キーワードを追加 自分のスレッド @@ -1564,7 +1564,7 @@ 応答がありません スレッドへのリンクをコピー 有効にする - あなたのIDサーバーのポリシー + あなたのIDサーバーの運営方針 新しいルームを作成 認証コードが正しくありません。 IDサーバーのURLを入力してください @@ -1602,7 +1602,7 @@ 添付ファイルの取得中にエラーが発生しました。 鍵のバックアップのバナーを閉じる キーワードに「%s」を含めることはできません - %s へのメール通知を有効にする + %sへのメール通知を有効にする ヒント:メッセージを長押しして「%s」を選択。 スレッドを用いると、会話のテーマを保ったり、会話を追跡したりするのが容易になります。 あなたの非公開スペース @@ -1646,7 +1646,7 @@ 音声メッセージ(%1$s) 推奨のルームバージョンへとアップグレード 音声メッセージを録音 - あなたのホームサーバーのポリシー + あなたのホームサーバーの運営方針 一番下に移動 %sが読みました %1$sと%2$sが読みました @@ -1698,7 +1698,7 @@ %d人のユーザーが読みました スペースへのアクセス - このサーバーはポリシーを提供していません。 + このサーバーは運営方針を提供していません。 数秒かかるかもしれません。少々お待ちください。 利用可能な言語を読み込んでいます… ユーザーを招待 @@ -1706,14 +1706,14 @@ パスワードを選択してください。 メンバーを追加 ログインを検証 - メッセージ… + メッセージを送る… このファイルは大きすぎてアップロードできません。 この情報の送信に同意しますか? 連絡先を発見するには、連絡先のデータ(電話番号や電子メール)をあなたのIDサーバーに送信する必要があります。プライバシーの保護のため、データは送信前にハッシュ化されます。 メールアドレスと電話番号を%sに送信 - このIDサーバーはポリシーを提供していません - IDサーバーのポリシーを隠す - IDサーバーのポリシーを表示 + このIDサーバーは運営方針を提供していません + IDサーバーの運営方針を隠す + IDサーバーの運営方針を表示 アカウントの新しいパスワードを設定… シェイクを検出しました! 電話を振って、しきい値を試してください @@ -1888,7 +1888,7 @@ スペースは、ルームや連絡先をグループ化する新しい方法です。 招待されています 新しいスペースを、あなたが管理するスペースに追加。 - 注意:アプリケーションは再起動します + 注意:アプリケーションが再起動します ホームサーバーの管理者にお問い合わせください あなたが参加している全てのルームがホームに表示されます。 親のスペースを自動的に更新 @@ -1932,7 +1932,7 @@ メッセージを送信できませんでした ウィジェットを開く %1$sに転送 - 通話は終了しました + 通話が終了しました 自分自身にダイレクトメッセージを送信することはできません! 電話番号(任意) 電話番号を確認 @@ -2038,7 +2038,7 @@ 位置情報を共有しました %sでリアクションしました 検証終了 - 次のいずれかのセキュリティが破られている可能性があります。 + 次のいずれかのセキュリティーが破られている可能性があります。 \n \n - あなたのホームサーバー \n - 検証している相手のホームサーバー @@ -2091,7 +2091,7 @@ ユーザーを招待できませんでした。招待したいユーザーを確認して、もう一度試してください。 %sの利用規約を開く ユーザーによる同意は与えられていません。 - 代わりに、他のIDサーバーのURLを入力できます + または、他のIDサーバーのURLを入力できます サーバー上の暗号鍵をバックアップして、暗号化されたメッセージとデータへのアクセスが失われるのを防ぎましょう。 いまキャンセルすると、ログインできなくなった際に、暗号化されたメッセージとデータを失ってしまう可能性があります。 \n @@ -2200,7 +2200,7 @@ %sを待機しています… このユーザーがこのセッションを検証するまで、送受信されるメッセージには警告マークが付きます。手動で検証することも可能です。 セッションの取得に失敗しました - チームメイトは誰ですか? + 誰がチームの仲間ですか? %sを探索できるようになります 私のスペース %1$s %2$s に参加してください スキップ @@ -2228,21 +2228,21 @@ 再認証が必要です 全てリセット 連絡先 - 検証がキャンセルされました。再び検証を開始することができます。 + 検証をキャンセルしました。あらためて開始してください。 押し続けて録音し、離すと送信 - セキュリティー向上のため、PINコードを選択してください + PINコードを設定してください %d個のサーバーアクセス制御リストの変更 置き換えられたルームに参加 このルームが発見できません。存在することを確認してください。 - 指紋や顔画像など、端末に固有の生体認証を有効にしてください。 + 指紋や顔画像など、端末に固有の生体認証を有効にする。 絵文字で検証 テキストで検証 すべてのセッションを検証し、アカウントとメッセージが安全であることを確認してください ログインしている場所を確認 復旧用の手段を全て無くしてしまいましたか?全てリセットする - 、あるいはクロス署名に対応した他のMatrixのクライアント + クロス署名に対応した他のMatrixのクライアントでも使用できます。 どのような議論を%sで行いたいですか? クロス署名の設定に失敗しました 履歴とメッセージが消去され、信頼済の端末、信頼済のユーザーが取り消されます @@ -2252,7 +2252,7 @@ 電話番号を検索する際にエラーが発生しました 着信を拒否しました それぞれにルームを作りましょう。後から追加することもできます(既にあるルームも追加できます)。 - 分かるように特徴を記入してください。これはいつでも変更できます。 + このスペースを特定できるような特徴を記入してください。これはいつでも変更できます。 目立つように特徴を記入してください。これはいつでも変更できます。 未読のメッセージ数のみを通知に表示。 2分間${app_name}を使用しないと、PINコードが要求されます。 @@ -2297,8 +2297,8 @@ エラーのためメッセージが送信されませんでした %sにいない人を探していますか? 直接${app_name}で招待を受け取るには、設定画面から%sしてください。 - PINコードを入力しなければ${app_name}のロックを解除することはできません。 - ${app_name}を開く際にはPINコードの入力が必要です。 + PINコードでしか${app_name}のロックを解除することはできません。 + ${app_name}を開く際には、毎回PINコードの入力が必要です。 あなたがブロックされているルームを開くことはできません。 PINコードの検証に失敗しました。新しいコードを入力してください。 端末の連絡先がありません @@ -2308,7 +2308,7 @@ このメッセージを待機しています。時間がかかる可能性があります ルームの設定の変更に成功しました 確認のため、セキュリティーフレーズを再入力してください。 - ホームサーバー(%1$s)が、IDサーバーに%2$sを設定するよう提案しています + ホームサーバー(%1$s)は、IDサーバーに%2$sを設定するように提案しています IDサーバー %s から切断しますか? ダイレクトメッセージを作成できませんでした。招待したユーザーを確認し、もう一度やり直してください。 セキュリティーフレーズ @@ -2323,4 +2323,16 @@ %1$s、%2$s他 %1$sと%2$s 自分と相手を認証してチャットを安全に保ちます + あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。 + 監査結果をエクスポート + ストレージから機密情報を発見できません + 操作を実行できません。ホームサーバーは最新のバージョンではありません。 + ビデオ通話が拒否されました + 音声通話が拒否されました + %1$sは通話を拒否しました + このデバイスを認証可能な他の端末が全くない場合にのみ、続行してください。 + このセッションを信頼済として検証すると、暗号化されたメッセージにアクセスすることができます。このアカウントにサインインしなかった場合は、あなたのアカウントのセキュリティーが破られている可能性があります: + アカウントのセキュリティーが破られている可能性があります + 選択したスペースに追加 + 最新の${app_name}は他のデバイスでも使用できます: \ No newline at end of file From ab2001cd7f8f97440a57a7f85e28723c32bc20a2 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Wed, 2 Mar 2022 17:45:27 +0300 Subject: [PATCH 013/152] Create a custom audio waveform view. --- .../main/res/values/styles_voice_message.xml | 16 +- .../detail/composer/VoiceMessageHelper.kt | 4 +- .../composer/voice/VoiceMessageViews.kt | 12 +- .../timeline/factory/MessageItemFactory.kt | 4 +- .../helper/VoiceMessagePlaybackTracker.kt | 23 +- .../detail/timeline/item/MessageVoiceItem.kt | 40 ++-- .../app/features/voice/AudioWaveformView.kt | 199 ++++++++++++++++++ .../layout/item_timeline_event_voice_stub.xml | 2 +- .../layout/view_voice_message_recorder.xml | 2 +- .../main/res/values/audio_waveform_attr.xml | 22 ++ 10 files changed, 287 insertions(+), 37 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt create mode 100644 vector/src/main/res/values/audio_waveform_attr.xml diff --git a/library/ui-styles/src/main/res/values/styles_voice_message.xml b/library/ui-styles/src/main/res/values/styles_voice_message.xml index 2e87353303..81d2e7581d 100644 --- a/library/ui-styles/src/main/res/values/styles_voice_message.xml +++ b/library/ui-styles/src/main/res/values/styles_voice_message.xml @@ -2,14 +2,14 @@ \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt index 735d356476..f9dfecd1f5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt @@ -221,7 +221,9 @@ class VoiceMessageHelper @Inject constructor( private fun onPlaybackTick(id: String) { if (mediaPlayer?.isPlaying.orFalse()) { val currentPosition = mediaPlayer?.currentPosition ?: 0 - playbackTracker.updateCurrentPlaybackTime(id, currentPosition) + val totalDuration = mediaPlayer?.duration ?: 0 + val percentage = currentPosition.toFloat() / totalDuration + playbackTracker.updateCurrentPlaybackTime(id, currentPosition, percentage) } else { playbackTracker.stopPlayback(id) stopPlaybackTicker() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt index 09284ea5fc..8adecaad6e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt @@ -27,7 +27,6 @@ import androidx.core.view.doOnLayout import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams -import com.visualizer.amplitude.AudioRecordView import im.vector.app.R import im.vector.app.core.extensions.setAttributeBackground import im.vector.app.core.extensions.setAttributeTintedBackground @@ -37,6 +36,8 @@ import im.vector.app.databinding.ViewVoiceMessageRecorderBinding import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView.DraggingState import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView.RecordingUiState import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker +import im.vector.app.features.themes.ThemeUtils +import im.vector.app.features.voice.AudioWaveformView class VoiceMessageViews( private val resources: Resources, @@ -284,7 +285,7 @@ class VoiceMessageViews( hideRecordingViews(RecordingUiState.Idle) views.voiceMessageMicButton.isVisible = true views.voiceMessageSendButton.isVisible = false - views.voicePlaybackWaveform.post { views.voicePlaybackWaveform.recreate() } + views.voicePlaybackWaveform.post { views.voicePlaybackWaveform.clear() } } fun renderPlaying(state: VoiceMessagePlaybackTracker.Listener.State.Playing) { @@ -292,11 +293,15 @@ class VoiceMessageViews( views.voicePlaybackControlButton.contentDescription = resources.getString(R.string.a11y_pause_voice_message) val formattedTimerText = DateUtils.formatElapsedTime((state.playbackTime / 1000).toLong()) views.voicePlaybackTime.text = formattedTimerText + val waveformColorIdle = ThemeUtils.getColor(views.voicePlaybackWaveform.context, R.attr.vctr_content_quaternary) + val waveformColorPlayed = ThemeUtils.getColor(views.voicePlaybackWaveform.context, R.attr.vctr_content_secondary) + views.voicePlaybackWaveform.updateColors(state.percentage, waveformColorPlayed, waveformColorIdle) } fun renderIdle() { views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) views.voicePlaybackControlButton.contentDescription = resources.getString(R.string.a11y_play_voice_message) + views.voicePlaybackWaveform.summarize() } fun renderToast(message: String) { @@ -327,8 +332,9 @@ class VoiceMessageViews( fun renderRecordingWaveform(amplitudeList: Array) { views.voicePlaybackWaveform.doOnLayout { waveFormView -> + val waveformColor = ThemeUtils.getColor(waveFormView.context, R.attr.vctr_content_secondary) amplitudeList.iterator().forEach { - (waveFormView as AudioRecordView).update(it) + (waveFormView as AudioWaveformView).add(AudioWaveformView.FFT(it.toFloat(), waveformColor)) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index 0c836748c8..da97cf6984 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -73,6 +73,7 @@ import im.vector.app.features.location.toLocationData import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.VideoContentRenderer import im.vector.app.features.settings.VectorPreferences +import im.vector.app.features.voice.AudioWaveformView import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import me.gujun.android.span.span import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl @@ -688,8 +689,7 @@ class MessageItemFactory @Inject constructor( return this ?.filterNotNull() ?.map { - // Value comes from AudioRecordView.maxReportableAmp, and 1024 is the max value in the Matrix spec - it * 22760 / 1024 + it * AudioWaveformView.MAX_FFT / 1024 } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt index c6204bff1c..076c05b9c4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt @@ -70,7 +70,8 @@ class VoiceMessagePlaybackTracker @Inject constructor() { fun startPlayback(id: String) { val currentPlaybackTime = getPlaybackTime(id) - val currentState = Listener.State.Playing(currentPlaybackTime) + val currentPercentage = getPercentage(id) + val currentState = Listener.State.Playing(currentPlaybackTime, currentPercentage) setState(id, currentState) // Pause any active playback states @@ -87,15 +88,16 @@ class VoiceMessagePlaybackTracker @Inject constructor() { fun pausePlayback(id: String) { val currentPlaybackTime = getPlaybackTime(id) - setState(id, Listener.State.Paused(currentPlaybackTime)) + val currentPercentage = getPercentage(id) + setState(id, Listener.State.Paused(currentPlaybackTime, currentPercentage)) } fun stopPlayback(id: String) { setState(id, Listener.State.Idle) } - fun updateCurrentPlaybackTime(id: String, time: Int) { - setState(id, Listener.State.Playing(time)) + fun updateCurrentPlaybackTime(id: String, time: Int, percentage: Float) { + setState(id, Listener.State.Playing(time, percentage)) } fun updateCurrentRecording(id: String, amplitudeList: List) { @@ -113,6 +115,15 @@ class VoiceMessagePlaybackTracker @Inject constructor() { } } + fun getPercentage(id: String): Float { + return when (val state = states[id]) { + is Listener.State.Playing -> state.percentage + is Listener.State.Paused -> state.percentage + /* Listener.State.Idle, */ + else -> 0f + } + } + fun clear() { listeners.forEach { it.value.onUpdate(Listener.State.Idle) @@ -131,8 +142,8 @@ class VoiceMessagePlaybackTracker @Inject constructor() { sealed class State { object Idle : State() - data class Playing(val playbackTime: Int) : State() - data class Paused(val playbackTime: Int) : State() + data class Playing(val playbackTime: Int, val percentage: Float) : State() + data class Paused(val playbackTime: Int, val percentage: Float) : State() data class Recording(val amplitudeList: List) : State() } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt index e9f728d976..82400a431d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt @@ -26,7 +26,6 @@ import android.widget.TextView import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass -import com.visualizer.amplitude.AudioRecordView import im.vector.app.R import im.vector.app.core.epoxy.ClickListener import im.vector.app.features.home.room.detail.timeline.helper.ContentDownloadStateTrackerBinder @@ -34,6 +33,7 @@ import im.vector.app.features.home.room.detail.timeline.helper.ContentUploadStat import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker import im.vector.app.features.home.room.detail.timeline.style.TimelineMessageLayout import im.vector.app.features.themes.ThemeUtils +import im.vector.app.features.voice.AudioWaveformView @EpoxyModelClass(layout = R.layout.item_timeline_event_base) abstract class MessageVoiceItem : AbsMessageItem() { @@ -78,11 +78,15 @@ abstract class MessageVoiceItem : AbsMessageItem() { holder.voicePlaybackWaveform.setOnLongClickListener(attributes.itemLongClickListener) + val waveformColorIdle = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_quaternary) + val waveformColorPlayed = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary) + holder.voicePlaybackWaveform.post { - holder.voicePlaybackWaveform.recreate() + holder.voicePlaybackWaveform.clear() waveform.forEach { amplitude -> - holder.voicePlaybackWaveform.update(amplitude) + holder.voicePlaybackWaveform.add(AudioWaveformView.FFT(amplitude.toFloat(), waveformColorIdle)) } + holder.voicePlaybackWaveform.summarize() } val backgroundTint = if (attributes.informationData.messageLayout is TimelineMessageLayout.Bubble) { @@ -93,33 +97,39 @@ abstract class MessageVoiceItem : AbsMessageItem() { holder.voicePlaybackLayout.backgroundTintList = ColorStateList.valueOf(backgroundTint) holder.voicePlaybackControlButton.setOnClickListener { playbackControlButtonClickListener?.invoke(it) } - voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener { - override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) { - when (state) { - is VoiceMessagePlaybackTracker.Listener.State.Idle -> renderIdleState(holder) - is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state) - is VoiceMessagePlaybackTracker.Listener.State.Paused -> renderPausedState(holder, state) + // Don't track and don't try to update UI before view is present + holder.view.post { + voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener { + override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) { + when (state) { + is VoiceMessagePlaybackTracker.Listener.State.Idle -> renderIdleState(holder, waveformColorIdle, waveformColorPlayed) + is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state, waveformColorIdle, waveformColorPlayed) + is VoiceMessagePlaybackTracker.Listener.State.Paused -> renderPausedState(holder, state, waveformColorIdle, waveformColorPlayed) + } } - } - }) + }) + } } - private fun renderIdleState(holder: Holder) { + private fun renderIdleState(holder: Holder, idleColor: Int, playedColor: Int) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(duration) + holder.voicePlaybackWaveform.updateColors(0f, playedColor, idleColor) } - private fun renderPlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing) { + private fun renderPlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing, idleColor: Int, playedColor: Int) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause) holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_pause_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) + holder.voicePlaybackWaveform.updateColors(state.percentage, playedColor, idleColor) } - private fun renderPausedState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Paused) { + private fun renderPausedState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Paused, idleColor: Int, playedColor: Int) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) + holder.voicePlaybackWaveform.updateColors(state.percentage, playedColor, idleColor) } private fun formatPlaybackTime(time: Int) = DateUtils.formatElapsedTime((time / 1000).toLong()) @@ -138,7 +148,7 @@ abstract class MessageVoiceItem : AbsMessageItem() { val voiceLayout by bind(R.id.voiceLayout) val voicePlaybackControlButton by bind(R.id.voicePlaybackControlButton) val voicePlaybackTime by bind(R.id.voicePlaybackTime) - val voicePlaybackWaveform by bind(R.id.voicePlaybackWaveform) + val voicePlaybackWaveform by bind(R.id.voicePlaybackWaveform) val progressLayout by bind(R.id.messageFileUploadProgressLayout) } diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt new file mode 100644 index 0000000000..9ba7597e60 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2022 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. + */ + +package im.vector.app.features.voice + +import android.content.Context +import android.content.res.Resources +import android.graphics.Canvas +import android.graphics.Paint +import android.util.AttributeSet +import android.view.View +import im.vector.app.R +import kotlin.math.max +import kotlin.random.Random + +class AudioWaveformView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + + private enum class Alignment(var value: Int) { + CENTER(0), + BOTTOM(1), + TOP(2) + } + + private enum class Flow(var value: Int) { + LTR(0), + RTL(1) + } + + data class FFT(val value: Float, var color: Int) + + private fun Int.dp() = this * Resources.getSystem().displayMetrics.density + + // Configuration fields + private var alignment = Alignment.CENTER + private var flow = Flow.LTR + private var verticalPadding = 4.dp() + private var horizontalPadding = 4.dp() + private var barWidth = 2.dp() + private var barSpace = 1.dp() + private var barMinHeight = 1.dp() + private var isBarRounded = true + + private val rawFftList = mutableListOf() + private var visibleBarHeights = mutableListOf() + + private val barPaint = Paint() + + init { + attrs?.let { + context + .theme + .obtainStyledAttributes( + attrs, + R.styleable.AudioWaveformView, + 0, + 0 + ) + .apply { + alignment = Alignment.values().find { it.value == getInt(R.styleable.AudioWaveformView_alignment, alignment.value) }!! + flow = Flow.values().find { it.value == getInt(R.styleable.AudioWaveformView_flow, alignment.value) }!! + verticalPadding = getDimension(R.styleable.AudioWaveformView_verticalPadding, verticalPadding) + horizontalPadding = getDimension(R.styleable.AudioWaveformView_horizontalPadding, horizontalPadding) + barWidth = getDimension(R.styleable.AudioWaveformView_barWidth, barWidth) + barSpace = getDimension(R.styleable.AudioWaveformView_barSpace, barSpace) + barMinHeight = getDimension(R.styleable.AudioWaveformView_barMinHeight, barMinHeight) + isBarRounded = getBoolean(R.styleable.AudioWaveformView_isBarRounded, isBarRounded) + setWillNotDraw(false) + barPaint.isAntiAlias = true + } + .apply { recycle() } + .also { + barPaint.strokeWidth = barWidth + barPaint.strokeCap = if (isBarRounded) Paint.Cap.ROUND else Paint.Cap.BUTT + } + } + } + + fun initialize(fftList: List) { + handleNewFftList(fftList) + invalidate() + } + + fun add(fft: FFT) { + handleNewFftList(listOf(fft)) + invalidate() + } + + fun summarize() { + if (rawFftList.isEmpty()) return + + val maxVisibleBarCount = getMaxVisibleBarCount() + val summarizedFftList = rawFftList.summarize(maxVisibleBarCount) + clear() + handleNewFftList(summarizedFftList) + invalidate() + } + + fun updateColors(limitPercentage: Float, colorBefore: Int, colorAfter: Int) { + val size = visibleBarHeights.size + val limitIndex = (size * limitPercentage).toInt() + visibleBarHeights.forEachIndexed { index, fft -> + fft.color = if (index < limitIndex) { + colorBefore + } else { + colorAfter + } + } + invalidate() + } + + fun clear() { + rawFftList.clear() + visibleBarHeights.clear() + } + + private fun List.summarize(target: Int): List { + val result = mutableListOf() + if (size <= target) { + result.addAll(this) + val missingItemCount = target - size + repeat(missingItemCount) { + val index = Random.nextInt(result.size) + result.add(index, result[index]) + } + } else { + val step = (size.toDouble() - 1) / (target - 1) + var index = 0.0 + while (index < size) { + result.add(get(index.toInt())) + index += step + } + } + return result + } + + private fun handleNewFftList(fftList: List) { + val maxVisibleBarCount = getMaxVisibleBarCount() + fftList.forEach { fft -> + rawFftList.add(fft) + val barHeight = max(fft.value / MAX_FFT * (height - verticalPadding * 2), barMinHeight) + visibleBarHeights.add(FFT(barHeight, fft.color)) + if (visibleBarHeights.size > maxVisibleBarCount) { + visibleBarHeights = visibleBarHeights.subList(visibleBarHeights.size - maxVisibleBarCount, visibleBarHeights.size) + } + } + } + + private fun getMaxVisibleBarCount() = ((width - horizontalPadding * 2) / (barWidth + barSpace)).toInt() + + private fun drawBars(canvas: Canvas) { + var currentX = horizontalPadding + visibleBarHeights.forEach { + barPaint.color = it.color + // TODO. Support flow + when (alignment) { + Alignment.BOTTOM -> { + val startY = height - verticalPadding + val stopY = startY - it.value + canvas.drawLine(currentX, startY, currentX, stopY, barPaint) + } + Alignment.CENTER -> { + val startY = (height - it.value) / 2 + val stopY = startY + it.value + canvas.drawLine(currentX, startY, currentX, stopY, barPaint) + } + Alignment.TOP -> { + val startY = verticalPadding + val stopY = startY + it.value + canvas.drawLine(currentX, startY, currentX, stopY, barPaint) + } + } + currentX += barWidth + barSpace + } + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + drawBars(canvas) + } + + companion object { + private const val MAX_FFT = 32760f + } +} diff --git a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml index a180afbf8e..0fad714bd4 100644 --- a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml @@ -40,7 +40,7 @@ app:layout_constraintTop_toTopOf="@id/voicePlaybackControlButton" tools:text="0:23" /> - - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 243a714586b13afeaa2432344687bddbf9c25658 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Wed, 2 Mar 2022 17:46:09 +0300 Subject: [PATCH 014/152] Remove 3rd party waveform library. --- library/ui-styles/build.gradle | 2 -- vector/build.gradle | 1 - vector/src/main/assets/open_source_licenses.html | 5 ----- .../java/im/vector/app/features/voice/AudioWaveformView.kt | 2 +- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/library/ui-styles/build.gradle b/library/ui-styles/build.gradle index cee58414c7..0ac513b252 100644 --- a/library/ui-styles/build.gradle +++ b/library/ui-styles/build.gradle @@ -60,6 +60,4 @@ dependencies { implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12' // dialpad dimen implementation 'im.dlg:android-dialer:1.2.5' - // AudioRecordView attr - implementation 'com.github.Armen101:AudioRecordView:1.0.5' } \ No newline at end of file diff --git a/vector/build.gradle b/vector/build.gradle index c6a2636acf..d58118eb24 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -416,7 +416,6 @@ dependencies { implementation 'jp.wasabeef:glide-transformations:4.3.0' implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12' implementation 'com.github.hyuwah:DraggableView:1.0.0' - implementation 'com.github.Armen101:AudioRecordView:1.0.5' // Custom Tab implementation 'androidx.browser:browser:1.4.0' diff --git a/vector/src/main/assets/open_source_licenses.html b/vector/src/main/assets/open_source_licenses.html index 2c25606f57..0bead1f826 100755 --- a/vector/src/main/assets/open_source_licenses.html +++ b/vector/src/main/assets/open_source_licenses.html @@ -437,11 +437,6 @@ THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Copyright (c) 2017-present, dialog LLC <info@dlg.im> -
  • - Armen101 / AudioRecordView -
    - Copyright 2019 Armen Gevorgyan -
  •  Apache License
    diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    index 9ba7597e60..768635b2f7 100644
    --- a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    @@ -194,6 +194,6 @@ class AudioWaveformView @JvmOverloads constructor(
         }
     
         companion object {
    -        private const val MAX_FFT = 32760f
    +        const val MAX_FFT = 32760
         }
     }
    
    From 4ca2a4e8b14b59cc3db02bf8fa9591ca1ef21aab Mon Sep 17 00:00:00 2001
    From: libexus 
    Date: Tue, 1 Mar 2022 15:38:06 +0000
    Subject: [PATCH 015/152] Translated using Weblate (German)
    
    Currently translated at 99.8% (2153 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
    ---
     vector/src/main/res/values-de/strings.xml | 78 +++++++----------------
     1 file changed, 23 insertions(+), 55 deletions(-)
    
    diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
    index bf72827085..7a8ac9c71b 100644
    --- a/vector/src/main/res/values-de/strings.xml
    +++ b/vector/src/main/res/values-de/strings.xml
    @@ -39,7 +39,6 @@
         Raumeinladung
         %1$s und %2$s
         Leerer Raum
    -
         %s hat diesen Raum aufgewertet.
         Sende eine Nachricht…
         Erste Synchronisation:
    @@ -244,7 +243,6 @@
         Löschen
         Umbenennen
         Inhalt melden
    -
         oder
         Einladen
         Abmelden
    @@ -267,7 +265,6 @@
         Nur Matrix-Kontakte
         Keine Ergebnisse
         Räume
    -
         Logdateien übermitteln
         Absturzberichte übermitteln
         Screenshot übermitteln
    @@ -298,7 +295,6 @@
         Dieser Homeserver möchte sicherstellen, dass du kein Roboter bist
         Die E-Mail-Adresse, die mit deinem Account verknüpft ist, muss eingegeben werden.
         Verifizierung der E-Mail-Adresse ist fehlgeschlagen. Stelle sicher, dass du den Link in der E-Mail geöffnet hast
    -
         Bitte eine gültige URL eingeben
         Fehlerhaftes JSON
         Enthielt kein gültiges JSON
    @@ -314,13 +310,10 @@
         Anruf aktiv…
         Die Gegenseite hat den Anruf nicht angenommen.
         Information
    -
         ${app_name} benötigt die Berechtigung, auf dein Mikrofon zugreifen zu können, um (Sprach-)Anrufe tätigen zu können.
    -
         ${app_name} benötigt die Berechtigung, auf Kamera und Mikrofon zu zugreifen, um Video-Anrufe durchzuführen.
     \n
     \nBitte erlaube den Zugriff im nächsten Dialog, um den Anruf durchzuführen.
    -
         Ja
         Nein
         Fortsetzen
    @@ -328,7 +321,6 @@
         Betreten
         Ablehnen
         Zu ungelesenen Nachrichten springen
    -
         Raum verlassen
         Raum wirklich verlassen\?
         DIREKT-CHATS
    @@ -341,8 +333,8 @@
         Du wirst diese Änderung nicht rückgängig machen können, da die Person dieselbe Berechtigungsstufe wie du erhalten wird.
     \nBist du sicher\?
         %s schreibt…
    -    %1$s & %2$s schreiben…
    -    %1$s, %2$s & andere schreiben…
    +    %1$s und %2$s schreiben…
    +    %1$s, %2$s und andere schreiben…
         Du bist nicht berechtigt, in diesen Raum zu schreiben.
         Vertrauen
         Nicht vertrauen
    @@ -355,7 +347,6 @@
         Das Zertifikat unterscheidet sich von dem Zertifikat, dem dein Gerät ursprünglich vertraut hat. Dies ist SEHR UNGEWÖHNLICH. Es wird empfohlen, dass du dieses neue Zertifikat NICHT AKZEPTIERST.
         Das Zertifikat hat sich von einem ursprünglich vertrauenswürdigem Zertifikat in ein nicht vertrauenswürdiges Zertifikat geändert. Eventuell wurde das Zertifikat des Servers erneuert. Bitte erkundige dich beim Server-Administrator, welcher Fingerprint als vertrauenswürdig gilt.
         Akzeptiere das Zertifikat nur dann, wenn der Server-Administrator einen Fingerprint veröffentlicht hat, der mit dem obigen übereinstimmt.
    -
         Suchen
         Raummitglieder filtern
         Keine Suchergebnisse
    @@ -400,7 +391,6 @@
         Öffentlichen Namen aktualisieren
         Zuletzt gesehen
         %1$s @ %2$s
    -
         Authentifizierung
         Angemeldet als
         Heimserver
    @@ -441,7 +431,6 @@
         Exportieren
         Passphrase eingeben
         Passphrase bestätigen
    -
         Ende-zu-Ende-Raumschlüssel importieren
         Raumschlüssel importieren
         Schlüssel aus lokaler Datei importieren
    @@ -453,7 +442,6 @@
         Bestätigen
         Vergleiche die folgenden Zeichen mit den Einstellungen in der Sitzung des anderen Nutzers und bestätige:
         Falls sie nicht übereinstimmen, wurde die Kommunikation vielleicht kompromittiert.
    -
         Raumverzeichnis auswählen
         Server-Name
         Alle Räume auf dem %s-Server
    @@ -531,7 +519,6 @@
         Community-Avatare
         Schütteln, um einen Fehler zu melden
         Mitglieder auflisten
    -
         
             %d Mitglied
             %d Mitglieder
    @@ -540,13 +527,10 @@
             %d neue Nachricht
             %d neue Nachrichten
         
    -
    -
         
             %d ungelesene Nachricht
             %d ungelesene Nachrichten
         
    -
         
             %d Raum
             %d Räume
    @@ -606,16 +590,10 @@
         Die Konversation wird hier fortgesetzt
         Dieser Raum ist die Fortsetzung einer anderen Konversation
         Klicke hier um die älteren Nachrichten zu sehen
    -
    -
    -
    -
         
             %d ausgewählt
             %d ausgewählt
         
    -
    -
         Systembenachrichtigungen
         kontaktiere deinen Service-Administrator
         Dieser Homeserver hat eine seiner Ressourcen-Grenzen erreicht, sodass einige Nutzer sich nicht anmelden können.
    @@ -707,7 +685,6 @@
         Token-Registrierung
         Wenn ein Benutzer ein abgestecktes Gerät mit ausgeschaltetem Bildschirm eine Weile nicht bewegt, wechselt es in den Bereitschaftsmodus. Dies hindert Apps daran, auf das Netzwerk zuzugreifen und verzögert die Ausführung von Aufgaben, Synchronisierungen und Standard-Alarmen.
         Ignoriere Optimierungen
    -
         Keine validen Google-Play-Dienste gefunden. Benachrichtigungen könnten nicht richtig funktionieren.
         Videogespräch aktiv…
         Schlüsselsicherung
    @@ -756,7 +733,6 @@
         Nachrichten in verschlüsselten Räumen sind mit Ende-zu-Ende-Verschlüsselung gesichert. Nur du und der Empfänger haben die Schlüssel um diese Nachrichten zu lesen.
     \n
     \nSichere deine Schlüssel, um sie nicht zu verlieren.
    -
         Wiederherstellungsschlüssel aus Passphrase generieren. Dies kann mehrere Sekunden brauchen.
         Du verlierst möglicherweise den Zugang zu deinen Nachrichten, wenn du dich abmeldest oder das Gerät verlierst.
         Rufe Backup-Version ab…
    @@ -817,7 +793,6 @@
         Bewahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort auf, wie z.B. einem Passwortmanager (oder Tresor) auf
         Ich habe eine Kopie angefertigt
         Teilen
    -
         Verliere nie wieder verschlüsselte Nachrichten
         Benutze Schlüsselsicherung
         Neue sichere Schlüssel für Nachrichten
    @@ -839,7 +814,6 @@
         Nachricht mit Eingabetaste senden
         Eingabetaste der Bildschirmtastatur schickt die Nachricht ab, statt einen Zeilenumbruch zu erzeugen
         Das Passwort ist ungültig
    -
         Medien
         Standard-Komprimierung
         Wählen
    @@ -879,7 +853,6 @@
         Überprüfe Sicherungsstatus
         Verifiziert!
         Verstanden
    -
         Verifizierungsanfrage
         %s möchte deine Sitzung verifizieren
         Unbekannter Fehler
    @@ -949,7 +922,6 @@
         Link in die Zwischenablage kopiert
         Raum erstellen…
         Bearbeitungsverlauf anzeigen
    -
         E2E-Schlüssel aus der Datei \"%1$s\" importieren.
         Vielen Dank, der Vorschlag wurde erfolgreich gesendet
         Der Vorschlag konnte nicht gesendet werden (%s)
    @@ -986,7 +958,6 @@
         Erkennungsoptionen werden angezeigt, sobald du eine E-Mail hinzugefügt hast.
         Gib einen neuen Identitätsserver ein
         Konnte keine Verbindung zum Homeserver herstellen
    -
         Dies ist keine Adresse eines Matrixservers
         Kann Homeserver nicht unter dieser URL erreichen. Bitte überprüfen
         Hintergrund-Synchronisierungsmodus
    @@ -994,7 +965,6 @@
     \nAbhängig vom Ressourcen-Status deines Geräts kann dein System die Synchronisierung verschieben.
         ${app_name} wird sich im Hintergrund periodisch zu einem bestimmten Zeitpunkt synchronisieren (konfigurierbar).
     \nDies wird Funk- und Akkunutzung beeinflussen. Es wird eine permanente Benachrichtigung geben, die sagt, dass ${app_name} auf Ereignisse lauscht.
    -
         Integrationen
         Benutze einen Integrationsmanager um Bots, Brücken, Widgets und Stickerpakete zu verwalten.
     \nIntegrationsmanager erhalten Rauminformationen und können so Widgets verändern, Einladungen senden und in deinem Namen Berechtigungslevel setzen.
    @@ -1078,7 +1048,6 @@
         Dieser Inhalt wurde als unangebracht gemeldet.
     \n
     \nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden.
    -
         Nutzer ignorieren
         Alle Nachrichten (laut)
         Alle Nachrichten
    @@ -1101,13 +1070,13 @@
         Premium-Hosting für Organisationen
         Mehr erfahren
         Andere
    -    Benutzerdefinierte & erweiterte Einstellungen
    +    Benutzerdefinierte und erweiterte Einstellungen
         Fortfahren
         Eine Trennung von deinem Identitätsserver würde bedeuten, dass du weder von anderen Nutzern gefunden werden, noch diese per E-Mail oder Telefonnummer einladen kannst.
         Du teilst deine E-Mail-Adressen oder Telefonnummern momentan auf dem Identitätsserver %1$s. Du wirst dich erneut mit %2$s verbinden müssen, um mit dem Teilen aufzuhören.
         Stimme den Nutzungsbedingungen des Identitätsservers (%s) zu, um zu erlauben per E-Mail oder Telefonnummer gefunden zu werden.
         Zu teilende Daten nicht verarbeitbar
    -    Erweitere & individualisiere dein Benutzererlebnis
    +    Erweitere und individualisiere dein Benutzererlebnis
         Mit %1$s verbinden
         Mit Element Matrix Services verbinden
         Mit einem individuellen Server verbinden
    @@ -1271,7 +1240,6 @@
         %s verifizieren
         %s verifiziert
         Warte auf %s…
    -
         Nachrichten in diesem Raum sind nicht Ende-zu-Ende-verschlüsselt.
         Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt.
     \n
    @@ -1295,7 +1263,7 @@
         Nutzer
         Admin in %1$s
         Moderation in %1$s
    -    Springen & als gelesen markieren
    +    Springen und als gelesen markieren
         ${app_name} kann keine Ereignisse vom Typ \'%1$s\'
         ${app_name} ist beim Verarbeiten des Ereignisinhalts mit der ID \'%1$s\' auf ein Problem gestoßen
         Nicht ignorieren
    @@ -1392,7 +1360,7 @@
     \n- Dieses Gerät, oder das andere Gerät
     \n- Die Internetverbindung, die von den Geräten genutzt wird
     \n
    -\nWir empfehlen dir dein Passwort & Wiederherstellungsschlüssel in den Einstellungen sofort zu ändern.
    +\nWir empfehlen dir dein Passwort und den Wiederherstellungsschlüssel in den Einstellungen sofort zu ändern.
         Verifizierung abgebrochen. Du kannst sie erneut starten.
         Verifizierung abgebrochen
         Gib dein %s ein um fortzufahren.
    @@ -1409,7 +1377,7 @@
         Synchronisiere Benutzerschlüssel
         Synchronisiere selbstsignierenden Schlüssel
         Richte Schlüsselbackup ein
    -    Deine %2$s & %1$s sind nun eingerichtet.
    +    Deine %2$s und %1$s sind nun eingerichtet.
     \n
     \nBewahre sie sicher auf! Du wirst sie benötigen, um verschlüsselte Nachrichten und sichere Informationen freizuschalten, wenn du alle deine aktive Sitzungen verlierst.
         Speichere ihn auf einem USB-Stick oder auf einem Sicherungslaufwerk
    @@ -1426,7 +1394,7 @@
         Verschlüsselung ist nicht aktiviert
         Raumupgrades
         Verschlüsselung aktiviert
    -    Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt. Erfahre mehr & verifiziere Benutzer in deren Profil.
    +    Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt. Erfahre mehr und verifiziere Benutzer in deren Profil.
         Die Verschlüsselung in diesem Raum wird nicht unterstützt
         Warte auf %s…
         Fehlerbehebung
    @@ -1435,12 +1403,11 @@
         Fast geschafft! Warte auf Bestätigung…
         Verschlüsselte Direktnachrichten
         Nachricht…
    -    Verifiziere dich & andere, um eure Chats zu schützen
    +    Verifiziere dich und andere, um eure Chats zu schützen
         Gib zum Fortfahren deinen %s ein
         Datei benutzen
         Dies ist kein gültiger Wiederherstellungsschlüssel
         Bitte gib deinen Wiederherstellungsschlüssel ein
    -
         Verschlüsselungsupgrade verfügbar
         Überprüfe Wiederherstellungsschlüssel
         Überprüfe Sicherungsstatus (%s)
    @@ -1472,7 +1439,7 @@
         Unverschlüsselt
         Verschlüsselt von einem unbekannten Gerät
         Überprüfe, wo du angemeldet bist
    -    Verifiziere alle deine Sitzungen, um sicherzustellen, dass dein Konto & deine Nachrichten sicher sind
    +    Verifiziere alle deine Sitzungen, um sicherzustellen, dass dein Konto und deine Nachrichten sicher sind
         Bestätige neue Anmeldung zu deinem Konto: %1$s
         Verifiziere manuell mit einem Text
         Anmeldung verifizieren
    @@ -1543,7 +1510,7 @@
         Backup einrichten
         Backup zurücksetzen
         Auf diesem Gerät einrichten
    -    Verlust verschlüsselter Nachrichten & Daten verhindern, indem die Schlüssel für die Entschlüsselung auf dem Server gesichert werden.
    +    Verlust verschlüsselter Nachrichten und Daten verhindern, indem die Schlüssel für die Entschlüsselung auf dem Server gesichert werden.
         Generiere einen neuen Sicherheitsschlüssel oder setze eine neue Sicherheitspassphrase für dein existierendes Backup.
         Dieses wird deinen aktuellen Schlüssel oder deine aktuelle Phrase ersetzen.
         Integrationen sind deaktiviert
    @@ -1589,9 +1556,9 @@
         Dein Serveradministrator hat in privaten Räumen und Direktnachrichten Ende-zu-Ende-Verschlüsselung standardmäßig deaktiviert.
         Flugzeugmodus ist aktiv
         Gib eine Sicherheitsphrase ein, die nur du kennst. Diese wird benutzt um deine Daten auf dem Server geheim zu halten.
    -    Wenn du jetzt abbrichst und den Zugriff zu deinen Sitzungen verlierst, kannst du verschlüsselte Nachrichten & Daten verlieren.
    +    Wenn du jetzt abbrichst und den Zugriff zu deinen Sitzungen verlierst, kannst du verschlüsselte Nachrichten und Daten verlieren.
     \n
    -\nDu kannst auch ein Backup einrichten & deine Schlüssel in den Einstellungen verwalten.
    +\nDu kannst auch ein Backup einrichten und deine Schlüssel in den Einstellungen verwalten.
         Du hast den Raum erstellt und konfiguriert.
         Dieser Account ist deaktiviert worden.
         Konnte Mediendatei nicht speichern
    @@ -1620,7 +1587,7 @@
         Stoppe Kamera
         Starte Kamera
         Backup
    -    Verlust verschlüsselter Nachrichten & Daten verhindern, indem die Schlüssel für die Entschlüsselung am Server gesichert werden.
    +    Verlust verschlüsselter Nachrichten und Daten verhindern, indem die Schlüssel für die Entschlüsselung am Server gesichert werden.
         Sicherheitsschlüssel benutzen
         Generiere einen Sicherheitsschlüssel, welcher z.B. in einem Passwortmanager oder in einem Tresor sicher aufbewahrt werden sollte.
         Eine Sicherheitsphrase benutzen
    @@ -1786,7 +1753,7 @@
         Raumname
         Prüfung exportieren
         Direktnachricht
    -    Geschichte der Anfragen von Schlüsselfreigaben senden
    +    Verlauf der Anfragen von Schlüsselfreigaben senden
         Keine weiteren Ergebnisse
         Starte die Diskussion
         Autorisieren
    @@ -1841,7 +1808,6 @@
         Aktivieren, wenn der Raum nur von Mitgliedern deines Homeservers zur internen Kommunikation verwendet wird. Das kann später nicht mehr geändert werden.
         Begrenze Zugang zu diesem Raum (für immer!) auf Mitglieder von %s
         %1$d von %2$d
    -
         Keine Vorschau für diesen Raum verfügbar. Willst du direkt beitreten\?
         Der Raum ist gerade nicht zugänglich.
     \nVersuche es später nochmal, oder bitte einen Raum-Admin um Hilfe.
    @@ -1910,8 +1876,6 @@
         Beim Weiterleiten des Anrufs ist ein Fehler aufgetreten
         Weiterleiten
         Verbinden
    -
    -
         Aktiver Anruf (%1$s)
         Beim Suchen der Telefonnummer ist ein Fehler aufgetreten
         Wähltastatur
    @@ -2106,7 +2070,6 @@
         Spaces Feedback
         Dieser Server ist schon in der Liste vorhanden
         Server oder Raumliste kann nicht gefunden werden
    -
         Bei %1$s anfragen
         Zu %1$s weiterleiten
         Space-Adressen
    @@ -2187,7 +2150,7 @@
         Alle im übergeordneten Space haben Zugriff auf den Raum - es ist nicht nötig jeden einzeln einzuladen. Du kannst dies in den Raumeinstellungen jederzeit ändern.
         Andere Spaces oder Räume die du kennst
         Spaces mit diesem Raum und dir als Mitglied
    -    Nur Erwähnungen & Schlüsselwörter
    +    Nur Erwähnungen und Schlüsselwörter
         Auflegen…
         Sprachanruf mit %s
         Videoanruf mit %s
    @@ -2353,7 +2316,6 @@
         Sichere Nachrichtenübertragung.
         Besitze deine Konversationen.
         Um bestehende Kontakte ermitteln zu können, müsst du Kontaktinformationen (E-Mails und Telefonnummern) an Ihren Identitätsserver senden. Wir verschlüsseln deine Daten vor dem Senden, um den Datenschutz zu gewährleisten.
    -
         Deine Kontakte sind privat. Um in deinen Kontakten Benutzer erkennen zu können, benötigen wir deine Erlaubnis, Kontaktinformationen an deinen Identitätsserver zu senden.
         Dieser Server stellt keine Richtlinie bereit.
         Deine Identitätsserver-Richtlinie
    @@ -2430,7 +2392,7 @@
         Hinweis: App wird neugestartet
         diese Frage überspringen
         Noch nicht sicher\? Du kannst %s
    -    Freundschaften und Familie
    +    Freunde und Familie
         In Thread antworten
         Aus einem Thread
         Filter
    @@ -2450,4 +2412,10 @@
             %1$d mehr
         
         Weniger anzeigen
    +    %1$s und %2$s
    +    %1$s, %2$s und andere
    +    
    +        %d Server-ACL geändert
    +        %d Server-ACLs geändert
    +    
     
    \ No newline at end of file
    
    From a71cc5a942ce79ad557c728cb636153c9b999fa5 Mon Sep 17 00:00:00 2001
    From: random 
    Date: Mon, 28 Feb 2022 10:07:30 +0000
    Subject: [PATCH 016/152] Translated using Weblate (Italian)
    
    Currently translated at 100.0% (2157 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/it/
    ---
     vector/src/main/res/values-it/strings.xml | 42 ++---------------------
     1 file changed, 2 insertions(+), 40 deletions(-)
    
    diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml
    index 849a4e92a4..492d8af526 100644
    --- a/vector/src/main/res/values-it/strings.xml
    +++ b/vector/src/main/res/values-it/strings.xml
    @@ -39,7 +39,6 @@
         Invito nella stanza
         %1$s e %2$s
         Stanza vuota
    -
         Sincronizzazione iniziale:
     \nImportazione account…
         Sincronizzazione iniziale:
    @@ -241,7 +240,6 @@
         Elimina
         Rinomina
         Segnala contenuto
    -
         o
         Invita
         Disconnetti
    @@ -264,7 +262,6 @@
         Mostra solo i contatti Matrix
         Nessun risultato
         Stanze
    -
         Invia i registri
         Invia i registri di crash
         Invia schermata
    @@ -295,11 +292,9 @@
         Questo indirizzo email non sembra corretto
         L\'indirizzo email è già stato impostato.
         Hai dimenticato la password\?
    -
         Questo homeserver vuole assicurarsi che tu non sia un robot
         Va inserito l\'indirizzo email associato al tuo account.
         La verifica del tuo indirizzo email è fallita: assicurati di aver cliccato sul link contenuto nella mail
    -
         Inserisci un URL valido
         JSON malformato
         Non conteneva un JSON valido
    @@ -315,14 +310,10 @@
         Chiamata in corso…
         Ricezione fallita da parte del destinatario.
         Informazione
    -
    -
         ${app_name} deve essere autorizzato ad accedere al microfono e poter così fare chiamate audio.
    -
         ${app_name} deve essere autorizzato ad accedere a fotocamera e microfono per poter fare chiamate video.
     \n
     \nNel prossimo pop-up concedi le autorizzazioni per poter fare la chiamata.
    -
         
         NO
         Continua
    @@ -330,7 +321,6 @@
         Entra
         Rifiuta
         Vai ai non letti
    -
         Esci dalla stanza
         Sei sicuro di voler uscire dalla stanza?
         CHAT DIRETTE
    @@ -357,7 +347,6 @@
         Il certificato è diverso da quello precedentemente contrassegnato sul tuo telefono come \"affidabile\". Questa cosa è MOLTO INSOLITA. Si raccomanda di NON ACCETTARE questo nuovo certificato.
         Il certificato del server è cambiato: quello precedente era stato contrassegnato come affidabile ma quello attuale no. Può darsi che il certificato precedente sia scaduto e sia stato semplicemente sostituito con uno nuovo. Contatta l\'amministratore del server per verificare l\'impronta digitale in uso.
         Contrassegna il certificato come affidabile solo se l\'mpronta digitale comunicata dall\'amministratore del server corrisponde a quella qua sopra.
    -
         Cerca
         Cerca tra i membri della stanza
         Nessun risultato
    @@ -443,7 +432,6 @@
         Queste sono caratteristiche sperimentali che potrebbero dare risultati inattesi. Usali con cautela.
         Imposta come indirizzo principale
         Non usare più come indirizzo principale
    -
         Tema
         Errore di decriptazione
         Nome pubblico
    @@ -455,7 +443,6 @@
         Esporta
         Inserisci la Passphrase
         Conferma la Passphrase
    -
         Importa le chiavi di crittografia E2E della stanza
         Importa le chiavi della stanza
         Importa le chiavi da un file locale
    @@ -467,7 +454,6 @@
         Conferma
         Conferma confrontando la seguente con le impostazioni utente della tua altra sessione:
         Se non corrispondono, la sicurezza delle tue comunicazioni potrebbe essere compromessa.
    -
         Scegli un elenco di stanze
         Nome del server
         Tutte le stanze sull\'Home Server %s
    @@ -509,7 +495,6 @@
         Sicuro di voler fare una chiamata audio\?
         Sicuro di voler fare una videochiamata\?
         Elenco dei membri
    -
         
             %d utente
             %d utenti
    @@ -519,8 +504,6 @@
             %d nuovo messaggio
             %d nuovi messaggi
         
    -
    -
         Tutti i messaggi
         Aggiungi alla schermata iniziale
         Anteprima degli URL
    @@ -530,7 +513,6 @@
             %d messaggio notificato non letto
             %d messaggi notificati non letti
         
    -
         
             %d stanza
             %d stanze
    @@ -608,16 +590,10 @@
         La conversazione continua qui
         Questa stanza contiene una conversazione cominciata altrove
         Clicca qui per vedere i messaggi precedenti
    -
    -
    -
    -
         
             %d selezionato
             %d selezionati
         
    -
    -
         Avvisi di sistema
         contatta l\'amministratore del servizio
         L\'Home Server ha superato uno dei limiti delle risorse, pertanto alcuni utenti non potranno accedere.
    @@ -708,7 +684,6 @@
         ${app_name} non è influenzato dall\'ottimizzazione della batteria.
         Se si lascia un dispositivo scollegato, fermo e con lo schermo spento, dopo un certo tempo questo entra in modalità Doze. Ciò impedisce alle App di accedere alla rete e ritarda le attività, le sincronizzazioni e la ricezione dei normali allarmi.
         Ignora l\'ottimizzazione
    -
         Non è stato trovato nessun APK Google Play Services valido. Le notifiche non funzioneranno correttamente.
         Chiamata video in corso…
         Backup delle chiavi
    @@ -778,7 +753,6 @@
         Salva il codice di recupero
         Condividi
         Salva come file
    -
         Si prega di farne una copia
         Condividi il codice di recupero con…
         Generazione del codice di recupero basato sulla Passphrase. Questo processo può durare alcuni secondi.
    @@ -826,7 +800,6 @@
         Eliminazione Backup…
         Elimina Backup
         Eliminare il Backup delle chiavi crittografiche dall\'Home Server\? Non potrai più usare il codice di recupero per leggere i messaggi cifrati.
    -
         Non perdere mai i messaggi cifrati
         Usa il Backup delle chiavi
         Nuove chiavi per messaggi sicuri
    @@ -840,7 +813,6 @@
         Versione
         Algoritmo
         Firma
    -
         Multimedia
         Compressione predefinita
         Scegli
    @@ -874,8 +846,6 @@
         Ignora
         Verificato!
         Capito
    -
    -
         Richiesta di verifica
         %s vuole verificare la tua sessione
         Errore sconosciuto
    @@ -972,7 +942,6 @@
         Nessuno
         Revoca
         Disconnetti
    -
         Non è stato trovato alcun Home Server seguendo questo URL. Per favore, controllalo
         Modalità sync in background
         Ottimizzato per la batteria
    @@ -983,7 +952,6 @@
     \nCiò avrà un certo impatto sulla quantità di dati e batteria utilizzati. Una notifica sempre accesa comunicherà che ${app_name} è attivo.
         Nessuna sincronizzazione in background
         Quando l\'App è in background non ti verranno notificati i messaggi in arrivo.
    -
         Farsi trovare
         Gestisci le impostazioni per farsi trovare.
         Non stai usando alcun server di identità
    @@ -1053,7 +1021,6 @@
         Questo contenuto è stato segnalato come inappropriato.
     \n
     \nSe non vuoi più vedere i contenuti di questo utente puoi ignorarlo. Ciò nasconderà i suoi messaggi dalla tua vista.
    -
         Integrazioni
         Usa un gestore di integrazioni per gestire bot, bridge, widget e pacchetti di sticker.
     \nI gestori di integrazioni possono ricevere dati di configurazione, modificare widget, mandare inviti alle stanze e modificare permessi a tuo nome.
    @@ -1264,7 +1231,6 @@
         Verifica %s
         %s verificato
         In attesa di %s…
    -
         I messaggi in questa stanza non sono cifrati E2E.
         I messaggi in questa stanza sono cifrati E2E.
     \n
    @@ -1410,7 +1376,6 @@
         Stampala e conservala in un posto sicuro
         Salvala in una penna USB o disco di backup
         Copiala sul Cloud
    -
         Crittografia attiva
         I messaggi in questa stanza sono crittografati E2E. Maggiori info e verifica degli utenti nel loro profilo.
         Crittografia non attiva
    @@ -1813,7 +1778,6 @@
         Nascondi avanzate
         Mostra avanzate
         %1$d di %2$d
    -
         Dai il consenso
         Revoca il mio consenso
         Hai acconsentito ad inviare email e numeri di telefono a questo server d\'identità per poter rintracciare altri utenti tra i tuoi contatti.
    @@ -1902,8 +1866,6 @@
         Trasferisci
         Connetti
         Prima consulta
    -
    -
         Chiamata attiva (%1$s)
         Si è verificato un errore cercando il numero di telefono
         Tastierino numerico
    @@ -2102,7 +2064,6 @@
         Inserisci il nome di un nuovo server che vuoi esplorare.
         Aggiungi un nuovo server
         Il tuo server
    -
         Spiacenti, si è verificato un errore tentando di entrare: %s
         Indirizzo dello spazio
         Vedi e gestisci gli indirizzi di questo spazio.
    @@ -2303,7 +2264,6 @@
         Domanda o argomento del sondaggio
         Crea sondaggio
         Sondaggio
    -
         Invia email e numeri di telefono a %s
         I tuoi contatti sono privati. Per trovare utenti dai tuoi contatti, ci serve l\'autorizzazione per inviare le informazioni dei contatti al tuo server d\'identità.
         La sessione è stata disconnessa!
    @@ -2448,4 +2408,6 @@
             %d modifica delle ACL del server
             %d modifiche delle ACL del server
         
    +    %1$s e %2$s
    +    %1$s, %2$s e altri
     
    \ No newline at end of file
    
    From 8f1cd11bbbef8c96defac371a4a8a55a57c75699 Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Wed, 2 Mar 2022 16:21:58 +0000
    Subject: [PATCH 017/152] Translated using Weblate (Japanese)
    
    Currently translated at 98.3% (2121 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/
    ---
     vector/src/main/res/values-ja/strings.xml | 9 +++++++--
     1 file changed, 7 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
    index fe125881f4..fbd6540dd6 100644
    --- a/vector/src/main/res/values-ja/strings.xml
    +++ b/vector/src/main/res/values-ja/strings.xml
    @@ -1974,7 +1974,7 @@
         国際電話番号は「+」から始まる必要があります
         コードを%1$sに送信しました。以下に入力して認証してください。
         このメールアドレスはどのアカウントにも登録されていません
    -    パスワードを変更すると、すべてのセッションでのエンドツーエンド暗号鍵がリセットされ、暗号化されたメッセージ履歴が読めなくなります。パスワードを再設定する前に、鍵のバックアップを設定するか、他のセッションから鍵をエクスポートしておいてください。
    +    パスワードを変更すると、全てのセッションでのエンドツーエンド暗号鍵がリセットされ、暗号化されたメッセージ履歴が読めなくなります。パスワードを再設定する前に、鍵のバックアップを設定するか、他のセッションからルームの鍵をエクスポートしておいてください。
         パスワードの再設定を確認するために認証メールを送信します。
         このメールアドレスはどのアカウントにも属していません。
         このアプリではこのホームサーバーにアカウントを作成できません。
    @@ -2322,7 +2322,7 @@
     \n検証は端末に保存され、新しいバージョンのアプリで共有されます。
         %1$s、%2$s他
         %1$sと%2$s
    -    自分と相手を認証してチャットを安全に保ちます
    +    自分と相手を認証して、チャットを安全に保ちましょう
         あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。
         監査結果をエクスポート
         ストレージから機密情報を発見できません
    @@ -2335,4 +2335,9 @@
         アカウントのセキュリティーが破られている可能性があります
         選択したスペースに追加
         最新の${app_name}は他のデバイスでも使用できます:
    +    音声通話が終了しました・%1$s
    +    ビデオ通話が終了しました・%1$s
    +    メールアドレスで招待したり、連絡先を検索したりできます…
    +    鍵のバックアップの機密情報をSSSSに保存しています
    +    あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。
     
    \ No newline at end of file
    
    From 84a27d23fdbd8bf8ba093eb68ff8c6f34a7eb796 Mon Sep 17 00:00:00 2001
    From: Arusekk 
    Date: Wed, 2 Mar 2022 20:59:53 +0000
    Subject: [PATCH 018/152] Translated using Weblate (Polish)
    
    Currently translated at 93.8% (2025 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
    ---
     vector/src/main/res/values-pl/strings.xml | 75 +++++------------------
     1 file changed, 17 insertions(+), 58 deletions(-)
    
    diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
    index 408fc207f5..fe98d6b6a1 100644
    --- a/vector/src/main/res/values-pl/strings.xml
    +++ b/vector/src/main/res/values-pl/strings.xml
    @@ -30,7 +30,6 @@
         Zaproszenie do pokoju
         %1$s i %2$s
         Pusty pokój
    -
         ** Nie można odszyfrować: %s **
         %s wykonał(a) rozmowę wideo.
         %s wykonał(a) połączenie głosowe.
    @@ -46,14 +45,14 @@
         Wstępna synchronizacja:
     \nImportowanie kryptografii
         Wstępna synchronizacja:
    -\nImportowanie pokoi
    +\nImportowanie pokojów
         Wstępna synchronizacja:
     \nImportowanie Twoich konwersacji
    -\nJeśli dołączyłeś(aś) do wielu pokoi, może to zająć dłuższą chwilę
    +\nJeśli dołączyłeś(aś) do wielu pokojów, może to zająć dłuższą chwilę
         Wstępna synchronizacja:
    -\nImportowanie zaproszonych pokoi
    +\nImportowanie zaproszonych pokojów
         Wstępna synchronizacja:
    -\nImportowanie opuszczonych pokoi
    +\nImportowanie opuszczonych pokojów
         Wstępna synchronizacja:
     \nImportowanie grup
         Wstępna synchronizacja:
    @@ -74,7 +73,6 @@
         Usuń
         Zmień nazwę
         Zgłoś treść
    -
         i
         Zaproś
         Wyloguj się
    @@ -97,7 +95,6 @@
         Tylko kontakty Matrixa
         Brak wyników
         Pokoje
    -
         Wyślij dzienniki
         Wyślij dzienniki awarii
         Wyślij zrzut ekranu
    @@ -141,7 +138,6 @@
         Przychodzące połączenie głosowe
         W trakcie połączenia…
         Informacja
    -
         ${app_name} wymaga uprawnienia, aby przeprowadzić połączenie audio.
         TAK
         NIE
    @@ -169,7 +165,6 @@
         Ignoruj
         Odcisk palca (%s):
         Nie można zweryfikować tożsamości serwera.
    -
         Szukaj
         Filtruj członków pokoju
         Brak wyników
    @@ -209,7 +204,6 @@
         Zaaktualizuj nazwę publiczną
         Ostatnio widziany(-a)
         %1$s @ %2$s
    -
         Uwierzytelnianie
         Zalogowany jako
         Interfejs użytkownika
    @@ -240,7 +234,6 @@
         Laboratorium
         Znajdują się tu eksperymentalne funkcje, których należy używać z ostrożnością.
         Ustaw jako główny adres
    -
         Motyw
         Nazwa publiczna
         ID sesji
    @@ -283,8 +276,6 @@
         Czy jesteś pewien, że chcesz rozpocząć wideorozmowę?
         Zrób zdjęcie
         Nagraj film
    -
    -
         Uszkodzony JSON
         
             %d zmiana członkostwa
    @@ -293,15 +284,10 @@
             
         
         Rozmówca nie połączył się.
    -
    -
         ${app_name} wymaga dostępu do kamery i mikrofonu, aby przeprowadzać rozmowy wideo.
     \n
     \nPrzyznaj dostęp w następnym oknie.
    -
         Lista uczestników
    -
    -
         
             1 członek
             kilku członków
    @@ -323,8 +309,6 @@
         Certyfikat różni się od tego zaufanego w twoim telefonie. Serwer mógł odnowić certyfikat. Skontaktuj się z administratorem serwera w celu weryfikacji odcisku palca.
         Certyfikat zmienił stan z zaufanego na niezaufany. jest to NIEZWYKLE RZADKIE. Rekomendowane jest NIE AKCEPTOWANIE nowego certyfikatu.
         Akceptuj certyfikat tylko wtedy gdy administrator opublikował odcisk palca pasujący do tego powyżej.
    -
    -
         Wszystkie wiadomości
         Dodaj do ekranu domowego
         Pokaż informacje o aplikacji w ustawieniach systemu.
    @@ -363,7 +347,6 @@
         Wysyłaj dane analityczne
         ${app_name} zbiera anonimowe informacje które pozwolą ulepszyć aplikację.
         Eksportuj klucze E2E pokoju
    -
         Importuj klucze E2E pokoju
         Importuj klucze pokoju
         Importuj klucze z lokalnego pliku
    @@ -372,14 +355,13 @@
         Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych sesji w tym pokoju z tej sesji.
         Aby sprawdzić czy ta sesja jest zaufana, skontaktuj się z jej właścicielem używając innych form (np. osobiście lub telefonicznie) i zapytaj czy klucz, który widzą w ustawieniach użytkownika dla tego urządzenia pasuje do klucza poniżej:
         Jeśli klucz pasuje, potwierdź to przyciskiem poniżej. Jeśli nie, to ktoś inny najprawdopodobniej przejmuje lub podszywa się pod tą sesję i powinieneś dodać tę sesję do czarnej listy. W przyszłości proces weryfikacji będzie bardziej skomplikowany.
    -
         Wyślij naklejkę
         Niestety, nie znaleziono zewnętrznej aplikacji, która ukończy to działanie.
         
             1 pokój
             %d pokoje
    -        %d pokoi
    -        
    +        %d pokojów
    +        %d pokojów
         
         
             1 aktywny widżet
    @@ -399,7 +381,6 @@
             %d nieprzeczytanych wiadomości powiadomienia
             
         
    -
         %1$s w %2$s
         Czy na pewno chcesz usunąć widżet z tego pokoju?
         Nie można utworzyć widżetu.
    @@ -436,16 +417,10 @@
         Błąd
         Opuszcza pokój
         Włącza/Wyłącza markdown
    -
    -
         Kliknij tutaj, aby zobaczyć starsze wiadomości
         Przepraszamy, wystąpił błąd
         Alerty systemowe
         Jeżeli to możliwe, proszę napisz opis w języku angielskim.
    -
    -
    -
    -
         
             1 zaznaczone
             %d zaznaczone
    @@ -603,7 +578,6 @@
         Jeżeli nie pamiętasz swoich danych odzystkiwania, możesz %s.
         Zgubiłeś (-łaś) swój klucz odzyskiwania\? Możesz ustawić nowy w ustawieniach.
         Kopia zapasowa posiada poprawną sygnaturę z niezweryfikowanej sesji %s
    -
         Jesteś na bieżąco!
         Unieważnij
         Rozłącz
    @@ -652,7 +626,6 @@
         Niepowodzenie przy pobieraniu wersji kluczy (%s).
         Usuwanie kopii zapasowej…
         Sprawdzanie stanu kopii zapasowej
    -
         Reakcje
         Brak sieci. Sprawdź swoje połączenie z Internetem.
         Proszę czekać…
    @@ -682,7 +655,6 @@
         IGNORUJ UŻYTKOWNIKA
         Treść zgłoszona
         Zgłoszone jako spam
    -
         Proszę napisz swoją sugestię poniżej.
         Opisz swoją sugestię tutaj
         Utwórz nową rozmowę bezpośrednią
    @@ -712,7 +684,6 @@
         Opuść pokój
         Włącz szyfrowanie end-to-end…
         Brak
    -
         Nie udało się połączyć z serwerem o podanym adresie URL, upewnij się, że wpisano go poprawnie
         Niektóre rodzaje wiadomości będą ciche (wygenerują powiadomienie bez dźwięku).
         Weryfikacja Usług Google
    @@ -761,9 +732,8 @@
     \nWpłynie to na użycie baterii i sieci, na panelu powiadomień pozostanie wyświetlone stałe powiadomiene o nasłuchiwaniu zdarzeń.
         Brak synchronizacji w tle
         Nie będziesz otrzymywać powiadomień o przychodzących wiadomościach gdy aplikacja będzie działać w tle.
    -
         Użyj menedżera integracji aby zarządzać botami, mostami, widżetami i pakietami naklejek.
    -\nMenedżerzy integracji odbierają dane konfiguracji, modyfikują widżety, wysyłają zaproszenia do pokoi i ustawiają poziomy uprawnień na Twe żądanie.
    +\nMenedżerzy integracji odbierają dane konfiguracji, modyfikują widżety, wysyłają zaproszenia do pokojów i ustawiają poziomy uprawnień w Twoim imieniu.
         Pokaż podgląd linków wewnątrz czatu jeśli twój serwer wspiera tę funkcję.
         Formatuj wiadomości używając składni Markdown zanim zostaną wysłane. Pozwala to na zaawansowane formatowanie takie jak używanie asterysków do wyświetlania tekstu w kursywie.
         Nie wpływa to na zaproszenia, wyrzucenia oraz bany.
    @@ -771,7 +741,6 @@
         Przycisk enter na klawiaturze programowej wyśle wiadomość zamiast wprowadzania łamanania linii
         Znajdź
         Zarządzaj ustawieniami wyszukiwania.
    -
         Media
         Domyślne źródło mediów
         Odzyskiwanie zaszyforwanych wiadomości
    @@ -832,7 +801,6 @@
         Zrobiłem kopię
         Zapisz Klucz Odzyskiwania
         Zapisz jako plik
    -
         Kopia zapasowa istnieje już na Twoim serwerze domowym
         Wygląda na to, iż kopia zapasowa kluczy została skonfigurowana za pomocą innej sesji. Czy chcesz zastąpić ją tą, którą tworzysz\?
         Generowanie Klucza Odzyskiwania używając hasła, proces może zająć kilka sekund.
    @@ -861,7 +829,6 @@
             Kopiowanie %d kluczy…
             
         
    -
         Niektóre powiadomienia są wyłączone w osobistej konfiguracji.
         Usługi Google Play są aktualne.
         Rozumiem
    @@ -930,7 +897,6 @@
         Zawartość została zgłoszona jako niewłaściwa.
     \n
     \nJeżeli nie chcesz widzieć treści od tego użytkownika, możesz go zablokować aby ukryć jego wiadomości.
    -
         Opuść pokój
         %1$s nie dokona(-ła) zmian
         Wysyła wiadomość jako spoiler
    @@ -1109,7 +1075,6 @@
         Zweryfikuj %s
         Zweryfikowano %s
         Oczekiwanie na %s…
    -
         Wiadomości w tym pokoju są zaszyfrowane end-to-end.
     \n
     \nTwoje wiadomości są zabezpieczone zamkami i jedynie Ty oraz Twój odbiorca posiadacie klucze, aby je odblokować.
    @@ -1222,7 +1187,7 @@
         Szyfrowanie miniatury…
         Nie możesz czegoś odnaleźć\?
         Utwórz nowy pokój
    -    Otwórz katalog pokoi
    +    Otwórz katalog pokojów
         Nazwa lub ID (#przykład:matrix.org)
         Serwer toższamości
         Odłącz od serwera tożsamości
    @@ -1345,7 +1310,6 @@
         Jeżeli teraz przerwiesz, możesz utracić zaszyfrowane wiadomości oraz dane jeżeli utracisz dostęp do zalogowanych sesji. 
     \n
     \nMożesz także ustawić Secure Backup i zarządzać swoimi kluczami w Ustawieniach.
    -
         Wydrukuj go i schowaj w bezpiecznym miejscu
         Twój %2$s i %1$s są teraz ustawione.
     \n
    @@ -1457,7 +1421,6 @@
         Dodaj obraz z
         Niepoprawny kod weryfikacyjny.
         Kod
    -
         Udziel zgody
         Wycofaj moją zgodę
         Udzieliłeś zgody na wysłanie adresów e-mail oraz numerów telefonów do tego serwera tożsamości w celu odkrycia innych użytkowników z Twoich kontaktów.
    @@ -1508,7 +1471,7 @@
             %d zablokowanych użytkowników
             %d zablokowanych użytkowników
         
    -    Opublikować ten pokój dla wszystkich w katalogu pokoi %1$s\?
    +    Opublikować ten pokój dla wszystkich w katalogu pokojów %1$s\?
         Cofnij publikację tego adresu
         Opublikuj ten adres
         Dodaj adres lokalny
    @@ -1526,7 +1489,7 @@
         To jest główny adres
         Opublikowane adresy mogą zostać wykorzystane przez kogokolwiek na dowolnym serwerze do dołączenia do Twojego pokoju. Żeby opublikować adres musi być on najpierw ustawiony jako adres lokalny.
         Opublikowane adresy
    -    Obejrzyj i zarządzaj adresami tego pokoju oraz jego widocznością w katalogu pokoi.
    +    Obejrzyj i zarządzaj adresami tego pokoju oraz jego widocznością w katalogu pokojów.
         Adres pokoju
         Dostęp do pokoju
         Zmiany dotyczące tego kto może czytać historię zostaną zastosowane wyłącznie do przyszłych wiadomości w tym pokoju. Widoczności już istniejącej historii pozostanie niezmieniona.
    @@ -1557,7 +1520,7 @@
         Anuluj zaproszenie
         Zaprzestanie ignorowania użytkownika spowoduje ponowne wyświetlanie wszystkich jego wiadomości.
         Przestań ignorować użytkownika
    -    Zignorowanie tego użytkownika usunie wszystkie jego wiadomości z pokoi, które współdzielicie.
    +    Zignorowanie tego użytkownika usunie wszystkie jego wiadomości z pokojów, które współdzielicie.
     \n
     \nOperacja ta może zostać cofnięta w dowolnej chwili poprzez ustawienia ogólne.
         Ignoruj użytkownika
    @@ -1895,7 +1858,7 @@
         Adres URL serwera domowego
         Wyślij historię żądań udostępnienia klucza
         Przestrzenie
    -    Katalog pokoi
    +    Katalog pokojów
         Sugerowane pokoje
         Nowa wartość
         Przełącz
    @@ -1984,7 +1947,7 @@
         Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia.
         Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia. 
     \nNie masz uprawnień aby dodawać pokoje.
    -    W tej Przestrzeni nie ma żadnych pokoi
    +    W tej Przestrzeni nie ma żadnych pokojów
         Proszę skontaktować się z administratorem Twojego serwera domowego aby uzyskać więcej informacji
         Wygląda na to, że Twój serwer domowy jeszcze nie obsługuje Przestrzeni
         Lubisz eksperymentować\?
    @@ -2006,7 +1969,7 @@
         Dodaj istniejące pokoje i przestrzenie
         Wybierz aby opuścić
         Opuść wybrane pokoje i przestrzenie…
    -    Nie opuszczaj żadnych pokoi i przestrzeni
    +    Nie opuszczaj żadnych pokojów i przestrzeni
         Opuść wszystkie pokoje i przestrzenie
         Jesteś jedynym administratorem tej przestrzeni. Opuszczenie jej oznacza brak kontroli nad nią.
         Nie będziesz w stanie ponownie dołączyć, do momentu kiedy nie zostaniesz ponownie zaproszony.
    @@ -2051,7 +2014,7 @@
         Publiczna
         Prywatna przestrzeń dla Ciebie i Twoich znajomych
         Ja i moi znajomi
    -    Prywatna przestrzeń do organizacji Twoich pokoi
    +    Prywatna przestrzeń do organizacji Twoich pokojów
         Tylko ja
         Upewnij się, że odpowiednie osoby mają dostęp do %s. Możesz zmienić to później.
         Z kim pracujesz\?
    @@ -2132,7 +2095,7 @@
         Opuścić obecną konferencję i przejść do innej\?
         Wystąpił błąd podczas próby dołączenia do konferencji
         Ten serwer znajduje się już na liście
    -    Nie można odnaleźć tego serwera lub jego listy pokoi
    +    Nie można odnaleźć tego serwera lub jego listy pokojów
         Wprowadź nazwę nowego serwera, który chcesz odkrywać.
         Dodaj nowy serwer
         Twój serwer
    @@ -2149,7 +2112,7 @@
         wyproszenie użytkownika zaskutkuje usunięciem go z tej przestrzeni.
     \n
     \nAby uniemożliwić mu ponowne dołączenie, należy go zbanować.
    -    Pokaż wszystkie pokoje w katalogu pokoi (również te zawierające treści dla dorosłych).
    +    Pokaż wszystkie pokoje w katalogu pokojów (również te zawierające treści dla dorosłych).
         Pokaż pokoje z treścią dla dorosłych
         %1$s zmienił(a) alternatywne adresy dla tego pokoju.
         Dodano %1$s i usunięto %2$s jako adresy tego pokoju.
    @@ -2190,7 +2153,6 @@
         Ustawienia pokoju
         Ankieta
         Plik jest zbyt duży, aby go przesłać.
    -
         Wyślij maile i numery telefonów do %s
         Twoje kontakty są prywatne. Aby odnaleźć użytkowników z Twoich kontaktów, potrzebujemy zgody do wysłania informacji o nich na Twój serwer tożsamości.
         Bezpieczna kopia
    @@ -2273,7 +2235,6 @@
         Aktualizuj pokój prywatny
         Aktualizuj pokój publiczny
         Dołącz do pokoju zastępczego
    -
         Dodaj kilka szczegółów, aby ułatwić ludziom identyfikację. Możesz je zmienić w dowolnym momencie.
         Dodaj kilka szczegółów, aby się wyróżnić. Możesz je zmienić w dowolnym momencie.
         Twoja przestrzeń prywatna
    @@ -2336,7 +2297,6 @@
             %1$d aktywnych połączeń ·
             %1$d aktywnych połączeń ·
         
    -
         Zgadzasz się na wysłanie tych informacji\?
         Ustawienia systemu
         Wersje
    @@ -2371,7 +2331,6 @@
         Niedostępny
         Dostępny
         Pokaż znaczniki odczytania
    -
         Odkrywanie (%s)
         Dokończ konfigurację odkrywania.
         Usuń wszystkie nieudane wiadomości
    
    From abfd9b8fdcc4ce95aaf196d2d497c46c6586aa20 Mon Sep 17 00:00:00 2001
    From: Jozef Gaal 
    Date: Tue, 1 Mar 2022 23:41:47 +0000
    Subject: [PATCH 019/152] Translated using Weblate (Slovak)
    
    Currently translated at 98.9% (2134 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
    ---
     vector/src/main/res/values-sk/strings.xml | 16 +++++++++-------
     1 file changed, 9 insertions(+), 7 deletions(-)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 18af56a598..6ec0827757 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -658,7 +658,7 @@
         Ignorovať
         Ste si istí, že sa chcete odhlásiť\?
         Označiť ako prečítané
    -    Prihlásiť sa použitím jediného prihlásenia
    +    Prihlásiť sa použitím jednotného prihlásenia SSO
         Pokročilé nastavenia oznámení
         Dôležitosť oznámení pre udalosti
         Vlastné nastavenia.
    @@ -1650,8 +1650,8 @@
         Vlastné (%1$d) v %2$s
         Predvolené v %1$s
         Overiť porovnaním emotikonov
    -    Namiesto toho overte porovnaním emoji
    -    Ak nie ste osobne, porovnajte namiesto toho emoji
    +    Namiesto toho overte porovnaním emotikonov
    +    Ak nie ste osobne, porovnajte namiesto toho emotikony
         Skenovať pomocou tohto zariadenia
         Naskenujte kód pomocou iného zariadenia alebo prepnite a skenujte pomocou tohto zariadenia
         Naskenujte kód pomocou zariadenia druhého používateľa, aby ste sa navzájom bezpečne overili
    @@ -2017,7 +2017,7 @@
         Vyberte si prosím heslo.
         Vyberte si prosím používateľské meno.
         Nepodarilo sa nastaviť krížové podpisovanie
    -    Interaktívne overte pomocou emoji
    +    Interaktívne overte pomocou emotikonov
         Manuálne overte pomocou textu
         Overte nové prihlásenie s prístupom k vášmu účtu: %1$s
         Overte všetky vaše relácie, aby ste si boli istý, že sú vaše správy a účet bezpečné
    @@ -2115,7 +2115,7 @@
         Krížové podpisovanie nie je povolené
         Vaša nová relácia je teraz overená. Má prístup k vašim šifrovaným správam a ostatní používatelia ju uvidia ako dôveryhodnú.
         Porovnajte kód s kódom zobrazeným na obrazovke druhého používateľa.
    -    Porovnajte jedinečné emoji a uistite sa, že sú zobrazené v rovnakom poradí.
    +    Porovnajte jedinečné emotikony a uistite sa, že sú zobrazené v rovnakom poradí.
         Aby ste si boli istý, urobte to osobne alebo použite iný dôveryhodný spôsob komunikácie.
         Ak chcete byť v bezpečí, overte %s pomocou jednorazového kódu.
         Po zapnutí šifrovania pre miestnosť ho už nemožno vypnúť. Správy odoslané v zašifrovanej miestnosti nemôže vidieť server, iba účastníci miestnosti. Zapnutie šifrovania môže zabrániť správnemu fungovaniu mnohých botov a premostení.
    @@ -2324,8 +2324,8 @@
         Kto má prístup\?
         Zmeny týkajúce sa toho, kto môže čítať históriu, sa budú vzťahovať len na budúce správy v tejto miestnosti. Viditeľnosť existujúcej histórie zostane nezmenená.
         Tento server neposkytuje žiadne zásady a pravidlá.
    -    Pridať tlačidlo do editora správ na otvorenie klávesnice emodži
    -    Zobraziť klávesnicu emodži
    +    Pridať tlačidlo do editora správ na otvorenie klávesnice emotikonov
    +    Zobraziť klávesnicu emotikonov
         Použite príkaz /confetti alebo pošlite správu obsahujúcu ❄️ alebo 🎉
         Zobraziť efekty konverzácie
         Relácia bola odhlásená!
    @@ -2437,4 +2437,6 @@
         
         %1$s, %2$s a ďalší
         %1$s a %2$s
    +    Pokračovať pomocou jednotného prihlásenia SSO
    +    jednotné prihlásenie SSO
     
    \ No newline at end of file
    
    From a251545e904cf0f0e3e43ba727e3c77f5adb8799 Mon Sep 17 00:00:00 2001
    From: Besnik Bleta 
    Date: Wed, 2 Mar 2022 09:39:16 +0000
    Subject: [PATCH 020/152] Translated using Weblate (Albanian)
    
    Currently translated at 99.4% (2145 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/sq/
    ---
     vector/src/main/res/values-sq/strings.xml | 57 ++++++-----------------
     1 file changed, 15 insertions(+), 42 deletions(-)
    
    diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
    index c363b8e4e9..48fc274eb7 100644
    --- a/vector/src/main/res/values-sq/strings.xml
    +++ b/vector/src/main/res/values-sq/strings.xml
    @@ -39,7 +39,6 @@
         %1$s hoqi emrin e tij në ekran (%2$s)
         %1$s hoqi temën e dhomës
         %1$s dërgoi një ftesë për %2$s që të marrë pjesë në dhomë
    -
         %s e përmirësoi këtë dhomë.
         Njëkohësimi fillestar:
     \nPo importohet llogaria…
    @@ -315,10 +314,6 @@
         Hidheni tej
         Anëtarë liste
         Hidhu te të palexuarit
    -
    -
    -
    -
         Dilni nga dhoma
         Jeni i sigurt se doni të dilni nga dhoma?
         FJALOSJE TË DREJTPËRDREJTA
    @@ -501,8 +496,6 @@
         Kreu
         Dhoma
         I ftuar
    -
    -
         Jeni përzënë prej %1$s nga %2$s
         Jeni dëbuar prej %1$s nga %2$s
         Arsye: %1$s
    @@ -520,7 +513,6 @@
         %1$s: %2$s
         %d+
         Po përgjohet për akte
    -
         Të parapëlqyer
         Ju lutemi, përshkruajeni të metën. Ç’po bënit? Ç’prisnit të ndodhte? Ç’ndodhi në fakt?
         Duket se po përplasni telefonin nga inati. Do të donit të hapej skena për njoftim të metash?
    @@ -528,17 +520,12 @@
         Dështoi dërgimi i njoftimit të të metës (%s)
         Dilni
         Dërgoni mesazh zanor
    -
         Verifikimi i adresës email dështoi: sigurohuni se keni klikuar lidhjen te email-i
    -
         Ju lutemi, niseni ${app_name}-in në një tjetër pajisje që mund të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te ky sesion.
    -
         %1$s & %2$s & të tjerë po shtypin…
         version olm
         Fikso dhomat me njoftime të humbura
         Vetëm anëtarët (që nga çasti i përzgjedhjes së kësaj mundësie)
    -
    -
         Përdor kamerë të brendshme
         Shtuat një sesion të ri \'%s\', i cili po kërkon kyçe fshehtëzimi.
         Sesioni juaj i paverifikuar \'%s\' po kërkon kyçe fshehtëzimi.
    @@ -551,7 +538,6 @@
         Ju lutemi, %s për ta zmadhuar këtë kufi.
         Ju lutemi, %s që të vazhdoni përdorimin e këtij shërbimi.
         ose
    -
         Në qoftë e mundur, ju lutemi, përshkrimin shkruajeni në anglisht.
         Hëpërhë, s’keni të aktivizuar ndonjë pako ngjitësash.
     \n
    @@ -565,16 +551,11 @@
         
         Po bëhet lidhja e thirrjes…
         Ana e largët dështoi të përgjigjet.
    -
    -
         Për të kryer thirrje audio, ${app_name}-i lyp leje të përdorë mikrofonin tuaj.
    -
         Për të kryer thirrje video, ${app_name}-i lyp leje të përdorë kamerën dhe mikrofonin tuaj.
     \n
     \nJu lutemi, lejoni përdorimin, që nga flluskat pasuese, që të jetë në gjendje të bëjë thirrjen.
    -
         JO
    -
         
             %d anëtar
             %d anëtarë
    @@ -585,14 +566,9 @@
             %d mesazh i ri
             %d mesazhe të rinj
         
    -
    -
    -
    -
         Ju lutemi, kontrolloni email-in tuaj dhe klikoni mbi lidhjen që përmban. Pasi të jetë bërë kjo, klikoni që të vazhdohet.
         Këto janë veçori eksperimentale që mund të ngecin në rrugë të papritura. Përdorini me kujdes.
         Ju lutemi, krijoni një frazëkalim për fshehtëzimin e kyçeve të eksportuar. Që të jeni në gjendje t’i importoni kyçet, do t’ju duhet të jepni të njëjtin frazëkalim.
    -
         Mos dërgo kurrë prej këtij sesioni mesazhe të fshehtëzuar te sesione të paverifikuar.
         Ripohojeni duke krahasuar sa vijon me Rregullimet e Përdoruesit te sesioni juaj tjetër:
         Nëse s’përputhen, siguria e komunikimeve tuaja mund të jetë komprometuar.
    @@ -639,7 +615,6 @@
             %d mesazh i njoftuar i palexuar
             %d mesazhe të njoftuar të palexuar
         
    -
         Dërgoni një ngjitës
         Dërgoni një ngjitës
         Thirrje
    @@ -700,7 +675,6 @@
         ${app_name}-i nuk preket nga Optimizime Baterie.
         Nëse një përdorues e lë një pajisje jo në prizë dhe të palëvizshme për një periudhë, me ekranin të fikur, pajisja kalon nën mënyrën Dremitje. Kjo u parandalon aplikimeve të hyjnë në rrjet dhe shtyn për më vonë punët e tyre, njëkohësimet dhe alarmet standarde.
         Shpërfille Optimizimin
    -
         S’u gjet APK për Google Play Services. Njoftimet mund të mos punojnë saktë.
         Thirrje Video Në Kryerje e Sipër…
         Kopjeruajtje Kyçesh
    @@ -737,7 +711,6 @@
         U bë
         Ruani Kyç Rimarrjesh
         Ruaje si Skedë
    -
         Ju lutemi, bëni një kopje
         Jepjani kyçin e rimarrjeve…
         Po prodhohet Kyç Rimarrjesh duke përdorur frazëkalim, ky proces mund të hajë disa sekonda.
    @@ -831,8 +804,6 @@
         Po shkarkohen kyçe…
         Po importohen kyçe…
         Që të përdorni Kopjeruajtje Kyçesh në këtë sesion, rikthejeni tani përmes frazëkalimit tuaj ose kyçi rimarrjesh.
    -
    -
         Media
         Ngjeshje parazgjedhje
         Zgjidhni
    @@ -869,8 +840,6 @@
         Shpërfille
         U verifikua!
         E mora vesh
    -
    -
         Kërkesë Verifikimi
         %s dëshiron të verifikojë sesionin tuaj
         Gabim i Panjohur
    @@ -965,7 +934,6 @@
         Asnjë
         Shfuqizoje
         Shkëputu
    -
         S’kapet dot shërbyes Home te kjo URL, ju lutemi, kontrollojeni
         Mënyrë Njëkohësimi Në Prapaskenë
         E optimizuar për baterinë
    @@ -976,7 +944,6 @@
     \nKjo do të ketë ndikim mbi përdorimin e baterisë dhe të transmetimit, do të shfaqet një njoftim i pandërprerë që pohon se ${app_name}-i po përgjon për akte.
         Pa njëkohësim në prapraskenë
         S’do të njoftoheni për mesazhe ardhës, kur aplikacioni gjendet në prapaskenë.
    -
         Administroni rregullimet tuaja për zbulime.
         S’po përdorni ndonjë shërbyes identitetesh
         Duket se po rrekeni të lidheni me një tjetër shërbyes Home. Doni të bëhet dalja\?
    @@ -1045,7 +1012,6 @@
         Kjo lëndë është raportuar si e papërshtatshme. 
     \n 
     \nNëse s’doni të shihni më lëndë nga ky përdorues, mund ta shpërfillni, që të fshihen mesazhet e tij.
    -
         Integrime
         Përdorni një përgjegjës integrimesh që të administroni robotë, ura, widget-e dhe paketa ngjitësish.
     \nPërgjegjësit e integrimeve marrin të dhëna formësimi dhe mund të ndryshojnë widget-e, të dërgojnë ftesa për në dhoma dhe të caktojnë shkallë pushteti në emrin tuaj.
    @@ -1324,7 +1290,6 @@
         %s u pranua
         Skanojeni kodin me pajisjen e përdoruesit tjetër, për të verifikuar në mënyrë të sigurt njëri-tjetrin
         Nëse s’jeni vetë atje, krahasoni emoji-n
    -
         ${app_name} nuk trajton akte të llojit \'%1$s\'
         ${app_name} ndeshi një problem kur vizatohej lëndë e aktit me ID \'%1$s\'
         Ky sesion s’është në gjendje të ndajë këtë verifikim me sesionet tuaj të tjerë.
    @@ -1407,7 +1372,6 @@
         Shtypeni dhe ruajeni diku në një vend të parrezik
         Ruajeni në një diskth USB ose pajisje kopjeruajtjesh
         Kopjojeni te depozita juaj personale në re
    -
         Fshehtëzimi u aktivizua
         Mesazhet në këtë dhomë janë të fshehtëzuara skaj-më-skaj. Mësoni më tepër & verifikoni përdorues te profilet e tyre.
         Fshehtëzim jo i aktivizuar
    @@ -1811,7 +1775,6 @@
         Fshihi të mëtejshmet
         Shfaq të mëtejshme
         %1$d nga %2$d
    -
         Jepe pranimin
         Shfuqizoje pranimin tim
         Keni dhënë pranimin tuaj për të dërguar email-e dhe numra telefonash te ky shërbyes identitetesh që të zbulojë përdorues të tjerë prej kontakteve tuaj.
    @@ -1863,8 +1826,6 @@
         Shpërngule
         Lidhe
         Konsultohu së pari
    -
    -
         Thirrje aktive (%1$s)
         Pati një gabim gjatë kërkimit të numrit të telefonit
         Pjesa e numrave
    @@ -2028,7 +1989,7 @@
         Unë dhe anëtarët e ekipit tim
         Një hapësirë private për të sistemuar dhomat tuaja
         Unë vetëm
    -    Siguroni që personat e duhur të kenë hyrje te %s. Këtë mund të ndryshoni më vonë.
    +    Siguroni që personat e duhur të kenë hyrje te %s.
         Me cilët po punoni\?
         Që të hyni në një hapësirë ekzistuese, ju duhet një ftesë.
         Këtë mund ta ndryshoni më vonë
    @@ -2102,7 +2063,6 @@
         Jepni emrin e e një shërbyesi të ri që doni të eksploroni.
         Shtoni shërbyes të ri
         Shërbyesi juaj
    -
         Na ndjeni, ndodhi një gabim teksa provohej të hyhej: %s
         Adresë hapësire
         Adresa hapësire
    @@ -2302,7 +2262,6 @@
         Krijoni Pyetësor
         A pranoni të dërgohen këto hollësi\?
         Për të zbuluar kontakte ekzistuese, duhet të dërgoni hollësi kontakti (email-e dhe numra telefonash) te shërbyesi juaj i identiteteve. Para dërgimit, i fshehtëzojmë të dhënat tuaja, për privatësi.
    -
         Dërgo email-e dhe numra telefonash te %s
         Kontaktet tuaja janë private. Për të zbuluar përdorues prej kontakteve tuaja, na duhet leja juaj për të dërguar hollësi kontakti te shërbyesi juaj i identiteteve.
         Është bërë dalja nga sesioni!
    @@ -2435,4 +2394,18 @@
         Kopjoje lidhjen te rrjedha
         Shiheni në dhomë
         Shihni Rrjedha
    +    %1$s dhe %2$s
    +    %1$s, %2$s dhe të tjerë
    +    
    +        %1$d më tepër
    +        %1$d më tepër
    +    
    +    Njofto krejt dhomën
    +    Përdorues
    +    
    +        %d ndryshim ACL-sh shërbyesi
    +        %d ndryshimë ACL-sh shërbyesi
    +    
    +    Njoftim dhome
    +    Shfaq më pak
     
    \ No newline at end of file
    
    From 0b6af0f2b290fee831ccf23316476b532b98de17 Mon Sep 17 00:00:00 2001
    From: Jeff Huang 
    Date: Tue, 1 Mar 2022 02:27:26 +0000
    Subject: [PATCH 021/152] Translated using Weblate (Chinese (Traditional))
    
    Currently translated at 100.0% (2157 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/
    ---
     vector/src/main/res/values-zh-rTW/strings.xml | 43 +------------------
     1 file changed, 2 insertions(+), 41 deletions(-)
    
    diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml
    index 060b739305..564a4ccf8a 100644
    --- a/vector/src/main/res/values-zh-rTW/strings.xml
    +++ b/vector/src/main/res/values-zh-rTW/strings.xml
    @@ -39,7 +39,6 @@
         聊天室邀請
         %1$s 和 %2$s
         空聊天室
    -
         初始化同步:
     \n正在匯入帳號……
         初始化同步:
    @@ -243,7 +242,6 @@
         刪除
         重新命名
         回報內容
    -
         
         邀請
         登出
    @@ -266,7 +264,6 @@
         僅 Matrix 聯絡人
         沒有結果
         聊天室
    -
         社群
         傳送記錄
         傳送當機紀錄
    @@ -300,11 +297,9 @@
         這看起不像是有效的電子郵件地址
         此電子郵件位址已經被定義。
         忘記密碼?
    -
         這個家伺服器想要確定您不是機器人
         必須輸入和您帳號關聯的電子郵件地址。
         電子郵件地址驗證失敗: 請確保您已點擊郵件中的連結
    -
         請輸入有效的網址
         異常的 JSON
         沒有包含有效的 JSON
    @@ -321,14 +316,10 @@
         通話進行中……
         遠端未能接聽。
         資訊
    -
    -
         ${app_name} 需要權限來存取麥克風,來撥打語音通話。
    -
         ${app_name} 需要權限來存取相機及麥克風來撥打視訊通話。
     \n
     \n為了可以正常使用通話功能,請在下個彈跳視窗中允許存取。
    -
         
         
         繼續
    @@ -337,8 +328,6 @@
         拒絕
         列出成員
         跳到未讀
    -
    -
         
             %d 個成員
         
    @@ -385,12 +374,9 @@
         請在另一個可以解密訊息的裝置上啟動 ${app_name},以便它將金鑰發送到此工作階段。
         憑證已從以前受信任的更改為不受信任的憑證。伺服器可能已續訂其憑證。請與伺服器管理員聯繫以尋找所需的指紋。
         僅當伺服器管理員發佈的指紋與上面的指紋匹配時才接受此憑證。
    -
         搜尋
         過濾聊天室成員
         沒有結果
    -
    -
         所有訊息
         新增到主畫面
         個人檔案圖片
    @@ -449,7 +435,6 @@
         更新公開名稱
         上次上線
         %1$s @ %2$s
    -
         授權
         登入爲
         家伺服器
    @@ -488,7 +473,6 @@
         這些是可能以非預期的方式壞掉的實驗性功能。請小心服用。
         設定為主要地址
         取消設定為主要地址
    -
         主題
         解密錯誤
         公開名稱
    @@ -500,7 +484,6 @@
         匯出
         輸入通關密語
         確認通關密語
    -
         匯入聊天室端到端加密密鑰
         匯入聊天室金鑰
         從本機檔案匯入金鑰
    @@ -512,7 +495,6 @@
         驗證
         透過將以下內容與您的其他工作階段中的使用者設定來確認:
         如果不符合的話,您的通訊安全可能正受到威脅。
    -
         選擇一個聊天室目錄
         伺服器名稱
         在 %s 伺服器上的所有聊天室
    @@ -520,7 +502,6 @@
         
             %d 條未讀的已通知訊息
         
    -
         
             %d 個聊天室
         
    @@ -594,15 +575,9 @@
         對話在此繼續
         這個聊天示是其他對話的延續
         點選這裡以檢視更舊的訊息
    -
    -
    -
    -
         
             %d 已選取
         
    -
    -
         系統警告
         聯絡您的服務管理員
         此家伺服器已經超過其中一項資源限制,所以有一些使用者將會無法登入
    @@ -694,7 +669,6 @@
         ${app_name} 不會被電池最佳化影響。
         如果使用者不為裝置充電,並讓其靜置一段時間,且將螢幕關閉,裝置將會進入 Doze 模式。這可能會導致應用程式無法存取網路,並延遲它們的工作、同步與標準警報。
         忽略最佳化
    -
         找不到有效的 Google Play 服務 APK。通知可能無法正常運作。
         視訊通話進行中……
         金鑰備份
    @@ -731,7 +705,6 @@
         完成
         儲存復原金鑰
         儲存為檔案
    -
         請複製
         分享復原金鑰與……
         正在使用通關密語生成復原金鑰,這個過程可能需要數秒鐘。
    @@ -814,7 +787,6 @@
         演算法
         簽章
         要在此工作階段上使用金鑰備份,現在就使用您的通關密語或復原金鑰復原。
    -
         正在計算復原金鑰……
         正在下載金鑰……
         正在匯出金鑰……
    @@ -823,7 +795,6 @@
         使用 Enter 傳送訊息
         軟體鍵盤的 Enter 按鈕將會傳送訊息而非換行
         密碼無效
    -
         媒體
         預設壓縮
         選擇
    @@ -858,8 +829,6 @@
         忽略
         已驗證!
         知道了
    -
    -
         驗證請求
         %s 想要驗證您的工作階段
         未知錯誤
    @@ -956,7 +925,6 @@
         
         撤銷
         斷線
    -
         無法在此 URL 找到家伺服器,請檢查
         背景同步模式
         為電池最佳化
    @@ -967,7 +935,6 @@
     \n這會影響到網路與電池的使用,並會顯示指出 ${app_name} 正在監聽某事件的永久通知。
         無背景同步
         當應用程式在背景時,您將不會收到訊息通知。
    -
         探索
         管理您的探索設定。
         您未使用任何身份識別伺服器
    @@ -1036,7 +1003,6 @@
         此內容已被回報為不合適。 
     \n 
     \n如果您不想要看到從此使用者而來的更多內容,您可以忽略他們以隱藏他們的訊息。
    -
         整合
         使用整合管理員以管理機器人、橋接、小工具與貼紙包。
     \n整合管理員可以代表您接收設定資料,調整小工具、傳送聊天室邀請並設定權力等級。
    @@ -1251,7 +1217,6 @@
         驗證 %s
         已驗證 %s
         正在等待驗證 %s……
    -
         此聊天室中的訊息未端到端加密。
         此聊天室中的訊息有端到端加密。
     \n
    @@ -1394,7 +1359,6 @@
         列印並將其存放在安全的地方
         將其儲存在 USB 隨身碟或備份磁碟上
         將其複製到您的私人雲端儲存空間
    -
         加密已啟用
         在此聊天室中的訊息已端到端加密。取得更多資訊並在使用者的個人檔案中驗證他們。
         加密未啟用
    @@ -1789,7 +1753,6 @@
         隱藏進階
         顯示進階
         %2$d 中的 %1$d
    -
         給予同意
         撤銷我的同意
         您已同意傳送電子郵件與電話號碼到此身份提供者以從您的聯絡人中探索其他使用者。
    @@ -1880,8 +1843,6 @@
         轉移
         連線
         先諮詢
    -
    -
         通話中 (%1$s)
         查詢電話號碼時發生錯誤
         撥號鍵盤
    @@ -2075,7 +2036,6 @@
         輸入您想要探索的新伺服器名稱。
         加入新的伺服器
         您的伺服器
    -
         抱歉,試圖加入時發生錯誤:%s
         空間地址
         檢視與管理此空間的地址。
    @@ -2272,7 +2232,6 @@
         投票問題或主題
         建立投票
         投票
    -
         向 %s 傳送電子郵件與電話號碼
         您的通訊錄是私人的。要從您的通訊錄中探索使用者,我們需要您的權限來傳送聯絡人資訊到您的身份識別伺服器。
         已登出工作階段!
    @@ -2411,4 +2370,6 @@
         
             %d 伺服器 ACL 變更
         
    +    %1$s 與 %2$s
    +    %1$s、%2$s 與其他人
     
    \ No newline at end of file
    
    From cc7545b31fe1900f44b5d33cb4e6246afce3ee62 Mon Sep 17 00:00:00 2001
    From: libexus 
    Date: Tue, 1 Mar 2022 15:36:02 +0000
    Subject: [PATCH 022/152] Translated using Weblate (German)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/de/
    ---
     fastlane/metadata/android/de-DE/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/de-DE/changelogs/40104020.txt | 2 ++
     2 files changed, 4 insertions(+)
     create mode 100644 fastlane/metadata/android/de-DE/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/de-DE/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/de-DE/changelogs/40104000.txt b/fastlane/metadata/android/de-DE/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..37de3cb4a2
    --- /dev/null
    +++ b/fastlane/metadata/android/de-DE/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Neues: Erstelle Threads, damit dein Chatverlauf nicht zugespammt wird. Nachrichtenblasen.
    +Ganze Änderungsliste: https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/de-DE/changelogs/40104020.txt b/fastlane/metadata/android/de-DE/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..6693401a24
    --- /dev/null
    +++ b/fastlane/metadata/android/de-DE/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Neues: Unterstützung für @room, Verbesserungen der Abstimmungen und weitere kleine Änderungen
    +Ganzer Changelog: https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From ee8e369294d84460cf59fb1787d20882d78936dc Mon Sep 17 00:00:00 2001
    From: Glandos 
    Date: Mon, 28 Feb 2022 19:52:43 +0000
    Subject: [PATCH 023/152] Translated using Weblate (French)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/
    ---
     fastlane/metadata/android/fr-FR/changelogs/40103170.txt | 2 ++
     fastlane/metadata/android/fr-FR/changelogs/40103180.txt | 2 ++
     fastlane/metadata/android/fr-FR/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/fr-FR/changelogs/40104020.txt | 2 ++
     4 files changed, 8 insertions(+)
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40103170.txt
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40103180.txt
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103170.txt b/fastlane/metadata/android/fr-FR/changelogs/40103170.txt
    new file mode 100644
    index 0000000000..c264ea3703
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40103170.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : envoyer votre position dans n'importe quel salon. Éditer un sondage.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.17
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103180.txt b/fastlane/metadata/android/fr-FR/changelogs/40103180.txt
    new file mode 100644
    index 0000000000..0b8a9542a5
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40103180.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : envoyer votre position dans n'importe quel salon. Éditer un sondage.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.18
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40104000.txt b/fastlane/metadata/android/fr-FR/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..eaced9e3f4
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : Implémentation initial des fils de discussion. Bulles de messages.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40104020.txt b/fastlane/metadata/android/fr-FR/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..068b4aac43
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : Ajout du support pour @room et des sondages non terminé parmi plein d'autres changements mineurs.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From 6e805beeedc41f9a0fdf7c94d21ae4009955f134 Mon Sep 17 00:00:00 2001
    From: SPiRiT 
    Date: Wed, 2 Mar 2022 21:02:50 +0000
    Subject: [PATCH 024/152] Translated using Weblate (Hebrew)
    
    Currently translated at 81.2% (1753 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 95 +++++++----------------
     1 file changed, 30 insertions(+), 65 deletions(-)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 1fea4fb060..bc0ab0ff34 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -82,7 +82,6 @@
         ערכת נושא שחורה
         ערכת נושא כהה
         ערכת נושא בהירה
    -
         חדרים
         אנשי קשר מטריקס בלבד
         שיחות
    @@ -125,11 +124,9 @@
         זו אינה כתובת שרת מטריקס חוקית
         אנא הכנס כתובת תקינה
         אנא עיין וקבל את המדיניות של שרת בית זה:
    -
         אימות כתובת הדוא\"ל נכשל: ודא שלחצת על הקישור בדוא\"ל
         יש להזין את כתובת הדוא\"ל המקושרת לחשבונך.
         שרת הבית רוצה לוודא שאתה לא רובוט
    -
         שכחת סיסמה\?
         מספר הטלפון הזה כבר קיים ומעודכן במערכת.
         כתובת הדוא\"ל הזו כבר קיימת ומוגדרת במערכת.
    @@ -162,7 +159,6 @@
         שיחת האלמנט נכשלה
         האם אתה בטוח שברצונך להתחיל שיחת וידאו\?
         האם אתה בטוח שברצונך להתחיל שיחה קולית\?
    -
         עבור להודעה שלא נקראה
         חברי רשימה
         דחייה
    @@ -173,14 +169,10 @@
         כן
         אפשר הרשאה לגשת לאנשי הקשר שלך.
         כדי לסרוק קוד QR, עליך לאפשר גישה למצלמה.
    -
         אלמנט זקוק להרשאה כדי לגשת למצלמה ולמיקרופון שלך כדי לבצע שיחות וידאו.
     \n
     \nאנא אפשר גישה בחלונות הקופצים הבאים כדי להיות מסוגל לבצע את השיחה.
    -
         אלמנט זקוק להרשאה כדי לגשת למיקרופון שלך כדי לבצע שיחות שמע.
    -
    -
         מידע
         הצד המרוחק לא הצליח להרים.
         שיחת וידאו מתבצעת …
    @@ -235,7 +227,6 @@
             %d שניות
         
         עיכוב בין כל סינכרון
    -
         פסק-זמן לבקשה לסנכרון
         החל באתחול
         לא תקבל הודעה על הודעות נכנסות כאשר האפליקציה ברקע.
    @@ -310,7 +301,6 @@
         סנן משתמשים מודרים
         סנן חברים מהחדר
         חפש
    -
         
             %d נבחר
             %d נבחרים
    @@ -410,20 +400,14 @@
         תמונת פרופיל
         הוסף למסך הבית
         כל ההודעות
    -
         האם ברצונך לעזוב את החדר\?
         עזוב חדר
    -
    -
    -
    -
         
             %d חבר
             %d חברים
             %d חברים
             %d חברים
         
    -
         התחל אימות
         מושב לא מאומת מבקש מפתחות הצפנה.
     \nשם מושב: %1$s
    @@ -523,7 +507,6 @@
             %d חדרים מועטים
             %d חדרים אחרים
         
    -
         
             הודעת התראה %d שלא נקראה
             %d הודעות התראה שלא נקראו
    @@ -534,7 +517,6 @@
         כל החדרים בשרת %s
         כתובת אתר של שרת בית
         בחר מדריך חדרים
    -
         אם הם לא תואמים, אבטחת התקשורת שלך עלולה להיפגע.
         אשרו על ידי השוואה בין הדברים הבאים להגדרות המשתמש בפגישה האחרת שלכם:
         אמת
    @@ -556,7 +538,6 @@
         נהל גיבוי מפתח
         שחזור הודעות מוצפנות
         מפתחות יוצאו בהצלחה
    -
         אנא צור משפט סיסמה להצפנת המפתחות המיוצאים. יהיה עליך להזין את אותו ביטוי סיסמה כדי שתוכל לייבא את המפתחות.
         יצא
         יצא מפתחות לקובץ מקומי
    @@ -567,7 +548,6 @@
         שם ציבורי
         שגיאת פענוח
         ערכת נושא
    -
         ביטול ההגדרה ככתובת הראשית
         הגדר ככתובת ראשית
         אלה תכונות ניסיוניות שעשויות להישבר בדרכים לא צפויות. השתמש בזהירות.
    @@ -690,8 +670,6 @@
         סיבה: %1$s
         חסום על ידי %2$s מ- %1$s
         אתה נבעט מ- %1$s על ידי %2$s
    -
    -
         הוזמנו
         חדרים
         בית
    @@ -748,7 +726,6 @@
         לעולם אל תאבד הודעות מוצפנות
         להגן מפני אובדן גישה להודעות ונתונים מוצפנים
         גיבוי מאובטח
    -
         מחק גיבוי למחוק את מפתחות ההצפנה המגובים שלך מהשרת\? לא תוכל עוד להשתמש במפתח השחזור שלך כדי לקרוא את היסטוריית ההודעות המוצפנת.
         מחק את הגיבוי
         בודק מצב גיבוי
    @@ -794,7 +771,6 @@
         נראה שכבר יש לך גיבוי מפתח הגדרה מהפעלה אחרת. האם אתה רוצה להחליף אותו לזה שאתה יוצר\?
         גיבוי כבר קיים בשרת הבית שלך
         מפתח השחזור נשמר.
    -
         שמירת קובץ בשם
         שיתוף
         שמור מפתח שחזור
    @@ -998,7 +974,6 @@
         כל ההודעות
         כל ההודעות (רועשות)
         התעלם ממשתמש זה
    -
         תוכן זה דווח כבלתי הולם.
     \n
     \nאם אינך רוצה לראות תוכן נוסף ממשתמש זה, תוכל להתעלם ממנו כדי להסתיר את ההודעות שלו.
    @@ -1058,7 +1033,6 @@
         אנא הזן את כתובת ה- URL של שרת הזהות
         לא ניתן היה להתחבר לשרת זהות
         הזן כתובת אתר של שרת זהות
    -
         תן הסכמה
         בטל את הסכמתי
         נתת את הסכמתך לשלוח מיילים ומספרי טלפון לשרת זהות זה כדי לגלות משתמשים אחרים מאנשי הקשר שלך.
    @@ -1157,7 +1131,6 @@
     \nההודעות שלך מאובטחות במנעולים ורק לך ולמקבל יש את המפתחות הייחודיים לפתיחתם.
         ההודעות כאן אינן מוצפנות מקצה לקצה.
         הודעות בחדר זה אינן מוצפנות מקצה לקצה.
    -
         ממתין ל- %s…
         %s מאומת
         אמת. את %s
    @@ -1219,11 +1192,8 @@
         שגיאה לא ידועה
         %s רוצה לאמת את ההפעלה שלך
         בקשת אימות
    -
    -
         הבנתי
         מאומת!
    -
         חתימה
         אלגוריתם
         גירסה
    @@ -1253,7 +1223,6 @@
         הצג תוכן בהתראות
         קוד PIN הוא הדרך היחידה לפתוח את Element.
         אפשר ביומטריה ספציפית למכשירים, כמו טביעות אצבע וזיהוי פנים.
    -
         גיבוי מאובטח
         הוסף לחצן במלחין ההודעות כדי לפתוח מקלדת אימוג\'י
         הצג מקלדת אימוג\'י
    @@ -1284,11 +1253,9 @@
         צפה ועדכן את התפקידים הנדרשים לשינוי חלקים שונים בחדר.
         הרשאות חדרים
         חדר זה אינו ציבורי. לא תוכל להצטרף שוב ללא הזמנה.
    -
         (%%%s)התקדמות
         אנשים
         מועדפים
    -
         ברירת מחדל מערכת
         קפצו לקבלת קריאה
         הודעה ישירה
    @@ -1370,7 +1337,6 @@
         שרת ביתי
         מחובר כ
         הזדהות
    -
         נראה לאחרונה
         עדכן שם ציבורי
         שם ציבורי
    @@ -1378,7 +1344,6 @@
         אלמנט אוסף ניתוח אנונימי כדי לאפשר לנו לשפר את היישום.
         שלח נתוני ניתוח
         ניתוח נתונים
    -
         נהל את הגדרות הגילוי שלך.
         תַגלִית
         הפוך את המשתמש שלי ללא פעיל
    @@ -1568,7 +1533,6 @@
         אם תבטל עכשיו, אתה עלול לאבד הודעות ונתונים מוצפנים אם תאבד את הגישה לכניסות שלך.
     \n
     \nאתה יכול גם להגדיר גיבוי מאובטח ולנהל את המפתחות שלך בהגדרות.
    -
         העתק אותו לאחסון הענן האישי שלך
         שמור אותו במפתח USB או בכונן גיבוי
         הדפיסו ואחסנו במקום בטוח
    @@ -1731,55 +1695,55 @@
         סיימת את השיחה.
         %s סיים את השיחה.
         ענית לשיחה.
    -    %s שנה לשיחה.
    +    %s ענה לשיחה.
         שלחת מידע לביצוע שיחה.
         %s שלח מידע לביצוע שיחה.
         ביצעת שיחת אודיו.
    -    %s ביצע שיחת אודיו.
    +    %s ביצע/ה שיחה קולית.
         ביצעת שיחת וידאו.
    -    %s ביצע שיחת וידאו .
    +    %s ביצע/ה שיחת וידאו.
         שינית את שם החדר ל: %1$s
         %1$s שינה את שם החדר ל: %2$s
    -    שינית את דמות החדר
    -    %1$s שינה את דמות החדר
    -    שינית את השם ל: %1$s
    +    שינית את תמונת החדר
    +    %1$s שינה את תמונת החדר
    +    שינית את הנושא ל: %1$s
         %1$s שינה את הנושא ל: %2$s
    -    ביטלתם את שם התצוגה שלכם (שם קודם %1$s)
    +    הסרת את שם התצוגה שלך (הוא היה %1$s)
         %1$sהורידו את שם התצוגה שלהם (היה קודם %2$s)
         שינית את שמך מ %1$s ל %2$s
         %1$s שינו את שמותיהם מ %2$s ל %3$s
         שינית את שמך ל %1$s
         %1$s שינה את שמו ל %2$s
    -    שינית את דמותך באפליקציה
    -    %1$s שינה את דמותו
    +    שינית תמונת פרופיל
    +    %1$s שינה תמונת פרופיל
         משכת את הזמנתו של %1$s\'s
    -    %1$s משך את הזמנתו של %2$s\'s
    +    %1$s ביטל/ה את ההזמנה של %2$s\'s
         חסמת את %1$s
    -    %1$s חסם את%2$s
    -    חסמת את %1$s
    -    %1$s הסיר מחסימה את %2$s
    +    %1$s חסם/ה את %2$s
    +    הסרת את החסימה של %1$s
    +    %1$s הסיר/ה מחסימה את %2$s
         הרחקת את %1$s
    -    %1$s הרחיק את%2$s
    +    %1$s הרחיק/ה את %2$s
         דחית את ההזמנה
         %1$s דחה את ההזמנה
         עזבת את החדר
    -    %1$s עזב את החדר
    +    %1$s עזב/ה את החדר
         עזבת את החדר
    -    %1$s עזב את החדר
    +    %1$s עזב/ה את החדר
         הצטרפת
    -    %1$s הצטרף
    +    %1$s הצטרף/ה
         הצטרפת לחדר
    -    %1$s הצטרף לחדר
    -    %1$s הזמין אותך
    +    %1$s הצטרף/ה לחדר
    +    %1$s הזמין/ה אותך
         הזמנת את %1$s
    -    %1$s הזמין %2$s
    +    %1$s הזמין/ה את %2$s
         יצרת את הדיון
    -    %1$s יצר את הדיון
    +    %1$s יצר/ה את הדיון
         יצרת את החדר
    -    %1$s יצר את החדר
    +    %1$s יצר/ה את החדר
         הזמנתך
    -    %s הזמנה
    -    כל חברי החדר, מהנקודה בה הם הוזמנו.
    +    ההזמנה של %s
    +    כל חברי החדר, מהרגע שבו הוזמנו.
         את/ה הפכת הודעות עתידיות לגלויות בפני %1$s
         %1$s הפך הודעות עתידיות לגלויות בפני %2$s
         חסמת את %1$s. סיבה: %2$s
    @@ -1830,7 +1794,6 @@
     \nממתין לתגובת השרת…
         חדר ריק (היה %s)
         חדר ריק
    -
         
             %1$s, %2$s, %3$s ו-%4$d אחר
             %1$s, %2$s, %3$s ו-%4$d אחרים
    @@ -1894,10 +1857,10 @@
         שדרגת כאן.
         %s שודרג כאן.
         שדרגת את החדר הזה.
    -    %s שדרג את החדר הזה.
    +    %s שידרג/ה חדר זה.
         כל אחד.
         כל חברי החדר.
    -    כל חברי החדר, מהנקודה בה הצטרפו.
    +    כל חברי החדר, מהרגע שבו הצטרפו.
         מפה
         שתף מיקום
         מיקום
    @@ -1924,8 +1887,8 @@
         מיפוי מיקומי משתמשים בציר הזמן
         לאחר ההפעלה, תוכל לשלוח את המיקום שלך לכל חדר
         אפשר שיתוף מיקום
    -    לפתוח בעזרת
    -    ${app_name} לא הצליח לגשת למיקום שלך. בבקשה נסה שוב מאוחר יותר.
    +    פתח באמצעות
    +    ${app_name} לא הצליח לגשת למיקום שלך. אנא נסה שוב מאוחר יותר.
         ${app_name} לא הצליח לגשת למיקום שלך
         שתף מיקום
         אפשר התראת דוא\"ל עבור %s
    @@ -2096,4 +2059,6 @@
         %1$s משך את ההזמנה של %2$s. סיבה: %3$s
         קיבלת את ההזמנה עבור %1$s. סיבה: %2$s
         %1$s קיבל את ההזמנה עבור %2$s. סיבה: %3$s
    +    שיתפו את מיקומם
    +    מיקום
     
    \ No newline at end of file
    
    From ed7d1927f5466f61d231cccc5a0dc87a357ebf4a Mon Sep 17 00:00:00 2001
    From: sagi korin 
    Date: Wed, 2 Mar 2022 15:41:11 +0000
    Subject: [PATCH 025/152] Translated using Weblate (Hebrew)
    
    Currently translated at 81.2% (1753 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 6 ++++++
     1 file changed, 6 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index bc0ab0ff34..57a8cf6630 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2061,4 +2061,10 @@
         %1$s קיבל את ההזמנה עבור %2$s. סיבה: %3$s
         שיתפו את מיקומם
         מיקום
    +    משתמשים
    +    הצג פחות
    +    דלג על השאלה
    +    יש לי כבר חשבון
    +    צור חשבון
    +    תקשורת מאובטחת.
     
    \ No newline at end of file
    
    From e8024688f4cbc3110323c930b4a01dac207fbec8 Mon Sep 17 00:00:00 2001
    From: Besnik Bleta 
    Date: Wed, 2 Mar 2022 09:37:09 +0000
    Subject: [PATCH 026/152] Translated using Weblate (Albanian)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/sq/
    ---
     fastlane/metadata/android/sq/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/sq/changelogs/40104020.txt | 2 ++
     2 files changed, 4 insertions(+)
     create mode 100644 fastlane/metadata/android/sq/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/sq/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/sq/changelogs/40104000.txt b/fastlane/metadata/android/sq/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..f917c7c0cb
    --- /dev/null
    +++ b/fastlane/metadata/android/sq/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Ndryshime kryesore në këtë version: Sendërtimi fillestar i mesazheve në rrjedha. Flluska mesazhesh.
    +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/sq/changelogs/40104020.txt b/fastlane/metadata/android/sq/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..2fbe4f2bf6
    --- /dev/null
    +++ b/fastlane/metadata/android/sq/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Ndryshimet kryesore në këtë version: shtim mbulimi për @room dhe për pyetësorë jopublikë, mes mjaft ndryshimesh të tjera të vockla.
    +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From a77637b751a3cadd8c1e6cffdcac2d1b13aaeb32 Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Thu, 3 Mar 2022 13:05:29 +0000
    Subject: [PATCH 027/152] Translated using Weblate (Japanese)
    
    Currently translated at 98.3% (2121 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/
    ---
     vector/src/main/res/values-ja/strings.xml | 36 +++++++++++------------
     1 file changed, 18 insertions(+), 18 deletions(-)
    
    diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
    index fbd6540dd6..c1f3304fb8 100644
    --- a/vector/src/main/res/values-ja/strings.xml
    +++ b/vector/src/main/res/values-ja/strings.xml
    @@ -1489,8 +1489,8 @@
         画像
         スクリーンショット
         接続
    -    投票
    -    投票
    +    アンケート
    +    アンケート
         コード
         役割
         送信
    @@ -1515,9 +1515,9 @@
         警告!
         位置情報
         メディア
    -    投票終了
    -    投票を終了しますか?
    -    投票を削除
    +    アンケート終了
    +    アンケートを終了しますか?
    +    アンケートを削除
         スペースを作成
         スペースに参加
         スペースを退出
    @@ -1531,10 +1531,10 @@
         非公開のルームをアップグレード
         音声メッセージを一時停止
         このメールアドレスをアカウントにリンク
    -    投票を編集
    +    アンケートを編集
         地図
    -    投票を終了
    -    投票を終了
    +    アンケートを終了
    +    アンケートを終了
         選択肢%1$d
         選択肢を作成
         位置情報
    @@ -1549,7 +1549,7 @@
         ファイルをアップロード
         連絡先を開く
         ステッカーを送信
    -    投票を作成
    +    アンケートを作成
         位置情報を共有
         スペースに関する変更を行うために必要な役割を更新する権限がありません
         スペースに関する変更を行うために必要な役割を選択
    @@ -1587,8 +1587,8 @@
         ルームの暗号化の有効化
         スペースのメインアドレスの変更
         スペースのアバターの変更
    -    投票を作成
    -    投票を作成
    +    アンケートを作成
    +    アンケートを作成
         暗号化が正しく設定されていないため、メッセージを送ることができません。クリックして設定を開いてください。
         暗号化が正しく設定されていないため、メッセージを送ることができません。管理者に連絡して、暗号化を正しい状態に復元してください。
         %2$dの%1$d
    @@ -1741,12 +1741,12 @@
         続行するには%sを入力してください
         有効なリカバリーキーではありません
         リカバリーキーを入力してください
    -    投票の種類
    -    実施中の投票
    +    アンケートの種類
    +    投票の際に結果を公開
         投票する
         投票した人には、投票の際に即座に結果が表示されます
    -    終了した投票
    -    結果は投票を終了した後でのみ明らかにされます
    +    アンケートの終了後に結果を公開
    +    結果はアンケートを終了した後でのみ明らかにされます
         以下で開く
         暗号化のアップグレードが利用可能です
         SSSSキーをリカバリーキーから生成しています
    @@ -1762,7 +1762,7 @@
         
             %1$d個の投票
         
    -    投票を締め切り、投票の最終結果を表示します。
    +    アンケートを締め切り、最終結果を表示します。
         招待者のみ参加可能。個人やチームに最適
         スペースを作成
         連絡先をスペースに招待
    @@ -1789,7 +1789,7 @@
         音声メッセージを録音しています
         録音を削除
         音声メッセージがアクティブの間は返信や編集はできません
    -    この投票を削除してよろしいですか?一度削除すると復元することはできません。
    +    このアンケートを削除してよろしいですか?一度削除すると復元することはできません。
         共有データの取り扱いに失敗しました
         回転とクロップ
         ルームを探索
    @@ -1815,7 +1815,7 @@
     \nこのユーザーのコンテンツをこれ以上見たくなければ、ユーザーを無視してそのメッセージを非表示にできます。
         %1$sにより%2$sに
         質問あるいはトピック
    -    投票の質問あるいはトピック
    +    アンケートの質問あるいはトピック
         少々お待ちください。少し時間がかかるかもしれません。
         ルームのバージョン 👓
         不安定
    
    From 4254f4606535f6899e0cc130683cfbbfc46fa7e8 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Thu, 3 Mar 2022 17:59:51 +0300
    Subject: [PATCH 028/152] Support scrolling playback on timeline.
    
    ---
     .../home/room/detail/TimelineFragment.kt      |  8 ++++++
     .../detail/composer/MessageComposerAction.kt  |  2 ++
     .../composer/MessageComposerViewModel.kt      | 16 +++++++++++-
     .../detail/composer/VoiceMessageHelper.kt     |  8 ++++++
     .../timeline/TimelineEventController.kt       |  2 ++
     .../timeline/factory/MessageItemFactory.kt    | 11 ++++++++
     .../detail/timeline/item/MessageVoiceItem.kt  | 25 +++++++++++++++++++
     7 files changed, 71 insertions(+), 1 deletion(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    index 2da69bbe6c..d019cb1777 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    @@ -2051,6 +2051,14 @@ class TimelineFragment @Inject constructor(
             messageComposerViewModel.handle(MessageComposerAction.PlayOrPauseVoicePlayback(eventId, messageAudioContent))
         }
     
    +    override fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformTouchedUp(eventId, messageAudioContent, percentage))
    +    }
    +
    +    override fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformMovedTo(eventId, messageAudioContent, percentage))
    +    }
    +
         private fun onShareActionClicked(action: EventSharedAction.Share) {
             when (action.messageContent) {
                 is MessageTextContent           -> shareText(requireContext(), action.messageContent.body)
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    index 10cef39942..daa5631d84 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    @@ -40,4 +40,6 @@ sealed class MessageComposerAction : VectorViewModelAction {
         data class PlayOrPauseVoicePlayback(val eventId: String, val messageAudioContent: MessageAudioContent) : MessageComposerAction()
         object PlayOrPauseRecordingPlayback : MessageComposerAction()
         data class EndAllVoiceActions(val deleteRecord: Boolean = true) : MessageComposerAction()
    +    data class VoiceWaveformTouchedUp(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
    +    data class VoiceWaveformMovedTo(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index 0d90227168..ccb51d3796 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -108,7 +108,9 @@ class MessageComposerViewModel @AssistedInject constructor(
                 is MessageComposerAction.EndAllVoiceActions             -> handleEndAllVoiceActions(action.deleteRecord)
                 is MessageComposerAction.InitializeVoiceRecorder        -> handleInitializeVoiceRecorder(action.attachmentData)
                 is MessageComposerAction.OnEntersBackground             -> handleEntersBackground(action.composerText)
    -        }
    +            is MessageComposerAction.VoiceWaveformTouchedUp         -> handleVoiceWaveformTouchedUp(action)
    +            is MessageComposerAction.VoiceWaveformMovedTo           -> handleVoiceWaveformMovedTo(action)
    +        }.exhaustive
         }
     
         private fun handleOnVoiceRecordingUiStateChanged(action: MessageComposerAction.OnVoiceRecordingUiStateChanged) = setState {
    @@ -861,6 +863,18 @@ class MessageComposerViewModel @AssistedInject constructor(
             voiceMessageHelper.pauseRecording()
         }
     
    +    private fun handleVoiceWaveformTouchedUp(action: MessageComposerAction.VoiceWaveformTouchedUp) {
    +        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    +        val toMillisecond = (action.percentage * duration).toInt()
    +        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +    }
    +
    +    private fun handleVoiceWaveformMovedTo(action: MessageComposerAction.VoiceWaveformMovedTo) {
    +        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    +        val toMillisecond = (action.percentage * duration).toInt()
    +        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +    }
    +
         private fun handleEntersBackground(composerText: String) {
             val isVoiceRecording = com.airbnb.mvrx.withState(this) { it.isVoiceRecording }
             if (isVoiceRecording) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    index f9dfecd1f5..b6a8dc2cd5 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    @@ -174,6 +174,14 @@ class VoiceMessageHelper @Inject constructor(
             stopPlaybackTicker()
         }
     
    +    fun movePlaybackTo(id: String, toMillisecond: Int, totalDuration: Int) {
    +        val percentage = toMillisecond.toFloat() / totalDuration
    +        playbackTracker.updateCurrentPlaybackTime(id, toMillisecond, percentage)
    +
    +        stopPlayback()
    +        playbackTracker.pausePlayback(id)
    +    }
    +
         private fun startRecordingAmplitudes() {
             amplitudeTicker?.stop()
             amplitudeTicker = CountUpTimer(50).apply {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    index 2ac592797c..3965afdbaa 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    @@ -138,6 +138,8 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
             fun getPreviewUrlRetriever(): PreviewUrlRetriever
     
             fun onVoiceControlButtonClicked(eventId: String, messageAudioContent: MessageAudioContent)
    +        fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
    +        fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
         }
     
         interface ReactionPillCallback {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    index da97cf6984..8b0b43009d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    @@ -357,11 +357,22 @@ class MessageItemFactory @Inject constructor(
                 }
             }
     
    +        val waveformTouchListener: MessageVoiceItem.WaveformTouchListener = object : MessageVoiceItem.WaveformTouchListener {
    +            override fun onWaveformTouchedUp(percentage: Float) {
    +                params.callback?.onVoiceWaveformTouchedUp(informationData.eventId, messageContent, percentage)
    +            }
    +
    +            override fun onWaveformMovedTo(percentage: Float) {
    +                params.callback?.onVoiceWaveformMovedTo(informationData.eventId, messageContent, percentage)
    +            }
    +        }
    +
             return MessageVoiceItem_()
                     .attributes(attributes)
                     .duration(messageContent.audioWaveformInfo?.duration ?: 0)
                     .waveform(messageContent.audioWaveformInfo?.waveform?.toFft().orEmpty())
                     .playbackControlButtonClickListener(playbackControlButtonClickListener)
    +                .waveformTouchListener(waveformTouchListener)
                     .voiceMessagePlaybackTracker(voiceMessagePlaybackTracker)
                     .izLocalFile(localFilesHelper.isLocalFile(fileUrl))
                     .izDownloaded(session.fileService().isFileInCache(
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    index 82400a431d..d1c134a743 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    @@ -19,6 +19,7 @@ package im.vector.app.features.home.room.detail.timeline.item
     import android.content.res.ColorStateList
     import android.graphics.Color
     import android.text.format.DateUtils
    +import android.view.MotionEvent
     import android.view.View
     import android.view.ViewGroup
     import android.widget.ImageButton
    @@ -38,6 +39,11 @@ import im.vector.app.features.voice.AudioWaveformView
     @EpoxyModelClass(layout = R.layout.item_timeline_event_base)
     abstract class MessageVoiceItem : AbsMessageItem() {
     
    +    interface WaveformTouchListener {
    +        fun onWaveformTouchedUp(percentage: Float)
    +        fun onWaveformMovedTo(percentage: Float)
    +    }
    +
         @EpoxyAttribute
         var mxcUrl: String = ""
     
    @@ -62,6 +68,9 @@ abstract class MessageVoiceItem : AbsMessageItem() {
         @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
         var playbackControlButtonClickListener: ClickListener? = null
     
    +    @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
    +    var waveformTouchListener: WaveformTouchListener? = null
    +
         @EpoxyAttribute
         lateinit var voiceMessagePlaybackTracker: VoiceMessagePlaybackTracker
     
    @@ -87,6 +96,20 @@ abstract class MessageVoiceItem : AbsMessageItem() {
                     holder.voicePlaybackWaveform.add(AudioWaveformView.FFT(amplitude.toFloat(), waveformColorIdle))
                 }
                 holder.voicePlaybackWaveform.summarize()
    +
    +            holder.voicePlaybackWaveform.setOnTouchListener { view, motionEvent ->
    +                when (motionEvent.action) {
    +                    MotionEvent.ACTION_UP   -> {
    +                        val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                        waveformTouchListener?.onWaveformTouchedUp(percentage)
    +                    }
    +                    MotionEvent.ACTION_MOVE -> {
    +                        val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                        waveformTouchListener?.onWaveformMovedTo(percentage)
    +                    }
    +                }
    +                true
    +            }
             }
     
             val backgroundTint = if (attributes.informationData.messageLayout is TimelineMessageLayout.Bubble) {
    @@ -111,6 +134,8 @@ abstract class MessageVoiceItem : AbsMessageItem() {
             }
         }
     
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +
         private fun renderIdleState(holder: Holder, idleColor: Int, playedColor: Int) {
             holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play)
             holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message)
    
    From 3bd4a4ccd3ece851ac3de5c4c4e1e11a406efc33 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Thu, 3 Mar 2022 19:54:13 +0300
    Subject: [PATCH 029/152] Fix voice recorder start/pause states.
    
    ---
     .../home/room/detail/composer/VoiceMessageHelper.kt         | 6 ++++--
     .../detail/timeline/helper/VoiceMessagePlaybackTracker.kt   | 2 +-
     2 files changed, 5 insertions(+), 3 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    index b6a8dc2cd5..6bde4ada3d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    @@ -132,9 +132,11 @@ class VoiceMessageHelper @Inject constructor(
         }
     
         fun startOrPausePlayback(id: String, file: File) {
    -        stopPlayback()
    +        val playbackState = playbackTracker.getPlaybackState(id)
    +        mediaPlayer?.stop()
    +        stopPlaybackTicker()
             stopRecordingAmplitudes()
    -        if (playbackTracker.getPlaybackState(id) is VoiceMessagePlaybackTracker.Listener.State.Playing) {
    +        if (playbackState is VoiceMessagePlaybackTracker.Listener.State.Playing) {
                 playbackTracker.pausePlayback(id)
             } else {
                 startPlayback(id, file)
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
    index 076c05b9c4..8167ad94af 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
    @@ -115,7 +115,7 @@ class VoiceMessagePlaybackTracker @Inject constructor() {
             }
         }
     
    -    fun getPercentage(id: String): Float {
    +    private fun getPercentage(id: String): Float {
             return when (val state = states[id]) {
                 is Listener.State.Playing -> state.percentage
                 is Listener.State.Paused  -> state.percentage
    
    From 5168d715ceb89ec62a31ea0504232952dd6c7c57 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 16:21:28 +0300
    Subject: [PATCH 030/152] Support scrolling playback on recorded audio before
     sending.
    
    ---
     .../home/room/detail/TimelineFragment.kt      | 20 ++++++++++++----
     .../detail/composer/MessageComposerAction.kt  |  4 ++--
     .../composer/MessageComposerViewModel.kt      |  8 ++-----
     .../detail/composer/VoiceMessageHelper.kt     |  6 ++---
     .../voice/VoiceMessageRecorderView.kt         | 17 +++++++++++++-
     .../composer/voice/VoiceMessageViews.kt       | 23 ++++++++++++++++---
     .../timeline/TimelineEventController.kt       |  4 ++--
     .../timeline/factory/MessageItemFactory.kt    |  6 +++--
     8 files changed, 65 insertions(+), 23 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    index d019cb1777..a0e8ddce3d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    @@ -786,6 +786,18 @@ class TimelineFragment @Inject constructor(
                     updateRecordingUiState(RecordingUiState.Draft)
                 }
     
    +            override fun onVoiceWaveformTouchedUp(percentage: Float, duration: Int) {
    +                messageComposerViewModel.handle(
    +                        MessageComposerAction.VoiceWaveformTouchedUp(VoiceMessagePlaybackTracker.RECORDING_ID, duration, percentage)
    +                )
    +            }
    +
    +            override fun onVoiceWaveformMoved(percentage: Float, duration: Int) {
    +                messageComposerViewModel.handle(
    +                        MessageComposerAction.VoiceWaveformTouchedUp(VoiceMessagePlaybackTracker.RECORDING_ID, duration, percentage)
    +                )
    +            }
    +
                 private fun updateRecordingUiState(state: RecordingUiState) {
                     messageComposerViewModel.handle(
                             MessageComposerAction.OnVoiceRecordingUiStateChanged(state))
    @@ -2051,12 +2063,12 @@ class TimelineFragment @Inject constructor(
             messageComposerViewModel.handle(MessageComposerAction.PlayOrPauseVoicePlayback(eventId, messageAudioContent))
         }
     
    -    override fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    -        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformTouchedUp(eventId, messageAudioContent, percentage))
    +    override fun onVoiceWaveformTouchedUp(eventId: String, duration: Int, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformTouchedUp(eventId, duration, percentage))
         }
     
    -    override fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    -        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformMovedTo(eventId, messageAudioContent, percentage))
    +    override fun onVoiceWaveformMovedTo(eventId: String, duration: Int, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformMovedTo(eventId, duration, percentage))
         }
     
         private fun onShareActionClicked(action: EventSharedAction.Share) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    index daa5631d84..091e9f7869 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    @@ -40,6 +40,6 @@ sealed class MessageComposerAction : VectorViewModelAction {
         data class PlayOrPauseVoicePlayback(val eventId: String, val messageAudioContent: MessageAudioContent) : MessageComposerAction()
         object PlayOrPauseRecordingPlayback : MessageComposerAction()
         data class EndAllVoiceActions(val deleteRecord: Boolean = true) : MessageComposerAction()
    -    data class VoiceWaveformTouchedUp(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
    -    data class VoiceWaveformMovedTo(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
    +    data class VoiceWaveformTouchedUp(val eventId: String, val duration: Int, val percentage: Float) : MessageComposerAction()
    +    data class VoiceWaveformMovedTo(val eventId: String, val duration: Int, val percentage: Float) : MessageComposerAction()
     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index ccb51d3796..fba3b8b5d3 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -864,15 +864,11 @@ class MessageComposerViewModel @AssistedInject constructor(
         }
     
         private fun handleVoiceWaveformTouchedUp(action: MessageComposerAction.VoiceWaveformTouchedUp) {
    -        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    -        val toMillisecond = (action.percentage * duration).toInt()
    -        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +        voiceMessageHelper.movePlaybackTo(action.eventId, action.percentage, action.duration)
         }
     
         private fun handleVoiceWaveformMovedTo(action: MessageComposerAction.VoiceWaveformMovedTo) {
    -        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    -        val toMillisecond = (action.percentage * duration).toInt()
    -        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +        voiceMessageHelper.movePlaybackTo(action.eventId, action.percentage, action.duration)
         }
     
         private fun handleEntersBackground(composerText: String) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    index 6bde4ada3d..c5d8b7a5c1 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    @@ -171,13 +171,13 @@ class VoiceMessageHelper @Inject constructor(
         }
     
         fun stopPlayback() {
    -        playbackTracker.stopPlayback(VoiceMessagePlaybackTracker.RECORDING_ID)
    +        playbackTracker.pausePlayback(VoiceMessagePlaybackTracker.RECORDING_ID)
             mediaPlayer?.stop()
             stopPlaybackTicker()
         }
     
    -    fun movePlaybackTo(id: String, toMillisecond: Int, totalDuration: Int) {
    -        val percentage = toMillisecond.toFloat() / totalDuration
    +    fun movePlaybackTo(id: String, percentage: Float, totalDuration: Int) {
    +        val toMillisecond = (totalDuration * percentage).toInt()
             playbackTracker.updateCurrentPlaybackTime(id, toMillisecond, percentage)
     
             stopPlayback()
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    index 9a643796a9..87a2630f2a 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    @@ -53,6 +53,8 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
             fun onDeleteVoiceMessage()
             fun onRecordingLimitReached()
             fun onRecordingWaveformClicked()
    +        fun onVoiceWaveformTouchedUp(percentage: Float, duration: Int)
    +        fun onVoiceWaveformMoved(percentage: Float, duration: Int)
         }
     
         @Inject lateinit var clock: Clock
    @@ -65,6 +67,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
         private var recordingTicker: CountUpTimer? = null
         private var lastKnownState: RecordingUiState? = null
         private var dragState: DraggingState = DraggingState.Ignored
    +    private var recordingDuration: Long = 0
     
         init {
             inflate(this.context, R.layout.view_voice_message_recorder, this)
    @@ -95,7 +98,6 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
                 override fun onDeleteVoiceMessage() = callback.onDeleteVoiceMessage()
                 override fun onWaveformClicked() {
                     when (lastKnownState) {
    -                    RecordingUiState.Draft  -> callback.onVoicePlaybackButtonClicked()
                         is RecordingUiState.Recording,
                         is RecordingUiState.Locked -> callback.onRecordingWaveformClicked()
                     }
    @@ -105,6 +107,18 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
                 override fun onMicButtonDrag(nextDragStateCreator: (DraggingState) -> DraggingState) {
                     onDrag(dragState, newDragState = nextDragStateCreator(dragState))
                 }
    +
    +            override fun onVoiceWaveformTouchedUp(percentage: Float) {
    +                if (lastKnownState == RecordingUiState.Draft) {
    +                    callback.onVoiceWaveformTouchedUp(percentage, recordingDuration.toInt())
    +                }
    +            }
    +
    +            override fun onVoiceWaveformMoved(percentage: Float) {
    +                if (lastKnownState == RecordingUiState.Draft) {
    +                    callback.onVoiceWaveformMoved(percentage, recordingDuration.toInt())
    +                }
    +            }
             })
         }
     
    @@ -203,6 +217,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
         }
     
         private fun stopRecordingTicker() {
    +        recordingDuration = recordingTicker?.elapsedTime() ?: 0
             recordingTicker?.stop()
             recordingTicker = null
         }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    index 8adecaad6e..f3b1fc918d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    @@ -60,8 +60,21 @@ class VoiceMessageViews(
                 actions.onDeleteVoiceMessage()
             }
     
    -        views.voicePlaybackWaveform.setOnClickListener {
    -            actions.onWaveformClicked()
    +        views.voicePlaybackWaveform.setOnTouchListener { view, motionEvent ->
    +            when (motionEvent.action) {
    +                MotionEvent.ACTION_DOWN -> {
    +                    actions.onWaveformClicked()
    +                }
    +                MotionEvent.ACTION_UP   -> {
    +                    val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                    actions.onVoiceWaveformTouchedUp(percentage)
    +                }
    +                MotionEvent.ACTION_MOVE -> {
    +                    val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                    actions.onVoiceWaveformMoved(percentage)
    +                }
    +            }
    +            true
             }
     
             views.voicePlaybackControlButton.setOnClickListener {
    @@ -70,6 +83,8 @@ class VoiceMessageViews(
             observeMicButton(actions)
         }
     
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +
         @SuppressLint("ClickableViewAccessibility")
         private fun observeMicButton(actions: Actions) {
             val draggableStateProcessor = DraggableStateProcessor(resources, dimensionConverter)
    @@ -332,7 +347,7 @@ class VoiceMessageViews(
     
         fun renderRecordingWaveform(amplitudeList: Array) {
             views.voicePlaybackWaveform.doOnLayout { waveFormView ->
    -            val waveformColor = ThemeUtils.getColor(waveFormView.context, R.attr.vctr_content_secondary)
    +            val waveformColor = ThemeUtils.getColor(waveFormView.context, R.attr.vctr_content_quaternary)
                 amplitudeList.iterator().forEach {
                     (waveFormView as AudioWaveformView).add(AudioWaveformView.FFT(it.toFloat(), waveformColor))
                 }
    @@ -355,5 +370,7 @@ class VoiceMessageViews(
             fun onDeleteVoiceMessage()
             fun onWaveformClicked()
             fun onVoicePlaybackButtonClicked()
    +        fun onVoiceWaveformTouchedUp(percentage: Float)
    +        fun onVoiceWaveformMoved(percentage: Float)
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    index 3965afdbaa..9c469dfead 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    @@ -138,8 +138,8 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
             fun getPreviewUrlRetriever(): PreviewUrlRetriever
     
             fun onVoiceControlButtonClicked(eventId: String, messageAudioContent: MessageAudioContent)
    -        fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
    -        fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
    +        fun onVoiceWaveformTouchedUp(eventId: String, duration: Int, percentage: Float)
    +        fun onVoiceWaveformMovedTo(eventId: String, duration: Int, percentage: Float)
         }
     
         interface ReactionPillCallback {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    index 8b0b43009d..9116de92dd 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    @@ -359,11 +359,13 @@ class MessageItemFactory @Inject constructor(
     
             val waveformTouchListener: MessageVoiceItem.WaveformTouchListener = object : MessageVoiceItem.WaveformTouchListener {
                 override fun onWaveformTouchedUp(percentage: Float) {
    -                params.callback?.onVoiceWaveformTouchedUp(informationData.eventId, messageContent, percentage)
    +                val duration = messageContent.audioInfo?.duration ?: 0
    +                params.callback?.onVoiceWaveformTouchedUp(informationData.eventId, duration, percentage)
                 }
     
                 override fun onWaveformMovedTo(percentage: Float) {
    -                params.callback?.onVoiceWaveformMovedTo(informationData.eventId, messageContent, percentage)
    +                val duration = messageContent.audioInfo?.duration ?: 0
    +                params.callback?.onVoiceWaveformMovedTo(informationData.eventId, duration, percentage)
                 }
             }
     
    
    From aae75ce52fa1541b32f54ee96a3442b65a92844a Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 16:54:56 +0300
    Subject: [PATCH 031/152] Always stop all voice actions and media player if app
     enters to the background.
    
    ---
     .../home/room/detail/composer/MessageComposerViewModel.kt  | 7 +++++--
     1 file changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index fba3b8b5d3..b71398c8a2 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -872,11 +872,14 @@ class MessageComposerViewModel @AssistedInject constructor(
         }
     
         private fun handleEntersBackground(composerText: String) {
    +        // Always stop all voice actions. It may be playing in timeline or active recording
    +        val playingAudioContent = voiceMessageHelper.stopAllVoiceActions(deleteRecord = false)
    +        voiceMessageHelper.clearTracker()
    +        
             val isVoiceRecording = com.airbnb.mvrx.withState(this) { it.isVoiceRecording }
             if (isVoiceRecording) {
    -            voiceMessageHelper.clearTracker()
                 viewModelScope.launch {
    -                voiceMessageHelper.stopAllVoiceActions(deleteRecord = false)?.toContentAttachmentData()?.let { voiceDraft ->
    +                playingAudioContent?.toContentAttachmentData()?.let { voiceDraft ->
                         val content = voiceDraft.toJsonString()
                         room.saveDraft(UserDraft.Voice(content))
                         setState { copy(sendMode = SendMode.Voice(content)) }
    
    From 601f10a6fb7e62f43e9d1ec8dbcf898bcbf50b78 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 17:16:09 +0300
    Subject: [PATCH 032/152] Support ltr and rtl flow of the recording waveform.
    
    ---
     .../java/im/vector/app/features/voice/AudioWaveformView.kt   | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    index 768635b2f7..7cdb1d51d5 100644
    --- a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    @@ -164,9 +164,10 @@ class AudioWaveformView @JvmOverloads constructor(
     
         private fun drawBars(canvas: Canvas) {
             var currentX = horizontalPadding
    -        visibleBarHeights.forEach {
    +        val flowableBarHeights = if (flow == Flow.LTR) visibleBarHeights else visibleBarHeights.reversed()
    +
    +        flowableBarHeights.forEach {
                 barPaint.color = it.color
    -            // TODO. Support flow
                 when (alignment) {
                     Alignment.BOTTOM -> {
                         val startY = height - verticalPadding
    
    From e09b123a9191e1d0aaea845657675ce05f982ca1 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 17:21:00 +0300
    Subject: [PATCH 033/152] Changelog added.
    
    ---
     changelog.d/5426.feature | 1 +
     1 file changed, 1 insertion(+)
     create mode 100644 changelog.d/5426.feature
    
    diff --git a/changelog.d/5426.feature b/changelog.d/5426.feature
    new file mode 100644
    index 0000000000..2dee22f07a
    --- /dev/null
    +++ b/changelog.d/5426.feature
    @@ -0,0 +1 @@
    +Allow scrolling position of Voice Message playback
    \ No newline at end of file
    
    From 4cb432e49704e2ccd5132fafcfad851754e40135 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 17:47:34 +0300
    Subject: [PATCH 034/152] Do not allow to flow RTL after summarized, playback
     time always flows LTR.
    
    ---
     .../main/java/im/vector/app/features/voice/AudioWaveformView.kt  | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    index 7cdb1d51d5..32f30fe458 100644
    --- a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    @@ -129,6 +129,7 @@ class AudioWaveformView @JvmOverloads constructor(
         }
     
         private fun List.summarize(target: Int): List {
    +        flow = Flow.LTR
             val result = mutableListOf()
             if (size <= target) {
                 result.addAll(this)
    
    From 3156410965eb913de7606d276962ae0dc715faef Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Mon, 7 Mar 2022 15:52:19 +0300
    Subject: [PATCH 035/152] Code review fixes.
    
    ---
     .../src/main/res/values/stylable_audio_waveform_view.xml        | 0
     .../home/room/detail/composer/voice/VoiceMessageViews.kt        | 2 +-
     .../home/room/detail/timeline/factory/MessageItemFactory.kt     | 1 +
     .../features/home/room/detail/timeline/item/MessageVoiceItem.kt | 2 +-
     4 files changed, 3 insertions(+), 2 deletions(-)
     rename vector/src/main/res/values/audio_waveform_attr.xml => library/ui-styles/src/main/res/values/stylable_audio_waveform_view.xml (100%)
    
    diff --git a/vector/src/main/res/values/audio_waveform_attr.xml b/library/ui-styles/src/main/res/values/stylable_audio_waveform_view.xml
    similarity index 100%
    rename from vector/src/main/res/values/audio_waveform_attr.xml
    rename to library/ui-styles/src/main/res/values/stylable_audio_waveform_view.xml
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    index f3b1fc918d..7a76657923 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    @@ -83,7 +83,7 @@ class VoiceMessageViews(
             observeMicButton(actions)
         }
     
    -    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = (motionEvent.x / view.width).coerceIn(0f, 1f)
     
         @SuppressLint("ClickableViewAccessibility")
         private fun observeMicButton(actions: Actions) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    index 865e8f80bd..e8e8927b6d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    @@ -709,6 +709,7 @@ class MessageItemFactory @Inject constructor(
             return this
                     ?.filterNotNull()
                     ?.map {
    +                    // Value comes from AudioWaveformView.MAX_FFT, and 1024 is the max value in the Matrix spec
                         it * AudioWaveformView.MAX_FFT / 1024
                     }
         }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    index d1c134a743..722e0f620a 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    @@ -134,7 +134,7 @@ abstract class MessageVoiceItem : AbsMessageItem() {
             }
         }
     
    -    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = (motionEvent.x / view.width).coerceIn(0f, 1f)
     
         private fun renderIdleState(holder: Holder, idleColor: Int, playedColor: Int) {
             holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play)
    
    From 6fef2f6d4e87f4deadd45f74387b39ef32312ecc Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Mon, 7 Mar 2022 21:48:16 +0300
    Subject: [PATCH 036/152] Lint fixes.
    
    ---
     .../home/room/detail/composer/MessageComposerViewModel.kt       | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index 36fbdf4788..0c89226f5a 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -877,7 +877,7 @@ class MessageComposerViewModel @AssistedInject constructor(
             // Always stop all voice actions. It may be playing in timeline or active recording
             val playingAudioContent = voiceMessageHelper.stopAllVoiceActions(deleteRecord = false)
             voiceMessageHelper.clearTracker()
    -        
    +
             val isVoiceRecording = com.airbnb.mvrx.withState(this) { it.isVoiceRecording }
             if (isVoiceRecording) {
                 viewModelScope.launch {
    
    From e758f440c7c8a8887ee8e2ec437337c3c16abb52 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Peter=20V=C3=A1gner?= 
    Date: Mon, 7 Mar 2022 22:18:49 +0000
    Subject: [PATCH 037/152] Translated using Weblate (Slovak)
    
    Currently translated at 99.2% (2140 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
    ---
     vector/src/main/res/values-sk/strings.xml | 6 ++++++
     1 file changed, 6 insertions(+)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 6ec0827757..3ea0dc14a8 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2439,4 +2439,10 @@
         %1$s a %2$s
         Pokračovať pomocou jednotného prihlásenia SSO
         jednotné prihlásenie SSO
    +    Zatvoriť výzvu zálohovanie kľúčov
    +    Výťazná odpoveď
    +    Nezaškrtnuté
    +    Zaškrtnuté
    +    Rozpísaná správa
    +    Otvoriť navigačnú ponuku
     
    \ No newline at end of file
    
    From a657bc6976e6da2f74de8437b0856d8f904e5784 Mon Sep 17 00:00:00 2001
    From: Zet 
    Date: Sat, 5 Mar 2022 14:53:44 +0000
    Subject: [PATCH 038/152] Translated using Weblate (Arabic)
    
    Currently translated at 30.5% (659 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ar/
    ---
     vector/src/main/res/values-ar/strings.xml | 44 +++++++----------------
     1 file changed, 13 insertions(+), 31 deletions(-)
    
    diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml
    index 0f1004ad7b..f0cc1fbceb 100644
    --- a/vector/src/main/res/values-ar/strings.xml
    +++ b/vector/src/main/res/values-ar/strings.xml
    @@ -38,7 +38,6 @@
         غُرفة فارِغة
         %1$s وَ %2$s
         دَعوة لغُرفة
    -
         دعوتك
         أنشأ ⁨%1$s⁩ الغرفة
         أنشأتَ الغرفة
    @@ -156,7 +155,7 @@
         المُزامنة الأولية:
     \nيستورد الغُرف
         المُزامنة الأولية:
    -\nيجري إستيرد التَعمية
    +\nيستورد التَعمية
         غُرفة فارِغة (كانت %s)
         
             %1$s، %2$s و%3$s
    @@ -192,7 +191,6 @@
         احذف
         غيّر الاسم
         أبلِغ عن المحتوى
    -
         اخرج
         مكالمة صوتية
         مكالمة صورية
    @@ -209,7 +207,6 @@
         متراسلو «ماترِكس» فقط
         لا نتائج
         الغرف
    -
         أرسِل السجلات
         أرسِل سجلات الانهيار
         أرسِل لقطة شاشة
    @@ -234,7 +231,6 @@
         أنسيت كلمة السر؟
         يجب إدخال عنوان البريد الإلكتروني المرتبط بحسابك.
         فشل تأكيد عنوان البريد: تحقق من نقر الرابط في البريد
    -
         أدخِل مسارا صالحا
         لم يحتوي JSON صالح
         أُرسلت الكثير من الطلبات
    @@ -261,7 +257,6 @@
         اخرج
         البصمة (⁨%s⁩):
         تعذّر التحقق من معرّف الخادوم البعيد.
    -
         لا نتائج
         صورة اللاحة
         اسم العرض
    @@ -325,7 +320,6 @@
         استخدم الكمرة الأصيلة
         اضبطه كعنوان رئيسي
         ألغِ ضبطه كعنوان رئيسي
    -
         السمة
         خطأ في فكّ التعمية
         اسم الجهاز
    @@ -335,7 +329,6 @@
         صدّر المفاتيح إلى ملف محلي
         أدخِل عبارة المرور
         أكّد عبارة المرور
    -
         استورد مفاتيح الطرفين لغرفة
         استورد مفاتيح الغرفة
         استورد المفاتيح من ملف محلي
    @@ -363,9 +356,7 @@
         بلاغ علة
         يبدو أنك تهزّ الهاتف وأنت مُحبط. أتريد إرسال بلاغ علة؟
         التقدم (%s٪)
    -
         يحمّل…
    -
         
             لا أعضاء
             عضو واحد
    @@ -384,7 +375,6 @@
             %d رسالة جديدة
             %d رسالة جديدة
         
    -
         أولوية منخفضة
         المجتمعات
         هزّ الجهاز بجنون يُرسل بلاغًا بعلة
    @@ -396,7 +386,6 @@
         أمتأكد من بدء محادثة صوتية؟
         أمتأكد من بدء محادثة صورية؟
         عنوان البريد مُعرّف بالفعل.
    -
         يريد خادوم المنزل هذا التأكد من أنك لست أحد الآليين
         JSON‏ معطوب
         
    @@ -407,19 +396,14 @@
             %d تغييرا على العضوية
             %d تغيير على العضوية
         
    -
         يحتاج Element تصريحا منك للوصول إلى المِكرفون لإجراء المكالمات الصوتية.
    -
         يحتاج Element تصريحا منك للوصول إلى الكمرة والمِكرفون لإجراء المكالمات الصورية.
     
     رجاءً اسمح بالوصول في المنبثقة التالية لتقدر على إرسال إجراء المكالمات الصورية.
    -
    -
         ادعُ
         انضم إلى الغرفة
         الأصلي
         لم يُجب الطرف البعيد.
    -
         الدردشات المباشرة
         أشِر إليه
         لن تستطيع العودة عن هذا التغيير إذ أنك تمنح المستخدم نفس مستوى السلطة الذي لك.
    @@ -482,7 +466,6 @@
         هُزّ الجهاز عند الإشارة إليّ
         التحاليل
         ‏⁨%1$s⁩ في ⁨%2$s⁩
    -
         تخويل
         والج كَ‍
         خادوم المنزل
    @@ -493,7 +476,6 @@
         الميل
         معطّل
         مزعج
    -
         لا ترسل من هذا الجهاز الرسائل المعمّاة إلى الأجهزة غير المؤكّدة
         عمِّ إلى الأجهزة المؤكّدة فقط
         <b>غير<b/> مؤكّدة
    @@ -504,7 +486,6 @@
         قد يعني هذا بأن أحدهم يعترض الاتصال بعدوانية، أو أن هاتفك لا يثق بالشهادة التي قدّمها الخادوم البعيد.
         إن قال مدير الخادوم بأن هذا متوقع، فتأكد من أن البصمة أدناه تطابق البصمة التي وفّرها.
         تغيّرت الشهادة من شهادة كنت تثق بها إلى شهادة لا تثق بها. لربما جدّد الخادوم شهادته. راسل إدارة الخادوم واسألهم عن البصمة المتوقعة.
    -
         أضِف اختصارا إلى الشاشة الرئيسية
         شاشة معلومات التطبيق في النظام
         دعوات المكالمات
    @@ -545,10 +526,6 @@
         رجاءً اكتب كلمة السر.
         رجاءً اكتب الوصف بالإنجليزية إن أمكن.
         تنبيهات النظام
    -
    -
    -
    -
         
             لا شيء محدّد
             واحدة محدّدة
    @@ -566,14 +543,11 @@
             %d رسالة إخطار غير مقروءة
             %d رسالة إخطار غير مقروءة
         
    -
         يمنع المستخدم حسب المعرّف المعطى
         يُلغي المنع عن المستخدم حسب المعرّف المعطى
         يُحدّد مستوى قدرة المستخدم
         يدعو المستخدم حسب المعرّف المعطى إلى الغرفة الحالية
         شغّل/عطّل مارك‌داون
    -
    -
         ألغِ تفعيل الحساب
         استُبدلت هذه الغرفة ولم تعد نشطة بعد الآن
         هذه الغرفة هي استمرار لمحادثة أخرى
    @@ -610,8 +584,8 @@
         طرد
         الإعدادات المتقدمة للإشعارات
         عند تسجيل الخروج الآن ستخسر مفاتيحك
    -    النسخ الاحتياطي المفاتيح ما زال جاريا. في حال خروجك الآن لن تتمكن لاحقا من قراءة الرسائل المشفرة.
    -    تأكد من تفعيل النسخ الاحتياطي للمفاتيح على كل أجهزتك كي لا تخسر رسائلك المشفرة
    +    النسخ الاحتياطي المفاتيح ما زال جاريا. في حال خروجك الآن لن تتمكن لاحقا من قراءة الرسائل المعماة.
    +    تأكد من تفعيل النسخ الاحتياطي للمفاتيح على كل أجهزتك كي لا تخسر رسائلك المعماة
         ينسخ احتياطيا المفاتيح…
         ليس لديك تصريح لبدء إجتماع
         ليس لديك تصريح لبدء إجتماع في هذه الغرفة
    @@ -622,10 +596,10 @@
         إفصل
         أبّطل
         لاشيء
    -    ستفقد الوصول إلى رسائلك المشفرة إلا إذا أخذت نسخة إحتياطية من مفاتيحك قبل تسجيلك للخروج.
    +    ستفقد الوصول إلى رسائلك المعماة إلا إذا أخذت نسخة إحتياطية من مفاتيحك قبل تسجيلك للخروج.
         نسخة إحتياطية
         هل أنت متأكد؟
    -    لا أريد رسائلي المشفرة
    +    لا أريد رسائلي المعماة
         نسخ إحتياطي للمفتاح
         إفتراضي النظام
         غير %1$s عنوان الغرفة الى %2$s.
    @@ -840,4 +814,12 @@
         يستورد المفاتيح…
         ينزّل المفاتيح…
         لا يسمح لك بالانضمام لهذه الغرفة
    +    فشلت مكالمة ${app_name}
    +    انسخ رابط النقاش
    +    اعرضه في الغرفة
    +    أقبل
    +    اعرض النقاشات
    +    فشلت إزالة الودجة
    +    فشلت إضافة الودجة
    +    يستمع للإشعارات
     
    \ No newline at end of file
    
    From 2e5bd0dda6d4fa594f612423630b7bf74d9ae102 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= 
    Date: Sun, 6 Mar 2022 10:20:03 +0000
    Subject: [PATCH 039/152] Translated using Weblate (Estonian)
    
    Currently translated at 99.9% (2155 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/et/
    ---
     vector/src/main/res/values-et/strings.xml | 43 ++---------------------
     1 file changed, 2 insertions(+), 41 deletions(-)
    
    diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml
    index 21d4aac1ec..44025005d3 100644
    --- a/vector/src/main/res/values-et/strings.xml
    +++ b/vector/src/main/res/values-et/strings.xml
    @@ -38,7 +38,6 @@
         Telefoninumber
         Kutse jututuppa
         %1$s ja %2$s
    -
         Tühi jututuba
         Esmane laadimine:
     \nImpordin kontot…
    @@ -265,7 +264,6 @@
         Tunnista kehtetuks
         Katkesta ühendus
         Teata kahtlasest sisust
    -
         või
         Kutsu
         Võta vastu
    @@ -297,7 +295,6 @@
         Vaid need, kellel on Matrixi konto
         Tulemusi ei ole
         Jututoad
    -
         Kogukonnad
         Saada logikirjed
         Saada kokkujooksmise logikirjed
    @@ -323,7 +320,6 @@
         Edasta häält
         Kas oled kindel, et soovid algatada häälkõnet\?
         Kas oled kindel, et soovid algatada videokõnet\?
    -
         Saada faile
         Saada kleepse
         Tee foto või video
    @@ -339,11 +335,9 @@
         See ei tundu olema e-posti aadressi moodi
         Selline e-posti aadress on juba kasutusel.
         Kas unustasid oma salasõna\?
    -
         See koduserver soovib olla kindel, et sa ei ole robot
         Sinu kontoga seotud e-posti aadress peab olema sisestatud.
         E-posti aadressi verifitseerimine ei õnnestunud. Palun kontrolli, et sa avasid kirjas leidunud lingi
    -
         Palun loe läbi ja nõustu koduserveri kasutusjuhendiga:
         Palun sisesta korrektne URL
         See ei ole toimiv Matrix\'i serveri aadress
    @@ -394,10 +388,7 @@
         Videokõne on pooleli…
         Teine osapool ei võtnud kõnet vastu.
         Lisateave õiguste kohta
    -
    -
         Kõnede tegemiseks vajab ${app_name} õigusi kasutada sinu mikrofoni.
    -
         ${app_name} vajab videokõnedeks õigusi sinu kaamera ja mikrofoni kasutamiseks.
     \n
     \nKõnede tegemiseks palun anna järgmisel lehel vajalikud õigused.
    @@ -408,7 +399,6 @@
         Liitu
         Hülga
         Mine lugemata sõnumite juurde
    -
         Isiklikud sõnumid
         See võib tähendada, et keegi on suuteline pahatahtlikult sinu veebiliiklust pealtkuulama või sinu telefon ei usalda serveri kasutatavat sertifikaati.
         Kui serveri haldaja on sind teavitanud, et nii võib juhtuda, siis kontrolli, et sertifikaadi sõrmejälg vastab sellele, mille haldaja sulle on andnud.
    @@ -455,7 +445,6 @@
         Kui sa soovid oma PIN-koodi lähtestada, siis klõpsi nuppu „Unustasin PIN-koodi“.
         Määra põhiaadressiks
         Eemalda põhiaadressiks määramine
    -
         Teema
         Fontide suurus
         Pisike
    @@ -513,8 +502,6 @@
         Palun sisesta taastevõti
         Verifitseeritud!
         Selge lugu
    -
    -
         Verifitseerimispäring
         %s soovib verifitseerida sinu sessiooni
         Sinu jututoad kuvatakse siin. Olemasolevate jututubade leidmiseks või uute tegemiseks klõpsi all paremal nurgas asuvat + nuppu.
    @@ -578,8 +565,6 @@
         Kuna sina oled selle sessiooni verifitseerinud, siis see sessioon on krüptitud sõnumite saatmiseks usaldusväärne:
         See isikutuvastusserver kasutab vana API\'t. ${app_name} toetab aga vaid API versiooni 2.
         See tegevus ei ole võimalik. Koduserveri versioon on liiga vana.
    -
    -
         Kõik sõnumid
         Lisa avalehele
         Profiilipilt
    @@ -698,15 +683,10 @@
         Väldi juhuslikke kõnesid
         Enne kõne algatamist küsi kinnitust
         Osalejate loend
    -
         
             %d osaleja
             %d osalejat
         
    -
    -
    -
    -
         Lahku jututoast
         Kas oled kindel, et soovid lahkuda jututoast\?
         Kutsu
    @@ -715,7 +695,6 @@
         Taasta ligipääs
         Müksa välja
         Maini
    -
         Taastevõti on salvestatud.
         Varukoopia on juba olemas sinu koduserveris
         Asenda
    @@ -871,8 +850,6 @@
         Lisa Matrix\'i rakendusi
         Luba süsteemi poolt hallatud kaamera kasutamine
         Käivita kohandatud vaate asemel süsteemne kaamera vaade.
    -
    -
         Taustapiirangud on Elemendi jaoks keelatud. Seda testi tuleks läbi viia mobiilse andmeside abil (WIFI puudub).
     \n%1$s
         Elemendi jaoks on taustpiirangud lubatud.
    @@ -909,7 +886,6 @@
         Kui rakendus töötab taustal, siis sa ei saa saabunud sõnumite kohta teavitusi.
         Käivita teenus seadme käivitamisel
         Sünkroniseerimispäring aegus
    -
         Viivitus sünkroonimiste vahel
         Versioon
         olm-teegi versioon
    @@ -964,7 +940,6 @@
         Eemalda minu konto kasutusest
         Leia kasutajaid
         Halda kasutajate otsingu seadistusi.
    -
         Analüütika
         Saada arendajatele analüütikat
         Võimaldamaks meil rakendust parandada kogub ${app_name} anonüümset teavet rakenduse kasutuse kohta.
    @@ -973,7 +948,6 @@
         Uuenda avalikku nime
         Viimati nähtud
         %1$s @ %2$s
    -
         Autentimine
         Sisselogitud kui
         Koduserver
    @@ -1000,7 +974,6 @@
     \nPane tähele, et antud toiming taaskäivitab rakenduse ja see võib võtta veidi aega.
         Vali riik
         Eksporditavate võtmete krüptimiseks palun sisesta paroolifraas. Võtmete importimisel pead kasutama sama paroolifraasi.
    -
         Võtmete eksportimine õnnestus
         Krüptitud sõnumite taastamine
         Halda võtmete varundust
    @@ -1016,7 +989,6 @@
         Verifitseeri
         Kinnita seda võrreldes järgnevaid andmeid oma teise sessiooni kasutajaseadetes:
         Kui nad omavahel ei klapi, siis teie suhtluse turvalisus võib olla ohus.
    -
         Vali jututubade loend
         Serveri aadress
         Kõik jututoad %s serveris
    @@ -1025,7 +997,6 @@
             %d lugemata teavitatud sõnum
             %d lugemata teavitatud sõnumit
         
    -
         Jätkamaks pead nõustuma kasutustingimustega.
         Sa oled lisanud uue sessiooni \'%s\', mis soovib saada krüptimisvõtmeid.
         Uus sessioon soovib krüptovõtmeid.
    @@ -1066,8 +1037,6 @@
         Avaleht
         Jututoad
         Kutsutud
    -
    -
         %2$s müksas sind välja %1$s jututoast
         Tunnuspilt
         Selleks et jätkata koduserveri %1$s kasutamist sa pead üle vaatama ja nõustuma meie kasutustingimustega.
    @@ -1156,7 +1125,6 @@
         Kontrollin varukoopia olekut
         Kustuta varukoopia
         Kas kustutame krüptovõtmete varukoopia serverist\? Sellisel juhul sa ei saa kasutada ka taastevõtit krüptitud sõnumite ajaloo loetavaks muutmseks.
    -
         Turvaline varundus
         Hoia ära, et kaotad ligipääsu krüptitud sõnumitele ja andmetele
         Ära kunagi kaota krüptitud sõnumeid
    @@ -1173,7 +1141,6 @@
         Versioon
         Algoritm
         Allkiri
    -
         Teadmata viga
         Sa ei kasuta ühtegi isikutuvastusserverit
         Tundub, et sa üritad luua ühendust teise koduserveriga. Kas sa soovid välja logida\?
    @@ -1448,7 +1415,6 @@
         Trüki ta välja ja hoia turvalises kohas
         Salvesta ta mälupulgale või varunduskettale
         Kopeeri ta isiklikku andmehoidlasse mis asub pilves
    -
         Kui sa tühistad nüüd, siis sa võid peale viimasest seadmest välja logimist kaotada ligipääsu oma krüptitud sõnumitele ja andmetele.
     \n
     \nAga sa võid seadistustes võtta kasutusele turvalise varunduse ning hallata oma krüptovõtmeid.
    @@ -1527,7 +1493,6 @@
         Haldaja sai nüüd teate, et see sisu ei ole sobilik. 
     \n 
     \nKui sa ei soovi enam näha selle kasutaja sisu, siis sa võid tema sõnumite peitmiseks kasutajat eirata.
    -
         Eira kasutajat
         Kõik sõnumid (lärmakas)
         Kõik sõnumid
    @@ -1708,7 +1673,6 @@
         Halda on Matrix\'i kontoga seotud e-posti aadresse ja telefoninumbreid
         Kood
         Palun kasuta rahvusvahelist vormingut (telefoninumbri alguses peaks olema „+“)
    -
         Kinnita oma isikusamasust verifitseerides seda sisselogimissessiooni. Sellega tagad ligipääsu krüptitud sõnumitele.
         Ei ole võimalik avada sellise jututoa vaadet, kus sulle on seatud suhtluskeeld.
         Ei leia sellist jututuba. Palun kontrolli, et ta ikka olemas on.
    @@ -1791,7 +1755,6 @@
         Otsevestlus
         Lisa kaasa võtmevahetusega seotud päringute ajalugu
         Rohkem otsingutulemusi pole
    -
         🔐️ Liitu minuga vestlusrakenduses ${app_name}
         Hei, palun suhtle minuga vestlusrakenduses ${app_name}: %s
         Kutsu sõpru
    @@ -1914,8 +1877,6 @@
         Suuna
         Ühenda
         Pea esmalt nõu
    -
    -
         Kõne on pooleli (%1$s)
         Telefoninumbri otsimisel tekkis viga
         Numbriklahvistik
    @@ -2112,7 +2073,6 @@
         Sisesta serveri nimi, mille sisu sa soovid uurida.
         Lisa uus server
         Sinu server
    -
         Vabandust, liitumisel tekkis viga: %s
         Kogukonnakeskuse aadressid
         Selle kogukonnakeskuse hallatud ja nähtavad aadressid.
    @@ -2315,7 +2275,6 @@
         Küsitluse küsimus või teema
         Koosta üks küsitlus
         Küsitlus
    -
         Saada e-posti aadressid ja telefoninumbrid %s serverisse
         Sinu kontaktid on vaid sinu teada. Kui tahad nende hulgast leida Matrix\'i kasutajaid, siis me vajame sinu luba nende andmete saatmiseks räsitud kujul isikutuvastusserverisse.
         Selleks et leida tuttavaid, sa peaksid saatma oma kontaktteavet (telefoninumbreid ja/või e-posti aadresse) siin rakenduses seadistatud isikutuvastusserverile. Parema andmeturvalisuse nimel me ei saada teavet mitte loetava tekstina, vaid räsina.
    @@ -2458,4 +2417,6 @@
             %d serveri kasutusõiguste muudatus
             %d serveri kasutusõiguste muudatust
         
    +    %1$s, %2$s ning teised kasutajad
    +    %1$s ja %2$s
     
    \ No newline at end of file
    
    From cf6a71702302ce4bf939e0999c4bcd02e3791aa6 Mon Sep 17 00:00:00 2001
    From: Tuomas Hietala 
    Date: Fri, 4 Mar 2022 23:28:50 +0000
    Subject: [PATCH 040/152] Translated using Weblate (Finnish)
    
    Currently translated at 80.2% (1730 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fi/
    ---
     vector/src/main/res/values-fi/strings.xml | 105 ++++++++++++++--------
     1 file changed, 67 insertions(+), 38 deletions(-)
    
    diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml
    index 931075ce8d..7e22ce42a8 100644
    --- a/vector/src/main/res/values-fi/strings.xml
    +++ b/vector/src/main/res/values-fi/strings.xml
    @@ -39,7 +39,6 @@
         Huonekutsu
         %1$s ja %2$s
         Tyhjä huone
    -
         Alkusynkronointi:
     \nTuodaan tiliä…
         Alkusynkronointi:
    @@ -190,7 +189,6 @@
         Poista
         Nimeä uudelleen
         Ilmoita epäilyttävästä sisällöstä
    -
         tai
         Kutsu
         Kirjaudu ulos
    @@ -213,7 +211,6 @@
         Ainoastaan Matrix-yhteyshenkilöt
         Ei tuloksia
         Huoneet
    -
         Lähetä lokit
         Lähetä kaatumislokit
         Lähetä näytönkaappauskuva
    @@ -259,13 +256,10 @@
         Puhelu käynnissä…
         Toinen puoli ei vastannut.
         Huomio
    -
         ${app_name} tarvitsee käyttöluvan mikrofoniin suorittakseen puheluita.
    -
         ${app_name} tarvitsee käyttöluvan kameraan ja mikrofoniin suorittakseen videopuheluita.
     \n
     \nSalli mikrofonin ja kameran käyttö seuraavilla näytöillä aloittaaksesi tämän puhelun.
    -
         KYLLÄ
         EI
         Jatka
    @@ -273,7 +267,6 @@
         Liity
         Hylkää
         Siirry ensimmäiseen lukemattomaan viestiin.
    -
         Poistu huoneesta
         Haluatko varmasti poistua huoneesta?
         YKSITYISKESKUSTELUT
    @@ -299,7 +292,6 @@
         Sertifikaatti johon laitteesi luotti aikaisemmin on vaihtunut. Tämä on HYVIN EPÄTAVALLISTA. On suositeltavaa, että ET hyväksy tätä uutta sertifikaattia.
         Sertifikaatti on vaihtunut ennestään luotetusta ei-luotettuun. Palvelin on voinut uusia sertifikaattinsa. Kysy palvelimen ylläpitäjältä, mikä sormenjäljen pitäisi olla.
         Hyväksy sertifikaatti vain, jos palvelimen ylläpitäjä on julkaissut sormenjäljen, joka täsmää yllä olevan kanssa.
    -
         Etsi
         Etsi huoneen jäsenistä
         Ei tuloksia
    @@ -344,7 +336,6 @@
         Päivitä julkinen nimi
         Viimeksi käytetty
         %1$s @ %2$s
    -
         Tunnistautuminen
         Kirjautuneena nimellä
         Kotipalvelin
    @@ -375,7 +366,6 @@
         Nämä ovat kokeellisia ominaisuuksia, jotka voivat mennä rikki. Käytä varoen.
         Aseta pääosoitteeksi
         Poista pääosoite
    -
         Salauksenpurkuvirhe
         Julkinen nimi
         Istunnon tunnus
    @@ -386,7 +376,6 @@
         Vie
         Anna salasana
         Vahvista salasana
    -
         Tuo salatun huoneen avaimet
         Tuo huoneen avaimet
         Tuo avaimet paikallisesta tiedostosta
    @@ -527,15 +516,10 @@
         Saapuvien puheluiden soittoääni
         Videopuhelu menossa…
         Käyttäjälista
    -
         
             yksi jäsen
             %d jäsentä
         
    -
    -
    -
    -
         Poista huoneesta
         
             yksi uusi viesti
    @@ -545,8 +529,6 @@
             yksi valittu
             %d valittu
         
    -
    -
         Edistyneet ilmoitusasetukset
         Ilmoituksen tärkeys tapahtumakohtaisesti
         Ratkaise ilmoituksien ongelmia
    @@ -621,7 +603,6 @@
         Paina lukukuittauksesta nähdäksesi tarkemman listan.
         Ei vaikuta kutsuihin, poistamisiin ja porttikieltoihin.
         Sisältää hahmokuvat ja näyttönimien vaihdot.
    -
         ${app_name} kerää anonyymiä analytiikkaa sovelluksen parantamiseksi.
         Luo salalause salataksesi viedyt avaimet. Tarvitset saman salalauseen avainten tuomiseen.
         Salattujen viestien palautus
    @@ -630,7 +611,6 @@
             yksi lukematon ilmoitettu viesti
             %d lukematonta ilmoitettua viestiä
         
    -
         
             yksi huone
             %d huonetta
    @@ -656,8 +636,6 @@
         Markdown päällä/pois
         Matrix-sovellusten hallinnan korjaamiseen
         Hiljainen
    -
    -
         Hahmokuva
         Jatkaaksesi kotipalvelimen %1$s käyttöä, sinun täytyy hyväksyä palvelun käyttöehdot.
         Näytä ehdot
    @@ -715,7 +693,6 @@
         Tallenna palautusavain
         Jaa
         Tallenna tiedostona
    -
         Teethän kopion
         Jaa palautusavain kohteelle…
         Luodaan palautusavainta käyttäen salalausetta. Tässä saattaa kestää useampi sekunti.
    @@ -782,8 +759,6 @@
         Näppäimistön enter-näppäin lähettää viestin sen sijaan, että se lisäisi rivinvaihdon
         Salasana ei ole kelvollinen
         %1$s -> %2$s
    -
    -
         Media
         Oletuksena oleva pakkauksen määrä
         Valitse
    @@ -887,8 +862,6 @@
         Näytä muokkaushistoria
         Avaimen jakopyyntö
         Vahvistettu!
    -
    -
         Vahvistuspyyntö
         %s haluaa vahvistaa laitteesi
         Viesti-ilmoitusten säännöt
    @@ -898,7 +871,6 @@
         Taustasynkronointitila
         Ei taustasynkronointia
         Et saa ilmoituksia saapuvista viesteistä, kun sovellus on taustalla.
    -
         Jatkaaksesi sinun täytyy hyväksyä palvelun käyttöehdot.
         Et käytä mitään identiteettipalvelinta
         Näyttää, että yrität yhdistää toiseen kotipalvelimeen. Haluatko kirjautua ulos\?
    @@ -942,7 +914,6 @@
         Se on roskapostia
         Se on sopimaton
         Ei mitään
    -
         Optimoitu akunkestoa varten
         ${app_name} synkronoi taustalla laitteen rajallisia resursseja (akkua) säästäen.
     \nLaitteesi resurssien tilasta riippuen käyttöjärjestelmä saattaa lykätä synkronointia.
    @@ -1025,7 +996,6 @@
         Tämä sisältö on ilmiannettu epäsopivana. 
     \n 
     \nJos et halua nähdä enempää sisältöä tältä käyttäjältä, voit estää hänet piilottaaksesi hänen viestit.
    -
         Tämä ei ole kelvollinen Matrix-palvelimen osoite
         Jätä käyttäjä huomiotta
         Kaikki viestit (äänekäs)
    @@ -1222,7 +1192,6 @@
         Varmenna %s
         Varmennettu %s
         Odotetaan käyttäjää %s…
    -
         Huoneessa olevat viesti eivät ole salattu osapuolten välisellä salauksella.
         Huoneen viestit ovat salattu osapuolten välisellä salauksella.
     \n
    @@ -1674,8 +1643,6 @@
             Aktiivinen puhelu ·
             %1$d aktiivista puhelua ·
         
    -
    -
         Aktiivinen puhelu (%1$s)
         Numeronäppäimistö
         Ei vastausta
    @@ -1926,14 +1893,14 @@
         Puuttuvat oikeudet
         Avaruudet
         
    -        Vähintään %1$s valinta vaaditaan
    -        Vähintään %1$s valintaa vaaditaan
    +        Vähintään yksi vaihtoehto vaaditaan
    +        Vähintään %1$s vaihtoehtoa vaaditaan
         
         Kysymys ei voi olla tyhjä
         LUO KYSELY
    -    LISÄÄ VALINTA
    -    Valinta %1$d
    -    Luo valinnat
    +    LISÄÄ VAIHTOEHTO
    +    Vaihtoehto %1$d
    +    Luo vaihtoehdot
         Kysymys tai aihe
         Kyselyn kysymys tai aihe
         Luo kysely
    @@ -1954,4 +1921,66 @@
         Lähetä m.room.server_acl-tapahtumia
         Valitse kotipalvelin
         Ei nyt
    +    Palauta salaus
    +    lähettää lumisadetta ❄️
    +    lähettää konfettia 🎉
    +    🔐️ Liity seuraani ${app_name}-sovelluksessa
    +    Hei, juttele minulle ${app_name}-sovelluksessa: %s
    +    Kotipalvelimesi (%1$s) ehdottaa, että käytät palvelinta %2$s identiteettipalvelimenasi
    +    Odotetaan salaushistoriaa
    +    Sinulla ei ole pääsyä tähän viestiin, koska lähettäjä jätti avaimet tarkoituksella lähettämättä
    +    Sinulla ei ole pääsyä tähän viestiin, koska lähettäjä ei luota istuntoosi
    +    Sinulla ei ole pääsyä tähän viestiin, koska lähettäjä esti sinut
    +    Ei saatavilla
    +    Tapahtuma lähetetty!
    +    Odotetaan tätä viestiä, tässä voi kestää jonkin aikaa
    +    Sinulla ei ole pääsyä tähän viestiin
    +    %1$s antoi porttikiellon
    +    Äänestäjät näkevät tulokset heti äänestettyään
    +    
    +        Lopullinen tulos yhden äänen perusteella
    +        Lopullinen tulos %1$d äänen perusteella
    +    
    +    
    +        Yksi ääni annettu. Äänestä nähdäksesi tulokset
    +        %1$d ääntä annettu. Äänestä nähdäksesi tulokset
    +    
    +    Ääniä ei annettu
    +    
    +        Perustuen yhteen ääneen
    +        Perustuen %1$d ääneen
    +    
    +    
    +        yksi ääni
    +        %1$d ääntä
    +    
    +    Ääni annettu
    +    Kartta
    +    Jaa sijainti
    +    Sijainti
    +    Jaa sijainti
    +    Suljettu kysely
    +    Avoin kysely
    +    Kyselyn tyyppi
    +    Muokkaa kyselyä
    +    Poista kysely
    +    Lähetä tarra
    +    Lähetä kuvia ja videoita
    +    Avaa kamera
    +    Näytä viestikuplat
    +    Kartan lataaminen epäonnistui
    +    Jaa sijainti
    +    Luo kysely
    +    Jaa sijainti
    +    Näytä vähemmän
    +    Läpisalattu, puhelinnumeroa ei vaadita. Ei mainoksia tai tiedonlouhintaa.
    +    Valitse missä keskustelujasi säilytetään – sinä päätät ja olet riippumaton. Yhdistäjänä Matrix.
    +    Sinä päätät.
    +    Turvallista ja riippumatonta viestintää, joka on yhtä yksityistä kuin keskustelisit kasvokkain kotonasi.
    +    Viestintää tiimillesi.
    +    Turvallista viestintää.
    +    Pidä keskustelusi hallussasi.
    +    Yhdistä palvelimeen
    +    Minulla on jo tili
    +    Luo tili
     
    \ No newline at end of file
    
    From 9e828822a7d72cf15cf976e4f9d8a5866668b7ad Mon Sep 17 00:00:00 2001
    From: Glandos 
    Date: Sun, 6 Mar 2022 21:45:13 +0000
    Subject: [PATCH 041/152] Translated using Weblate (French)
    
    Currently translated at 99.9% (2156 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
    ---
     vector/src/main/res/values-fr/strings.xml | 86 ++++++++++++-----------
     1 file changed, 44 insertions(+), 42 deletions(-)
    
    diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
    index f56efb4ec3..6bae118e59 100644
    --- a/vector/src/main/res/values-fr/strings.xml
    +++ b/vector/src/main/res/values-fr/strings.xml
    @@ -39,7 +39,6 @@
         Invitation au salon
         Salon vide
         %1$s et %2$s
    -
         Synchronisation initiale :
     \nImportation du compte…
         Synchronisation initiale :
    @@ -217,7 +216,6 @@
         Supprimer
         Renommer
         Signaler le contenu
    -
         ou
         Inviter
         Se déconnecter
    @@ -368,7 +366,6 @@
         Nom du serveur d’accueil
         Tous les salons sur le serveur %s
         Tous les salons natifs sur %s
    -
         Veuillez décrire l’erreur. Qu’avez-vous fait \? Quel était le comportement attendu \? Que s’est-il réellement passé \?
         Afin de diagnostiquer les problèmes, les journaux de ce client seront envoyés avec ce rapport d’erreur. Ce rapport d’erreur, y compris les journaux et la capture d’écran, ne seront pas visibles publiquement. Si vous préférez envoyer le texte ci-dessus uniquement, veuillez décocher :
         Vous semblez secouer le téléphone avec agacement. Souhaitez-vous ouvrir soumettre un rapport d’anomalie \?
    @@ -377,26 +374,19 @@
         L’envoi du rapport d’anomalie a échoué (%s)
         Ceci ne ressemble pas à une adresse e-mail valide
         Cette adresse e-mail est déjà utilisée.
    -
         Ce serveur d’accueil souhaite s’assurer que vous n’êtes pas un robot
         L’adresse e-mail liée à votre compte doit être saisie.
         Impossible de vérifier l’adresse e-mail : assurez-vous d’avoir cliqué sur le lien dans l’e-mail
    -
         Trop de requêtes ont été envoyées
         Quitter
         Citer
         Le correspondant n’a pas décroché.
         Information
    -
    -
         ${app_name} a besoin d’accéder à votre microphone pour passer des appels audio.
    -
         ${app_name} a besoin d’accéder à votre appareil photo et à votre microphone pour passer des appels vidéo.
     \n
     \nVeuillez autoriser l’accès dans les prochaines fenêtres pour pouvoir effectuer l’appel.
    -
         Aller au premier message non lu
    -
         Voulez-vous vraiment quitter le salon \?
         Ignorer
         Afficher tous les messages de cet utilisateur
    @@ -413,11 +403,9 @@
         Le certificat n’est plus celui qui a été approuvé par votre téléphone. Ce comportement est INATTENDU. Il est recommandé de ne PAS ACCEPTER ce nouveau certificat.
         Le certificat n’est plus celui qui a été approuvé par votre téléphone. Le serveur a peut-être renouvelé son certificat. Contactez l’administrateur du serveur pour lui demander l’empreinte de son certificat.
         Acceptez le certificat uniquement si l’administrateur du serveur a publié une empreinte correspondant à celle ci-dessus.
    -
         Quand je suis invité sur un salon
         Paramètres utilisateur
         %1$s @ %2$s
    -
         Vérifiez votre e-mail et cliquez sur le lien qu’il contient. Une fois cela fait, cliquez sur continuer.
         Afficher tous les messages de %s \?
     \n
    @@ -426,14 +414,11 @@
         Uniquement les membres (à partir de l’activation de cette option)
         Uniquement les membres (depuis leur invitation)
         Ce sont des fonctionnalités expérimentales qui peuvent se comporter de façon inattendue. À utiliser avec précaution.
    -
         Exporter les clés vers un fichier local
    -
         Importer les clés à partir d’un fichier local
         Ne jamais envoyer de messages chiffrés aux sessions non vérifiées depuis cette session.
         Confirmez en comparant les informations suivantes avec les paramètres utilisateur dans votre autre session :
         Si elles ne correspondent pas, la sécurité de votre communication est peut-être compromise.
    -
         Interface utilisateur
         Langue
         Choisissez une langue
    @@ -508,7 +493,6 @@
         Motif : %1$s
         Badge
         Secouer avec agacement pour signaler une anomalie
    -
         
             %d membre
             %d membres
    @@ -518,13 +502,10 @@
             %d nouveaux messages
         
         Liste les membres
    -
    -
         
             %d message notifié non lu
             %d messages notifiés non lus
         
    -
         
             %d salon
             %d salons
    @@ -584,16 +565,10 @@
         La conversation continue ici
         Ce salon est la suite d’une autre conversation
         Cliquer ici pour voir les anciens messages
    -
    -
    -
    -
         
             %d sélectionné
             %d sélectionnés
         
    -
    -
         Alertes système
         contacter l’administrateur de votre service
         Ce serveur d’accueil a dépassé une de ses limites de ressources donc certains utilisateurs ne pourront pas se connecter.
    @@ -685,7 +660,6 @@
         ${app_name} n’est pas affecté par l’optimisation de la batterie.
         Si un utilisateur laisse un appareil débranché et immobile pour une longue durée, avec l’écran éteint, l’appareil entre en mode veille.. Cela empêche les applications d’accéder au réseau et reporte leurs tâches, synchronisations et alarmes standard.
         Ignorer l’optimisation
    -
         Aucun APK des services Google Play valide n’a été trouvé. Les notifications peuvent ne pas fonctionner correctement.
         Appel vidéo en cours…
         Sauvegarde de clé
    @@ -722,7 +696,6 @@
         Terminé
         Sauvegarder la clé de récupération
         Enregistrer dans un fichier
    -
         Veuillez en faire une copie
         Partager la clé de récupération avec…
         Génération de la clé de récupération utilisant la phrase secrète. Cette opération peut prendre plusieurs secondes.
    @@ -808,7 +781,6 @@
         Algorithme
         Signature
         Pour utiliser la sauvegarde de clés sur cette session, faites une restauration avec votre phrase secrète ou votre clé de récupération.
    -
         Traitement de la clé de récupération…
         Téléchargement des clés…
         Importation des clés…
    @@ -817,7 +789,6 @@
         Envoyer le message avec Entrée
         Le bouton Entrée sur le clavier logiciel enverra le message au lieu d’aller à la ligne
         Le mot de passe n’est pas valide
    -
         Média
         Compression par défaut
         Choisir
    @@ -854,8 +825,6 @@
         Ignorer
         Vérifié !
         Compris
    -
    -
         Demande de vérification
         %s veut vérifier votre session
         Erreur inconnue
    @@ -952,7 +921,6 @@
         Aucun
         Révoquer
         Déconnecter
    -
         Impossible de joindre le serveur d’accueil à cette URL, veuillez la vérifier
         Mode de synchronisation en arrière-plan
         Optimisé pour préserver la batterie
    @@ -963,7 +931,6 @@
     \nCela aura un impact sur l’utilisation des données mobiles et de la batterie, une notification permanente sera affichée indiquant que ${app_name} est à l’écoute des évènements.
         Aucune synchronisation en arrière-plan
         Vous ne serez pas notifié des messages entrants quand l’application est en arrière-plan.
    -
         Découverte
         Gérer vos paramètres de découverte.
         Vous n’utilisez aucun serveur d’identité
    @@ -1033,7 +1000,6 @@
         Ce contenu a été signalé comme inapproprié.
     \n
     \nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l’ignorer pour masquer ses messages.
    -
         Intégrations
         Utilisez un gestionnaire d’intégrations pour gérer les robots, les passerelles, les widgets et les jeux d’autocollants.
     \nLes gestionnaires d’intégrations reçoivent des données de configuration et peuvent modifier des widgets, envoyer des invitations de salon et définir des rangs à votre place.
    @@ -1249,7 +1215,6 @@
         Vérifier %s
         %s a été vérifié
         Nous attendons %s…
    -
         Les messages dans ce salon ne sont pas chiffrés de bout en bout.
         Les messages dans ce salon sont chiffrés de bout en bout.
     \n
    @@ -1395,7 +1360,6 @@
         Imprimez-le et conservez-le en lieu sûr
         Sauvegardez-le sur une clé USB ou un disque de sauvegarde
         Copiez-le sur votre stockage dans le cloud personnel
    -
         Chiffrement activé
         Les messages de ce salon sont chiffrés de bout en bout. Apprenez-en plus et vérifiez les utilisateurs sur leur profil.
         Chiffrement désactivé
    @@ -1779,7 +1743,6 @@
         Veuillez fournir une adresse de salon
         Cette adresse est déjà utilisée
         %1$d de %2$d
    -
         Autoriser
         Révoquer mon autorisation
         Vous avez donné votre autorisation pour envoyer des e-mails et des numéros de téléphone à ce serveur d’identité pour découvrir d\'autres utilisateurs à partir de vos contacts.
    @@ -1858,8 +1821,6 @@
         Transférer
         Rejoindre
         Consulter d’abord
    -
    -
         Appel en cours (%1$s)
         Il y a eu une erreur lors de la recherche du numéro de téléphone
         Pavé de numérotation
    @@ -2060,7 +2021,7 @@
         Moi et mon équipe
         Un espace privé pour organiser vos salons
         Seulement moi
    -    Assurez-vous que les accès à %s sont accordés aux bonnes personnes. Vous pourrez changer ceci plus tard.
    +    Assurez-vous que les bonnes personnes ont accès à %s.
         Avec qui travaillez-vous \?
         Pour rejoindre un espace existant, il vous faut une invitation.
         Le fichier est trop volumineux pour être envoyé.
    @@ -2112,7 +2073,6 @@
         Ajouter un nouveau serveur
         Votre serveur
         Consultation de %1$s
    -
         Désolé, une erreur est survenue en essayant de rejoindre %s
         Adresse de l’espace
         Afficher et gérer les adresses de cet espace.
    @@ -2313,7 +2273,6 @@
         Question ou sujet du sondage
         Créer un sondage
         Sondage
    -
         Envoyer des courriels et des numéros de téléphone à %s
         Vos contacts sont personnels et privés. Pour découvrir des utilisateurs à partir de vos contacts, nous avons besoin de votre permission pour envoyer les informations des contacts à votre serveur d’identité.
         La session a été déconnectée !
    @@ -2413,4 +2372,47 @@
         Communication indépendante et sécurisée qui vous donne le même niveau d\'intimité qu\'une discussion face-à-face dans votre maison.
         Localisation
         Le chiffrement a été mal configuré ce qui vous empêche d\'envoyer des messages. Cliquez pour ouvrir les paramètres.
    +    Notification du salon
    +    Utilisateurs
    +    Notifier tout le salon
    +    
    +        %1$d de plus
    +        %1$d de plus
    +    
    +    Réduire
    +    Afficher les messages en bulles
    +    Impossible de charger la carte
    +    Carte
    +    Note : l’application sera redémarrée
    +    Activer les messages en fils de discussion
    +    Se connecter au serveur
    +    Vous cherchez à joindre un serveur existant \?
    +    passer cette question
    +    Pas encore sûr \? Vous pouvez %s
    +    Communautés
    +    Équipes
    +    Famille et amis
    +    Nous allons vous aider à vous connecter.
    +    À qui allez-vous le plus parler \?
    +    Vous êtes déjà en train de voir ce fil de discussion !
    +    Voir dans le salon
    +    Répondre dans le fil de discussion
    +    La commande « %s » est connue mais non supportée dans les fils de discussion.
    +    Depuis un fil de discussion
    +    Indice : Appui long sur un message puis « %s ».
    +    Les fils de discussion vous permettent de centrer vos conversations sur un sujet, et de les suivre facilement.
    +    Gardez vos conversations organisées avec les fils de discussion
    +    Affiche tous les fils de discussion auxquels vous avez participé
    +    Mes fils de discussion
    +    Affiche tous les fils de discussion du salon actuel
    +    Tous les fils de discussion
    +    Filtrer
    +    Fils de discussion
    +    Fil de discussion
    +    Filtrer les fils de discussion du salon
    +    %1$s, %2$s et d’autres
    +    %1$s et %2$s
    +    Copier le lien du fil de discussion
    +    Voir dans le salon
    +    Voir les fils de discussions
     
    \ No newline at end of file
    
    From 8b7606bd203ec1aa988ca862bf71f1aa92260faf Mon Sep 17 00:00:00 2001
    From: notramo 
    Date: Mon, 7 Mar 2022 20:27:43 +0000
    Subject: [PATCH 042/152] Translated using Weblate (Hungarian)
    
    Currently translated at 99.8% (2154 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/
    ---
     vector/src/main/res/values-hu/strings.xml | 28 +++++++++++------------
     1 file changed, 14 insertions(+), 14 deletions(-)
    
    diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
    index 000da846b8..f189a4198f 100644
    --- a/vector/src/main/res/values-hu/strings.xml
    +++ b/vector/src/main/res/values-hu/strings.xml
    @@ -1562,7 +1562,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Szoba beállításainak módosítása sikeres
         Nem érheted el ezt az üzenetet
         Várakozás erre az üzenetre, ez eltarthat egy darabig
    -    A végpontok közötti titkosítás miatt lehet hogy várnod kell, hogy valaki üzenet megérkezzen, mert a titkosítási kulcsok nem lettek megfelelően elküldve neked.
    +    A végpontok közötti titkosítás miatt lehet hogy várnod kell, hogy valaki üzenetét el tudd olvasni, mert a titkosítási kulcsok nem lettek megfelelően elküldve neked.
         Nem érheted el ezt az üzenetet, mert a küldő letiltott
         Nem érheted el ezt az üzenetet, mert a feladó nem bízik a munkamenetedben
         Nem érheted el ezt az üzenetet, mert a feladó szándékosan nem küldte el a kulcsokat
    @@ -1829,7 +1829,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Én és a csoporttársaim
         Privát tér a szobáid csoportosításához
         Csak én
    -    Ellenőrizd, hogy a megfelelő személyeknek van hozzáférése ide: %s.
    +    Ellenőrizd, hogy a megfelelő személyeknek van hozzáférésük ehhez: %s.
         Csak az olvasatlan üzenetek számát mutassa az egyszerű értesítésekben.
         Kivel dolgozol együtt\?
         Létező térbe való belépéshez meghívó szükséges.
    @@ -2376,25 +2376,25 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Térkép betöltése sikertelen
         Térkép
         Figyelem: az alkalmazás újraindul
    -    Üzenetszálak engedélyezése
    +    Üzenetszálak bekapcsolása
         Szerverhez csatlakozás
    -    Csatlakoznál egy már meglévő szerverhez\?
    -    kérdés kihagyása
    -    Még nem vagy biztos\? Tudhatsz ilyent: %s
    +    Csatlakoznál egy meglévő szerverhez\?
    +    Kihagyhatod ezt a kérdést.
    +    Még nem tudod\? %s
         Közösségek
         Csoportok
         Barátok és család
         Segítünk a kapcsolatteremtésben.
    -    Kivel beszélgetnék leginkább\?
    -    Már nézed ezt az üzenetszálat!
    +    Kikkel fogsz legtöbbet beszélgetni\?
    +    Jelenleg ezt az üzenetszálat olvasod!
         Megjelenítés szobában
    -    Válasz az üzenetszálban
    +    Válasz üzenetszálban
         „%s” parancs ismert, de üzenetszálban nem támogatott.
    -    Az üzenetszálból
    -    Tipp: Koppints hosszan az üzenetre és használd ezt: %s.
    +    Egy üzenetszálból
    +    Tipp: Koppints hosszan az üzenetre és használd a \"%s\" opciót.
         Az üzenetszálak segítenek a különböző témájú beszélgetések figyelemmel kísérésében.
    -    Beszélgetések üzenetszálakba való rendezése
    -    Minden üzenetszál megjelenítése ahol szerepel
    +    Beszélgetések üzenetszálakba rendezése
    +    Minden üzenetszál megjelenítése, ahová üzenetet küldtél
         Üzenetszálaim
         A szobában lévő összes szál mutatása
         Minden üzenetszál
    @@ -2417,6 +2417,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
             %d szerver jogosultság változott
             %d szerver jogosultság változott
         
    -    %1$s, %2$s és még mások
    +    %1$s, %2$s és mások
         %1$s és %2$s
     
    \ No newline at end of file
    
    From e6d81b3a7712e6ad27c673cd4700ec3746344d6c Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Mon, 7 Mar 2022 06:14:01 +0000
    Subject: [PATCH 043/152] Translated using Weblate (Japanese)
    
    Currently translated at 98.6% (2128 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/
    ---
     vector/src/main/res/values-ja/strings.xml | 114 +++++++++++-----------
     1 file changed, 58 insertions(+), 56 deletions(-)
    
    diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
    index c1f3304fb8..e87e5653ca 100644
    --- a/vector/src/main/res/values-ja/strings.xml
    +++ b/vector/src/main/res/values-ja/strings.xml
    @@ -139,8 +139,8 @@
         メールアドレスを追加
         電話番号を追加
         通知音
    -    このアカウントで通知を許可
    -    このセッションで通知を許可
    +    このアカウントでは通知を有効にする
    +    このセッションでは通知を有効にする
         1対1のチャットでのメッセージ
         グループチャットでのメッセージ
         ルームへ招待されたとき
    @@ -219,7 +219,7 @@
         送信
         このホームサーバーは、あなたがロボットではないことの確認を求めています
         アカウントに登録されたメールアドレスの入力が必要です。
    -    メールアドレスの確認に失敗しました:電子メールのリンクをクリックしたことを確認してください
    +    メールアドレスの認証に失敗しました:電子メールのリンクをクリックしたことを確認してください
         不正な形式のJSON
         有効なJSONを含んでいませんでした
         ログイン要求が多すぎます
    @@ -273,14 +273,14 @@
         発言を通報
         写真を撮影
         動画を撮影
    -    検証を開始
    +    認証を開始
         リクエストにuser_idがありません。
         リクエストにroom_idがありません。
         リクエストの送信に失敗しました。
         ウィジェットを作成できません。
         ウィジェットをこのルームから削除してもよろしいですか?
    -    一致していない場合は、あなたのコミュニケーションの安全性が損なわれている可能性があります。
    -    このセッションでは、未検証のセッションに対して暗号化されたメッセージを送信しない。
    +    一致していない場合は、コミュニケーションのセキュリティーが破られている可能性があります。
    +    このセッションでは、未認証のセッションに対して暗号化されたメッセージを送信しない。
         認証済のセッションに対してのみ暗号化
         インポート
         ローカルファイルから鍵をインポート
    @@ -300,7 +300,7 @@
         信用する
         信用しない
         フィンガープリント(%s):
    -    リモートサーバーのIDを確認できませんでした。
    +    リモートサーバーのIDを認証できませんでした。
         誰かが不当にあなたの通信を傍受しているか、あなたの電話がリモートサーバーの証明書を信用していない可能性があります。
         サーバーの管理者が、これは想定されていることであると言っているのであれば、以下のフィンガープリントが、管理者によるフィンガープリントと一致していることを確認してください。
         証明書はあなたの電話により信頼されていたものから変更されています。これはきわめて異常な事態です。この新しい証明書を承認しないことを強く推奨します。
    @@ -420,7 +420,7 @@
         アカウントを停止するときに、自分の送信した全てのメッセージの履歴を消去してください(警告: この操作により、今後のユーザーは会話を不完全な形で見ることになります)
         アカウントを停止
         パスワードを入力してください。
    -    このルームは交換されており、使用されていません。
    +    このルームは置き換えられており、アクティブではありません。
         こちらから継続中の会話を確認
         このルームは別の会話の続きです
         以前のメッセージを見るには、ここをクリックしてください
    @@ -438,7 +438,7 @@
         %1$s:%2$s
         %d+
         展開
    -    畳む
    +    折りたたむ
         承諾
         このホームサーバーの方針を確認し承諾してください:
         通話設定画面
    @@ -569,7 +569,7 @@
         
             %d件のアクティブなセッション
         
    -    このログインを検証
    +    このログインを認証
         QRコード
         はい
         いいえ
    @@ -580,7 +580,7 @@
         削除の確認
         このイベントを削除してよろしいですか?ルーム名や説明の変更を削除すると、変更が取り消されますのでご注意ください。
         暗号化は有効です
    -    このルーム内でのメッセージはエンドツーエンド暗号化されます。詳細の確認や検証はユーザーのプロフィールをご確認ください。
    +    このルーム内でのメッセージはエンドツーエンド暗号化されます。詳細の確認や認証はユーザーのプロフィールをご確認ください。
         暗号化が有効になっていません
         通知設定
         切断
    @@ -657,7 +657,7 @@
         招待されています
         %sからの招待
         概ね完了しました。%sの画面にも同じシールドアイコンが表示されていますか?
    -    相手ユーザーの端末のコードをスキャンし、相互に安全性を検証
    +    相手ユーザーの端末のコードをスキャンし、相互に安全性を認証
         相手のコードをスキャン
         スキャンできません
         拒否
    @@ -1147,10 +1147,10 @@
     \nセッション名:%1$s
     \n最後のオンライン日時:%2$s
     \n新たにログインして新しいセッションを開始しなかった場合、この要求を無視してください。
    -    未認証のセッションが暗号鍵を要請しています。
    +    未認証のセッションが暗号鍵を要求しています。
     \nセッション名:%1$s
     \n最後のオンライン日時:%2$s
    -\n新たにログインして新しいセッションを開始しなかった場合、この要求を無視してください。
    +\n新しいセッションにログインしていない場合、この要求を無視してください。
         鍵の共有リクエスト
         カスタムカメラ画面の代わりにシステムカメラを使用します。
         使用中のウィジェットがありません
    @@ -1326,7 +1326,7 @@
         会話
         未読メッセージはありません
         未読はありません!
    -    %sがセッションの検証を要求しています
    +    %sがセッションの認証を要求しています
         リトライ
         他のホームサーバーに接続しようとしているようですね。サインアウトしますか?
         IDサーバーを使用していません
    @@ -1334,7 +1334,7 @@
         このルームを含む参加済のスペース
         このルームにアクセスできるスペースを決定します。スペースが選択されると、そのメンバーはルーム名を見つけて参加できます。
         了解
    -    完了しました!
    +    完了しました!
         メッセージの新しい鍵
         暗号化されたメッセージを決して失わないために
         セキュアバックアップ
    @@ -1477,7 +1477,7 @@
         スパムとして報告済
         このルームにファイルはありません
         このルームにメディアはありません
    -    公開されたルームをアップグレード
    +    公開ルームをアップグレード
         非公開スペース
         公開スペース
         送信済
    @@ -1566,7 +1566,7 @@
         有効にする
         あなたのIDサーバーの運営方針
         新しいルームを作成
    -    認証コードが正しくありません。
    +    確認コードが正しくありません。
         IDサーバーのURLを入力してください
         名前、ID、メールアドレスで検索
         システムの設定
    @@ -1667,7 +1667,7 @@
         イベントを送信しました!
         送信に失敗した全てのメッセージを削除
         失敗しました
    -    公開されたルーム
    +    公開ルーム
         アバターを削除
         アバターを変更
         かけ直す
    @@ -1705,7 +1705,7 @@
         ユーザーを招待しています…
         パスワードを選択してください。
         メンバーを追加
    -    ログインを検証
    +    ログインを認証
         メッセージを送る…
         このファイルは大きすぎてアップロードできません。
         この情報の送信に同意しますか?
    @@ -1838,7 +1838,7 @@
         一般
         転送
         信頼済
    -    検証済
    +    認証済
         未送信のメッセージを削除
         カスタムイベントを送信
         ルームの状態を探索
    @@ -1857,7 +1857,7 @@
         
             %1$d個の投票があります。結果を見るには投票してください
         
    -    未検証の端末で暗号化
    +    未認証の端末で暗号化
         メッセージを紙吹雪と共に送る
         メッセージを降雪と共に送る
         紙吹雪🎉を送る
    @@ -1954,7 +1954,7 @@
         パスワードはまだ変更されていません。
     \n
     \n変更作業を中止しますか?
    -    %1$sに認証メールを送信しました。
    +    %1$sに確認メールを送信しました。
         メールボックスを確認してください
         サインインに戻る
         元の大きさのままメディアファイルを送信
    @@ -1968,18 +1968,18 @@
         認証の要求
         %sがキャンセルしました
         既読
    -    検証
    +    認証
         メールアドレスが正しくないようです
         国際電話番号の形式を使用してください。
         国際電話番号は「+」から始まる必要があります
         コードを%1$sに送信しました。以下に入力して認証してください。
         このメールアドレスはどのアカウントにも登録されていません
         パスワードを変更すると、全てのセッションでのエンドツーエンド暗号鍵がリセットされ、暗号化されたメッセージ履歴が読めなくなります。パスワードを再設定する前に、鍵のバックアップを設定するか、他のセッションからルームの鍵をエクスポートしておいてください。
    -    パスワードの再設定を確認するために認証メールを送信します。
    -    このメールアドレスはどのアカウントにも属していません。
    -    このアプリではこのホームサーバーにアカウントを作成できません。
    +    パスワードの再設定を確認するために確認メールを送信します。
    +    このメールアドレスはどのアカウントにも登録されていません。
    +    このアプリでは、このホームサーバーにアカウントを作成できません。
     \n
    -\nウェブクライエントを使用してアカウント登録しますか?
    +\nウェブクライアントを使用してアカウントを作成しますか?
         申し訳ありませんが、このサーバーはアカウントの新規登録を受け入れていません。
         このアプリではこのホームサーバーにサインインできません。このホームサーバーは次のサインインの方法に対応しています:%1$s
     \n
    @@ -2037,11 +2037,11 @@
         セキュリティーキーを保存
         位置情報を共有しました
         %sでリアクションしました
    -    検証終了
    +    認証が完了しました
         次のいずれかのセキュリティーが破られている可能性があります。
     \n
     \n - あなたのホームサーバー
    -\n - 検証している相手のホームサーバー
    +\n - 認証している相手が接続しているホームサーバー
     \n - あなたか相手のインターネット接続
     \n - あなたか相手の端末
         セキュアではない
    @@ -2130,23 +2130,23 @@
         ナビゲーションのメニューを開く
         承諾しました
         %sが承諾しました
    -    %sが検証済み
    -    %sを検証する
    -    絵文字を比較して検証
    -    絵文字を比較して検証
    +    %sが認証済
    +    %sを認証する
    +    絵文字を比較して認証
    +    絵文字を比較して認証
         対面でない場合は、代わりに絵文字を比較してください
         あなたのホームサーバーで許容されている添付ファイルの最大サイズは%sです。
         新しいパスワードを確認するには下記のリンクを開いてください。リンクにアクセスしてから、以下をクリックしてください。
         PINコードを再設定するには「PINコードを忘れた」をタップしてログアウトし、その後再設定してください。
         
    -        いま検証できる%d個の端末を表示
    +        いま認証できる%d個の端末を表示
         
         この操作を実行するには ${app_name}に認証情報を入力する必要があります。
         あなただけが知っている秘密のパスワードを入力してください。バックアップ用にセキュリティーキーを生成します。
    -    暗号化されたメッセージにアクセスするには、ログインを検証し、本人確認を行う必要があります。
    -    暗号化されたメッセージにアクセスするには、あなたの他のセッションからログインを検証し、本人確認を行う必要があります。
    +    暗号化されたメッセージにアクセスするには、ログインを認証し、本人確認を行う必要があります。
    +    暗号化されたメッセージにアクセスするには、あなたの他のセッションからログインを認証し、本人確認を行う必要があります。
         詳しく知る
    -    セキュリティーを高めるために、使い捨てコードが一致しているのを確認して、%sを検証しましょう。
    +    セキュリティーを高めるために、使い捨てコードが一致しているのを確認して、%sを認証しましょう。
         暗号化の設定が正しくありません。
         暗号化を復元
         暗号化を有効な状態に取り戻すために、管理者に連絡してください。
    @@ -2163,12 +2163,12 @@
         完了!
         アカウントパスワードと違うものにしてください。
         続行するには%sを入力してください。
    -    検証を中止しました
    -    今中止すると、%1$s(%2$s)を検証しません。検証は相手のユーザープロフィール画面からもう一度開始できます。
    +    認証を中止しました
    +    今中止すると、%1$s(%2$s)を認証しません。認証は相手のユーザープロフィール画面からもう一度開始できます。
         中止すると、新しい端末では暗号化されたメッセージが読めず、他のユーザーに信頼されません
         中止すると、この端末では暗号化されたメッセージが読めず、他のユーザーに信頼されません
         自分ではない
    -    新しいセッションを検証して、暗号化されたメッセージにアクセスできるようにしましょう。
    +    新しいセッションを認証して、暗号化されたメッセージにアクセスできるようにしましょう。
         新しいログイン。あなたですか?
         ${app_name} Android
         ルームの管理者によって削除されています。理由:%1$s
    @@ -2180,9 +2180,9 @@
     \n
     \n予期しないトラブルを起こす可能性があるので注意してください。
         %1$s(%2$s)が新しいセッションでサインインしました:
    -    このセッションは%1$s(%2$s)によって検証されているので、メッセージのセキュリティは信頼できます。
    -    既存のセッションでこのセッションを検証して、暗号化されたメッセージへアクセスできるようにしましょう。
    -    あなたはこのセッションを検証しているので、メッセージのセキュリティは信頼できます。
    +    このセッションは%1$s(%2$s)によって認証されているので、メッセージのセキュリティは信頼できます。
    +    既存のセッションでこのセッションを認証して、暗号化されたメッセージへアクセスできるようにしましょう。
    +    あなたはこのセッションを認証しているので、メッセージのセキュリティは信頼できます。
         利用可能な暗号情報がありません
         既定のバージョン
         非公開のルームとダイレクトメッセージにおけるエンドツーエンド暗号化は、あなたのサーバーの管理者により既定として無効にされています。
    @@ -2198,7 +2198,7 @@
         あと少しです!確認を待機しています…
         あと少しです!もう一方のデバイスは同じマークを表示していますか?
         %sを待機しています…
    -    このユーザーがこのセッションを検証するまで、送受信されるメッセージには警告マークが付きます。手動で検証することも可能です。
    +    このユーザーがこのセッションを認証するまで、送受信されるメッセージには警告マークが付きます。手動で認証することも可能です。
         セッションの取得に失敗しました
         誰がチームの仲間ですか?
         %sを探索できるようになります
    @@ -2228,7 +2228,7 @@
         再認証が必要です
         全てリセット
         連絡先
    -    検証をキャンセルしました。あらためて開始してください。
    +    認証をキャンセルしました。あらためて開始してください。
         押し続けて録音し、離すと送信
         PINコードを設定してください
         
    @@ -2237,9 +2237,9 @@
         置き換えられたルームに参加
         このルームが発見できません。存在することを確認してください。
         指紋や顔画像など、端末に固有の生体認証を有効にする。
    -    絵文字で検証
    -    テキストで検証
    -    すべてのセッションを検証し、アカウントとメッセージが安全であることを確認してください
    +    絵文字で認証
    +    テキストで認証
    +    すべてのセッションを認証し、アカウントとメッセージが安全であることを確認してください
         ログインしている場所を確認
         復旧用の手段を全て無くしてしまいましたか?全てリセットする
         クロス署名に対応した他のMatrixのクライアントでも使用できます。
    @@ -2282,12 +2282,12 @@
     \n
     \n続行してよろしいですか?
         このリンクを再確認してください
    -    ログインを検証してください:%1$s
    +    ログインを認証してください:%1$s
         機密ストレージのアクセスに失敗しました
         この設定を有効にすると、全てのアクティビティーにFLAG_SECUREを追加します。変更を有効にするにはアプリケーションの再起動が必要です。
         このアカウントは無効化されています。
    -    個人のクラウドストレージにコピーしましょう
    -    印刷して安全な場所に保管しましょう
    +    個人用のクラウドストレージにコピー
    +    印刷して安全な場所に保管
         %2$sと%1$sが設定されました。
     \n
     \n安全な場所で保管してください!それらは、アクティブなセッションを全て失ってしまった際、暗号化されたメッセージや安全な情報のロックを解除するために必要となります。
    @@ -2300,7 +2300,7 @@
         PINコードでしか${app_name}のロックを解除することはできません。
         ${app_name}を開く際には、毎回PINコードの入力が必要です。
         あなたがブロックされているルームを開くことはできません。
    -    PINコードの検証に失敗しました。新しいコードを入力してください。
    +    PINコードの認証に失敗しました。新しいコードを入力してください。
         端末の連絡先がありません
         暗号化の履歴を待機しています
         送信者があなたのセッションを信頼していないため、このメッセージにアクセスすることができません
    @@ -2318,8 +2318,8 @@
         絵文字の一覧を開く
         認証に失敗しました
         復旧を設定しています。
    -    このセッションは、他のセッションと検証を共有することができません。
    -\n検証は端末に保存され、新しいバージョンのアプリで共有されます。
    +    このセッションは、他のセッションと認証を共有することができません。
    +\n認証は端末に保存され、新しいバージョンのアプリで共有されます。
         %1$s、%2$s他
         %1$sと%2$s
         自分と相手を認証して、チャットを安全に保ちましょう
    @@ -2331,7 +2331,7 @@
         音声通話が拒否されました
         %1$sは通話を拒否しました
         このデバイスを認証可能な他の端末が全くない場合にのみ、続行してください。
    -    このセッションを信頼済として検証すると、暗号化されたメッセージにアクセスすることができます。このアカウントにサインインしなかった場合は、あなたのアカウントのセキュリティーが破られている可能性があります:
    +    このセッションを信頼済として認証すると、暗号化されたメッセージにアクセスすることができます。このアカウントにサインインしなかった場合は、あなたのアカウントのセキュリティーが破られている可能性があります:
         アカウントのセキュリティーが破られている可能性があります
         選択したスペースに追加
         最新の${app_name}は他のデバイスでも使用できます:
    @@ -2340,4 +2340,6 @@
         メールアドレスで招待したり、連絡先を検索したりできます…
         鍵のバックアップの機密情報をSSSSに保存しています
         あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。
    +    詳細を非表示
    +    他の参加者はいません。%sに招待しましょう。
     
    \ No newline at end of file
    
    From e1c61e3e309566e643a3e20240ad3fc4c8ae2188 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?=
     
    Date: Fri, 4 Mar 2022 02:24:21 +0000
    Subject: [PATCH 044/152] Translated using Weblate (Portuguese (Brazil))
    
    Currently translated at 100.0% (2157 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/
    ---
     vector/src/main/res/values-pt-rBR/strings.xml | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
    index b9e2fa3791..cd237407d2 100644
    --- a/vector/src/main/res/values-pt-rBR/strings.xml
    +++ b/vector/src/main/res/values-pt-rBR/strings.xml
    @@ -1414,7 +1414,7 @@
         Quase lá! %s está mostrando um tick (✓)\?
         Sim
         Não
    -    Conectividade ao servidor tem sido perdida
    +    A conexão com o servidor foi perdida
         Modo avião está ligado
         Ferramentas Dev
         Dados de Conta
    @@ -2107,7 +2107,7 @@
             %d chamadas de vídeo perdidas
         
         
    -        Chamadad de áudio perdida
    +        Chamada de áudio perdida
             %d chamadas de áudio perdidas
         
         Por favor note que fazer upgrade vai fazer uma nova versão da sala. Todas as mensagens atuais vão permanecer nesta sala arquivada.
    
    From 37bbaa983f0687616298071e7e4a7f9879ac1a04 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Peter=20V=C3=A1gner?= 
    Date: Mon, 7 Mar 2022 22:22:00 +0000
    Subject: [PATCH 045/152] Translated using Weblate (Slovak)
    
    Currently translated at 99.3% (2143 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
    ---
     vector/src/main/res/values-sk/strings.xml | 9 ++++++++-
     1 file changed, 8 insertions(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 3ea0dc14a8..410939ef62 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2423,7 +2423,7 @@
         Udalosť vymazaná používateľom, dôvod: %1$s
         Dôvod úpravy
         ${app_name} sa stretol s problémom pri vykresľovaní obsahu udalosti s id \'%1$s\'
    -    Reagoval/a s: %s
    +    Reagoval/a: %s
         ${app_name} môže padať častejšie, keď sa vyskytne neočakávaná chyba
         Zadajte adresu servera, ktorý chcete použiť
         Vlastné hlásenie…
    @@ -2445,4 +2445,11 @@
         Zaškrtnuté
         Rozpísaná správa
         Otvoriť navigačnú ponuku
    +    Videli
    +    
    +        %1$d ďalšia
    +        %1$d ďalšie
    +        %1$d ďalších
    +    
    +    Zadajte URL adresu servera Modular Element alebo adresu servera, ktorý si želáte použiť
     
    \ No newline at end of file
    
    From 4d0cde6fb9413c90137b60d032e365e5a79fda58 Mon Sep 17 00:00:00 2001
    From: Jozef Gaal 
    Date: Mon, 7 Mar 2022 22:18:58 +0000
    Subject: [PATCH 046/152] Translated using Weblate (Slovak)
    
    Currently translated at 99.3% (2143 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
    ---
     vector/src/main/res/values-sk/strings.xml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 410939ef62..8d97ff7266 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2439,7 +2439,7 @@
         %1$s a %2$s
         Pokračovať pomocou jednotného prihlásenia SSO
         jednotné prihlásenie SSO
    -    Zatvoriť výzvu zálohovanie kľúčov
    +    Zatvoriť výzvu na zálohovanie kľúčov
         Výťazná odpoveď
         Nezaškrtnuté
         Zaškrtnuté
    
    From d8f8d4a40c084c7deb373b772246ac3411459d70 Mon Sep 17 00:00:00 2001
    From: notramo 
    Date: Mon, 7 Mar 2022 20:38:25 +0000
    Subject: [PATCH 047/152] Translated using Weblate (Hungarian)
    
    Currently translated at 98.0% (50 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/
    ---
     .../android/hu-HU/full_description.txt        | 61 +++++++++----------
     .../android/hu-HU/short_description.txt       |  2 +-
     fastlane/metadata/android/hu-HU/title.txt     |  2 +-
     3 files changed, 32 insertions(+), 33 deletions(-)
    
    diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt
    index 899b4cd978..0791eed7ba 100644
    --- a/fastlane/metadata/android/hu-HU/full_description.txt
    +++ b/fastlane/metadata/android/hu-HU/full_description.txt
    @@ -1,43 +1,42 @@
    -Element egy biztonságos üzenetküldő és csapatmunka támogató alkalmazás ami ideális távoli munkavégzés közben csoportos csevegéshez. Az alkalmazás végpontok közötti titkosítást használ videó konferenciához, fájl megosztáshoz és videó hivásokhoz.
    +Az Element egy biztonságos üzenetküldő, és egy csapatmunka app, amely távoli munkavégzéshez is alkalmas lehet. Az alkalmazás végponti titkosítás használatával biztosít videó konferencia, fájlmegosztás, és audio hívás lehetőségeket.
     
    -Element tulajdonságai:
    -- Fejlett online kommunikációs eszköz
    -- Teljesen titkosított üzenetküldés biztonságos céges kommunikációt kínál még a távdolgozóknak is
    -- Elosztott csevegés a Matrix nyílt forráskódú keretrendszer felhasználásával
    -- Bizontságos fájl megosztás titkosítottan projektek kezeléséhez
    -- Videó hívás VoIP-pal és képernyőmegosztással
    -- Könnyen integrálható a kedvenc online kollaborációs eszközöddel, projekt menedzsment eszközzel, VoIP szolgáltatással vagy más csoport üzenetküldő alkalmazással
    +Az Element funkciói többek között:
    +- Fejlett online kommunikációs eszközök
    +- Titkosított üzenetek a biztonságos céges kommunikációhoz, otthonról dolgozóknak is
    +- Decentralizált chat a nyílt forráskódú Matrix protokoll használatával
    +- Biztonságos fájlmegosztáss a projektek kezeléséhez
    +- Videochat, VoIP, és képernyőmegosztási lehetőséggel 
    +- Egyszerű integráció a kedvenc online kollaborációs eszközeiddel, projektkezelési eszközökkel, VoIP szolgáltatásokkal, és más csoportos üzenetküldő alkalmazásokkal
     
    -Element teljesen más mint a többi üzenetküldő alkalmazás. Matrixot használ, egy nyílt hálózatot a decentralizált biztonságos kommunikációhoz. Lehetőséget ad saját szerver üzemeltetésére ami maximális tulajdont és kontrollt biztosít az adatok fölött.
    +Element is completely different from other messaging and collaboration apps. It operates on Matrix, an open network for secure messaging and decentralized communication. It allows self-hosting to give users maximum ownership and control of their data and messages.
     
    -Magánélet védelme és titkosított üzenetküldés
    -Element megóv a kéretlen hirdetésektől, adatbányászattól és a különböző szigetszerű megoldásoktól. Minden adatot biztonságba helyez, egy az egybe videó és hang kommunikáció végpontok között titkosítva ahol az eszközök hitelesítve vannak.
    +Privacy and encrypted messaging
    +Element protects you from unwanted ads, data mining and walled gardens. It also secures all your data, one-to-one video and voice communication through end-to-end encryption and cross-signed device verification.
     
    -Element a kezedbe adja az adatvédelmi irányítást miközben bárkivel kommunikálhatsz a Matrix hálózatban vagy más üzleti kollaborációs eszközzel ami integrálva van, mint amilyen a Slack.
    +Element gives you control over your privacy while allowing you to communicate securely with anyone on the Matrix network, or other business collaboration tools by integrating with apps such as Slack.
     
    -Element futtatható saját szerveren
    +Element can be self-hosted
    +To allow more control of your sensitive data and conversations, Element can be self-hosted or you can choose any Matrix-based host - the standard for open source, decentralized communication. Element gives you privacy, security compliance and integration flexibility.
     
    -Azért, hogy az érzékeny adatok és beszélgetések minnél inkább az irányításod alatt lehessen az Elementet saját magadnak üzemeltetheted vagy választhatsz bármely Matrixon alapuló - szabványos nyílt forráskódú és decentralizált kommunikáció - szoláltató közül. Element adatvédelmet, biztonságot és rugalmas integrációkat biztosít.
    +Own your data
    +You decide where to keep your data and messages. Without the risk of data mining or access from third parties.
     
    -A te adatod a tiéd
    -Te döntöd el, hogy hol tárolod az adataidat és üzeneteidet. Adatbányászat vagy harmadik fél hozzáférésének kockázata nélkül.
    +Element puts you in control in different ways:
    +1. Get a free account on the matrix.org public server hosted by the Matrix developers, or choose from thousands of public servers hosted by volunteers
    +2. Self-host your account by running a server on your own IT infrastructure
    +3. Sign up for an account on a custom server by simply subscribing to the Element Matrix Services hosting platform
     
    -Element többféle képpen adja vissza az irányítást:
    -1. Szerezz egy ingyenes hozzáférést a matrix.org nyilvános szerverre amit a Matrix fejlesztők üzemeltetnek vagy válassz a több ezer önkéntesek által üzemeltetett nyilvános szerverből 
    -2. Üzemeltess szerver magadnak a saját infrastruktúrádon
    -3. Iratkozz fel egy egyedi szerverre az Element Matrix Services platformon
    +Open messaging and collaboration
    +You can chat with anyone on the Matrix network, whether they’re using Element, another Matrix app or even if they are using a different messaging app.
     
    -Nyílt üzenetküldés és kollaboráció
    -Bárkivel beszélgethetsz a Matrix hálózaton, akár az Elementet használja akár egy másik Matrix alkalmazást használ vagy akár egy eltérő üzenetküldőt. 
    +Super secure
    +Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signed device verification.
     
    -Fantasztikusan biztonságos
    -Igazi végpontok között titkosítás (csak a beszélgetésben résztvevők tudják visszafejteni) és hitelesítés eszközök közötti aláírásokkal.
    +Complete communication and integration
    +Messaging, voice and video calls, file sharing, screen sharing and a whole bunch of integrations, bots and widgets. Build rooms, communities, stay in touch and get things done.
     
    -Teljes kommunikáció és integráció
    -Üzenetküldés, hang és videóhívás, fájl megosztás, képernyő megosztás és egy csomó integráció, botok és kisalkalmazások. Építs szobákat, közösségeket, maradj kapcsolatban és végezz el dolgokat.
    +Pick up where you left off
    +Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io
     
    -Vedd fel a fonalat
    -Maradj kapcsolatban bárhol minden eszközödön a szinkronizált üzenetekkel és a weben a https://app.element.io oldallal
    -
    -Nyílt forráskód
    -Element Android egy nyílt forráskódú projekt a GitHubon. Küldj hibajegyet és/vagy vegyél részt a fejlesztésében itt: https://github.com/vector-im/element-android
    +Open source
    +Element Android is an open source project, hosted by GitHub. Please report bugs and/or contribute to its development at https://github.com/vector-im/element-android
    diff --git a/fastlane/metadata/android/hu-HU/short_description.txt b/fastlane/metadata/android/hu-HU/short_description.txt
    index 2dfe14c516..51be689331 100644
    --- a/fastlane/metadata/android/hu-HU/short_description.txt
    +++ b/fastlane/metadata/android/hu-HU/short_description.txt
    @@ -1 +1 @@
    -Csoportos üzenetküldő - titkosított üzenetek, videó hívások
    +Csoportos üzenetküldő - titkosított üzenetek és videó hívások
    diff --git a/fastlane/metadata/android/hu-HU/title.txt b/fastlane/metadata/android/hu-HU/title.txt
    index 907f907f99..c463dea393 100644
    --- a/fastlane/metadata/android/hu-HU/title.txt
    +++ b/fastlane/metadata/android/hu-HU/title.txt
    @@ -1 +1 @@
    -Element
    +Element - Biztonságos üzenetküldő
    
    From bf619204e1a5d6aa459a78e8ed9ebfe86a182d1c Mon Sep 17 00:00:00 2001
    From: Edward Gera 
    Date: Mon, 7 Mar 2022 14:54:14 +0000
    Subject: [PATCH 048/152] Translated using Weblate (Hebrew)
    
    Currently translated at 85.5% (1846 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 69 +++++++++++++++++++++++
     1 file changed, 69 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 57a8cf6630..3d9cfd1154 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2067,4 +2067,73 @@
         יש לי כבר חשבון
         צור חשבון
         תקשורת מאובטחת.
    +    סגור את קוֹטֵף האמוג\'י
    +    פתח את קוֹטֵף האמוג\'י
    +    רמת האמון אמינה
    +    אזהרה רמת האמון
    +    ברירת המחדל של רמת האמון
    +    נבחר
    +    וידאו
    +    יש טיוטה שלא נשלחה
    +    חלק מההודעות לא נשלחו
    +    מחיקת אווטאר
    +    החלף אווטאר
    +    תמונה
    +    ייבוא מפתחות מהקובץ
    +    פתח יישומונים
    +    צילום מסך
    +    האימות נכשלה
    +    ${app_name} כדי לבצע פעולה זו נדורש להזין את פרטי התחברות שלך.
    +    יש צורך באימות מחדש
    +    החלק כדי לסיים את השיחה
    +    אדם לא ידוע
    +    העבר אל %1$s
    +    התייעצות עם %1$s
    +    משתמשים
    +    אירעה שגיאה בהעברת השיחה
    +    הַעֲבִר
    +    התחבר
    +    התייעץ קודם
    +    %1$s הקש לחזרה
    +    שיחה פעילה (%1$s) ·
    +    
    +        שיחה פעילה ·
    +        %1$d שיחות פעילות ·
    +        
    +        
    +    
    +    שיחה פעילה (%1$s)
    +    אירעה שגיאה בחיפוש מספר הטלפון
    +    לוח חיוג
    +    אין מענה
    +    שיחה וידאו שלא נענתה
    +    שיחה קולית שלא נענתה
    +    השיחה קולית נדחתה
    +    שיחת וידאו נדחתה
    +    שיחת הווידאו הסתיימה • %1$s
    +    השיחה הקולית הסתיימה • %1$s
    +    שיחת קולית פעילה
    +    שיחת וידאו פעילה
    +    שיחה וידאו נכנסת
    +    שיחה קולית נכנסת
    +    שיחה חוזרת
    +    השיחה הזו הסתיימה
    +    %1$s דחה את השיחה הזו
    +    דחית את השיחה הזו
    +    התראת חדר
    +    להודיע לכל החדר
    +    
    +        %1$d יותר
    +        
    +        
    +        
    +    
    +    %1$s, %2$s ואחרים
    +    %1$s ו %2$s
    +    
    +        %d שינוי ברשימות ACL בשרתים
    +        
    +        
    +        
    +    
     
    \ No newline at end of file
    
    From a7e44c81f2e1914806c306421a74e2bba43e5a53 Mon Sep 17 00:00:00 2001
    From: Ilan Feler 
    Date: Sun, 6 Mar 2022 14:48:01 +0000
    Subject: [PATCH 049/152] Translated using Weblate (Hebrew)
    
    Currently translated at 85.5% (1846 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 39 +++++++++++++++++++++++
     1 file changed, 39 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 3d9cfd1154..73a57823eb 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2136,4 +2136,43 @@
             
             
         
    +    נהל חדרים
    +    החלט מי יכול לראות ולהצטרף לחדר זה.
    +    הקש כדי לערוך מרחבים
    +    חפש שם
    +    חפש באמצאות שם, כינוי או מייל
    +    דוחס וידאו %d%%
    +    דוחס תמונה …
    +    תן משוב
    +    שליחת המשוב נכשלה (%s)
    +    תודה, המשוב שלך נשלח בהצלחה
    +    אתה יכול לצור איתי קשר במידה ויהיו לך שאלות המשך
    +    הינך משתמש בגירסת נסיון של מרחבים. המשוב שלך ישמש לעידכון גהגרסאות הבאות. פרטי המערכת ושם המשתמש ירשמו כדי שנוכל להשתמש במשוב שלך בצורה מיטבית.
    +    משוב
    +    סוף המשאל
    +    פעולה זו תעצור את האפשרות להצביע ותציג את תוצאות המשאל.
    +    סוף המשאל\?
    +    אפשרות הזוכה
    +    סוף המשאל
    +    שאלה לא יכולה להיות ריקה
    +    צור משאל
    +    הוסף אפשרות
    +    אפשרות %1$d
    +    צור אפשריות
    +    שאלה או נושא
    +    שאלה או נושא המשאל
    +    צור משאל
    +    אתחל את הישומון כדי שהשינויים יכנסו לתוקף.
    +    הצטרף בכל מקרה
    +    הצטרף למרחב
    +    צור מרחב
    +    דלג כרגע
    +    הצטרף למרחב שלי %1$s%2$s
    +    הודעות קבוצה מוצפנות
    +    הודעות ישירות
    +    שידרוגי חדר
    +    השם המוצג שלי
    +    שם המשתמש שלי
    +    הזמנות לחדר
    +    מילות מפתח
     
    \ No newline at end of file
    
    From 2c0d281a7bde658ec9ca50e27b543d7ca1f6be13 Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Mon, 7 Mar 2022 07:33:01 +0000
    Subject: [PATCH 050/152] Translated using Weblate (Japanese)
    
    Currently translated at 62.7% (32 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/ja/
    ---
     .../android/ja-JP/changelogs/40100100.txt     |  2 +-
     .../android/ja-JP/changelogs/40100110.txt     |  2 +-
     .../android/ja-JP/changelogs/40100120.txt     |  4 +-
     .../android/ja-JP/changelogs/40100130.txt     |  4 +-
     .../android/ja-JP/changelogs/40100140.txt     |  4 +-
     .../android/ja-JP/changelogs/40100150.txt     |  4 +-
     .../android/ja-JP/changelogs/40100160.txt     |  4 +-
     .../android/ja-JP/changelogs/40100170.txt     |  4 +-
     .../android/ja-JP/changelogs/40101000.txt     |  4 +-
     .../android/ja-JP/changelogs/40101010.txt     |  4 +-
     .../android/ja-JP/changelogs/40101020.txt     |  4 +-
     .../android/ja-JP/changelogs/40101030.txt     |  4 +-
     .../android/ja-JP/changelogs/40101160.txt     |  4 +-
     .../android/ja-JP/changelogs/40103090.txt     |  2 +
     .../android/ja-JP/changelogs/40103100.txt     |  2 +-
     .../android/ja-JP/changelogs/40103130.txt     |  2 +
     .../android/ja-JP/changelogs/40103140.txt     |  2 +
     .../android/ja-JP/changelogs/40103150.txt     |  2 +
     .../android/ja-JP/full_description.txt        | 40 +++++++++----------
     19 files changed, 53 insertions(+), 45 deletions(-)
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103090.txt
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103130.txt
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103140.txt
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103150.txt
    
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100100.txt b/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
    index 48af96d216..0f9fc720a9 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
    @@ -1,2 +1,2 @@
     今回の新バージョンでは、主にバグの修正と改善が行われています。メッセージの送信がより速くなりました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.10
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.10
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100110.txt b/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
    index b8b9798fcd..d67486a147 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
    @@ -1,2 +1,2 @@
     今回の新バージョンでは、主にUI(ユーザーインターフェース)とUX(ユーザーエクスペリエンス)の向上が図られています。友達を招待したり、QRコードを読み取って素早くDMを作成できるようになりました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.11
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.11
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100120.txt b/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
    index 01c33c5d52..1e10e5f2e3 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.12
    +このバージョンの主な変更点:URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.12
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100130.txt b/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
    index 941a052239..0e5ef9b8eb 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.13
    +このバージョンの主な変更点:URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.13
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100140.txt b/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
    index 6dc536cdcf..8fa9848d0b 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: 部屋の許可、自動のテーマ切替、そして多くのバグを修正しました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.14
    +このバージョンの主な変更点:部屋の許可、自動のテーマ切替、そして多くのバグを修正しました。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.14
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100150.txt b/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
    index caded1b8ed..c94330b70b 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: ソーシャルログインに対応しました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15
    +このバージョンの主な変更点:ソーシャルログインに対応しました。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.15
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100160.txt b/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
    index 1b1a2092b0..ae947f1781 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100170.txt b/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
    index a0cc7b107d..01b742a9a2 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: バグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.17
    +このバージョンの主な変更点:バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.17
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101000.txt b/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
    index d0900f38c2..0c09cee3dd 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.0
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.0
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101010.txt b/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
    index cb204e5696..25ac73b449 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.1
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.1
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101020.txt b/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
    index bb6ab66525..762879a281 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.2
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.2
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101030.txt b/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
    index e7ecc05a0f..3c641c09ac 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.3
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.3
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101160.txt b/fastlane/metadata/android/ja-JP/changelogs/40101160.txt
    index 985ea10510..3e37e353d7 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101160.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101160.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点:ルームにて誰かがログアウトした際に発生するエラーを修正しました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.16
    +このバージョンの主な変更点:ルームにて誰かがログアウトした際に発生するエラーを修正しました。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.16
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103090.txt b/fastlane/metadata/android/ja-JP/changelogs/40103090.txt
    new file mode 100644
    index 0000000000..580b49e6d9
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103090.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:音声メッセージの下書き機能の追加。不具合の修正。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.9
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103100.txt b/fastlane/metadata/android/ja-JP/changelogs/40103100.txt
    index 76c28cdd90..0527756005 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40103100.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103100.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点:投票機能のサポート(実験的)。URL プレビューの新規デザイン。
    +このバージョンの主な変更点:アンケート機能のサポート(実験的)。URL プレビューの新規デザイン。
     更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.10
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103130.txt b/fastlane/metadata/android/ja-JP/changelogs/40103130.txt
    new file mode 100644
    index 0000000000..19d04a9b99
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103130.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:登録時の表示に関する変更(Analyticsへのオプトインなど)。数学に関するイベントをラボに追加。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.13
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103140.txt b/fastlane/metadata/android/ja-JP/changelogs/40103140.txt
    new file mode 100644
    index 0000000000..c9f5062c5b
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103140.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:登録時の表示に関する変更(Analyticsへのオプトインなど)。数学に関するイベントをラボに追加。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.14
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103150.txt b/fastlane/metadata/android/ja-JP/changelogs/40103150.txt
    new file mode 100644
    index 0000000000..89c3117cf5
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103150.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:登録時の表示に関する変更(Analyticsへのオプトインなど)。数学に関するイベントをラボに追加。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.15
    diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt
    index 6014938cce..ce1550acb0 100644
    --- a/fastlane/metadata/android/ja-JP/full_description.txt
    +++ b/fastlane/metadata/android/ja-JP/full_description.txt
    @@ -1,42 +1,42 @@
    -Elementは、安全なメッセンジャー、リモートワーク中のグループチャットに適したチームコラボレーションアプリです。エンドツーエンドの暗号化を使用して、強力なビデオ会議、ファイル共有、音声通話を提供します。
    +Elementは、安全なメッセージングアプリ、リモートワーク中のグループチャットに適したチームコラボレーションアプリです。エンド・ツー・エンドの暗号化技術を使用して、強力なビデオ会議、ファイル共有、音声通話を提供します。
     
     Elementの特徴
     - 高度なオンラインコミュニケーションツール
    -- 完全に暗号化されたメッセージにより、リモートワーカーでも、より安全な企業コミュニケーションが可能
    -- Matrixオープンソースフレームワークをベースにした分散型のチャット
    -- プロジェクトを管理しながら、暗号化されたデータで安全にファイル共有
    +- メッセージの完全な暗号化。リモートワーカーでも、より安全な企業コミュニケーションが可能
    +- Matrixオープンソースフレームワークに基づく、分散型のチャット
    +- プロジェクトの管理と並行して、データの暗号化によりファイルを安全に共有することが可能
     - Voice over IPによるビデオチャットと画面共有
    -- お気に入りのオンラインコラボレーションツール、プロジェクト管理ツール、VoIPサービス、その他のチームメッセージングアプリと簡単に統合可能
    +- お気に入りのオンラインコラボレーションツールや、プロジェクト管理ツール、VoIPサービス、その他のチームメッセージングアプリと簡単に統合可能
     
    -Elementは他のメッセージングアプリやコラボレーションアプリとは全く異なります。安全なメッセージングと分散型(非中央集権)コミュニケーションのためのオープンネットワークであるMatrixで動作します。ユーザーが自分のデータやメッセージを最大限にコントロールできるように、セルフホスティングも可能です。
    +Elementは、他のメッセージングアプリやコラボレーションアプリとは全く異なります。安全なメッセージングと分散型(非中央集権型)コミュニケーションのためのオープンネットワークであるMatrixで動作します。自分のデータやメッセージを最大限にコントロールするために、あなた自身がサーバーを運営することもできます。
     
     プライバシーと暗号化されたコミュニケーション
    -Elementは、望ましくない広告、データマイニング、ウォールドガーデンからユーザーを保護します。また、エンド・ツー・エンドの暗号化と相互署名された端末の検証により、全てのデータ、1対1のビデオおよび音声通信を保護します。
    +Elementは、望ましくない広告、データマイニング、囲い込みからユーザーを守ります。また、エンド・ツー・エンドの暗号化と、相互署名による端末の認証に基づき、全てのデータ、ビデオ会議、音声通信を保護します。
     
    -Elementは、Slackなどのアプリと統合することで、Matrixネットワーク上の誰とでも安全にコミュニケーションを取ることができると同時に、プライバシーをコントロールすることができます。
    +Elementでは、Matrixネットワークにいる誰とでもコミュニケーションが行えるだけでなく、Slackなどのアプリと連携すれば、他のネットワークともコミュニケーションを行うとともに、プライバシーをコントロールすることができます。
     
    -Elementはセルフホスティングが可能
    -機密データや会話の管理を強化するために、Elementはセルフホスティングが可能です。または、オープンソースの分散型コミュニケーションの標準であるMatrixベースのホストを選択することもできます。Elementは、プライバシー、セキュリティーコンプライアンス、および統合の柔軟性を提供します。
    +セルフホスティングが可能
    +機密データや会話の管理を強化するために、Elementはセルフホスティングが可能です。または、オープンソースの分散型コミュニケーションの標準であるMatrixに基づくサーバーを選ぶこともできます。Elementは、プライバシー、セキュリティーコンプライアンス、および柔軟な機能統合を提供します。
     
     自分のデータを所有する
    -データやメッセージをどこに保管するかは、ユーザー自身が決めることができます。データマイニングやサードパーティからのアクセスのリスクはありません。
    +データやメッセージを保管する場所を自分で決めることができます。データマイニングや第三者へのデータ流出のリスクはありません。
     
    -Elementでは、どのサーバーを使うかを、ご自身で決めることができます。
    -1. 開発者がホストする matrix.org のパブリックサーバーで無料アカウントを取得するか、ボランティアがホストしているパブリックサーバーから選択する。
    +Elementでは、どのサーバーを使うかをご自身で決めることができます。
    +1. 開発者が運営する matrix.org の公開サーバーで無料アカウントを取得するか、ボランティアが管理している運営サーバーから選ぶ。
     2. あなた自身がサーバーを運営し、アカウントを管理する。
    -3. Element Matrix Servicesのホスティングプラットフォームに加入し、カスタムサーバー上でアカウントを作る。
    +3. Element Matrix Servicesの運営プラットフォームに加入し、カスタムサーバー上でアカウントを作る。
     
     オープンなメッセージングとコラボレーション
    -Matrixネットワーク上の誰とでも、相手がElementや他のMatrixアプリを使っているか、さらには他のメッセージングアプリを使っているかに関わらず、チャットをすることができます。
    +相手がElement、他のMatrixアプリ、さらには他のメッセージングアプリを使っているかに関わらず、Matrixネットワーク上の誰とでもチャットをすることができます。
     
     非常に安全
    -本物のエンド・ツー・エンドの暗号化(会話に参加している人だけがメッセージを復号化できる)と、相互署名された端末の検証を行います。
    +本物のエンド・ツー・エンドの暗号化(会話に参加している人だけがメッセージを復号化できます)と、クロス署名による端末の認証が可能です。
     
     包括的なコミュニケーションと統合
    -メッセージング、音声およびビデオ通話、ファイル共有、画面共有、その他多くのインテグレーション、ボット、ウィジェットを提供します。ルームやコミュニティーを立ち上げて連絡を取り合い、物事をスムーズに成し遂げることができます。
    +メッセージング、音声およびビデオ通話、ファイル共有、画面共有、その他多くの機能統合、ボット、ウィジェットを提供します。ルームやコミュニティーを立ち上げて連絡を取り合い、物事をスムーズに成し遂げましょう。
     
    -中断からの再開
    -メッセージの履歴は全ての端末とウェブ(https://app.element.io)で完全に同期されるので、どこからでも連絡を取り合うことができます。
    +いつでも、どこにいても
    +メッセージの履歴は、全ての端末とウェブ(https://app.element.io)で完全に同期されるので、どこからでも連絡を取り合うことができます。
     
     オープンソース
    -Element AndroidはGitHubで開発されているオープンソースのプロジェクトです。 バグの報告や開発への貢献は https://github.com/vector-im/element-android にて受け付けています。
    +Element Androidは、GitHubで開発されているオープンソースのプロジェクトです。 不具合の報告や開発への貢献は https://github.com/vector-im/element-android にて受け付けています。
    
    From 314f32ed45f52c01685e04ce6af2170e91942f49 Mon Sep 17 00:00:00 2001
    From: Michael Kaye <1917473+michaelkaye@users.noreply.github.com>
    Date: Wed, 9 Mar 2022 09:33:05 +0000
    Subject: [PATCH 051/152] If a FileNotFound exception occurs, log a simple
     message indicating the tests may have not run.
    
    ---
     tools/ci/render_test_output.py | 55 ++++++++++++++++++----------------
     1 file changed, 29 insertions(+), 26 deletions(-)
    
    diff --git a/tools/ci/render_test_output.py b/tools/ci/render_test_output.py
    index 1e7940ce04..f955b93cf9 100755
    --- a/tools/ci/render_test_output.py
    +++ b/tools/ci/render_test_output.py
    @@ -13,32 +13,35 @@ print("::group::Arguments")
     print(f"{sys.argv}") 
     print("::endgroup::")
     for xmlfile in xmlfiles:
    -    tree = ET.parse(xmlfile)
    +    try:
    +        tree = ET.parse(xmlfile)
         
    -    root = tree.getroot()
    -    name = root.attrib['name']
    -    time = root.attrib['time']
    -    tests = int(root.attrib['tests'])
    -    skipped = int(root.attrib['skipped'])
    -    errors = int(root.attrib['errors'])
    -    failures = int(root.attrib['failures'])
    -    success = tests - failures - errors - skipped
    -    total = tests - skipped
    -    print(f"::group::{name} {success}/{total} ({skipped} skipped) in {time}")
    -    
    -    for testcase in root:
    -        if testcase.tag != "testcase":
    -            continue
    -        testname = testcase.attrib['classname']
    -        message = testcase.attrib['name']
    -        time = testcase.attrib['time']
    -        child = testcase.find("failure")
    -        if child is None:
    -            print(f"{message} in {time}s")
    -        else:
    -            print(f"::error file={testname}::{message} in {time}s")
    -            print(child.text)
    -    body = f"passed={success} failures={failures} errors={errors} skipped={skipped}"
    -    print(f"::set-output name={suitename}::={body}")
    +        root = tree.getroot()
    +        name = root.attrib['name']
    +        time = root.attrib['time']
    +        tests = int(root.attrib['tests'])
    +        skipped = int(root.attrib['skipped'])
    +        errors = int(root.attrib['errors'])
    +        failures = int(root.attrib['failures'])
    +        success = tests - failures - errors - skipped
    +        total = tests - skipped
    +        print(f"::group::{name} {success}/{total} ({skipped} skipped) in {time}")
    +        
    +        for testcase in root:
    +            if testcase.tag != "testcase":
    +                continue
    +            testname = testcase.attrib['classname']
    +            message = testcase.attrib['name']
    +            time = testcase.attrib['time']
    +            child = testcase.find("failure")
    +            if child is None:
    +                print(f"{message} in {time}s")
    +            else:
    +                print(f"::error file={testname}::{message} in {time}s")
    +                print(child.text)
    +        body = f" passed={success} failures={failures} errors={errors} skipped={skipped}"
    +        print(f"::set-output name={suitename}::={body}")
    +    except FileNotFoundError:
    +        print(f"::error::Unable to open test results file {xmlfile} - check if the tests completed")
         print("::endgroup::")
     
    
    From 5ec8a2b36d8f8027c311a67bf5590dbe7791b5ce Mon Sep 17 00:00:00 2001
    From: Michael Kaye <1917473+michaelkaye@users.noreply.github.com>
    Date: Wed, 9 Mar 2022 10:04:25 +0000
    Subject: [PATCH 052/152] Add some color to the nightly summary.
    
    ---
     .github/workflows/nightly.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
    index a5bb7c2a6c..01df067f1f 100644
    --- a/.github/workflows/nightly.yml
    +++ b/.github/workflows/nightly.yml
    @@ -379,4 +379,4 @@ jobs:
               matrix_access_token: ${{ secrets.ELEMENT_ANDROID_NOTIFICATION_ACCESS_TOKEN }}
               matrix_room_id: ${{ secrets.ELEMENT_ANDROID_INTERNAL_ROOM_ID }}
               text_template: "Nightly test run: {{#each job_statuses }}{{#with this }}{{#if completed }}  {{name}} {{conclusion}} at {{completed_at}}, {{/if}}{{/with}}{{/each}}"
    -          html_template: "Nightly test run results: {{#each job_statuses }}{{#with this }}{{#if completed }}
    {{name}} {{conclusion}} at {{completed_at}} [details]{{/if}}{{/with}}{{/each}}" + html_template: "Nightly test run results: {{#each job_statuses }}{{#with this }}{{#if completed }}
    {{icon conclusion}} {{name}} {{conclusion}} at {{completed_at}} [details]{{/if}}{{/with}}{{/each}}" From 029ccfa37f397e04323158d40b963ec484e4aa70 Mon Sep 17 00:00:00 2001 From: Michael Kaye <1917473+michaelkaye@users.noreply.github.com> Date: Wed, 9 Mar 2022 10:21:29 +0000 Subject: [PATCH 053/152] Add names to all jobs --- .github/workflows/nightly.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 01df067f1f..ebddf716d5 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -308,6 +308,7 @@ jobs: failure_screenshots/ codecov-units: + name: Unit tests with codecoverage runs-on: macos-latest steps: - uses: actions/checkout@v3 @@ -333,6 +334,7 @@ jobs: build/reports/jacoco/allCodeCoverageReport/allCodeCoverageReport.xml sonarqube: + name: Sonarqube upload runs-on: macos-latest if: always() needs: @@ -362,6 +364,7 @@ jobs: # Notify the channel about scheduled runs, do not notify for manually triggered runs notify: + name: Notify matrix runs-on: ubuntu-latest needs: - integration-tests From 3ef2f824e81598c5a6c71a4eaf50cf9c71962b1a Mon Sep 17 00:00:00 2001 From: cfriedlander Date: Fri, 11 Mar 2022 11:10:11 +0100 Subject: [PATCH 054/152] add presence indicator online --- library/ui-styles/src/main/res/values/colors.xml | 4 ++++ library/ui-styles/src/main/res/values/palette_mobile.xml | 3 +++ library/ui-styles/src/main/res/values/theme_dark.xml | 1 + library/ui-styles/src/main/res/values/theme_light.xml | 1 + vector/src/main/res/drawable/ic_presence_online.xml | 2 +- 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/library/ui-styles/src/main/res/values/colors.xml b/library/ui-styles/src/main/res/values/colors.xml index 75b03a7d2e..0578a598e9 100644 --- a/library/ui-styles/src/main/res/values/colors.xml +++ b/library/ui-styles/src/main/res/values/colors.xml @@ -122,6 +122,10 @@ @color/palette_gray_100 @color/palette_gray_450 + + @color/presence_online + @color/presence_online + @color/palette_prune diff --git a/library/ui-styles/src/main/res/values/palette_mobile.xml b/library/ui-styles/src/main/res/values/palette_mobile.xml index ec2f1d0814..0e5a6865da 100644 --- a/library/ui-styles/src/main/res/values/palette_mobile.xml +++ b/library/ui-styles/src/main/res/values/palette_mobile.xml @@ -54,4 +54,7 @@ @color/palette_azure @color/palette_grape + + @color/palette_element_green + \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/theme_dark.xml b/library/ui-styles/src/main/res/values/theme_dark.xml index 06670ccd68..7177687fdd 100644 --- a/library/ui-styles/src/main/res/values/theme_dark.xml +++ b/library/ui-styles/src/main/res/values/theme_dark.xml @@ -43,6 +43,7 @@ @color/vctr_presence_indicator_offline_dark + @color/vctr_presence_indicator_online_dark ?vctr_system diff --git a/library/ui-styles/src/main/res/values/theme_light.xml b/library/ui-styles/src/main/res/values/theme_light.xml index c184464320..c90c021591 100644 --- a/library/ui-styles/src/main/res/values/theme_light.xml +++ b/library/ui-styles/src/main/res/values/theme_light.xml @@ -43,6 +43,7 @@ @color/vctr_presence_indicator_offline_light + @color/vctr_presence_indicator_online_light ?vctr_system diff --git a/vector/src/main/res/drawable/ic_presence_online.xml b/vector/src/main/res/drawable/ic_presence_online.xml index 2184f359b2..e5229de3fd 100644 --- a/vector/src/main/res/drawable/ic_presence_online.xml +++ b/vector/src/main/res/drawable/ic_presence_online.xml @@ -16,7 +16,7 @@ From 04aaed7210f766457c45006742aec809d8d2fdf8 Mon Sep 17 00:00:00 2001 From: chagai95 <31655082+chagai95@users.noreply.github.com> Date: Fri, 11 Mar 2022 17:12:58 +0100 Subject: [PATCH 055/152] Change log line --- changelog.d/5513.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/5513.misc diff --git a/changelog.d/5513.misc b/changelog.d/5513.misc new file mode 100644 index 0000000000..62be94d6bb --- /dev/null +++ b/changelog.d/5513.misc @@ -0,0 +1 @@ +Added presence indicator online like it is done for offline. From 4922d5f5ff6f48e96a077ed6ba643a44be272166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Fri, 11 Mar 2022 11:25:56 +0000 Subject: [PATCH 056/152] Translated using Weblate (Icelandic) Currently translated at 65.3% (1409 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/is/ --- vector/src/main/res/values-is/strings.xml | 1234 ++++++++++++++++++++- 1 file changed, 1199 insertions(+), 35 deletions(-) diff --git a/vector/src/main/res/values-is/strings.xml b/vector/src/main/res/values-is/strings.xml index 07fe4b55be..714ec292e8 100644 --- a/vector/src/main/res/values-is/strings.xml +++ b/vector/src/main/res/values-is/strings.xml @@ -4,9 +4,9 @@ %1$s bauð %2$s %1$s bauð þér %1$s gekk í hópinn - %1$s hætti + %1$s hætti í spjallrásinni %1$s hafnaði boðinu - %1$s sparkaði %2$s + %1$s fjarlægði %2$s %1$s afbannaði %2$s %1$s bannaði %2$s %1$s breyttu auðkennismynd sinni @@ -20,10 +20,10 @@ Villa í Matrix Tölvupóstfang Símanúmer - %1$s tók til baka boð frá %2$s + %1$s tók til baka boð til %2$s %1$s setti birtingarnafn sitt sem %2$s %1$s breytti birtingarnafni sínu úr %2$s í %3$s - %1$s fjarlægði birtingarnafn sitt (%2$s) + %1$s fjarlægði birtingarnafn sitt (sem var %2$s) %1$s breytti umræðuefninu í: %2$s %1$s breytti heiti spjallrásarinnar í: %2$s %s hringdi myndsamtal. @@ -38,7 +38,6 @@ Tæki sendandans hefur ekki sent okkur dulritunarlyklana fyrir þessi skilaboð. Boð á spjallrás %1$s og %2$s - Tóm spjallrás Ljóst þema Dökkt þema @@ -80,7 +79,6 @@ Samtöl Engar niðurstöður Spjallrásir - Senda atvikaskrá Senda hrunskrár Senda skjámynd @@ -121,14 +119,13 @@ Taka þátt Hafna Listi yfir meðlimi - %d meðlimur %d meðlimir Fara af spjallrás - Ertu viss um að þú viljir fara út spjallrásinni? - BEINT SPJALL + Ertu viss um að þú viljir fara úr spjallrásinni\? + Bein skilaboð Bjóða %s er að skrifa… %1$s & %2$s eru að skrifa… @@ -145,7 +142,6 @@ Leita Sía meðlimi spjallrásar Engar niðurstöður - Öll skilaboð Notandamynd Birtingarnafn @@ -180,7 +176,7 @@ Veldu tungumál Breyta lykilorði eldra lykilorð - nýtt lykilorð + Nýtt lykilorð Mistókst að uppfæra lykilorð Lykilorðið þitt hefur verið uppfært Sýna öll skilaboð frá %s\? @@ -199,10 +195,10 @@ Þema Afkóðunarvilla Heiti tækis - Auðkenni tækis + Auðkenni setu Dulritunarlykill tækis Flytja út - Settu inn lykilsetningu (passphrase) + Settu inn lykilsetningu Staðfestu lykilsetningu Flytja inn Sannreyna @@ -270,19 +266,18 @@ Þér hefur verið sparkað úr %1$s af %2$s Þú hefur verið settur í bann á %1$s af %2$s Tilraunir - Klaga efni + Kæra efni Slóð á heimaþjón Ertu viss að þú viljir byrja raddsamtal? Ertu viss að þú viljir byrja myndsamtal? - Fara í fyrstu ólesin skilaboð. + Fara í ólesið Banna Afbanna Fela öll skilaboð frá þessum notanda Sýna öll skilaboð frá þessum notanda - Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás + Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás. Gat ekki sannreynt auðkenni fjartengds þjóns. - - Bæta við flýtileið á aðalskjá + Bæta við á upphafsskjá Hljóð með tilkynningu Virkja tilkynningar fyrir þennan notandaaðgang Virkja tilkynningar á þessu tæki @@ -294,7 +289,6 @@ Heimildir fyrir tengiliði Alltaf birta tímamerki skilaboða Birta tímamerki á 12 stunda sniði (t.d. 2:30 fh) - Heimaþjónn Auðkennisþjónn Þetta tölvupóstfang er nú þegar í notkun. @@ -304,18 +298,16 @@ Einungis meðlimir (síðan þeir skráðu sig) Innra auðkenni þessarar spjallrásar Veldu skrá yfir spjallrásir - URL-slóð heimaþjóns + Heiti heimaþjóns %d ólesið tilkynnt skilaboð %d ólesin tilkynnt skilaboð - Ertu viss um að þú viljir eyða viðmótshlutanum? Gat ekki búið til viðmótshluta. Mistókst að senda beiðni. Boðið - Bönun notanda mun henda þeim út úr þessu herbergi og halda þeim frá því að koma aftur. - + Bann á notanda mun henda honum út af þessari spjallrás og koma í veg fyrir að viðkomandi komi aftur. Skilaboð innihalda birtingarnafn mitt Skilaboð innihalda notandanafn mitt Skilaboð í maður-á-mann spjalli @@ -332,10 +324,8 @@ Þú getur ekki afturkallað þessa aðgerð, þar sem þú ert að gefa notandanum jafn mikil völd og þú hefur sjálf/ur. \nErtu alveg viss\? Hlé milli tveggja samstillingarbeiðna - Halda gögnum + Halda myndefni Skoðaðu tölvupóstinn þinn og smelltu á tengilinn sem hann inniheldur. Þegar því er lokið skaltu smella á að halda áfram. - - Aðeins dulrita til sannvottaðra tækja Aldrei senda dulrituð skilaboð af þessu tæki til ósannvottaðra tækja. Völd verða að vera jákvæð heiltala. @@ -344,36 +334,1210 @@ Vantar spjallrásarauðkenni í beiðni. Vantar notandaauðkenni í beiðni. Senda límmerki - Ekki var svarað á fjartengda endanum. - - ${app_name} þarf heimild til að nota hljóðnemann svo hægt sé að hringja hljóðsímtöl. - ${app_name} þarf heimild til að nota myndavélina og hljóðnemann svo hægt sé að hringja myndsímtöl. \n \nLeyfðu aðgang í næstu sprettgluggum til þess að geta hringt. - - Gera notandaaðgang óvirkann Gera notandaaðganginn minn óvirkann Senda greiningargögn Yfirfara núna Gera notandaaðgang óvirkann Gera notandaaðgang óvirkann - Lýstu villunni. Hvað varstu að gera? Hverju áttirðu von á? Hvað gerðist í raun? Til að geta greint vandamál eru atvikaskrár þessa forrits sendar með þessari villuskýrslu. Ef þú vilt einungis senda textann hér fyrir ofan, taktu þá gátmerkið úr reitnum: Það er eins og þú sért að hrista símann ákveðið. Myndirðu vilja senda villuskýrslu? Forritið hrundi síðast. Myndirðu vilja senda inn villuskýrslu? Senda límmerki ${app_name} safnar nafnlausum greiningargögnum til að gera okkur kleift að bæta forritið. - Heimaskjár + Upphafsskjár Festa spjallrásir með óskoðuðum tilkynningum Festa spjallrásir með ólesnum skilaboðum Sjálfgefið virkja forskoðun innfelldra vefslóða Þetta eru eiginleikar á tilraunastigi sem gætu bilað á óvæntan hátt. Notist með varúð. Setja sem aðalvistfang - Ekki setja sem aðalvistfang + Ekki hafa sem aðalvistfang Nauðsynlegt gildi vantar. + Þú getur slökkt á þessu hvenær sem er í stillingunum + Dulrituð skilaboð í hópaspjalli + Dulrituð skilaboð í maður-á-mann spjalli + Upphaf samstillingar: +\nHleð inn samtölunum þínum +\nÞetta getur tekið dálítinn tíma ef þú tekur þátt í mörgum spjallrásum + Aðeins fólk sem hefur verið boðið getur fundið og tekið þátt + Einka (einungis gegn boði) + Þú getur sýsla- með tilkynningar í %1$s. + Sjálfgefinn uppruni myndefnis + Sjálfgefin þjöppun + Sýslaðu með tölvupóstföng og símanúmer sem tengd eru við Matrix-aðganginn þinn + Tölvupóstföng og símanúmer + Lykilorðið er ekki gilt + Utanaðkomandi aðgerðasöfn + Hjálpaðu okkur að bæta ${app_name} + Sýsla með uppgötvunarstillingarnar þínar. + Smelltu á leskvittanir til að sjá ítarlegan lista. + Birta leskvittanir + Markdown-sníðing + Láttu aðra sjá að þú sért að skrifa. + Senda skriftilkynningar + Umsýsla dulritunarlykla + Dulrituð hópskilaboð + Dulrituð bein skilaboð + Bestun fyrir rafhlöðuendingu + Birting tilkynninga + Tilkynningar eru óvirkar í þessari setu. +\nYfirfarðu stillingar í ${app_name}. + Tilkynningar eru virkar í þessari setu. + Tilkynningar eru óvirkar fyrir notandaaðganginn þinn. +\nYfirfarðu stillingar aðgangsins. + Tilkynningar eru virkar fyrir notandaaðganginn þinn. + Tilkynningar eru óvirkar í kerfisstillingum. +\nYfirfarðu kerfisstillingarnar. + Tilkynningar eru virkar í kerfisstillingum. + Í keyrslu (%1$d af %2$d) + Keyra prófanir + Greining á vandamálum + Leysa vandamál með tilkynningar + Stikkorð mega ekki innihalda \'%s\' + Stikkorð mega ekki byrja með \'.\' + Bæta við nýju stikkorði + Stikkorðin þín + Minnst á og stikkorð + Virkja tilkynningar í tölvupósti fyrir %s + Til að fá tilkynningar í tölvupósti, þarf að tengja tölvupóstfang við Matrix-aðganginn þinn + Tilkynning í tölvupósti + Mikilvægi tilkynninga eftir atburðum + Skráð út úr setunni! + Spjallrásin hefur verið yfirgefin! + Einungis þar sem er minnst á og stikkorð + Sía bannaða notendur + Úr spjallþræði + Ábending: Ýttu lengi á skilaboð og notaðu “%s”. + Spjallþræðir hjálpa til við að halda samræðum við efnið og gerir auðveldara að rekja þær. + Haltu umræðum skipulögðum með spjallþráðum + Birtir alla spjallþræði sem þú hefur tekið þátt í + Birtir alla spjallþræði úr fyrirliggjandi spjallrás + Spjallþræðirnir mínir + Allir spjallþræðir + Sía þræði spjallrásar + Heimildir spjallrásar + Þessi spjallrás er ekki opinber. Þú munt ekki geta tekið aftur þátt nema að vera boðið. + Gefa heimild til að fá aðgang að tengiliðunum þínum. + Til að skanna QR-kóða þarftu að veita aðgang að myndavélinni. + Lýk símtali… + Notandi upptekinn + Þú settir símtalið í bið + %s setti símtalið í bið + Raddsímtal við %s + Myndsamtal við %s + Myndsamtal í gangi… + + Ósvarað myndsímtal + %d ósvöruð myndsímtöl + + + Ósvarað raddsímtal + %d ósvöruð raddsímtöl + + Veldu hringitón fyrir símtöl: + Innhringitónn + Nota sjálfgefinn ${app_name} hringitón fyrir innhringingar + Biðja um staðfestingu áður en símtal er hafið + Koma í veg fyrir símtöl af slysni + Þetta símanúmer er nú þegar skráð. + Því miður, ekkert utankomandi forrit hefur fundist sem getur lokið þessari aðgerð. + Í augnablikinu ertu ekki með neina límmerkjapakka virkjaða. +\n +\nBæta einhverjum við núna\? + Veldu hljóðtæki + ${app_name} símtal mistókst + Senda tal + Slóð á API-kerfisviðmót heimaþjóns + Ef mögulegt, skaltu skrifa lýsinguna á ensku. + Sýna allar spjallrásir í spjallrásalistanum, þar með taldar spjallrásir með viðkvæmu efni. + Sýna spjallrásir með viðkvæmu efni + Aðvaranir kerfis + Afrita tengil á spjallþráð + Taka úr birtingu + Skoða spjallþræði + Mistókst að fjarlægja viðmótshluta + Mistókst að bæta við viðmótshluta + Þú getur ekki byrjað símtal með sjálfum þér, bíddu eftir að þátttakendur samþykki boðið + Þú getur ekki byrjað símtal með sjálfum þér + Til að senda talskilaboð þarf að gefa heimild fyrir hljóðnema. + Til að framkvæma þessa aðgerð þarf að gefa heimild fyrir myndavél í kerfisstillingum. + Það vantar heimildir til að framkvæma þessa aðgerð, það þarf að gefa viðkomandi heimildir í kerfisstillingum. + Hefja talfund + Hefja myndfund + Þú hefur ekki heimildir til að hefja símtal + Þú hefur ekki heimildir til að hefja símtal á þessari spjallrás + Þú hefur ekki heimildir til að hefja fjarfund + Þú hefur ekki heimildir til að hefja fjarfund á þessari spjallrás + Vantar heimildir + Þú munt missa aðgang að dulrituðu skilaboðunum þínum nema þú takir öryggisafrit af dulritunarlyklum áður en þú skráir þig út. + Öryggisafritun dulritunarlykla í gangi. Þú munt tapa dulrituðu skilaboðunum þínum ef þú skráir þig út núna. + Þú munt tapa dulrituðu skilaboðunum þínum ef þú skráir þig út núna + Þú kveiktir á enda-í-enda dulritun. + %1$s kveikti á enda-í-enda dulritun. + Taka öryggisafrit + Öryggisafrita dulritunarlykla… + Ég vil ekki dulrituðu skilaboðin mín + Nota öryggisafrit af lykli + Hlusta eftir tilkynningum + Þú kveiktir á enda-í-enda dulritun (óþekkt algrími %1$s). + %1$s kveikti á enda-í-enda dulritun (óþekkt algrími %2$s). + Þú hefur bannað gestum að koma inn á spjallrásina. + %1$s hefur bannað gestum að koma inn á spjallrásina. + Þú hefur bannað gestum að koma inn á spjallrásina. + %1$s hefur bannað gestum að koma inn á spjallrásina. + Þú hefur leyft gestum að koma inn hér. + %1$s hefur leyft gestum að koma inn hér. + Þú hefur leyft gestum að koma inn á spjallrásina. + %1$s hefur leyft gestum að koma inn á spjallrásina. + + Þú fjarlægðir varavistfangið %1$s af þessari spjallrás. + Þú fjarlægðir varavistföngin %1$s af þessari spjallrás. + + + %1$s fjarlægði varavistfangið %2$s af þessari spjallrás. + %1$s fjarlægði varavistföngin %2$s af þessari spjallrás. + + + Þú bættir við varavistfanginu %1$s fyrir þessa spjallrás. + Þú bættir við varavistföngunum %1$s fyrir þessa spjallrás. + + + %1$s bætti við varavistfanginu %2$s fyrir þessa spjallrás. + %1$s bætti við varavistföngunum %2$s fyrir þessa spjallrás. + + Þú tókst til baka boð til %1$s. Ástæða: %2$s + %1$s tók til baka boð til %2$s. Ástæða: %3$s + Þú samþykktir boð um að taka þátt í %1$s. Ástæða: %2$s + %1$s samþykkti boð um að taka þátt í %2$s. Ástæða: %3$s + Þú bannaðir %1$s. Ástæða: %2$s + %1$s bannaði %2$s. Ástæða: %3$s + Þú tókst %1$s úr banni. Ástæða: %2$s + %1$s tók %2$s úr banni. Ástæða: %3$s + Þú fjarlægðir %1$s. Ástæða: %2$s + %1$s fjarlægði %2$s. Ástæða: %3$s + Þú hafnaðir boðinu. Ástæða: %2$s + %1$s hafnaði boðinu. Ástæða: %2$s + Þú hættir. Ástæða: %1$s + %1$s hætti. Ástæða: %2$s + Þú yfirgafst spjallrásina. Ástæða: %1$s + %1$s yfirgaf spjallrásina. Ástæða: %2$s + Þú tekur þátt. Ástæða: %1$s + %1$s tekur þátt. Ástæða: %2$s + Þú komst inn á spjallrásina. Ástæða: %1$s + %1$s kom inn á spjallrásina. Ástæða: %2$s + %1$s bauð þér. Ástæða: %2$s + Þú bauðst %1$s. Ástæða: %2$s + %1$s bauð %2$s. Ástæða: %3$s + Boð um þátttöku til þín. Ástæða: %1$s + Boð um þátttöku til %1$s. Ástæða: %2$s + Upphaf samstillingar: +\nFlyt inn gögn úr notandaaðgangi + Upphaf samstillingar: +\nFlyt inn samfélög + Upphaf samstillingar: +\nFlyt inn yfirgefnar spjallrásir + Upphaf samstillingar: +\nFlyt inn boð í spjallrásir + Upphaf samstillingar: +\nFlyt inn spjallrásir + Upphaf samstillingar: +\nFlyt inn dulritunargögn + Upphaf samstillingar: +\nFlyt inn notandaaðgang… + Upphaf samstillingar: +\nSæki gögn… + Upphaf samstillingar: +\nBíð eftir svari frá netþjóni… + Þú hefur ekki heimild til að taka þátt í þessari spjallrás + Þú breyttir völdum %1$s. + Þú breyttir %1$s viðmótshluta + %1$s breytti %2$s viðmótshluta + Þú fjarlægðir %1$s viðmótshluta + %1$s fjarlægði %2$s viðmótshluta + Þú bættir við %1$s viðmótshluta + %1$s bætti við %2$s viðmótshluta + Þú samþykktir boð um að taka þátt í %$s + Þú afturkallaðir boðið til %1$s + %1$s afturkallaði boðið til %2$s + Þú afturkallaðir boð til %1$s um þátttöku í spjallrásinni + %1$s afturkallaði boð til %2$s um þátttöku í spjallrásinni + Þú bauðst %1$s + Þú sendir boð til %1$s um þátttöku í spjallrásinni + Þú fjarlægðir auðkennismynd spjallrásarinnar + %1$s fjarlægði auðkennismynd spjallrásarinnar + Þú fjarlægðir umfjöllunarefni spjallrásar + Þú fjarlægðir heiti spjallrásar + + Breyting á ACL á %d netþjóni + Breyting á ACL á %d netþjóni + + Þú gerðir skilaboð héðan í frá sýnileg fyrir %1$s + Bæta við fólki + 🎉 Öllum netþjónum er núna bannað að taka þátt! Þessa spjallrás er ekki lengur hægt að nota. + • Netþjónar sem samsvara IP-tölum eru núna bannaðir. + • Netþjónar sem samsvara IP-tölum eru núna leyfðir. + • Netþjónar sem samsvara %s voru fjarlægðir af listanum yfir leyfilegt. + • Netþjónar sem samsvara %s eru núna leyfðir. + • Netþjónar sem samsvara %s voru fjarlægðir af bannlistanum. + • Netþjónar sem samsvara %s eru núna bannaðir. + Þú breyttir ACL á netþjóni fyrir þessa spjallrás. + %s breytti ACL á netþjóni fyrir þessa spjallrás. + • Netþjónar sem samsvara IP-tölum eru bannaðir. + • Netþjónar sem samsvara IP-tölum eru leyfðir. + • Netþjónar sem samsvara %s eru leyfðir. + • Netþjónar sem samsvara %s eru bannaðir. + Þú stilltir ACL á netþjóni fyrir þessa spjallrás. + %s stillti ACL á netþjóni fyrir þessa spjallrás. + Þú uppfærðir hér. + %s uppfærði hér. + Þú uppfærðir þessa spjallrás. + %s uppfærði þessa spjallrás. + %1$s gerði skilaboð héðan í frá sýnileg fyrir %2$s + Þú gerðir ferilskrá spjallrásar héðan í frá sýnilega fyrir %1$s + Þú laukst símtalinu. + Þú svaraðir símtalinu. + Þú sendir gögn til að setja upp samtalið. + %s sendi gögn til að setja upp samtalið. + Þú hringdir raddsamtal. + Þú hringdir myndsamtal. + Þú breyttir heiti spjallrásarinnar í: %1$s + Þú breyttir auðkennismynd spjallrásarinnar + %1$s breytti auðkennismynd spjallrásarinnar + Þú breyttir umræðuefninu í: %1$s + Þú fjarlægðir birtingarnafn þitt (sem var %1$s) + Þú breytti birtingarnafni þínu úr %1$s í %2$s + Þú settir birtingarnafn þitt sem %1$s + Opna könnun + Spila talskilaboð + Þú þarft heimild til að uppfæra spjallrás + Vertu þolinmóð/ur Þetta getur tekið nokkra stund. + Opið öllum, best fyrir dreifða hópa + Aðvara án hljóðs + Aðvara með hljóði + Opna emoji-tánmyndaval + Skipta um auðkennismynd + Opna viðmótshluta + Virkt samtal (%1$s) + Talnaborð + Nýtt PIN-númer + Opna notkunarskilmála %s + Önnur tiltæk tungumál + 🔐️ Vertu með mér á ${app_name} + Veldu þér lykilorð. + Veldu þér notandanafn. + Aðeins stutt í dulrituðum spjallrásum + Settu inn endurheimtulykil + Ný innskráning. Varst þetta þú\? + Flugvélahamur er virkur + Ekki treyst + Sérsniðið (%1$d) í %2$s + Sjálfgefið í %1$s + Umsjónarmaður í %1$s + Stjórnandi í %1$s + Stjórnendur + + Einn aðili + %1$d aðilar + + Aðgerðir stjórnanda + Ekki öruggt + Birta villuleitarupplýsingar á skjá + Aðrar setur + Úreltur heimaþjónn + Athugaðu tölvupóstinn þinn + Símanúmer lítur út fyrir að vera ógilt. Yfirfarðu það + Nota alþjóðlega sniðið. + Nýtt lykilorð + Opna valmyndina til að útbúa spjallrás + Settu inn slóð auðkennisþjónsins + Engar breytingar fundust + Aðrar tilkynningar frá utanaðkomandi aðilum + Ekkert netkerfi. Athugaðu nettenginguna þína. + Atburður undir umsjón stjórnanda spjallrásar + Eyða öryggisafriti + Öryggisafrit endurheimti %s ! + Settu inn endurheimtulykil + Aflæsi ferli + Flyt inn dulritunarlykla… + Næ í dulritunarlykla… + Reikna endurheimtulykil… + Endurheimti úr öryggisafriti: + Settu inn endurheimtulykil + Endurheimtulykill + Deila endurheimtulykli með… + Gera afrit + Endurheimtulykillinn hefur verið vistaður. + Vista endurheimtulykil + Ég hef gert afrit + Því miður, villa kom upp + Smelltu hér til að sjá eldri skilaboð + Markdown-texti hefur verið gerður óvirkur. + Markdown-texti hefur verið gerður virkur. + Birtir upplýsingar um notanda + Markdown-texti af/á + Skilgreindu völd notanda + Loka á allt + Auðkenni viðmótshluta + Þemað þitt + Notandaauðkennið þitt + Vefslóð á auðkennismyndina þína + Birtingarnafnið þitt + Þessum viðmótshluta var bætt við af: + %1$s: %2$s %3$s + ** Mistókst að senda - opnaðu spjallrásina + %1$s í %2$s og %3$s + + %1$s: %2$d skilaboð + %1$s: %2$d skilaboð + + + %d boð + %d boð + + Þessi netþjónn er nú þegar á listanum + Fann ekki þennan netþjón eða spjallrásalista hans + Sláðu inn nafn nýja netþjónsins sem þú vilt skoða. + óþekkt IP-vistfang + Sýsla með öryggisafrit dulritunarlykla + Endurheimt dulritaðra skilaboða + Útflutningur dulritunarlykla tókst + Önnur svæði sem þú gætir ekki vitað um + Spila hljóð við myndatöku + Engin samstilling í bakgrunni + Bestað gagnvart rauntíma + Bestað gagnvart rafhleðslu + Hamur samstillingar í bakgrunni + Láta mig vita fyrir + Engu tölvupóstfangi hefur verið bætt við notandaaðganginn þinn + Engu símanúmeri hefur verið bætt við notandaaðganginn þinn + Mistókst að koma á rauntímatengingu. +\nBiddu kerfisstjóra heimaþjónsins þíns um að setja upp TURN-þjón til að tryggja að símtöl virki eðlilega. + %1$s úr %2$s í %3$s + %1$s breytti völdum %2$s. + Stjórnandi + Þú breyttir auðkennismyndinni þinni + Þú tókst til baka boð til %1$s + Þú bannaðir %1$s + Þú afbannaðir %1$s + Þú fjarlægðir %1$s + Þú hafnaðir boðinu + Þú hættir í spjallrásinni + %1$s hætti í spjallrásinni + Þú hættir í spjallrásinni + Þú gekkst í hópinn + Þú gekkst í spjallrásina + Þú bauðst %1$s + Þú bjóst til umræðuna + %1$s bjó til umræðuna + Þú bjóst til spjallrásina + %1$s bjó til spjallrásina + %s gekk í hópinn. + Þú stilltir aðalvistfang spjallrásarinnar sem %1$s. + Sérsniðin kæra… + Sýna allar spjallrásir á forsíðu + Sýsla með spjallrásir og svæði + Sýsla með spjallrásir + Svæði eru ný leið til að hópa fólk og spjallrásir. + Bæta við fyrirliggjandi svæðum + Bæta við fyrirliggjandi spjallrásum + Yfirgefa svæði + Bæta við spjallrásum + Kanna spjallrásir + Búa til svæði + Ég og félagar í teyminu mínu + Bara ég + Einkasvæðið þitt + Opinbera svæðið þitt + Bæta við svæði + Einkasvæði + Opinbert svæði + Uppfærir spjallrás í nýja útgáfu + Búa til svæði + Almenningsspjallrás + Eyða auðkennismynd + Það kom upp villa við að fletta upp símanúmerinu + Sendir skilaboðið með snjókomu + Sendir skilaboðið með skrauti + Uppfærsla dulritunar tiltæk + Sendir skilaboð sem óbreyttur texti án þess að túlka það sem markdown + Dulritun ekki virk + Skilaboð í þessari spjallrás eru enda-í-enda dulrituð. + Kerfisstjóri netþjónsins þíns hefur lokað á sjálfvirka dulritun í einkaspjallrásum og beinum skilaboðum. + Stillingar spjallrásar + Skilaboð í þessari spjallrás eru ekki enda-í-enda dulrituð. + Límmerki + Útbý svæði… + Settu inn vistfang spjallrásar + Þetta vistfang er nú þegar í notkun + Vistfang svæðis + Eftir að kveikt er á dulritun er ekki hægt að slökkva á henni. + Setur ( ͡° ͜ʖ ͡°) framan við hrein textaskilaboð + Setur ¯\\_(ツ)_/¯ framan við hrein textaskilaboð + Þetta lítur ekki út eins og gilt tölvupóstfang + Skrá tölvupóstfang + Sláðu inn vistfang netþjónsins sem þú vilt nota + Sláðu inn vistfang Modular Element-þjóns eða netþjónsins sem þú vilt nota + Vistfang fyrir Element Matrix þjónustur + Skrá inn í %1$s + Tengjast við %1$s + Skrá inn með %s + Teymi + Vinir og fjölskylda + Sendir skilaboðin sem stríðni + Stillingar spjallrásar + Hunsa notanda + Snúa og skera utan af + Límmerki + Bæta við mynd frá + Búa til nýja spjallrás + Samþykktu þjónustuskilmála auðkennisþjónsins (%s) svo hægt sé að finna þig með tölvupóstfangi eða símanúmeri. + Þú ert núna að deila tölvupóstföngum eða símanúmerum á auðkennisþjóninum %1$s. Þú þarft að tengjast aftur við %2$s til að hætta að deila þessu. + Finnanleg tölvupóstföng + Búa til nýja spjallrás + Notaðu vélmenni, viðmótshluta og límmerkjapakka + Sýsla með samþættingar + Leyfðu \'Sýsla með samþættingar\' í stillingunum til að gera þetta. + Samþættingar eru óvirkar + Samþættingarstýring + Leyfa samþættingar + Sýna lyklaborð með tjáningartáknum + Senda skilaboð með \'Enter\' + Hefur ekki áhrif á boð/fjarlægingu/bönn. + Birta taka-þátt og hætta skilaboð + Notaðu samþættingarstýringu til að stýra vélmennum, viðmótshlutum og límmerkjapökkum. +\nSamþættingarstýringar taka við stillingagögnum og geta breytt viðmótshlutum, sent boð í spjallrásir, auk þess að geta úthlutað völdum fyrir þína hönd. + Samþættingar + Þetta er upphaf ferils beinna skilaboða með %s. + Bein skilaboð + Leita að heiti + Leita eftir heiti, auðkenni eða tölvupóstfangi + Nafn eða auðkenni (#example:matrix.org) + Skoða spjallrásalistann + Senda ný bein skilaboð + Breytingar á skilaboðum + Þjappa myndskeiði %d%% + Þjappa mynd… + Sendi skrá (%1$s / %2$s) + Dulrita skrá… + Öll samfélög + Sýna fjarlægð skilaboð + Þú átt engin fleiri ólesin skilaboð + Boðið af %s + Sendi þér boð + Svara í spjallþræði + Allir lyklar öryggisafritaðir + Setja upp á þessu tæki + Varið öryggisafrit + Búa til svæði + Einungis gegn boði, best fyrir þig og lítinn hóp + Fara í fyrstu leskvittun + Sannprófa þessa setu + Þau samsvara ekki + Þau samsvara + Fela ítarlegt + Birta ítarlegt + Hreinsa öll gögn + Þú hefur verið skráður út úr öllum setum og munt ekki lengur fá ýti-tilkynningar. Til að endurvirkja tilkynningar, þarf að skrá sig aftur inn á hverju tæki fyrir sig. + Eigðu samtölin þín. + Aftengja auðkennisþjón + Umsagnir um svæði + Birta frátökutákn fyrir fjarlægð skilaboð + Eftir að þetta hefur verið virkjað, muntu geta sent staðsetninguna þína á hvaða spjallrás sem er + Niðurstöður birtast einungis eftir að þú hefur lokað könnuninni + Kjósendur sjá niðurstöðurnar þegar þeir hafa kosið + + Lokaniðurstöður byggðar á %1$d atkvæði + Lokaniðurstöður byggðar á %1$d atkvæðum + + + %1$d atkvæði greitt. Greiddu atkvæði til að sjá útkomuna + %1$d atkvæði greidd. Greiddu atkvæði til að sjá útkomuna + + Næ ekki að tengjast heimaþjóni á þessari slóð, athugaðu slóðina + réttur valkostur + Spurning eða viðfangsefni + Endurræstu forritið til að breytingin taki gildi. + Virkja LaTeX-stærðfræði + Tengja þetta tölvupóstfang við notandaaðganginn þinn + + %1$d til viðbótar + %1$d til viðbótar + + Birta skilaboðablöðrur + Mistókst að hlaða inn landakorti + Myndgera staðsetningu notenda á tímalínunni + Virkja deilingu staðsetninga + ${app_name} gat ekki fengið staðsetninguna þína. Reyndu aftur síðar. + ${app_name} gat ekki fengið staðsetninguna þína + Lokuð könnun + Ljúka könnun + Ljúka þessari könnun\? + Ljúka könnun + Engin atkvæði greidd + + Byggt á %1$d atkvæði + Byggt á %1$d atkvæðum + + + %1$d atkvæði + %1$d atkvæði + + + Það þarf allavega %1$s valkost + Það þarf allavega %1$s valkosti + + Spurning má ekki vera auð + Set upp öryggisafrit af lykli + Útbý öruggislykil úr lykilsetningu + Lykilsetning endurheimtu + Notaðu lykilsetningu endurheimtu eða dulritunarlykil + Sýsla með í öryggisafriti dulritunarlykla + Nota öryggisafrit af lykli + Verja öryggisafrit + Eyða öryggisafriti + Athuga ástand öryggisafrits + Eyði öryggisafriti… + Öryggisafrit af lyklum er ekki virkt í þessari setu. + + %d nýjum lykli hefur verið bætt við þessa setu. + %d nýjum lyklum hefur verið bætt við þessa setu. + + + Endurheimti öryggisafrit með %d lykli. + Endurheimti öryggisafrit með %d lyklum. + + Ef þú veist ekki lykilsetningu fyrir endurheimtu, geturðu %s. + notað endurheimtulykilinn þinn + Öryggisafrit er þegar til staðar á heimaþjóninum þínum + (Ítarlegt) Settu upp með endurheimtulykli + Bý til öryggisafrit + Stilla lykilsetningu + Verðu öryggisafritið þitt með lykilsetningu. + Byrja að nota öryggisafrit dulritunarlykla + Lykilsetning er of veik + Settu inn lykilsetningu + Lykilsetningar samsvara ekki + Búa til lykilsetningu + Útbúðu lykilsetningu til að dulrita útfluttu dulritunarlyklana. Þú þarft að setja inn sama lykilsetningu til að geta flutt aftur inn þessa dulritunarlykla. + Renna til að ljúka símtalinu + Tapaðu aldrei dulrituðum skilaboðum + Endilega %s til að halda áfram að nota þessa þjónustu. + Endilega %s til að fá þessi takmörk hækkuð. + Þessi heimaþjónn er kominn fram yfir takmörk á mánaðarlega virkum notendum. + Þessi heimaþjónn er kominn fram yfir takmörk á mánaðarlega virkum notendum þannig að sumir notendur munu ekki geta skráð sig inn. + Þessi heimaþjónn er kominn fram yfir takmörk á tilföngum sínum. + Þessi heimaþjónn er kominn fram yfir takmörk á tilföngum sínum þannig að sumir notendur munu ekki geta skráð sig inn. + hafðu samband við kerfisstjóra þjónustunnar þinnar + Þessi spjallrás er framhald af öðru samtali + Samtalið heldur áfram hér + Þessari spjallrás hefur verið skipt út og er hún ekki lengur virk. + Til að halda áfram að nota %1$s heimaþjóninn þarftu að yfirfara og samþykkja skilmálana og kvaðir. + Til að laga umsýslu Matrix-forrita + Beiðni um deilingu dulritunarlykils + Þú verður að samþykkja þjónustuskilmálana til að geta haldið áfram. + Ræstu myndavél kerfisins í stað sérsniðna myndavélaskjásins. + Þessi viðmótshluti vill nota eftirfarandi tilföng: + Fara af fyrirliggjandi fjarfundi og skipta yfir í hinn\? + Því miður, villa kom upp við að reyna að tengjast fjarfundinum + Því miður, fjarfundasímtöl með Jitsi eru ekki studd á eldri tækjum (tæki með Android OS minna en 6.0) + Afturkalla aðgang fyrir mig + Mistókst að hlaða inn viðmótshluta. +\n%s + Að nota það gæti deilt gögnum með %s: + Að nota það gæti stillt vefkökur og deilt gögnum með %s: + Ef þetta samsvarar ekki, getur verið að samskiptin þín séu berskjölduð. + Staðfestu með því að bera eftirfarandi saman við \'Stillingar notanda\' í hinni setunni þinni: + + Tókst að flytja inn%1$d/%2$d dulritunarlykli. + Tókst að flytja inn%1$d/%2$d dulritunarlyklum. + + Veldu hvaða svæði hafa aðgang að þessari spjallrás. Ef svæði er valið geta meðlimir þess fundið og tekið þátt í spjallrásinni. + Hver sem er á svæði með þessari spjallrás getur fundið hana og tekið þátt í henni. Aðeins stjórnendur spjallrásarinnar geta bætt henni í svæði. + Hver sem er getur látið vita af sér á spjallrásinni, meðlimir geta þá samþykkt eða hafnað + Mistókst að fá sýnileika spjallrásar á spjallrásaskrá (%1$s). + Svæði sem þú veist að innihalda þessa spjallrás + Veldu hverjir geta fundið spjallrásina og tekið þátt. + Svæði sem hafa aðgang + Leyfa meðlimum svæðis að finna og fá aðgang. + Meðlimir svæðisins %s geta fundið, forskoðað og tekið þátt. + Óþekkt aðgangsstilling (%s) + Birta þessa spjallrás opinberlega á skrá %1$s yfir spjallrásir\? + Einungis meðlimir svæðis + Hver sem er getur fundið svæðið og tekið þátt + Hver sem er getur fundið spjallrásina og tekið þátt + Birta falda atburði í tímalínu + Hjálp og um + Rödd og myndband + Stillingar spjallrásar + Umfjöllunarefni spjallrásar (valkvætt) + Skipta um netkerfi + Búa til nýtt svæði + Viðbrögð + Skoða viðbrögð + Bæta við viðbrögðum + Viðbrögð + Þú hefur klárað að lesa allt! + Skoða á spjallrás + Breytir auðkennismyndinni þinni einungis í fyrirliggjandi spjallrás + Breytir auðkennismyndinni einungis í fyrirliggjandi spjallrás + Breytir birtu gælunafni þínu einungis í fyrirliggjandi spjallrás + Fjarlægir notanda með uppgefið auðkenni úr þessari spjallrás + Stilla umfjöllunarefni spjallrásar + Gengur til liðs við spjallrás með uppgefnu vistfangi + Býður notanda með uppgefið auðkenni í fyrirliggjandi spjallrás + Stillir heiti spjallrásar + Hunsar notanda, felur skilaboð viðkomandi fyrir þér + Bannar notanda með uppgefið auðkenni + Engir virkir viðmótshlutar + Nota hljóðnemann + Nota myndavélina + Hlaða inn viðmótshluta + Nýtt boð + Netþjónninn þinn + Útgáfa spjallrásar + + %d bannaður notandi + %d bannaðir notendur + + %1$s, %2$s, %3$s og %4$s + Villa í SSL. + Veldu heimaþjón + Skrá inn með einfaldri innskráningu (single sign-on) + Nota sem sjálfgefið og ekki spyrja aftur + Kveikja á HD + Slökkva á HD + Skipta á milli myndavéla + Þráðlaus heyrnartól + Tilkynning á spjallrás + Notendur + Tilkynna öllum á spjallrásinni + Sýna minna + Deila staðsetningu + Búa til könnun + Opna tengiliði + Senda límmerki + Hlaða inn skrá + Senda myndir og myndskeið + Opna myndavél + Opna með + Deila staðsetningu + Landakort + Deila staðsetningu + Staðsetning + Deila staðsetningu + Tegund könnunar + Breyta könnun + Fjarlægja könnun + Atkvæði greitt + ÚTBÚA KÖNNUN + BÆTA VIÐ VALKOSTI + Búa til valkosti + Búa til könnun + %1$ds eftir + Eyða upptöku + Stöðva upptöku + Uppfærsla er nauðsynleg + Uppfæra + Nafnlaus spjallrás + Tillaga + Ljúka uppsetningu + Sleppa í bili + Deila tengli + Bjóða fólki + Lýsing + Slembið + Almennt + Einka + Opinbert + Eyða ósendum skilaboðum + Mistókst + Sent + Sendi + Atburður sendur! + Ekkert efni + Stöðulykill + Tegund + Senda sérsniðinn atburð + Skoða stöðu spjallrásar + Ekki tiltækt + Ónettengt + Nettengt + Ekki tilkynna + Ekki skoðað + Athugað + Valið + Myndskeið + Mynd + Skjámynd + Tókst ekki að auðkenna + Óþekktur einstaklingur + Notendur + Flutningur + Tengjast + Virkt samtal (%1$s) · + + Virkt samtal · + %1$d virk samtöl · + + Ekkert svar + Innhringing myndsamtals + Innhringing raddsamtals + Hringja til baka + Þessu símtali er lokið + Henda breytingum + Breyta PIN-númeri + Virkja PIN-númer + Gleymt PIN-númer\? + Settu inn PIN-númerið þitt + Staðfestu PIN-númer + + %d færsla + %d færslur + + Tengiliðaskrá + KANNA NÁNAR + NÁÐI ÞVÍ + Stilla auðkennismynd + Umfjöllunarefni + Nafn spjallrásar + Setja upp + Ræsa myndavélina + Stöðva myndavélina + Kveikja á hljóðnema + Þagga niður í hljóðnema + Opna spjall + Hlutverk + Stilla hlutverk + Senda inn + Nota %1$s + Núverandi tungumál + Bjóða vinum + Bjóða notendum + BJÓÐA + Ódulritað + Frumstilla allt + Gat ekki vistað myndefnisskrá + Skilaboð… + Leysa vandamál + "Umfjöllunarefni: " + Dulritun virk + Ljúka + Hætt við staðfestingu + Endurlesa + Staðfesta fjarlægingu + Fjarlægja… + Tenging við netþjón hefur rofnað + Nei + + QR-kóði + Endurstilla dulritunarlykla + Treyst + Setur + Aðvörun + Sannreynt + Sannreyna + óstöðug + stöðug + Sjálfgefin útgáfa + Útgáfa á þjóni + Heiti þjóns + Virkja dulritun + Virkja dulritun\? + Tímalína + Hætta að hunsa + Notendur + Boðsgestir + Sérsniðið + Umsjónarmenn + Fara út + Fara af spjallrás + Innsendingar + Tilkynningar + Stillingar + Meira + Kanna nánar + Öryggi + Bíð… + Könnun + Skrá + Tal + Hljóð + Mynd. + Myndskeið. + Virkja dulritun + Núverandi seta + Stillingar + Ítarlegar stillingar + Lýsingin er of stutt + Hreinsa gögn + Lykilorð + Skrá inn + Skrá inn + Matrix-auðkenni + Aðvörun + Næsta + Lykilorð + Notandanafn + Notandanafn eða tölvupóstfang + Næsta + Settu inn kóða + Staðfestu símanúmer + Næsta + Símanúmer (valfrjálst) + Símanúmer + Næsta + Tölvupóstfang (valfrjálst) + Tölvupóstur + Könnuninni er lokið + Valkostur %1$d + Spurning eða viðfangsefni könnunar + Aðvörun + Lykilorðið þitt hefur verið endurstillt. + Tókst! + Ég hef staðfest tölvupóstfangið mitt + Halda áfram + Aðvörun! + Tölvupóstur + Næsta + Vistfang + Hreinsa vinnsluferil + Skrá inn + Nýskrá + Halda áfram + einfaldri innskráningu (single sign-on) + Skrá inn með %s + Halda áfram með %s + Eða + Annað + Kanna nánar + Ég er nú þegar með notandaaðgang + Stofna aðgang + Komast í gang + Tengjast þjóni + Samfélög + Ólesin skilaboð + Fjarlægja úr eftirlætum + Bæta í eftirlæti + Stillingar + Þagga niður + Aðeins minnst á + Öll skilaboð + Öll skilaboð (hávært) + Tilkynnt sem óviðeigandi + Tilkynnt sem ruslpóstur + Efni tilkynnt + KÆRA + Ástæður fyrir kæru á þessu efni + Kæra þetta efni + Þetta er óviðeigandi + Þetta er ruslpóstur + %1$s kl. %2$s + SKRÁR + MYNDEFNI + %1$d af %2$d + Staðsetning + Könnun + Myndasafn + Myndavél + Tengiliður + Skrá + Opna leiðsagnarsleðann + Kóði + Auðkennisþjónn + Þjónustuskilmálar + Skoða breytingaskrá + Tillögur + QR-kóði + Tengill afritaður á klippispjald + (breytt) + Bíð… + Bein skilaboð + Gefðu umsögn + Umsagnir + Kerfisstillingar + Útgáfur + Hjálp og aðstoð + Hjálp + Snið: + Slóð: + Öryggi og gagnaleynd + Kjörstillingar + Almennt + Opinbert + Umfjöllunarefni + Heiti + Nafn spjallrásar + ÚTBÚA + Bein skilaboð + Spjallrásir + Bíddu aðeins… + Búa til nýja spjallrás + Skilaboðum eytt + Spjallrásir + Samtöl + Reyna aftur + Svara + Breyta + Óþekkt villa + Náði því + Sannreynt! + Undirritun + Reiknirit + Útgáfa + Endurheimta úr öryggisafriti + Ertu viss\? + Óvænt villa + Stöðva + Skipta út + Vista sem skrá + Deila + Lokið + Tókst ! + (Ítarlegt) + %d+ + %1$s: %2$s + fella saman + fletta út + Settu inn lykilorðið þitt. + Settu inn notandanafn. + Þögult + Breytir birtu gælunafni þínu + Fara af spjallrás + Birtir aðgerð + Hunsa + Deila + Lesa DRM-varið myndefni + Leyfa + Auðkenni spjallrásar + Opna í vafra + Endurlesa viðmótshluta + Viðmótshluti + Virkir viðmótshlutar + SKOÐA + %1$s: %2$s + Ég + Ný skilaboð + Spjallrás + Nýr atburður + %1$s og %2$s + + %d tilkynning + %d tilkynningar + + Bæta við nýjum þjóni + Opinbert + Einka + Staðvær vistföng + Gefa út + Aðgangur að spjallrás + Stillingar notandaaðgangs + Veldu + Veldu + Myndefni + Lykilorð + hér + Forskoða myndefni fyrir sendingu + + %d sekúnda + %d sekúndur + + Skilaboð frá vélmennum + Boð á spjallrás + Stikkorð + \@spjallrás + Hópskilaboð + Bein skilaboð + Notandanafnið mitt + Birtingarnafn mitt + Virkja í ræsingu + Bæta við notandaaðgangi + Sérsniðnar stillingar. + Virkja + Setustillingar. + Virkja + Stillingar notandaaðgangs. + Opna stillingar + Kerfisstillingar. + Annað + Sjálfgefnar tilkynningar + Ítarlegar stillingar á tilkynningum + Fjarlægja %s\? + Símanúmer + Tölvupóstföng + Ekkert + Sía + Spjallþræðir + Spjallþráður + + %d valið + %d valið + + Breyta stillingum + Bjóða notendum + Heimildir + %1$s og %2$s + Taka notanda úr banni + Banna notanda + Fjarlægja notanda + Lækka niður um stig + Ekkert svar + Bíða + Halda áfram + Símtöl + Alltaf spyrja + Aftan + Fram + Heyrnartól + Hátalari + Sími + Svæði + Skrá yfir spjallrásir + Ekki fleiri niðurstöður + Tilkynningar + Nýtt gildi + Tókst + Villa + Endurstilla + Hafna + Spila + Aftengjast + Afturkalla + Sækja + Hafna + Hunsa + Sleppa + Samþykkja + Breyta + Samþykki + Ekki núna + Virkja + Skipta um + Bæta við + Ýttu til að breyta svæðum + Veldu svæði + Hætta að birta þetta vistfang + Birta þetta vistfang + Bæta við staðværu vistfangi + Þessi spjallrás er ekki með nein staðvær vistföng + Stilltu vistföng fyrir þessa spjallrás svo notendur geti fundið hana í gegnum heimaþjóninn þinn (%1$s) + Nýtt birt vistfangs (t.d. #samnefni:netþjónn) + Engin önnur birt vistföng ennþá. + Engin önnur birt vistföng ennþá, bættu einu við hér fyrir neðan. + Eyða vistfanginu \"%1$s\"\? + Hætta að birta vistfangið \"%1$s\"\? + Birta nýtt vistfang handvirkt + Önnur birt vistföng: + Þetta er aðalvistfangið + Birt vistföng getur hvaða einstaklingur eða netþjónn sem er notað til að taka þátt í spjallrásinni þinni. Til að birta vistfang, þarf fyrst að stilla það sem staðvært vistfang. + Birt vistföng + Sjá og sýsla með vistföng þessa svæðis. + Vistföng svæða + Sjá og sýsla með vistföng þessarar spjallrásar og sýnileika hennar í spjallrásaskránni. + Vistföng spjallrása + Leyfa gestum að taka þátt + Aðgangur að svæði + Hver hefur aðgang\? + Láta mig vita fyrir + Uppgötvun + Uppfærslur spjallrásar + Skilaboð sem innihalda @spjallrás + Þegar spjallrásir eru uppfærðar + Heimildir svæðis + Ástæða fyrir banni + Ástæða fjarlægingar + Hætta við boð + Hætta að hunsa notanda + Hunsa notanda + Lækka þig sjálfa/n í tign\? + Fjarlægja úr spjalli + Hætta við boð + Notandinn sem þú hringdir í er upptekinn. + Þetta er ekki gilt vistfang á Matrix-þjóni + Tillögur að spjallrásum + Skoða á spjallrás + Þú breyttir vistföngum fyrir þessa spjallrás. + %1$s breytti vistföngum fyrir þessa spjallrás. + Þú breytti aðal- og varavistföngunum fyrir þessa spjallrás. + %1$s breytti aðal- og varavistföngunum fyrir þessa spjallrás. + Þú breyttir varavistfanginu fyrir þessa spjallrás. + %1$s breytti varavistfanginu fyrir þessa spjallrás. + Þú fjarlægðir aðalvistfang spjallrásarinnar. + %1$s fjarlægði aðalvistfang spjallrásarinnar. + %1$s stillti aðalvistfang spjallrásarinnar sem %2$s. + Þú bættir við %1$s og fjarlægðir %2$s sem vistföng fyrir þessa spjallrás. + %1$s bætti við %2$s og fjarlægði %3$s sem vistföng fyrir þessa spjallrás. + + Þú fjarlægðir %1$s sem vistfang fyrir þessa spjallrás. + Þú fjarlægðir %1$s sem vistföng fyrir þessa spjallrás. + + + %1$s fjarlægði %2$s sem vistfang fyrir þessa spjallrás. + %1$s fjarlægði %2$s sem vistföng fyrir þessa spjallrás. + + + Þú bættir við %1$s sem vistfangi fyrir þessa spjallrás. + Þú bættir við %1$s sem vistföngum fyrir þessa spjallrás. + + + %1$s bætti við %2$s sem vistfangi fyrir þessa spjallrás. + %1$s bætti við %2$s sem vistföngum fyrir þessa spjallrás. + + Breyta umfjöllunarefni + Uppfæra svæðið + Uppfæra spjallrásina + Senda m.room.server_acl atburði + Breyta heimildum + Breyta nafni svæðis + Breyta nafni spjallrásar + Breyta sýnileika ferils + Virkja dulritun svæðis + Virkja dulritun spjallrásar + Skipta um aðalvistfang svæðisins + Skipta um aðalvistfang spjallrásarinnar + Skipta um táknmynd svæðis + Skipta um auðkennismynd spjallrásar + Breyta viðmótshlutum + Tilkynna öllum + Fjarlægja skilaboð send af öðrum + Banna notendur + Fjarlægja notendur + Senda skilaboð + Sjálfgefið hlutverk + %1$s, %2$s og aðrir + Hringing… + Afrita + Merkja sem lesið + Ertu viss um að þú viljir skrá þig út\? + Leggja á + Hafna + Samþykkja + Lokið + Svæði + Hefja spjall + Ekkert + Ertu viss\? + Öryggisafrit af lykli + Sjálfgefið í kerfinu + Sendi skilaboð… + Skilaboð send + Tóm spjallrás (var %s) + + %1$s, %2$s, %3$s og %4$d til viðbótar + %1$s, %2$s, %3$s og %4$d til viðbótar + + %1$s, %2$s og %3$s + Sérsniðið + Sérsniðið (%1$d) + Sjálfgefið + Umsjónarmaður + %1$s bauð %2$s + Engin breyting. + %1$s gekk í hópinn + Boðið þitt \ No newline at end of file From 3d7aa99b28418faf511ca980fe407ceafa85cc9a Mon Sep 17 00:00:00 2001 From: Tuomas Hietala Date: Fri, 11 Mar 2022 22:40:22 +0000 Subject: [PATCH 057/152] Translated using Weblate (Finnish) Currently translated at 83.2% (1795 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fi/ --- vector/src/main/res/values-fi/strings.xml | 88 ++++++++++++++++++++--- 1 file changed, 79 insertions(+), 9 deletions(-) diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml index 7e22ce42a8..c5e67771dd 100644 --- a/vector/src/main/res/values-fi/strings.xml +++ b/vector/src/main/res/values-fi/strings.xml @@ -46,7 +46,8 @@ Alkusynkronointi: \nTuodaan huoneita Alkusynkronointi: -\nTuodaan liityttyjä huoneita +\nLadataan keskustelujasi +\nMikäli olet liittynyt moniin huoneisiin, tässä voi mennä tovi Alkusynkronointi: \nTuodaan kutsuttuja huoneita Alkusynkronointi: @@ -365,7 +366,7 @@ Kokeelliset Nämä ovat kokeellisia ominaisuuksia, jotka voivat mennä rikki. Käytä varoen. Aseta pääosoitteeksi - Poista pääosoite + Kumoa pääosoitteeksi asettaminen Salauksenpurkuvirhe Julkinen nimi Istunnon tunnus @@ -520,7 +521,7 @@ yksi jäsen %d jäsentä - Poista huoneesta + Poista keskustelusta yksi uusi viesti %d uutta viestiä @@ -628,7 +629,7 @@ Määritä käyttäjän oikeuksien taso Poistaa käyttäjän operaattorioikeudet Kutsuu käyttäjän nykyiseen huoneeseen - Liittyy annettuun huoneeseen + Liittyy osoitteen mukaiseen huoneeseen Poistu huoneesta Aseta huoneen aihe Potkaisee käyttäjän pois @@ -646,7 +647,7 @@ \nViestien näkyvyys Matrixissa on samantapainen kuin sähköpostissa. Viestiesi unohtaminen tarkoittaa, että lähettämiäsi viestejä ei näytetä uusille tai rekisteröitymättömille käyttäjille. Ne rekisteröityneet käyttäjät, joilla viestisi jo on, pääsevät kuitenkin näkemään oman kopionsa niistä jatkossakin. Unohda kaikki viestit, jotka olen lähettänyt, kun tilini on poistettu (Varoitus: tästä seuraa, että tulevat käyttäjät näkevät vanhat keskustelut epätäydellisinä) Syötä käyttäjätunnus. - Tämä huone on korvattu toisella huoneella + Tämä huone on korvattu toisella eikä ole enää aktiivinen. Keskustelu jatkuu täällä Tämä huone on jatkoa toiselle keskustelulle Paina tästä nähdäksesi vanhemmat viestit @@ -801,9 +802,9 @@ %s kutsui Sinulla ei ole enempää lukemattomia viestejä Keskustelut - Yksityisviestisi näytetään tässä. Napsauta + oikeasta alakulmasta aloittaaksesi. + Yksityisviestisi näytetään tässä. Napauta + oikeasta alakulmasta aloittaaksesi keskustelun. Huoneet - Huoneesi näytetään tässä. Napsauta + oikeasta alakulmasta aloittaaksesi. + Huoneesi näytetään tässä. Napauta + oikeasta alakulmasta löytääksesi olemassa olevia tai perustaaksesi omiasi. Reaktiot Samaa mieltä Lisää reaktio @@ -1405,7 +1406,7 @@ Viestieditori Muut kielet Näytä merkki poistettujen viestien paikalla - Käytä /snow kometoa tai lähetä viesti jossa on ❄️ tai 🎉 + Käytä /confetti-komentoa tai lähetä viesti jossa on ❄️ tai 🎉 Näytä keskustelujen tehosteet Näytä poistetut viestit Jos poistat käyttäjän porttikiellon, hän voi liittyä huoneeseen uudelleen. @@ -1507,7 +1508,7 @@ Ensimmäinen synkronointi: \nLadataan tietoja… Ensimmäinen synkronointi: -\nOdotetaan palvelimen vastausta. . . +\nOdotetaan palvelimen vastausta…
    %1$s, %2$s, %3$s ja %4$d muu %1$s, %2$s, %3$s ja %4$d muuta @@ -1983,4 +1984,73 @@ Yhdistä palvelimeen Minulla on jo tili Luo tili + ${app_name} ei voinut käyttää sijaintiasi. Yritä myöhemmin uudelleen. + ${app_name} ei voinut käyttää sijaintiasi + Haluatko varmasti poistaa tämän kyselyn\? Et voi palauttaa sitä poistamisen jälkeen. + Huomaa: sovellus käynnistetään uudelleen + Tapahtuman sisältö + Tapahtuman sisältö + Lähetä mukautettu tapahtuma + Oletusluottamustaso + Huonetta, johon olet saanut porttikiellon ei voi avata. + Noudetaan yhteystietojasi… + Lähettää viestin lumisateen kera + Lähettää viestin konfetin kera + ${app_name} iOS +\n${app_name} Android + Lähettää viestin pelkkänä tekstinä, tulkitsematta sitä markdowniksi + Ota yhteyttä ylläpitäjään salauksen palauttamiseksi kelvolliseen tilaan. + Lue koodi toisella laitteellasi tai vaihda ja lue tällä laitteella + Ei-luotettu kirjautuminen + Teit tästä kutsua edellyttävän. + Sijainti + Kysely + + %1$s, %2$s ja yksi muu lukivat + %1$s, %2$s ja %3$d muuta lukivat + + Hyväksytkö näiden tietojen lähettämisen\? + Versiot + Ohje ja tuki + Ohje + Huone on luotu, mutta joitakin kutsuja ei ole lähetetty seuraavasta syystä: +\n +\n%s + Tähän huoneeseen ei pääse tällä hetkellä. +\nYritä myöhemmin uudelleen tai kysy huoneen ylläpitäjältä onko sinulla pääsyä. + Näytä huoneessa + Tuntematon pääsyasetus (%s) + Aseta osoitteita tälle huoneelle, jotta käyttäjät voivat löytää tämän huoneen kotipalvelimesi (%1$s) kautta + Uusi julkaistu osoite (esim. #alias:palvelin) + Kuka hyvänsä millä hyvänsä palvelimella voi käyttää julkaistua osoitetta huoneeseesi liittymiseen. Osoitteen julkaisemiseksi se täytyy ensin asettaa paikalliseksi osoitteeksi. + Kolmansien osapuolten kirjastot + Voit poistaa tämän käytöstä koska tahansa asetuksista + Emme jaa tietoa kolmansien tahojen kanssa + Emme tallenna tai profiloi mitään tilin tietoja + Huoneesta on poistuttu! + Sinulla ei ole lupaa päivittää rooleja, jotka vaaditaan huoneen eri osien muuttamiseen + Valitse roolit, jotka vaaditaan huoneen eri osien muuttamiseen + Tarkastele ja päivitä rooleja, jotka vaaditaan huoneen eri osien muuttamiseen. + %1$s, %2$s ja muita + %1$s ja %2$s + Kotipalvelinta URL-osoitteesta %s ei tavoiteta. Tarkista linkki tai valitse kotipalvelin manuaalisesti. + Näytä huoneessa + Ota käyttöön + + Poistit tältä huoneelta vaihtoehtoisen osoitteen %1$s. + Poistit tältä huoneelta vaihtoehtoiset osoitteet %1$s. + + + %1$s poisti tältä huoneelta vaihtoehtoisen osoitteen %2$s. + %1$s poisti tältä huoneelta vaihtoehtoiset osoitteet %2$s. + + + Lisäsit tälle huoneelle vaihtoehtoisen osoitteen %1$s. + Lisäsit tälle huoneelle vaihtoehtoiset osoitteet %1$s. + + + %1$s lisäsi tälle huoneelle vaihtoehtoisen osoitteen %2$s. + %1$s lisäsi tälle huoneelle vaihtoehtoiset osoitteet %2$s. + + Sinulla ei ole lupaa liittyä tähän huoneeseen \ No newline at end of file From 0521ff91c3ef116d0c4b59fa94964a5ada3526ce Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 11 Mar 2022 09:33:25 +0000 Subject: [PATCH 058/152] Translated using Weblate (Hungarian) Currently translated at 99.8% (2154 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- vector/src/main/res/values-hu/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index f189a4198f..eae62b6417 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -2279,7 +2279,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Elhagytad a szobát! A meglévő kapcsolatok felderítéséhez információkat (e-mail cím és telefonszám) kell elküldeni az azonosítási szolgáltatónak. Az adatok az adatvédelem miatt hashelve lesznek elküldve. Beleegyezel az információk elküldésébe\? - Nem most + Ne most Engedélyezés Biztosan törlöd ezt a szavazást\? Ezt a műveletet később nem lehet visszavonni. Szavazás törlése From 5d67529ce211124c7a1fdab919145ff7227aea92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Mon, 14 Mar 2022 04:37:32 +0000 Subject: [PATCH 059/152] Translated using Weblate (Slovak) Currently translated at 99.7% (2152 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- vector/src/main/res/values-sk/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index 8d97ff7266..154d6f41b3 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -2452,4 +2452,5 @@ %1$d ďalších Zadajte URL adresu servera Modular Element alebo adresu servera, ktorý si želáte použiť + Hlasovať \ No newline at end of file From 667189c8bc2c59f6aef58b7e07c3b98523f18f32 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Mon, 14 Mar 2022 04:37:00 +0000 Subject: [PATCH 060/152] Translated using Weblate (Slovak) Currently translated at 99.7% (2152 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- vector/src/main/res/values-sk/strings.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index 154d6f41b3..ab3d80d9ca 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -2274,7 +2274,7 @@ Týmto sa zastaví možnosť hlasovania a zobrazia sa konečné výsledky ankety. Určite chcete túto anketu odstrániť\? Po odstránení ju už nebudete môcť obnoviť. Typ ankety - Otvoriť anketu + Otvorená anketa Hlasujúci uvidia výsledky hneď po hlasovaní Uzavretá anketa Zobraziť vlákna @@ -2453,4 +2453,12 @@ Zadajte URL adresu servera Modular Element alebo adresu servera, ktorý si želáte použiť Hlasovať + Odoslať stav udalosti + Priradenie sa nepodarilo. + V súčasnosti neexistuje žiadne priradenie k tomuto identifikátoru. + použite záložný kľúč na obnovu kľúča + Uloženie tajnej zálohy kľúčov v SSSS + Generovanie kľúča SSSS z kľúča pre obnovu + Definovanie predvoleného kľúča SSSS + Rýchle-zlyhanie \ No newline at end of file From 0b67e1cb3f1ae55a1d8561cd9aacbc2718fc53b2 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Sun, 13 Mar 2022 08:59:01 +0000 Subject: [PATCH 061/152] Translated using Weblate (Russian) Currently translated at 100.0% (51 of 51 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/ru/ --- fastlane/metadata/android/ru-RU/changelogs/40104000.txt | 2 ++ fastlane/metadata/android/ru-RU/changelogs/40104020.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/ru-RU/changelogs/40104000.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/40104020.txt diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104000.txt b/fastlane/metadata/android/ru-RU/changelogs/40104000.txt new file mode 100644 index 0000000000..f6bf34b3cc --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/40104000.txt @@ -0,0 +1,2 @@ +Основные изменения в этой версии: Начальная реализация веток сообщений. Сообщения пузыри. +Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.4.0 diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104020.txt b/fastlane/metadata/android/ru-RU/changelogs/40104020.txt new file mode 100644 index 0000000000..864bd03d5e --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/40104020.txt @@ -0,0 +1,2 @@ +Основные изменения в этой версии: добавлена поддержка @room и нераскрытых опросов, а также множество других мелких изменений. +Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.4.2 From a5585ca3b37405923641e9a18df37f3c144cdc3d Mon Sep 17 00:00:00 2001 From: Edward Gera Date: Sun, 13 Mar 2022 15:01:48 +0000 Subject: [PATCH 062/152] Translated using Weblate (Hebrew) Currently translated at 89.0% (1921 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/he/ --- vector/src/main/res/values-iw/strings.xml | 91 +++++++++++++++++++++-- 1 file changed, 83 insertions(+), 8 deletions(-) diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml index 73a57823eb..d78ff9f162 100644 --- a/vector/src/main/res/values-iw/strings.xml +++ b/vector/src/main/res/values-iw/strings.xml @@ -2099,8 +2099,8 @@ שיחה פעילה · %1$d שיחות פעילות · - - + + שיחה פעילה (%1$s) אירעה שגיאה בחיפוש מספר הטלפון @@ -2124,17 +2124,17 @@ להודיע לכל החדר %1$d יותר - - - + + + %1$s, %2$s ואחרים %1$s ו %2$s %d שינוי ברשימות ACL בשרתים - - - + + + נהל חדרים החלט מי יכול לראות ולהצטרף לחדר זה. @@ -2175,4 +2175,79 @@ שם המשתמש שלי הזמנות לחדר מילות מפתח + הזמן אל %s + הזמן אנשים + הזמן אנשים למרחב שלך + תֵאוּר + יוצר מרחב… + אַקרַאִי + ראשי + בואו ניצור חדר לכל אחד מהם. אתה יכול להוסיף עוד מאוחר יותר, כולל אלה שכבר קיימים. + על איזה דברים אתה עובד\? + ודא שלאנשים הנכונים יש גישה לחברה %s. תוכל להזמין עוד מאוחר יותר. + מי הם חבריך לצוות\? + אנחנו ניצור עבורם חדרים. אתה יכול להוסיף עוד מאוחר יותר גם. + איזה דיונים אתה רוצה לקיים ב-%s\? + תן לזה שם כדי להמשיך. + הוסף כמה פרטים כדי לשפר לזיהוי. אתה יכול לשנות את זה בכל שלב. + הוסף כמה פרטים כדי לבלוט. אתה יכול לשנות את זה בכל שלב. + צור מרחב + הזמן רק, הכי טוב לעצמך או לצוותים שלך + פְּרָטִי + פתוח לכל אחד, הכי מתאים לקהילות + צִבּוּרִי + מרחב פרטי עבורך ועבור חברי הצוות שלך + אני וחברי הצוות + מרחב פרטי לארגון החדרים שלך + רק אני + ודא שלאנשים הנכונים יש גישה אל %s. + עם מי אתה עובד\? + כדי להצטרף למרחב קיים, אתה צריך הזמנה. + אתה יכול לשנות את זה מאוחר יותר + איזה סוג מרחב אתה רוצה ליצור\? + המרחב הפרטי שלך + המרחב הציבורי שלך + הוסף מרחב + מרחב אישי + מרחב ציבורי + האם אתה בטוח שברצונך למחוק את כל ההודעות שלא נשלחו בחדר הזה\? + מחק הודעות שלא נשלחו + שליחת ההודעות נכשלה + האם ברצונך לבטל את שליחת ההודעה\? + מחק את כל ההודעות שנכשלו + נִכשָׁל + נשלח + שְׁלִיחָה + משדרג חדר לגרסה חדשה + עזוב את החדר עם מזהה נתון (או החדר הנוכחי אם ריק) + הצטרף למרחב עם המזהה הנתון + הוסף למרחב הנתון + צור מרחב + תוכן האירוע + מצב האירוע נשלח! + האירוע נשלח! + אירוע שגוי + חסר סוג הודעה + אין תוכן + תוכן האירוע + מצב מפתח + סוג + שלח אירוע מצב מותאם אישית + ערוך תוכן + מצב אירוע + שלח מצב אירוע + שלח אירוע מותאם אישית + חקור מצב חדר + כלי מפתח + לא זמין + לא על הקו + על הקו + חדר ציבורי + צפה באישורי קריאה + אל תתריעה + מתריעה ללא קול + מתריעה עם צליל + ההודעה לא נשלחה עקב שגיאה + לא בָּדוּק + בָּדוּק \ No newline at end of file From e3d8b3d488153c6b48d76691f57435b022379d5c Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Sun, 13 Mar 2022 09:12:39 +0000 Subject: [PATCH 063/152] Translated using Weblate (Russian) Currently translated at 99.8% (2153 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/ --- vector/src/main/res/values-ru/strings.xml | 99 +++++++++-------------- 1 file changed, 39 insertions(+), 60 deletions(-) diff --git a/vector/src/main/res/values-ru/strings.xml b/vector/src/main/res/values-ru/strings.xml index 465bbbb28c..9a925ecaa7 100644 --- a/vector/src/main/res/values-ru/strings.xml +++ b/vector/src/main/res/values-ru/strings.xml @@ -39,7 +39,6 @@ Приглашение в комнату %1$s и %2$s Пустая комната - Начальная синхронизация: \nИмпорт учетной записи… Начальная синхронизация: @@ -258,7 +257,6 @@ Удалить Переименовать Пожаловаться на содержимое - или Приглашение Выйти из учётной записи @@ -281,7 +279,6 @@ Только Matrix контакты Нет результатов Комнаты - Отправить логи Отправить журналы ошибок Отправить снимок экрана @@ -309,11 +306,9 @@ Это не похоже на действительный адрес электронной почты Этот адрес электронной почты уже используется. Забыли пароль? - Этот домашний сервер хочет убедиться, что вы не робот Должен быть введен адрес электронной почты привязанный к учетной записи. Не удалось проверить адрес электронной почты: убедитесь, что вы перешли по ссылке из сообщения - Пожалуйста, введите корректный URL Неверный формат JSON Не содержит допустимого JSON @@ -329,12 +324,10 @@ Идёт разговор… Вызываемый абонент не смог ответить. Информация - ${app_name} необходимы разрешения на доступ к микрофону, чтобы выполнять звонки. ${app_name} необходимы разрешения на доступ к камере и микрофону для видеовызовов. \n \nПожалуйста дайте разрешение в следующем окне для звонка. - ДА НЕТ Продолжить @@ -342,7 +335,6 @@ Присоединиться Отклонить Перейти к непрочитанному - Покинуть комнату Вы уверены, что хотите выйти из комнаты\? ПРЯМЫЕ СООБЩЕНИЯ @@ -369,7 +361,6 @@ Сертификат был изменен с того, которому доверял ваш телефон. Это ОЧЕНЬ НЕОБЫЧНО. Рекомендуется НЕ ПРИНИМАТЬ этот новый сертификат. Сертификат изменился с ранее доверенного на недействительный. Возможно, сервер обновил свой сертификат. Свяжитесь с администратором сервера для получения ожидаемого отпечатка сертификата. Примите сертификат только если администратор сервера опубликовал отпечаток сертификата, который соответствует указанному выше. - Поиск Фильтр списка пользователей Нет результатов @@ -414,7 +405,6 @@ Обновить публичное имя Недавно %1$s @ %2$s - Аутентификация Авторизован как Домашний сервер @@ -445,7 +435,6 @@ Это экспериментальные функции, которые могут повести себя неожиданным образом. Используйте с осторожностью. Установить как основной адрес Сбросить основной адрес - Ошибка дешифровки Публичное имя ID сессии @@ -456,7 +445,6 @@ Экспорт Введите парольную фразу Подтвердите парольную фразу - Импорт E2E ключей комнаты Импорт ключей комнаты Импортировать ключи из локального файла @@ -468,7 +456,6 @@ Подтвердить Чтобы убедиться, что этой сессии можно доверять, обратитесь к ее владельцу, используя другие способы (например, лично или по телефону), и спросите, соответствует ли ключ, который он видит в настройках для этой сессии: Если они не совпадают, безопасность вашего общения может быть поставлена под угрозу. - Выбор каталога комнат Имя сервера Все комнаты на сервере %s @@ -545,7 +532,6 @@ Причина: %1$s Встряхните устройство, чтобы сообщить об ошибке Список участников - %d комната %d комнаты @@ -560,7 +546,6 @@ Аватар - %d участник %d участника @@ -573,7 +558,6 @@ %d новых сообщений - %d изменение членства %d изменения членства @@ -586,7 +570,6 @@ %d непрочитанных уведомлений - Чутье Отправить стикер Отправить стикер @@ -633,18 +616,12 @@ Нажмите здесь для просмотра старых сообщений Присоединиться к комнате с указанным адресом Для исправления управления приложениями Matrix - - - - %d выбран %d выбрано %d выбраны - - Системные оповещения Ошибка Создать парольную фразу @@ -733,7 +710,6 @@ Показывать события о вступлении/выходе Показывать события аккаунта Включает изменения аватара и отображаемого имени. - Использовать системную камеру вместо камеры Element. %1$s: %2$s %d+ @@ -814,7 +790,6 @@ Невозможно расшифровать резервную копию с помощью этого ключа восстановления: убедитесь, что вы ввели правильный ключ. Невозможно расшифровать резервную копию с помощью этого пароля: убедитесь, что вы ввели правильный пароль. Генерация ключей восстановления с использованием парольной фразы может занять несколько секунд. - [%1$s] \nЭта ошибка вне контроля ${app_name}. На телефоне нет учетной записи Google. Пожалуйста, добавьте аккаунт Google. [%1$s] @@ -855,7 +830,6 @@ Использовать резервное копирование ключей Управление резервным копированием ключей Новые ключи зашифрованных сообщений - Ваши ключи копируются. (Дополнительно) Настройка с ключом восстановления Или защитите резервную копию с помощью ключа восстановления, сохранив его в безопасном месте. @@ -910,11 +884,8 @@ Поделиться Запрос поделится ключом Игнорировать - Проверено! Понял - - Запрос на подтверждение %s желает подтвердить вашу сессию Неизвестная ошибка @@ -1011,7 +982,6 @@ Никто Отмена Отключить - Не удается связаться с домашним сервером по этому URL, пожалуйста, проверьте его Оптимизирован для батареи Оптимизирован для работы в реальном времени @@ -1023,7 +993,6 @@ ${app_name} будет синхронизироваться в фоновом режиме периодически в точное время (настраивается). \nЭто повлияет на использование радио и батареи, появится постоянное уведомление о том, что ${app_name} прислушивается к событиям. Вы не будете уведомлены о входящих сообщениях, когда приложение находится в фоновом режиме. - Изменить настройки обнаружения. Вы не используете какой-либо сервер обнаружения Похоже, вы пытаетесь подключиться к другому домашнему серверу. Вы хотите выйти\? @@ -1090,7 +1059,7 @@ Покинуть комнату %1$s сделал(а) комнату доступной для всех, у кого есть ссылка. %1$s сделал(а) комнату доступной только по приглашению. - Подробные логи помогут разработчикам, предоставив больше информации, когда вы отправляете ВзмахЯрости. Даже когда они разрешены, приложение не записывает ваши сообщения и другие приватные данные. + Подробные логи помогут разработчикам, предоставив больше информации, когда вы отправляете \"Яростное встряхивание\". Даже когда они разрешены, приложение не записывает ваши сообщения и другие приватные данные. Закройте меню создание комнаты… Вниз Контакт @@ -1276,7 +1245,6 @@ Лента сообщений Ключ сообщения Распечатайте его и храните в безопасном месте - Шифрование включено Шифрование не включено %1$s: %2$s @@ -1311,7 +1279,6 @@ Закрыть окно резервного копирования ключей %s прочитано Не удалось обработать данные - Воспроизвести Копировать Удачно @@ -1405,10 +1372,10 @@ Это недопустимый идентификатор пользователя. Ожидаемый формат: \'@user:homeserver.org\' Не удалось найти действительный домашний сервер. Пожалуйста, проверьте свой идентификатор Начальная синхронизация… - СотрясениеЯрости + Яростное встряхивание Порог обнаружения Встряхните телефон, чтобы проверить порог обнаружения - Обнаружено потрясение! + Обнаружено встряхивание! Показываем только первые результаты, наберите больше букв… Раннее падение ${app_name} может падать чаще, когда происходит непредвиденная ошибка @@ -1443,7 +1410,6 @@ Подтверждено %s Подтверждённых %s Ожидаем %s… - Сообщения в этой комнате не защищены сквозным шифрованием. Сообщения в этой комнате защищены сквозным шифрованием. \n @@ -1871,7 +1837,6 @@ Скрыть дополнительные настройки Показать дополнительные настройки %1$d из %2$d - Дать согласие Отозвать моё согласие Больше никаких результатов @@ -1973,8 +1938,6 @@ Перевод Подключиться Сначала посоветуйтесь - - Нет учётных данных, неправильная учётная запись пользователя и/или пароль Вы уверены, что хотите удалить все неотправленные сообщения в этой комнате\? Удалить неотправленные сообщения @@ -2061,7 +2024,6 @@ Обновление Пожалуйста, будьте терпеливы, это может занять некоторое время. Присоединиться к замещенной комнате - Безымянная Комната Некоторые комнаты могут быть скрыты, потому что они приватные, и вам нужно приглашение. Некоторые комнаты могут быть скрыты, потому что они приватные, и вам нужно приглашение. @@ -2130,7 +2092,7 @@ Приватное пространство для организации ваших комнат Я и члены команды Только я - Убедитесь, что нужные люди имеют доступ к %s. Вы сможете изменить это позже. + Убедитесь, что нужные люди имеют доступ к %s. С кем вы работаете\? Чтобы присоединиться к существующему пространству, вам необходимо получить приглашение. Вы сможете изменить это позже @@ -2453,7 +2415,6 @@ Местоположение Вы согласны отправить эту информацию\? Чтобы обнаружить существующие контакты, необходимо отправить контактную информацию (электронную почту и номера телефонов) на сервер обнаружения. Мы хешируем ваши данные перед отправкой для обеспечения конфиденциальности. - Отправить электронные адреса и номера телефонов %s Ваши контакты приватны. Чтобы обнаружить пользователей из ваших контактов, нам необходимо ваше разрешение на отправку контактной информации на ваш сервер обнаружения. Системные настройки @@ -2485,16 +2446,16 @@ Включить Слежка за уведомлениями Вам не разрешено подключаться к этой комнате - Организуйте обсуждение в потоках - Показать все потоки в которых вы участвуете - Все Потоки - Просмотр Потоков + Организуйте обсуждение с помощью веток + Показать все ветки, в которых вы участвуете + Все ветки + Посмотреть ветки Посмотреть в комнате - Показать всплывающие сообщения + Показывать сообщения в пузырях Не удалось загрузить карту Карта Примечание: приложение будет перезапущено - Включить Сообщения Потока + Включить ветки сообщений Подключиться к серверу Хотите присоединиться к существующему серверу\? пропустить вопрос @@ -2504,18 +2465,36 @@ Друзья и семья Мы поможем вам подключится. С кем вы будете общаться больше всего\? - Вы уже просматриваете этот Поток! + Вы уже просматриваете эту ветку! Просмотр в Комнате - Ответить в Поток - Команда «%s» распознается, но не поддерживается в потоках. - Из Потока + Ответить в ветке + Команда «%s» распознается, но не поддерживается в ветках. + Из ветки Совет: нажмите и удерживайте сообщение и используйте «%s». - Потоки помогают хранить ваши разговоры по темам и легко отслеживать их. - Мои Потоки - Показать все потоки в текущей комнате + Ветки помогают хранить ваши разговоры по темам и легко отслеживать их. + Мои ветки + Показать все ветки этой комнаты Фильтр - Потоки - Поток - Фильтровать Потоки в комнате - Скопировать ссылку в поток + Ветки + Ветка + Фильтровать ветки в комнате + Скопировать ссылку в ветку + Уведомления комнаты + Пользователи + Оповестить всю комнату + + И ещё %1$d + И ещё %1$d + И ещё %1$d + И ещё %1$d + + Свернуть + %1$s, %2$s и другие + %1$s и %2$s + + %d изменение ACL сервера + %d изменения ACL сервера + %d изменений ACL сервера + %d изменений ACL сервера + \ No newline at end of file From bd50954b575fc06b4b07ad1de06a2b22d3ba9ff6 Mon Sep 17 00:00:00 2001 From: Ultimator14 Date: Sat, 12 Mar 2022 20:36:39 +0000 Subject: [PATCH 064/152] Translated using Weblate (German) Currently translated at 99.8% (2154 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- vector/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index 7a8ac9c71b..41d94b8afc 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -1257,7 +1257,7 @@ Raum verlassen Verlasse den Raum… Administratoren - Moderationen + Moderatoren Benutzerdefiniert Eingeladen Nutzer From bd4e251c8adb9a9ff94e1bf6df198202dcc4c25a Mon Sep 17 00:00:00 2001 From: libexus Date: Fri, 11 Mar 2022 19:38:58 +0000 Subject: [PATCH 065/152] Translated using Weblate (German) Currently translated at 99.8% (2154 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- vector/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index 41d94b8afc..a62349040d 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -1079,7 +1079,7 @@ Erweitere und individualisiere dein Benutzererlebnis Mit %1$s verbinden Mit Element Matrix Services verbinden - Mit einem individuellen Server verbinden + Mit einem anderen Server verbinden Bei %1$s anmelden Registrieren Anmelden From 9657a50a6ac78b335713c9f734c42171ea3d2b29 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Wed, 9 Mar 2022 08:45:52 +0000 Subject: [PATCH 066/152] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- vector/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index cd237407d2..f2eaf8d993 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -1414,7 +1414,7 @@ Quase lá! %s está mostrando um tick (✓)\? Sim Não - A conexão com o servidor foi perdida + Conectividade ao servidor tem sido perdida Modo avião está ligado Ferramentas Dev Dados de Conta From 0013d08ac7824d2fe7ee16d8bc0e247b919c11bc Mon Sep 17 00:00:00 2001 From: Edward Gera Date: Tue, 15 Mar 2022 06:44:44 +0000 Subject: [PATCH 067/152] Translated using Weblate (Hebrew) Currently translated at 89.1% (1923 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/he/ --- vector/src/main/res/values-iw/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml index d78ff9f162..8459160bf2 100644 --- a/vector/src/main/res/values-iw/strings.xml +++ b/vector/src/main/res/values-iw/strings.xml @@ -2250,4 +2250,6 @@ ההודעה לא נשלחה עקב שגיאה לא בָּדוּק בָּדוּק + הזמינו בדואר אלקטרוני + זה רק אתה כרגע. %s יהיה טוב יותר עם אחרים. \ No newline at end of file From c2fa67ea22c82b62ffbfe6790b2822acb2193787 Mon Sep 17 00:00:00 2001 From: Jeanne Lavoie Date: Tue, 15 Mar 2022 12:26:50 +0000 Subject: [PATCH 068/152] Translated using Weblate (French) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/ --- vector/src/main/res/values-fr/strings.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 6bae118e59..5c95775ca3 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -34,7 +34,7 @@ L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message. Envoi du message impossible Erreur de Matrix - Adresse e-mail + Adresse électronique Numéro de téléphone Invitation au salon Salon vide @@ -372,7 +372,7 @@ L’application s’est arrêtée anormalement la dernière fois. Souhaitez-vous ouvrir l’écran de rapport d’anomalie \? Le rapport d’anomalie a bien été envoyé L’envoi du rapport d’anomalie a échoué (%s) - Ceci ne ressemble pas à une adresse e-mail valide + Ceci ne ressemble pas à une adresse électronique valide Cette adresse e-mail est déjà utilisée. Ce serveur d’accueil souhaite s’assurer que vous n’êtes pas un robot L’adresse e-mail liée à votre compte doit être saisie. @@ -2415,4 +2415,8 @@ Copier le lien du fil de discussion Voir dans le salon Voir les fils de discussions + + %d changement des ACL du serveur + %d changements des ACL du serveur + \ No newline at end of file From ae5f09922a59728cff664cf2d37e0c025b1821ce Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Mon, 14 Mar 2022 13:37:44 +0000 Subject: [PATCH 069/152] Translated using Weblate (Slovak) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- vector/src/main/res/values-sk/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index ab3d80d9ca..6650890ac3 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -2461,4 +2461,9 @@ Generovanie kľúča SSSS z kľúča pre obnovu Definovanie predvoleného kľúča SSSS Rýchle-zlyhanie + Najprv konzultovať + Vyberte si, čo opustíte + Opustiť miestnosť s daným id (alebo aktuálnu miestnosť, ak je prázdna) + Varovná úroveň dôveryhodnosti + Pripojiť \ No newline at end of file From a40ad9543d19a7628e734eadf65c716c03dfbab7 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 14 Mar 2022 11:45:58 +0000 Subject: [PATCH 070/152] Translated using Weblate (Persian) Currently translated at 100.0% (51 of 51 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/ --- fastlane/metadata/android/fa/changelogs/40104000.txt | 2 ++ fastlane/metadata/android/fa/changelogs/40104020.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/fa/changelogs/40104000.txt create mode 100644 fastlane/metadata/android/fa/changelogs/40104020.txt diff --git a/fastlane/metadata/android/fa/changelogs/40104000.txt b/fastlane/metadata/android/fa/changelogs/40104000.txt new file mode 100644 index 0000000000..7beb79981f --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40104000.txt @@ -0,0 +1,2 @@ +تغییرات اصلی در این نگارش: پیاده سازی نخستین پیام‌های رشته‌ای. حباب‌های پیام. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.4.0 diff --git a/fastlane/metadata/android/fa/changelogs/40104020.txt b/fastlane/metadata/android/fa/changelogs/40104020.txt new file mode 100644 index 0000000000..6d5148220d --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40104020.txt @@ -0,0 +1,2 @@ +تغییرات اصلی در این نگارش: افزودن پشتیبانی به ‪@room‬ و نظرسنجی‌های فاش نشده در کنار تغییرات کوچک دیگر. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.4.2 From 3130e67edb706fe79094602e4d5011f7f31102b1 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 14 Mar 2022 11:43:03 +0000 Subject: [PATCH 071/152] Translated using Weblate (Persian) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- vector/src/main/res/values-fa/strings.xml | 57 ++++++----------------- 1 file changed, 15 insertions(+), 42 deletions(-) diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index eb8a29b6b2..a3ee61013e 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -40,7 +40,6 @@ شماره تلفن دعوت اتاق %1$s و %2$s - اتاق خالی همگام‌سازی نخستین: \nدرون‌ریزی حساب… @@ -221,7 +220,6 @@ اولویت پایین گفتگوها اتاق‌ها - گزارش اشکال پیوستن به اتاق نام کاربری @@ -296,16 +294,11 @@ %d عضو %d عضو - - - - ترک اتاق آیا از ترک این اتاق اطمینان دارید؟ گپ‌های مستقیم دعوت بارگیری - رد شدن انجام شد نادیده‌گرفتن @@ -327,7 +320,6 @@ در صورت عدم پشتیبان‌گیری از کلیدهای خود پیش از خروج، دسترسی شما به پیام‌های رمزنگاری شده از بین می‌رود. پیوند دائمی مشاهده منبع رمزگشایی شده - این کارساز خانگی می‌خواهد مطمئن شود که روبات نیستید بازدرخواست کلیدهای رمزنگاری از دیگر نشست‌هایتان. لطفاً المنت را روی افزاره‌ای دیگر که می‌تواند پیام را رمزگشایی کند، اجرا کنید تا بتواند کلیدها را به این نشست بفرستد. @@ -335,8 +327,6 @@ قطع اتصال نپذیرفتن پالایش اعضای اتاق - - عکس نمایه نام نمایشی افزودن نشانی رایانامه @@ -419,7 +409,6 @@ افزودن کاره‌های ماتریکس پیام رمزنگاری شده اتاق‌ها - (پیش‌رفته) (پیش‌رفته) برپایی با کلید بازیابی گرفتن نگارش پشتیبان… @@ -518,7 +507,6 @@ ابطال باید نشانی رایانامهٔ پیوسته به حسابتان وارد شود. شکست در تأیید نشانی رایانامه: مطمئن شوید که پیوند درون رایانامه را کلیک کرده‌اید - لطفاً سیاست‌های این کارساز خانگی را بررسی کرده و بپذیرید: لطفا یک نشانی معتبر وارد کنید این یک نشانی کارساز ماتریکس معتبر نیست @@ -531,7 +519,6 @@ گزینش صدای زنگ برای تماس‌ها: اطلاعات پرش به ناخوانده - تحریم رفع انسداد اخراج @@ -722,7 +709,6 @@ %d پیام آگاهی نخوانده %d پیام آگاهی نخوانده - %1$s: %2$d پیام %1$s: %2$d پیام @@ -796,7 +782,6 @@ ایجاد خانه دعوت شد - غیرفعّال‌سازی حساب غیرفعّال‌سازی حساب هرگز پیام‌های رمزشده را از دست ندهید @@ -1084,7 +1069,6 @@ گرفتم اطّلاعات بیش‌تر خطای رمزگشایی - بازنشاندن از نشانی اصلی ارتباط با مدیر خدمتتان اکنون بازبینی شود @@ -1096,7 +1080,6 @@ رمزنگاری این اتاق پشتیبانی نمی‌شود لطفاً نام کاربری‌ای وارد کنید. برای دیدن پیام‌های قدیمی‌تر، کلیک کنید - پیام‌های این‌جا، رمزنگاری سرتاسری شده‌اند. \n \nپیام‌هایتان با قفل‌هایی امن شده‌اند و فقط شما و گیرندگان دیگر، کلیدهای یکتا را برای قفل‌گشاییشان دارید. @@ -1215,7 +1198,6 @@ دعوت‌ها، برداشتن‌ها و انسدادها تأثیر نمی‌پذیرند. نمایش پیام‌های پیوستن و ترک اتاق پیش‌نمایشی از آدرس‌های URL در پیام‌ها نمایش داده شود. - المنت بصورت دوره‌ای و در بازه‌های قابل تنظیم در پس زمینه همگام‌سازی می شود. \nاین بر مصرف باتری شما تأثیر می‌گذارد، یک اعلان دائمی نمایش داده می‌شود که المنت برای رویدادها گوش می‌دهد. المنت در پس زمینه همگام‌سازی می‌کند به گونه ای که منابع محدود دستگاه (باتری) حفظ می‌شود. @@ -1264,7 +1246,6 @@ هیچ شماره تلفنی به حسابتان افزوده نشده نتیجه‌ای در پی نداشت فیلترکردن کاربران مسدود شده - %d مورد %d مورد @@ -1284,19 +1265,13 @@ تنزل نقش شما در اتاق؟ شما نمی‌توانید این تغییر را بازگردانید. زیرا در حال ارتقای سطح کاربر دیگر به سطح خودتان هستید. \nآیا مطمئن هستید؟ - - المنت برای برقراری تماس تصویری نیازمند دسترسی به میکروفون و دوربین است. \n \nلطفا در پنجره های بعدی دسترسی های لازم را بدهید. - المنت برای برقراری تماس صوتی نیازمند دسترسی به میکروفون است. - - خطای SSL: هویت طرف مقابل تأیید نشد. شکست در برقراری ارتباط همزمان. \nلطاً از مدیر کارساز بخواهید برای برقراری مطمئن تماس‌ها، کارساز turn را پیکربندی کند. - بعد از راه‌اندازی مجدد، هیچ تاریخچه، پیام، دستگاه تائید شده یا کاربر تائید شده‌ای در حساب شما وجود نخواهد داشت اگر همه چیز را بازنشانی کنید تنها در صورتی این کار را انجام دهید که از هیچ دستگاه دیگری نمی‌توانید این دستگاه را تائید نمائید. @@ -1319,7 +1294,6 @@ اگر اکنون لغو کنید، ممکن است در صورت قطع دسترسی به ورودهایتان، داده‌ها و پیام‌های رمزنگاشته را از دست بدهد. \n \nهمچنین می‌توانید در تنظیمات، پشتیبان امن برپا کرده و کلیدهایتان را مدیریت کنید. - آن را در فضای ابری خود کپی کنید آن را روی فلش یا حافظه‌ای دیگر ذخیره کنید آن را چاپ کرده و در محلی امن و مطمئن نگهداری کنید @@ -1478,7 +1452,6 @@ ارسال به عنوان پیام تباه‌کننده حذف‌کردن از اولویت پایین اضافه‌کردن به اولویت پایین - این محتوا به عنوان محتوای نامناسب گزارش شده‌است. \n \nاگر نمی‌خواهید محتوای بیشتری از این کاربر مشاهده کنید ، می توانید او را نادیده بگیرید تا پیام‌های او را مشاهده نکنید. @@ -1553,11 +1526,8 @@ خطای نامشخص %s می‌خواهد نشستتان را تأیید کند درخواست تأیید - - فهمیدم تأییدشده! - امضاء الگوریتم @@ -1568,7 +1538,6 @@ پشتیبان‌گیری از کلیدهای شما. این ممکن است چند دقیقه طول بکشد… مدیریت در بخش پشتیبان‌گیری از کلید کلیدهای رمزگذاری جدید - کلیدهای رمزگذاری پشتیبان شما از سرور حذف شوند؟ در اینن صورت دیگر نخواهید توانست از کلید بازیابی خود برای خواندن پیام رمزشده‌ی قبلی خود استفاده کنید. حذف نسخه‌ی پشتیبان در حال بررسی وضعیت نسخه‌ی پشتیبان @@ -1609,7 +1578,6 @@ به نظر می‌رسد شما در یک نشست دیگر کلید پشتیبان تهیه کرده‌اید. آیا می‌خواهید آن را با موردی که ایجاد می‌کنید جایگزین کنید؟ از پیش، پشتیبانی روی کارساز خانگیتان وجود دارد کلید بازیابی ذخیره شد. - کلید بازیابی خود را در جایی بسیار امن نظیر برنامه‌های شناخته‌شده‌ی مدیریت گذرواژه نگه دارید کلید بازیابی شما برای روز مبادا است - اگر کلید امنیتی خود را فراموش کنید می توانید از آن برای بازیابی دسترسی به پیام‌های رمزگذاری شده استفاده کنید. \nکلید بازیابی خود را در جایی بسیار امن نظیر برنامه‌های شناخته‌شده‌ی مدیریت گذرواژه نگه دارید @@ -1686,13 +1654,11 @@ %d دعوت نام کارساز - %1$d از %2$d کلید با موفقیت بارگذاری شد. %1$d از %2$d کلید با موفقیت بارگذاری شدند. کلیدها با موفقیت بر روی دستگاه استخراج شدند - لطفاً یک رمز برای رمزنگاری کلیدها وارد کنید. ورود این رمز برای بارگذاری کلیدها ضروری خواهد بود. اجتماع پخش صدای شاتر @@ -1707,13 +1673,11 @@ لطفاً ایمیل خود را بررسی کنید و روی لینک ارسال شده، کلیک کنید. پس از انجام این کار، روی ادامه کلیک کنید. برای انجام این کار اجازه‌ی یکپارچه‌سازی را در تنظیمات فعال کنید. یکپارچه‌سازی‌ها غیر فعال هستند - %1$s @ %2$s آخرین اتصال نام عمومی به‌روزرسانی نام عمومی شناسه - المنت اطلاعاتی را جمع آوری می کند و با ارسال آنان به صورت ناشناس به ما امکان بهبود برنامه را می‌دهد. ارسال داده های تجزیه و تحلیل تجزیه و تحلیل @@ -1786,7 +1750,6 @@ آغاز به گپ برون‌ریزی بازرسی اگر اتاق فقط برای تعامل با افراد داخل سرور خانه شما می‌باشد، این قابلیت را فعال کنید. این تنظیم را بعدا نمی‌توانید تغییر دهید. - یک کلید امنیتی ایجاد کنید تا در مکانی امن مانند سامانه مدیریت رمز عبور یا گاوصندوق آن را ذخیره کنید. ارتباطی با این شناسه وجود ندارد. هویت خود را تأیید کنید تا به پیام‌های رمز شده دسترسی پیدا کنید. @@ -1872,8 +1835,6 @@ هنگام انتقال تماس خطایی روی داد انتقال متصل شوید - - تماس فعال (%1$s) هنگام جستجوی شماره تلفن خطایی روی داد ‬پد شماره گیری @@ -2039,7 +2000,7 @@ من و همگروهی‌هایم یک فضای خصوصی برای نظم بخشی به اتاق‌هایتان فقط من - مطمئن شوید که افراد درست به %s دسترسی دارند. می‌توانید بعدها این را تغییر دهید. + مطمئن شوید که افراد درست به %s دسترسی دارند. ساخت یک فضا هر کسی در فضای این اتاق، می‌تواند اتاق را یافته و بپیوندد. فقط مدیران این اتاق می توانند به فضایی بیفزایندش. فقط اعضای فضا @@ -2123,7 +2084,6 @@ ارتقا لطفاً شکیبا باشید. ممکن است کمی زمان ببرد. پیوستن به اتاق جایگزینی - ناپایدار پایدار نگارش پیش‌گزیده @@ -2313,7 +2273,6 @@ پرسش یا موضوع نظرسنجی ایجاد نظرسنجی نظرسنجی - فرستادن رایانامه‌ّا و شماره‌های تلفن به %s آشنایانتان خصوصی هستند. برای کشف کاربران از آشنایانتان، نیاز به اجازه‌تان برای فرستادن اطّلاعات آشنا به کارساز هویتتان داریم. نشست خارج شده است! @@ -2446,4 +2405,18 @@ رونوشت از پیوند به رشته دیدن در اتاق دیدن رشته‌ها + + %d تغییر سطح کنترل دسترسی + %d تغییر سطح کنترل دسترسی + + آگاهی اتاق + کاربران + آگاهی به تمام اتاق + + %1$d بیش‌تر + %1$d بیش‌تر + + نمایش کم‌تر + %1$s، %2$s و دیگران + %1$s و %2$s \ No newline at end of file From f8ca2fecd5b71ecc55b5286d3af327b9859bba38 Mon Sep 17 00:00:00 2001 From: chagai95 <31655082+chagai95@users.noreply.github.com> Date: Tue, 15 Mar 2022 17:08:31 +0100 Subject: [PATCH 072/152] Update changelog.d/5513.misc Co-authored-by: Adam Brown --- changelog.d/5513.misc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/5513.misc b/changelog.d/5513.misc index 62be94d6bb..767a9f1843 100644 --- a/changelog.d/5513.misc +++ b/changelog.d/5513.misc @@ -1 +1 @@ -Added presence indicator online like it is done for offline. +Added online presence indicator attribute online to match offline styling From c15e908a158ddcdbe84c09d4cce7ac43f928f052 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 1 Mar 2022 16:17:34 +0000 Subject: [PATCH 073/152] converting onboarding action to sealed interface --- .../features/onboarding/OnboardingAction.kt | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt index 4f16231747..4a5445a262 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt @@ -25,26 +25,26 @@ import org.matrix.android.sdk.api.auth.data.Credentials import org.matrix.android.sdk.api.auth.registration.RegisterThreePid import org.matrix.android.sdk.internal.network.ssl.Fingerprint -sealed class OnboardingAction : VectorViewModelAction { - data class OnGetStarted(val resetLoginConfig: Boolean, val onboardingFlow: OnboardingFlow) : OnboardingAction() - data class OnIAlreadyHaveAnAccount(val resetLoginConfig: Boolean, val onboardingFlow: OnboardingFlow) : OnboardingAction() +sealed interface OnboardingAction : VectorViewModelAction { + data class OnGetStarted(val resetLoginConfig: Boolean, val onboardingFlow: OnboardingFlow) : OnboardingAction + data class OnIAlreadyHaveAnAccount(val resetLoginConfig: Boolean, val onboardingFlow: OnboardingFlow) : OnboardingAction - data class UpdateServerType(val serverType: ServerType) : OnboardingAction() - data class UpdateHomeServer(val homeServerUrl: String) : OnboardingAction() - data class UpdateUseCase(val useCase: FtueUseCase) : OnboardingAction() - object ResetUseCase : OnboardingAction() - data class UpdateSignMode(val signMode: SignMode) : OnboardingAction() - data class LoginWithToken(val loginToken: String) : OnboardingAction() - data class WebLoginSuccess(val credentials: Credentials) : OnboardingAction() - data class InitWith(val loginConfig: LoginConfig?) : OnboardingAction() - data class ResetPassword(val email: String, val newPassword: String) : OnboardingAction() - object ResetPasswordMailConfirmed : OnboardingAction() + data class UpdateServerType(val serverType: ServerType) : OnboardingAction + data class UpdateHomeServer(val homeServerUrl: String) : OnboardingAction + data class UpdateUseCase(val useCase: FtueUseCase) : OnboardingAction + object ResetUseCase : OnboardingAction + data class UpdateSignMode(val signMode: SignMode) : OnboardingAction + data class LoginWithToken(val loginToken: String) : OnboardingAction + data class WebLoginSuccess(val credentials: Credentials) : OnboardingAction + data class InitWith(val loginConfig: LoginConfig?) : OnboardingAction + data class ResetPassword(val email: String, val newPassword: String) : OnboardingAction + object ResetPasswordMailConfirmed : OnboardingAction // Login or Register, depending on the signMode - data class LoginOrRegister(val username: String, val password: String, val initialDeviceName: String) : OnboardingAction() + data class LoginOrRegister(val username: String, val password: String, val initialDeviceName: String) : OnboardingAction // Register actions - open class RegisterAction : OnboardingAction() + open class RegisterAction : OnboardingAction data class AddThreePid(val threePid: RegisterThreePid) : RegisterAction() object SendAgainThreePid : RegisterAction() @@ -60,7 +60,7 @@ sealed class OnboardingAction : VectorViewModelAction { object RegisterDummy : RegisterAction() // Reset actions - open class ResetAction : OnboardingAction() + open class ResetAction : OnboardingAction object ResetHomeServerType : ResetAction() object ResetHomeServerUrl : ResetAction() @@ -69,16 +69,16 @@ sealed class OnboardingAction : VectorViewModelAction { object ResetResetPassword : ResetAction() // Homeserver history - object ClearHomeServerHistory : OnboardingAction() + object ClearHomeServerHistory : OnboardingAction - data class PostViewEvent(val viewEvent: OnboardingViewEvents) : OnboardingAction() + data class PostViewEvent(val viewEvent: OnboardingViewEvents) : OnboardingAction - data class UserAcceptCertificate(val fingerprint: Fingerprint) : OnboardingAction() + data class UserAcceptCertificate(val fingerprint: Fingerprint) : OnboardingAction - object PersonalizeProfile : OnboardingAction() - data class UpdateDisplayName(val displayName: String) : OnboardingAction() - object UpdateDisplayNameSkipped : OnboardingAction() - data class ProfilePictureSelected(val uri: Uri) : OnboardingAction() - object SaveSelectedProfilePicture : OnboardingAction() - object UpdateProfilePictureSkipped : OnboardingAction() + object PersonalizeProfile : OnboardingAction + data class UpdateDisplayName(val displayName: String) : OnboardingAction + object UpdateDisplayNameSkipped : OnboardingAction + data class ProfilePictureSelected(val uri: Uri) : OnboardingAction + object SaveSelectedProfilePicture : OnboardingAction + object UpdateProfilePictureSkipped : OnboardingAction } From 4225f62120540a34c632a27fe138ae1dba4951ed Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 12:18:50 +0000 Subject: [PATCH 074/152] adding test helper for asserting states whilst combining previous updates --- vector/src/test/java/im/vector/app/test/Extensions.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/vector/src/test/java/im/vector/app/test/Extensions.kt b/vector/src/test/java/im/vector/app/test/Extensions.kt index 3ff041dc11..136ca58d68 100644 --- a/vector/src/test/java/im/vector/app/test/Extensions.kt +++ b/vector/src/test/java/im/vector/app/test/Extensions.kt @@ -55,6 +55,17 @@ class ViewModelTest( return this } + fun assertStatesWithPrevious(initial: S, vararg expected: S.() -> S): ViewModelTest { + val reducedExpectedStates = expected.fold(mutableListOf(initial)) { acc, curr -> + val next = curr.invoke(acc.last()) + acc.add(next) + acc + } + + states.assertValues(reducedExpectedStates) + return this + } + fun assertStates(expected: List): ViewModelTest { states.assertValues(expected) return this From 3fa415007c21e2bbad4c350d1f16429c6aae2f4b Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 16:49:23 +0000 Subject: [PATCH 075/152] extracting registration steps to separate handler to make testing the flow simpler --- .../features/onboarding/OnboardingAction.kt | 18 +- .../onboarding/OnboardingViewModel.kt | 170 ++++-------------- .../onboarding/RegistrationActionHandler.kt | 61 +++++++ .../ftueauth/FtueAuthCaptchaFragment.kt | 3 +- .../FtueAuthGenericTextInputFormFragment.kt | 11 +- .../ftueauth/FtueAuthWaitForEmailFragment.kt | 5 +- .../ftueauth/terms/FtueAuthTermsFragment.kt | 3 +- .../onboarding/OnboardingViewModelTest.kt | 110 +++++++++--- .../RegistrationActionHandlerTest.kt | 73 ++++++++ .../test/fakes/FakeAuthenticationService.kt | 5 + .../test/fakes/FakeRegisterActionHandler.kt | 43 +++++ .../app/test/fakes/FakeRegistrationWizard.kt | 10 +- 12 files changed, 328 insertions(+), 184 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt create mode 100644 vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt create mode 100644 vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt index 4a5445a262..8b17b318c1 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt @@ -22,7 +22,6 @@ import im.vector.app.features.login.LoginConfig import im.vector.app.features.login.ServerType import im.vector.app.features.login.SignMode import org.matrix.android.sdk.api.auth.data.Credentials -import org.matrix.android.sdk.api.auth.registration.RegisterThreePid import org.matrix.android.sdk.internal.network.ssl.Fingerprint sealed interface OnboardingAction : VectorViewModelAction { @@ -42,22 +41,9 @@ sealed interface OnboardingAction : VectorViewModelAction { // Login or Register, depending on the signMode data class LoginOrRegister(val username: String, val password: String, val initialDeviceName: String) : OnboardingAction + object StopEmailValidationCheck : OnboardingAction - // Register actions - open class RegisterAction : OnboardingAction - - data class AddThreePid(val threePid: RegisterThreePid) : RegisterAction() - object SendAgainThreePid : RegisterAction() - - // TODO Confirm Email (from link in the email, open in the phone, intercepted by the app) - data class ValidateThreePid(val code: String) : RegisterAction() - - data class CheckIfEmailHasBeenValidated(val delayMillis: Long) : RegisterAction() - object StopEmailValidationCheck : RegisterAction() - - data class CaptchaDone(val captchaResponse: String) : RegisterAction() - object AcceptTerms : RegisterAction() - object RegisterDummy : RegisterAction() + data class PostRegisterAction(val registerAction: RegisterAction) : OnboardingAction // Reset actions open class ResetAction : OnboardingAction diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 36020fbe61..303a4d5950 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -83,6 +83,7 @@ class OnboardingViewModel @AssistedInject constructor( private val vectorFeatures: VectorFeatures, private val analyticsTracker: AnalyticsTracker, private val uriFilenameResolver: UriFilenameResolver, + private val registrationActionHandler: RegistrationActionHandler, private val vectorOverrides: VectorOverrides ) : VectorViewModel(initialState) { @@ -116,16 +117,16 @@ class OnboardingViewModel @AssistedInject constructor( private val matrixOrgUrl = stringProvider.getString(R.string.matrix_org_server_url).ensureTrailingSlash() + private val registrationWizard: RegistrationWizard + get() = authenticationService.getRegistrationWizard() + val currentThreePid: String? - get() = registrationWizard?.currentThreePid + get() = registrationWizard.currentThreePid // True when login and password has been sent with success to the homeserver val isRegistrationStarted: Boolean get() = authenticationService.isRegistrationStarted - private val registrationWizard: RegistrationWizard? - get() = authenticationService.getRegistrationWizard() - private val loginWizard: LoginWizard? get() = authenticationService.getLoginWizard() @@ -153,7 +154,7 @@ class OnboardingViewModel @AssistedInject constructor( is OnboardingAction.WebLoginSuccess -> handleWebLoginSuccess(action) is OnboardingAction.ResetPassword -> handleResetPassword(action) is OnboardingAction.ResetPasswordMailConfirmed -> handleResetPasswordMailConfirmed() - is OnboardingAction.RegisterAction -> handleRegisterAction(action) + is OnboardingAction.PostRegisterAction -> handleRegisterAction(action.registerAction) is OnboardingAction.ResetAction -> handleResetAction(action) is OnboardingAction.UserAcceptCertificate -> handleUserAcceptCertificate(action) OnboardingAction.ClearHomeServerHistory -> handleClearHomeServerHistory() @@ -164,6 +165,7 @@ class OnboardingViewModel @AssistedInject constructor( is OnboardingAction.ProfilePictureSelected -> handleProfilePictureSelected(action) OnboardingAction.SaveSelectedProfilePicture -> updateProfilePicture() is OnboardingAction.PostViewEvent -> _viewEvents.post(action.viewEvent) + OnboardingAction.StopEmailValidationCheck -> currentJob = null }.exhaustive } @@ -266,131 +268,36 @@ class OnboardingViewModel @AssistedInject constructor( } } - private fun handleRegisterAction(action: OnboardingAction.RegisterAction) { - when (action) { - is OnboardingAction.CaptchaDone -> handleCaptchaDone(action) - is OnboardingAction.AcceptTerms -> handleAcceptTerms() - is OnboardingAction.RegisterDummy -> handleRegisterDummy() - is OnboardingAction.AddThreePid -> handleAddThreePid(action) - is OnboardingAction.SendAgainThreePid -> handleSendAgainThreePid() - is OnboardingAction.ValidateThreePid -> handleValidateThreePid(action) - is OnboardingAction.CheckIfEmailHasBeenValidated -> handleCheckIfEmailHasBeenValidated(action) - is OnboardingAction.StopEmailValidationCheck -> handleStopEmailValidationCheck() - } - } - - private fun handleCheckIfEmailHasBeenValidated(action: OnboardingAction.CheckIfEmailHasBeenValidated) { - // We do not want the common progress bar to be displayed, so we do not change asyncRegistration value in the state - currentJob = executeRegistrationStep(withLoading = false) { - it.checkIfEmailHasBeenValidated(action.delayMillis) - } - } - - private fun handleStopEmailValidationCheck() { - currentJob = null - } - - private fun handleValidateThreePid(action: OnboardingAction.ValidateThreePid) { - currentJob = executeRegistrationStep { - it.handleValidateThreePid(action.code) - } - } - - private fun executeRegistrationStep(withLoading: Boolean = true, - block: suspend (RegistrationWizard) -> RegistrationResult): Job { - if (withLoading) { - setState { copy(asyncRegistration = Loading()) } - } - return viewModelScope.launch { - try { - registrationWizard?.let { block(it) } - /* - // Simulate registration disabled - throw Failure.ServerError(MatrixError( - code = MatrixError.FORBIDDEN, - message = "Registration is disabled" - ), 403)) - */ - } catch (failure: Throwable) { - if (failure !is CancellationException) { - _viewEvents.post(OnboardingViewEvents.Failure(failure)) - } - null - } - ?.let { data -> - when (data) { - is RegistrationResult.Success -> onSessionCreated(data.session, isAccountCreated = true) - is RegistrationResult.FlowResponse -> onFlowResponse(data.flowResult) - } - } - - setState { - copy( - asyncRegistration = Uninitialized - ) - } - } - } - - private fun handleAddThreePid(action: OnboardingAction.AddThreePid) { - setState { copy(asyncRegistration = Loading()) } + private fun handleRegisterAction(action: RegisterAction) { currentJob = viewModelScope.launch { - try { - registrationWizard?.addThreePid(action.threePid) - } catch (failure: Throwable) { - _viewEvents.post(OnboardingViewEvents.Failure(failure)) + if (action.hasLoadingState()) { + setState { copy(asyncRegistration = Loading()) } } - setState { - copy( - asyncRegistration = Uninitialized - ) - } - } - } - - private fun handleSendAgainThreePid() { - setState { copy(asyncRegistration = Loading()) } - currentJob = viewModelScope.launch { - try { - registrationWizard?.sendAgainThreePid() - } catch (failure: Throwable) { - _viewEvents.post(OnboardingViewEvents.Failure(failure)) - } - setState { - copy( - asyncRegistration = Uninitialized - ) - } - } - } - - private fun handleAcceptTerms() { - currentJob = executeRegistrationStep { - it.acceptTerms() - } - } - - private fun handleRegisterDummy() { - currentJob = executeRegistrationStep { - it.dummy() + kotlin.runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) } + .fold( + onSuccess = { + when (it) { + is RegistrationResult.Success -> onSessionCreated(it.session, isAccountCreated = true) + is RegistrationResult.FlowResponse -> onFlowResponse(it.flowResult) + } + }, + onFailure = { + if (it !is CancellationException) { + _viewEvents.post(OnboardingViewEvents.Failure(it)) + } + } + ) + setState { copy(asyncRegistration = Uninitialized) } } } private fun handleRegisterWith(action: OnboardingAction.LoginOrRegister) { reAuthHelper.data = action.password - currentJob = executeRegistrationStep { - it.createAccount( - action.username, - action.password, - action.initialDeviceName - ) - } - } - - private fun handleCaptchaDone(action: OnboardingAction.CaptchaDone) { - currentJob = executeRegistrationStep { - it.performReCaptcha(action.captchaResponse) - } + handleRegisterAction(RegisterAction.CreateAccount( + action.username, + action.password, + action.initialDeviceName + )) } private fun handleResetAction(action: OnboardingAction.ResetAction) { @@ -461,7 +368,7 @@ class OnboardingViewModel @AssistedInject constructor( } when (action.signMode) { - SignMode.SignUp -> startRegistrationFlow() + SignMode.SignUp -> handleRegisterAction(RegisterAction.RegisterDummy) SignMode.SignIn -> startAuthenticationFlow() SignMode.SignInWithMatrixId -> _viewEvents.post(OnboardingViewEvents.OnSignModeSelected(SignMode.SignInWithMatrixId)) SignMode.Unknown -> Unit @@ -499,7 +406,7 @@ class OnboardingViewModel @AssistedInject constructor( // If there is a pending email validation continue on this step try { - if (registrationWizard?.isRegistrationStarted == true) { + if (registrationWizard.isRegistrationStarted) { currentThreePid?.let { handle(OnboardingAction.PostViewEvent(OnboardingViewEvents.OnSendEmailSuccess(it))) } @@ -730,12 +637,6 @@ class OnboardingViewModel @AssistedInject constructor( } } - private fun startRegistrationFlow() { - currentJob = executeRegistrationStep { - it.getRegistrationFlow() - } - } - private fun startAuthenticationFlow() { // Ensure Wizard is ready loginWizard @@ -745,8 +646,7 @@ class OnboardingViewModel @AssistedInject constructor( private fun onFlowResponse(flowResult: FlowResult) { // If dummy stage is mandatory, and password is already sent, do the dummy stage now - if (isRegistrationStarted && - flowResult.missingStages.any { it is Stage.Dummy && it.mandatory }) { + if (isRegistrationStarted && flowResult.missingStages.any { it is Stage.Dummy && it.mandatory }) { handleRegisterDummy() } else { // Notify the user @@ -754,6 +654,10 @@ class OnboardingViewModel @AssistedInject constructor( } } + private fun handleRegisterDummy() { + handleRegisterAction(RegisterAction.RegisterDummy) + } + private suspend fun onSessionCreated(session: Session, isAccountCreated: Boolean) { val state = awaitState() state.useCase?.let { useCase -> diff --git a/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt b/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt new file mode 100644 index 0000000000..2938681ce7 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022 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. + */ + +package im.vector.app.features.onboarding + +import org.matrix.android.sdk.api.auth.registration.RegisterThreePid +import org.matrix.android.sdk.api.auth.registration.RegistrationResult +import org.matrix.android.sdk.api.auth.registration.RegistrationWizard +import javax.inject.Inject + +class RegistrationActionHandler @Inject constructor() { + + suspend fun handleRegisterAction(registrationWizard: RegistrationWizard, action: RegisterAction): RegistrationResult { + return when (action) { + RegisterAction.StartRegistration -> registrationWizard.getRegistrationFlow() + is RegisterAction.CaptchaDone -> registrationWizard.performReCaptcha(action.captchaResponse) + is RegisterAction.AcceptTerms -> registrationWizard.acceptTerms() + is RegisterAction.RegisterDummy -> registrationWizard.dummy() + is RegisterAction.AddThreePid -> registrationWizard.addThreePid(action.threePid) + is RegisterAction.SendAgainThreePid -> registrationWizard.sendAgainThreePid() + is RegisterAction.ValidateThreePid -> registrationWizard.handleValidateThreePid(action.code) + is RegisterAction.CheckIfEmailHasBeenValidated -> registrationWizard.checkIfEmailHasBeenValidated(action.delayMillis) + is RegisterAction.CreateAccount -> registrationWizard.createAccount(action.username, action.password, action.initialDeviceName) + } + } +} + +sealed interface RegisterAction { + object StartRegistration : RegisterAction + data class CreateAccount(val username: String, val password: String, val initialDeviceName: String) : RegisterAction + + data class AddThreePid(val threePid: RegisterThreePid) : RegisterAction + object SendAgainThreePid : RegisterAction + + // TODO Confirm Email (from link in the email, open in the phone, intercepted by the app) + data class ValidateThreePid(val code: String) : RegisterAction + + data class CheckIfEmailHasBeenValidated(val delayMillis: Long) : RegisterAction + + data class CaptchaDone(val captchaResponse: String) : RegisterAction + object AcceptTerms : RegisterAction + object RegisterDummy : RegisterAction +} + +fun RegisterAction.hasLoadingState() = when (this) { + is RegisterAction.CheckIfEmailHasBeenValidated -> false + else -> true +} diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt index e2e390ae2d..4773332138 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt @@ -39,6 +39,7 @@ import im.vector.app.databinding.FragmentLoginCaptchaBinding import im.vector.app.features.login.JavascriptResponse import im.vector.app.features.onboarding.OnboardingAction import im.vector.app.features.onboarding.OnboardingViewState +import im.vector.app.features.onboarding.RegisterAction import kotlinx.parcelize.Parcelize import org.matrix.android.sdk.internal.di.MoshiProvider import timber.log.Timber @@ -181,7 +182,7 @@ class FtueAuthCaptchaFragment @Inject constructor( val response = javascriptResponse?.response if (javascriptResponse?.action == "verifyCallback" && response != null) { - viewModel.handle(OnboardingAction.CaptchaDone(response)) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.CaptchaDone(response))) } } return true diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthGenericTextInputFormFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthGenericTextInputFormFragment.kt index bd5054f646..2800530152 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthGenericTextInputFormFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthGenericTextInputFormFragment.kt @@ -37,6 +37,7 @@ import im.vector.app.databinding.FragmentLoginGenericTextInputFormBinding import im.vector.app.features.login.TextInputFormFragmentMode import im.vector.app.features.onboarding.OnboardingAction import im.vector.app.features.onboarding.OnboardingViewEvents +import im.vector.app.features.onboarding.RegisterAction import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.parcelize.Parcelize @@ -138,7 +139,7 @@ class FtueAuthGenericTextInputFormFragment @Inject constructor() : AbstractFtueA private fun onOtherButtonClicked() { when (params.mode) { TextInputFormFragmentMode.ConfirmMsisdn -> { - viewModel.handle(OnboardingAction.SendAgainThreePid) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.SendAgainThreePid)) } else -> { // Should not happen, button is not displayed @@ -152,19 +153,19 @@ class FtueAuthGenericTextInputFormFragment @Inject constructor() : AbstractFtueA if (text.isEmpty()) { // Perform dummy action - viewModel.handle(OnboardingAction.RegisterDummy) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.RegisterDummy)) } else { when (params.mode) { TextInputFormFragmentMode.SetEmail -> { - viewModel.handle(OnboardingAction.AddThreePid(RegisterThreePid.Email(text))) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.AddThreePid(RegisterThreePid.Email(text)))) } TextInputFormFragmentMode.SetMsisdn -> { getCountryCodeOrShowError(text)?.let { countryCode -> - viewModel.handle(OnboardingAction.AddThreePid(RegisterThreePid.Msisdn(text, countryCode))) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.AddThreePid(RegisterThreePid.Msisdn(text, countryCode)))) } } TextInputFormFragmentMode.ConfirmMsisdn -> { - viewModel.handle(OnboardingAction.ValidateThreePid(text)) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.ValidateThreePid(text))) } } } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthWaitForEmailFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthWaitForEmailFragment.kt index 94758c7fad..ec72f52b9e 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthWaitForEmailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthWaitForEmailFragment.kt @@ -25,6 +25,7 @@ import com.airbnb.mvrx.args import im.vector.app.R import im.vector.app.databinding.FragmentLoginWaitForEmailBinding import im.vector.app.features.onboarding.OnboardingAction +import im.vector.app.features.onboarding.RegisterAction import kotlinx.parcelize.Parcelize import org.matrix.android.sdk.api.failure.is401 import javax.inject.Inject @@ -54,7 +55,7 @@ class FtueAuthWaitForEmailFragment @Inject constructor() : AbstractFtueAuthFragm override fun onResume() { super.onResume() - viewModel.handle(OnboardingAction.CheckIfEmailHasBeenValidated(0)) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.CheckIfEmailHasBeenValidated(0))) } override fun onPause() { @@ -70,7 +71,7 @@ class FtueAuthWaitForEmailFragment @Inject constructor() : AbstractFtueAuthFragm override fun onError(throwable: Throwable) { if (throwable.is401()) { // Try again, with a delay - viewModel.handle(OnboardingAction.CheckIfEmailHasBeenValidated(10_000)) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.CheckIfEmailHasBeenValidated(10_000))) } else { super.onError(throwable) } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt index 5ce9a5350d..03598d3a47 100755 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt @@ -32,6 +32,7 @@ import im.vector.app.features.login.terms.LoginTermsViewState import im.vector.app.features.login.terms.PolicyController import im.vector.app.features.onboarding.OnboardingAction import im.vector.app.features.onboarding.OnboardingViewState +import im.vector.app.features.onboarding.RegisterAction import im.vector.app.features.onboarding.ftueauth.AbstractFtueAuthFragment import kotlinx.parcelize.Parcelize import org.matrix.android.sdk.internal.auth.registration.LocalizedFlowDataLoginTerms @@ -111,7 +112,7 @@ class FtueAuthTermsFragment @Inject constructor( } private fun submit() { - viewModel.handle(OnboardingAction.AcceptTerms) + viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.AcceptTerms)) } override fun updateWithState(state: OnboardingViewState) { diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index 085e1a8049..44d44a94b2 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -29,6 +29,7 @@ import im.vector.app.test.fakes.FakeAuthenticationService import im.vector.app.test.fakes.FakeContext import im.vector.app.test.fakes.FakeHomeServerConnectionConfigFactory import im.vector.app.test.fakes.FakeHomeServerHistoryService +import im.vector.app.test.fakes.FakeRegisterActionHandler import im.vector.app.test.fakes.FakeRegistrationWizard import im.vector.app.test.fakes.FakeSession import im.vector.app.test.fakes.FakeStringProvider @@ -41,6 +42,9 @@ import kotlinx.coroutines.test.runBlockingTest import org.junit.Before import org.junit.Rule import org.junit.Test +import org.matrix.android.sdk.api.auth.registration.FlowResult +import org.matrix.android.sdk.api.auth.registration.RegistrationResult +import org.matrix.android.sdk.api.auth.registration.Stage import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities private const val A_DISPLAY_NAME = "a display name" @@ -50,6 +54,7 @@ private val AN_UNSUPPORTED_PERSONALISATION_STATE = PersonalizationState( supportsChangingDisplayName = false, supportsChangingProfilePicture = false ) +private val A_LOADABLE_REGISTER_ACTION = RegisterAction.StartRegistration class OnboardingViewModelTest { @@ -63,6 +68,7 @@ class OnboardingViewModelTest { private val fakeUriFilenameResolver = FakeUriFilenameResolver() private val fakeActiveSessionHolder = FakeActiveSessionHolder(fakeSession) private val fakeAuthenticationService = FakeAuthenticationService() + private val fakeRegisterActionHandler = FakeRegisterActionHandler() lateinit var viewModel: OnboardingViewModel @@ -108,28 +114,67 @@ class OnboardingViewModelTest { .finish() } + @Test + fun `given register action requires more steps when handling action then posts next steps`() = runBlockingTest { + val test = viewModel.test(this) + val flowResult = FlowResult(missingStages = listOf(Stage.Email(true)), completedStages = listOf(Stage.Email(true))) + givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.FlowResponse(flowResult)) + + viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) + + test + .assertStatesWithPrevious( + initialState, + { copy(asyncRegistration = Loading()) }, + { copy(asyncRegistration = Uninitialized) } + ) + .assertEvents(OnboardingViewEvents.RegistrationFlowResult(flowResult, isRegistrationStarted = true)) + .finish() + } + + @Test + fun `given registration has started and has dummy step to do when handling action then ignores other steps and executes dummy`() = runBlockingTest { + val test = viewModel.test(this) + + val homeServerCapabilities = HomeServerCapabilities(canChangeDisplayName = true, canChangeAvatar = true) + fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(homeServerCapabilities) + val flowResult = FlowResult(missingStages = listOf(Stage.Dummy(mandatory = true), Stage.Email(true)), completedStages = emptyList()) + givenRegistrationResultsFor(listOf( + A_LOADABLE_REGISTER_ACTION to RegistrationResult.FlowResponse(flowResult), + RegisterAction.RegisterDummy to RegistrationResult.Success(fakeSession) + )) + givenSuccessfullyCreatesAccount() + + viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) + + test + .assertStatesWithPrevious( + initialState, + { copy(asyncRegistration = Loading()) }, + { copy(asyncLoginAction = Success(Unit), personalizationState = homeServerCapabilities.toPersonalisationState()) }, + { copy(asyncRegistration = Uninitialized) }, + + ) + .assertEvents(OnboardingViewEvents.OnAccountCreated) + .finish() + } + @Test fun `given homeserver does not support personalisation when registering account then updates state and emits account created event`() = runBlockingTest { - fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(HomeServerCapabilities(canChangeDisplayName = false, canChangeAvatar = false)) + val homeServerCapabilities = HomeServerCapabilities(canChangeDisplayName = false, canChangeAvatar = false) + fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(homeServerCapabilities) + givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession)) givenSuccessfullyCreatesAccount() val test = viewModel.test(this) - viewModel.handle(OnboardingAction.RegisterDummy) + viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) test - .assertStates( + .assertStatesWithPrevious( initialState, - initialState.copy(asyncRegistration = Loading()), - initialState.copy( - asyncLoginAction = Success(Unit), - asyncRegistration = Loading(), - personalizationState = AN_UNSUPPORTED_PERSONALISATION_STATE - ), - initialState.copy( - asyncLoginAction = Success(Unit), - asyncRegistration = Uninitialized, - personalizationState = AN_UNSUPPORTED_PERSONALISATION_STATE - ) + { copy(asyncRegistration = Loading()) }, + { copy(asyncLoginAction = Success(Unit), personalizationState = homeServerCapabilities.toPersonalisationState()) }, + { copy(asyncLoginAction = Success(Unit), asyncRegistration = Uninitialized) } ) .assertEvents(OnboardingViewEvents.OnAccountCreated) .finish() @@ -173,10 +218,10 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME)) test - .assertStates( + .assertStatesWithPrevious( initialState, - initialState.copy(asyncDisplayName = Loading()), - initialState.copy(asyncDisplayName = Fail(AN_ERROR)), + { copy(asyncDisplayName = Loading()) }, + { copy(asyncDisplayName = Fail(AN_ERROR)) }, ) .assertEvents(OnboardingViewEvents.Failure(AN_ERROR)) .finish() @@ -264,6 +309,7 @@ class OnboardingViewModelTest { FakeVectorFeatures(), FakeAnalyticsTracker(), fakeUriFilenameResolver.instance, + fakeRegisterActionHandler.instance, FakeVectorOverrides() ) } @@ -286,14 +332,6 @@ class OnboardingViewModelTest { state.copy(asyncProfilePicture = Fail(cause)) ) - private fun givenSuccessfullyCreatesAccount() { - fakeActiveSessionHolder.expectSetsActiveSession(fakeSession) - val registrationWizard = FakeRegistrationWizard().also { it.givenSuccessfulDummy(fakeSession) } - fakeAuthenticationService.givenRegistrationWizard(registrationWizard) - fakeAuthenticationService.expectReset() - fakeSession.expectStartsSyncing() - } - private fun expectedSuccessfulDisplayNameUpdateStates(personalisedInitialState: OnboardingViewState): List { return listOf( personalisedInitialState, @@ -304,4 +342,26 @@ class OnboardingViewModelTest { ) ) } + + private fun givenSuccessfullyCreatesAccount() { + fakeActiveSessionHolder.expectSetsActiveSession(fakeSession) + fakeAuthenticationService.expectReset() + fakeSession.expectStartsSyncing() + } + + private fun givenRegistrationResultFor(action: RegisterAction, result: RegistrationResult) { + givenRegistrationResultsFor(listOf(action to result)) + } + + private fun givenRegistrationResultsFor(results: List>) { + fakeAuthenticationService.givenRegistrationStarted(true) + val registrationWizard = FakeRegistrationWizard() + fakeAuthenticationService.givenRegistrationWizard(registrationWizard) + fakeRegisterActionHandler.givenResultsFor(registrationWizard, results) + } } + +private fun HomeServerCapabilities.toPersonalisationState() = PersonalizationState( + supportsChangingDisplayName = canChangeDisplayName, + supportsChangingProfilePicture = canChangeAvatar +) diff --git a/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt new file mode 100644 index 0000000000..87efa0bddc --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2022 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. + */ + +package im.vector.app.features.onboarding + +import im.vector.app.test.fakes.FakeRegistrationWizard +import im.vector.app.test.fakes.FakeSession +import kotlinx.coroutines.test.runBlockingTest +import org.amshove.kluent.shouldBeEqualTo +import org.junit.Test +import org.matrix.android.sdk.api.auth.registration.RegisterThreePid +import org.matrix.android.sdk.api.auth.registration.RegistrationResult +import org.matrix.android.sdk.api.auth.registration.RegistrationWizard + +private val A_SESSION = FakeSession() +private val AN_EXPECTED_RESULT = RegistrationResult.Success(A_SESSION) +private const val A_USERNAME = "a username" +private const val A_PASSWORD = "a password" +private const val AN_INITIAL_DEVICE_NAME = "a device name" +private const val A_CAPTCHA_RESPONSE = "a captcha response" +private const val A_PID_CODE = "a pid code" +private const val EMAIL_VALIDATED_DELAY = 10000L +private val A_PID_TO_REGISTER = RegisterThreePid.Email("an email") + +class RegistrationActionHandlerTest { + + private val fakeRegistrationWizard = FakeRegistrationWizard() + private val registrationActionHandler = RegistrationActionHandler() + + @Test + fun `when handling register action then delegates to wizard`() = runBlockingTest { + val cases = listOf( + case(RegisterAction.StartRegistration) { getRegistrationFlow() }, + case(RegisterAction.CaptchaDone(A_CAPTCHA_RESPONSE)) { performReCaptcha(A_CAPTCHA_RESPONSE) }, + case(RegisterAction.AcceptTerms) { acceptTerms() }, + case(RegisterAction.RegisterDummy) { dummy() }, + case(RegisterAction.AddThreePid(A_PID_TO_REGISTER)) { addThreePid(A_PID_TO_REGISTER) }, + case(RegisterAction.SendAgainThreePid) { sendAgainThreePid() }, + case(RegisterAction.ValidateThreePid(A_PID_CODE)) { handleValidateThreePid(A_PID_CODE) }, + case(RegisterAction.CheckIfEmailHasBeenValidated(EMAIL_VALIDATED_DELAY)) { checkIfEmailHasBeenValidated(EMAIL_VALIDATED_DELAY) }, + case(RegisterAction.CreateAccount(A_USERNAME, A_PASSWORD, AN_INITIAL_DEVICE_NAME)) { + createAccount(A_USERNAME, A_PASSWORD, AN_INITIAL_DEVICE_NAME) + } + ) + + cases.forEach { testSuccessfulActionDelegation(it) } + } + + private suspend fun testSuccessfulActionDelegation(case: Case) { + fakeRegistrationWizard.givenSuccessFor(result = A_SESSION, case.expect) + + val result = registrationActionHandler.handleRegisterAction(fakeRegistrationWizard, case.action) + + result shouldBeEqualTo AN_EXPECTED_RESULT + } +} + +private fun case(action: RegisterAction, expect: suspend RegistrationWizard.() -> RegistrationResult) = Case(action, expect) + +private class Case(val action: RegisterAction, val expect: suspend RegistrationWizard.() -> RegistrationResult) diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt index e1a605c7df..10daf5de1e 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt @@ -23,10 +23,15 @@ import org.matrix.android.sdk.api.auth.AuthenticationService import org.matrix.android.sdk.api.auth.registration.RegistrationWizard class FakeAuthenticationService : AuthenticationService by mockk() { + fun givenRegistrationWizard(registrationWizard: RegistrationWizard) { every { getRegistrationWizard() } returns registrationWizard } + fun givenRegistrationStarted(started: Boolean) { + every { isRegistrationStarted } returns started + } + fun expectReset() { coJustRun { reset() } } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt new file mode 100644 index 0000000000..6c01779a02 --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022 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. + */ + +package im.vector.app.test.fakes + +import im.vector.app.features.onboarding.RegisterAction +import im.vector.app.features.onboarding.RegistrationActionHandler +import io.mockk.coEvery +import io.mockk.mockk +import org.matrix.android.sdk.api.auth.registration.RegistrationResult +import org.matrix.android.sdk.api.auth.registration.RegistrationWizard + +class FakeRegisterActionHandler { + + val instance = mockk() + + fun givenResultFor(wizard: RegistrationWizard, action: RegisterAction, result: RegistrationResult) { + coEvery { instance.handleRegisterAction(wizard, action) } answers { + it.invocation.args.first() + result + } + } + + fun givenResultsFor(wizard: RegistrationWizard, result: List>) { + coEvery { instance.handleRegisterAction(wizard, any()) } answers { + val actionArg = it.invocation.args[1] as RegisterAction + result.first { it.first == actionArg }.second + } + } +} diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt index 6ae394eea1..2fc830e94a 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt @@ -25,6 +25,14 @@ import org.matrix.android.sdk.api.session.Session class FakeRegistrationWizard : RegistrationWizard by mockk() { fun givenSuccessfulDummy(session: Session) { - coEvery { dummy() } returns RegistrationResult.Success(session) + givenSuccessFor(session) { dummy() } + } + + fun givenSuccessFor(result: Session, expect: suspend RegistrationWizard.() -> RegistrationResult) { + coEvery { expect(this@FakeRegistrationWizard) } returns RegistrationResult.Success(result) + } + + fun givenSuccessfulAcceptTerms(session: Session) { + coEvery { acceptTerms() } returns RegistrationResult.Success(session) } } From 434ee67982b9d2b00bc125081716b7dc60852928 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 17:27:54 +0000 Subject: [PATCH 076/152] ensure the pid add/resend methods do not trigger the next registration steps - keeps the previous behaviour --- .../app/features/onboarding/OnboardingViewModel.kt | 11 ++++++++--- .../features/onboarding/RegistrationActionHandler.kt | 6 ++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 303a4d5950..6c3c7b02c1 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -276,9 +276,14 @@ class OnboardingViewModel @AssistedInject constructor( kotlin.runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) } .fold( onSuccess = { - when (it) { - is RegistrationResult.Success -> onSessionCreated(it.session, isAccountCreated = true) - is RegistrationResult.FlowResponse -> onFlowResponse(it.flowResult) + when { + action.ignoresResult() -> { + // do nothing + } + else -> when (it) { + is RegistrationResult.Success -> onSessionCreated(it.session, isAccountCreated = true) + is RegistrationResult.FlowResponse -> onFlowResponse(it.flowResult) + } } }, onFailure = { diff --git a/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt b/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt index 2938681ce7..b4998d2ba0 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt @@ -55,6 +55,12 @@ sealed interface RegisterAction { object RegisterDummy : RegisterAction } +fun RegisterAction.ignoresResult() = when (this) { + is RegisterAction.AddThreePid -> true + is RegisterAction.SendAgainThreePid -> true + else -> false +} + fun RegisterAction.hasLoadingState() = when (this) { is RegisterAction.CheckIfEmailHasBeenValidated -> false else -> true From b2a1aa17bdd4daf7250185e8132d102dd51d924c Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 17:28:08 +0000 Subject: [PATCH 077/152] adding commas to separate the test name sections --- .../onboarding/OnboardingViewModelTest.kt | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index 44d44a94b2..a36c3cbb7a 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -50,10 +50,6 @@ import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities private const val A_DISPLAY_NAME = "a display name" private const val A_PICTURE_FILENAME = "a-picture.png" private val AN_ERROR = RuntimeException("an error!") -private val AN_UNSUPPORTED_PERSONALISATION_STATE = PersonalizationState( - supportsChangingDisplayName = false, - supportsChangingProfilePicture = false -) private val A_LOADABLE_REGISTER_ACTION = RegisterAction.StartRegistration class OnboardingViewModelTest { @@ -78,7 +74,7 @@ class OnboardingViewModelTest { } @Test - fun `when handling PostViewEvent then emits contents as view event`() = runBlockingTest { + fun `when handling PostViewEvent, then emits contents as view event`() = runBlockingTest { val test = viewModel.test(this) viewModel.handle(OnboardingAction.PostViewEvent(OnboardingViewEvents.OnTakeMeHome)) @@ -89,7 +85,7 @@ class OnboardingViewModelTest { } @Test - fun `given supports changing display name when handling PersonalizeProfile then emits contents choose display name`() = runBlockingTest { + fun `given supports changing display name, when handling PersonalizeProfile, then emits contents choose display name`() = runBlockingTest { val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = true, supportsChangingProfilePicture = false)) viewModel = createViewModel(initialState) val test = viewModel.test(this) @@ -102,7 +98,7 @@ class OnboardingViewModelTest { } @Test - fun `given only supports changing profile picture when handling PersonalizeProfile then emits contents choose profile picture`() = runBlockingTest { + fun `given only supports changing profile picture, when handling PersonalizeProfile, then emits contents choose profile picture`() = runBlockingTest { val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = false, supportsChangingProfilePicture = true)) viewModel = createViewModel(initialState) val test = viewModel.test(this) @@ -115,7 +111,7 @@ class OnboardingViewModelTest { } @Test - fun `given register action requires more steps when handling action then posts next steps`() = runBlockingTest { + fun `given register action requires more steps, when handling action, then posts next steps`() = runBlockingTest { val test = viewModel.test(this) val flowResult = FlowResult(missingStages = listOf(Stage.Email(true)), completedStages = listOf(Stage.Email(true))) givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.FlowResponse(flowResult)) @@ -133,7 +129,7 @@ class OnboardingViewModelTest { } @Test - fun `given registration has started and has dummy step to do when handling action then ignores other steps and executes dummy`() = runBlockingTest { + fun `given registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runBlockingTest { val test = viewModel.test(this) val homeServerCapabilities = HomeServerCapabilities(canChangeDisplayName = true, canChangeAvatar = true) @@ -160,7 +156,7 @@ class OnboardingViewModelTest { } @Test - fun `given homeserver does not support personalisation when registering account then updates state and emits account created event`() = runBlockingTest { + fun `given homeserver does not support personalisation, when registering account, then updates state and emits account created event`() = runBlockingTest { val homeServerCapabilities = HomeServerCapabilities(canChangeDisplayName = false, canChangeAvatar = false) fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(homeServerCapabilities) givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession)) @@ -181,7 +177,7 @@ class OnboardingViewModelTest { } @Test - fun `given changing profile picture is supported when updating display name then updates upstream user display name and moves to choose profile picture`() = runBlockingTest { + fun `given changing profile picture is supported, when updating display name, then updates upstream user display name and moves to choose profile picture`() = runBlockingTest { val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = true)) viewModel = createViewModel(personalisedInitialState) val test = viewModel.test(this) @@ -196,7 +192,7 @@ class OnboardingViewModelTest { } @Test - fun `given changing profile picture is not supported when updating display name then updates upstream user display name and completes personalization`() = runBlockingTest { + fun `given changing profile picture is not supported, when updating display name, then updates upstream user display name and completes personalization`() = runBlockingTest { val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = false)) viewModel = createViewModel(personalisedInitialState) val test = viewModel.test(this) @@ -211,7 +207,7 @@ class OnboardingViewModelTest { } @Test - fun `given upstream failure when handling display name update then emits failure event`() = runBlockingTest { + fun `given upstream failure, when handling display name update, then emits failure event`() = runBlockingTest { val test = viewModel.test(this) fakeSession.fakeProfileService.givenSetDisplayNameErrors(AN_ERROR) @@ -228,7 +224,7 @@ class OnboardingViewModelTest { } @Test - fun `when handling profile picture selected then updates selected picture state`() = runBlockingTest { + fun `when handling profile picture selected, then updates selected picture state`() = runBlockingTest { val test = viewModel.test(this) viewModel.handle(OnboardingAction.ProfilePictureSelected(fakeUri.instance)) @@ -243,7 +239,7 @@ class OnboardingViewModelTest { } @Test - fun `given a selected picture when handling save selected profile picture then updates upstream avatar and completes personalization`() = runBlockingTest { + fun `given a selected picture, when handling save selected profile picture, then updates upstream avatar and completes personalization`() = runBlockingTest { val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME) viewModel = createViewModel(initialStateWithPicture) val test = viewModel.test(this) @@ -258,7 +254,7 @@ class OnboardingViewModelTest { } @Test - fun `given upstream update avatar fails when saving selected profile picture then emits failure event`() = runBlockingTest { + fun `given upstream update avatar fails, when saving selected profile picture, then emits failure event`() = runBlockingTest { fakeSession.fakeProfileService.givenUpdateAvatarErrors(AN_ERROR) val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME) viewModel = createViewModel(initialStateWithPicture) @@ -273,7 +269,7 @@ class OnboardingViewModelTest { } @Test - fun `given no selected picture when saving selected profile picture then emits failure event`() = runBlockingTest { + fun `given no selected picture, when saving selected profile picture, then emits failure event`() = runBlockingTest { val test = viewModel.test(this) viewModel.handle(OnboardingAction.SaveSelectedProfilePicture) @@ -285,7 +281,7 @@ class OnboardingViewModelTest { } @Test - fun `when handling profile picture skipped then completes personalization`() = runBlockingTest { + fun `when handling profile skipped, then completes personalization`() = runBlockingTest { val test = viewModel.test(this) viewModel.handle(OnboardingAction.UpdateProfilePictureSkipped) From 75cbb727a443e78f972072b485c5b96d7d83bb9b Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 17:45:29 +0000 Subject: [PATCH 078/152] cleaning up test names and bodies to be clearer --- .../onboarding/OnboardingViewModelTest.kt | 45 ++++++++++--------- .../fixtures/HomeserverCapabilityFixture.kt | 40 +++++++++++++++++ 2 files changed, 63 insertions(+), 22 deletions(-) create mode 100644 vector/src/test/java/im/vector/app/test/fixtures/HomeserverCapabilityFixture.kt diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index a36c3cbb7a..b485a3fa44 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -37,6 +37,7 @@ import im.vector.app.test.fakes.FakeUri import im.vector.app.test.fakes.FakeUriFilenameResolver import im.vector.app.test.fakes.FakeVectorFeatures import im.vector.app.test.fakes.FakeVectorOverrides +import im.vector.app.test.fixtures.aHomeServerCapabilities import im.vector.app.test.test import kotlinx.coroutines.test.runBlockingTest import org.junit.Before @@ -51,6 +52,7 @@ private const val A_DISPLAY_NAME = "a display name" private const val A_PICTURE_FILENAME = "a-picture.png" private val AN_ERROR = RuntimeException("an error!") private val A_LOADABLE_REGISTER_ACTION = RegisterAction.StartRegistration +private val A_HOMESERVER_CAPABILITIES = aHomeServerCapabilities(canChangeDisplayName = true, canChangeAvatar = true) class OnboardingViewModelTest { @@ -129,38 +131,27 @@ class OnboardingViewModelTest { } @Test - fun `given registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runBlockingTest { + fun `when registering account, then updates state and emits account created event`() = runBlockingTest { + givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession)) + givenSuccessfullyCreatesAccount(A_HOMESERVER_CAPABILITIES) val test = viewModel.test(this) - val homeServerCapabilities = HomeServerCapabilities(canChangeDisplayName = true, canChangeAvatar = true) - fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(homeServerCapabilities) - val flowResult = FlowResult(missingStages = listOf(Stage.Dummy(mandatory = true), Stage.Email(true)), completedStages = emptyList()) - givenRegistrationResultsFor(listOf( - A_LOADABLE_REGISTER_ACTION to RegistrationResult.FlowResponse(flowResult), - RegisterAction.RegisterDummy to RegistrationResult.Success(fakeSession) - )) - givenSuccessfullyCreatesAccount() - viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) test .assertStatesWithPrevious( initialState, { copy(asyncRegistration = Loading()) }, - { copy(asyncLoginAction = Success(Unit), personalizationState = homeServerCapabilities.toPersonalisationState()) }, - { copy(asyncRegistration = Uninitialized) }, - - ) + { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }, + { copy(asyncLoginAction = Success(Unit), asyncRegistration = Uninitialized) } + ) .assertEvents(OnboardingViewEvents.OnAccountCreated) .finish() } @Test - fun `given homeserver does not support personalisation, when registering account, then updates state and emits account created event`() = runBlockingTest { - val homeServerCapabilities = HomeServerCapabilities(canChangeDisplayName = false, canChangeAvatar = false) - fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(homeServerCapabilities) - givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession)) - givenSuccessfullyCreatesAccount() + fun `given registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runBlockingTest { + givenSuccessfulRegistrationForStartAndDummySteps(missingStages = listOf(Stage.Dummy(mandatory = true))) val test = viewModel.test(this) viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) @@ -169,8 +160,8 @@ class OnboardingViewModelTest { .assertStatesWithPrevious( initialState, { copy(asyncRegistration = Loading()) }, - { copy(asyncLoginAction = Success(Unit), personalizationState = homeServerCapabilities.toPersonalisationState()) }, - { copy(asyncLoginAction = Success(Unit), asyncRegistration = Uninitialized) } + { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }, + { copy(asyncRegistration = Uninitialized) } ) .assertEvents(OnboardingViewEvents.OnAccountCreated) .finish() @@ -339,7 +330,17 @@ class OnboardingViewModelTest { ) } - private fun givenSuccessfullyCreatesAccount() { + private fun givenSuccessfulRegistrationForStartAndDummySteps(missingStages: List) { + val flowResult = FlowResult(missingStages = missingStages, completedStages = emptyList()) + givenRegistrationResultsFor(listOf( + A_LOADABLE_REGISTER_ACTION to RegistrationResult.FlowResponse(flowResult), + RegisterAction.RegisterDummy to RegistrationResult.Success(fakeSession) + )) + givenSuccessfullyCreatesAccount(A_HOMESERVER_CAPABILITIES) + } + + private fun givenSuccessfullyCreatesAccount(homeServerCapabilities: HomeServerCapabilities) { + fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(homeServerCapabilities) fakeActiveSessionHolder.expectSetsActiveSession(fakeSession) fakeAuthenticationService.expectReset() fakeSession.expectStartsSyncing() diff --git a/vector/src/test/java/im/vector/app/test/fixtures/HomeserverCapabilityFixture.kt b/vector/src/test/java/im/vector/app/test/fixtures/HomeserverCapabilityFixture.kt new file mode 100644 index 0000000000..a4d9869a89 --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fixtures/HomeserverCapabilityFixture.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 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. + */ + +package im.vector.app.test.fixtures + +import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities +import org.matrix.android.sdk.api.session.homeserver.RoomVersionCapabilities + +fun aHomeServerCapabilities( + canChangePassword: Boolean = true, + canChangeDisplayName: Boolean = true, + canChangeAvatar: Boolean = true, + canChange3pid: Boolean = true, + maxUploadFileSize: Long = 100L, + lastVersionIdentityServerSupported: Boolean = false, + defaultIdentityServerUrl: String? = null, + roomVersions: RoomVersionCapabilities? = null +) = HomeServerCapabilities( + canChangePassword, + canChangeDisplayName, + canChangeAvatar, + canChange3pid, + maxUploadFileSize, + lastVersionIdentityServerSupported, + defaultIdentityServerUrl, + roomVersions +) From 804513c808de54f318f808cc2d8c07e28d130d6b Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 17:53:12 +0000 Subject: [PATCH 079/152] adding case for result ignoring register actions --- .../onboarding/OnboardingViewModelTest.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index b485a3fa44..3c8279bafa 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -44,6 +44,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.matrix.android.sdk.api.auth.registration.FlowResult +import org.matrix.android.sdk.api.auth.registration.RegisterThreePid import org.matrix.android.sdk.api.auth.registration.RegistrationResult import org.matrix.android.sdk.api.auth.registration.Stage import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities @@ -52,7 +53,9 @@ private const val A_DISPLAY_NAME = "a display name" private const val A_PICTURE_FILENAME = "a-picture.png" private val AN_ERROR = RuntimeException("an error!") private val A_LOADABLE_REGISTER_ACTION = RegisterAction.StartRegistration +private val A_RESULT_IGNORED_REGISTER_ACTION = RegisterAction.AddThreePid(RegisterThreePid.Email("an email")) private val A_HOMESERVER_CAPABILITIES = aHomeServerCapabilities(canChangeDisplayName = true, canChangeAvatar = true) +private val AN_IGNORED_FLOW_RESULT = FlowResult(missingStages = emptyList(), completedStages = emptyList()) class OnboardingViewModelTest { @@ -130,6 +133,23 @@ class OnboardingViewModelTest { .finish() } + @Test + fun `given register action ignores result, when handling action, then does nothing on success`() = runBlockingTest { + val test = viewModel.test(this) + givenRegistrationResultFor(A_RESULT_IGNORED_REGISTER_ACTION, RegistrationResult.FlowResponse(AN_IGNORED_FLOW_RESULT)) + + viewModel.handle(OnboardingAction.PostRegisterAction(A_RESULT_IGNORED_REGISTER_ACTION)) + + test + .assertStatesWithPrevious( + initialState, + { copy(asyncRegistration = Loading()) }, + { copy(asyncRegistration = Uninitialized) } + ) + .assertNoEvents() + .finish() + } + @Test fun `when registering account, then updates state and emits account created event`() = runBlockingTest { givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession)) From 390ae4344df08f559ce1a02b3276b4c9fdf99edb Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 18:07:13 +0000 Subject: [PATCH 080/152] allowing test withPrevious to be supplied a list --- .../features/onboarding/OnboardingViewModelTest.kt | 14 +++++--------- .../src/test/java/im/vector/app/test/Extensions.kt | 4 ++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index 3c8279bafa..b6e92655c0 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -196,7 +196,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME)) test - .assertStates(expectedSuccessfulDisplayNameUpdateStates(personalisedInitialState)) + .assertStatesWithPrevious(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates()) .assertEvents(OnboardingViewEvents.OnChooseProfilePicture) .finish() fakeSession.fakeProfileService.verifyUpdatedName(fakeSession.myUserId, A_DISPLAY_NAME) @@ -211,7 +211,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME)) test - .assertStates(expectedSuccessfulDisplayNameUpdateStates(personalisedInitialState)) + .assertStatesWithPrevious(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates()) .assertEvents(OnboardingViewEvents.OnPersonalizationComplete) .finish() fakeSession.fakeProfileService.verifyUpdatedName(fakeSession.myUserId, A_DISPLAY_NAME) @@ -339,14 +339,10 @@ class OnboardingViewModelTest { state.copy(asyncProfilePicture = Fail(cause)) ) - private fun expectedSuccessfulDisplayNameUpdateStates(personalisedInitialState: OnboardingViewState): List { + private fun expectedSuccessfulDisplayNameUpdateStates(): List OnboardingViewState> { return listOf( - personalisedInitialState, - personalisedInitialState.copy(asyncDisplayName = Loading()), - personalisedInitialState.copy( - asyncDisplayName = Success(Unit), - personalizationState = personalisedInitialState.personalizationState.copy(displayName = A_DISPLAY_NAME) - ) + { copy(asyncDisplayName = Loading()) }, + { copy(asyncDisplayName = Success(Unit), personalizationState = personalizationState.copy(displayName = A_DISPLAY_NAME)) } ) } diff --git a/vector/src/test/java/im/vector/app/test/Extensions.kt b/vector/src/test/java/im/vector/app/test/Extensions.kt index 136ca58d68..5fe07b967a 100644 --- a/vector/src/test/java/im/vector/app/test/Extensions.kt +++ b/vector/src/test/java/im/vector/app/test/Extensions.kt @@ -56,6 +56,10 @@ class ViewModelTest( } fun assertStatesWithPrevious(initial: S, vararg expected: S.() -> S): ViewModelTest { + return assertStatesWithPrevious(initial, expected.toList()) + } + + fun assertStatesWithPrevious(initial: S, expected: List S>): ViewModelTest { val reducedExpectedStates = expected.fold(mutableListOf(initial)) { acc, curr -> val next = curr.invoke(acc.last()) acc.add(next) From 694016fc164139739ad45977fc4f4b83876e289d Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 18:14:45 +0000 Subject: [PATCH 081/152] adding test case for the non loading registration steps --- .../onboarding/OnboardingViewModelTest.kt | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index b6e92655c0..ec9851ebc8 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -53,9 +53,11 @@ private const val A_DISPLAY_NAME = "a display name" private const val A_PICTURE_FILENAME = "a-picture.png" private val AN_ERROR = RuntimeException("an error!") private val A_LOADABLE_REGISTER_ACTION = RegisterAction.StartRegistration +private val A_NON_LOADABLE_REGISTER_ACTION = RegisterAction.CheckIfEmailHasBeenValidated(delayMillis = -1L) private val A_RESULT_IGNORED_REGISTER_ACTION = RegisterAction.AddThreePid(RegisterThreePid.Email("an email")) private val A_HOMESERVER_CAPABILITIES = aHomeServerCapabilities(canChangeDisplayName = true, canChangeAvatar = true) private val AN_IGNORED_FLOW_RESULT = FlowResult(missingStages = emptyList(), completedStages = emptyList()) +private val ANY_CONTINUING_REGISTRATION_RESULT = RegistrationResult.FlowResponse(AN_IGNORED_FLOW_RESULT) class OnboardingViewModelTest { @@ -118,8 +120,7 @@ class OnboardingViewModelTest { @Test fun `given register action requires more steps, when handling action, then posts next steps`() = runBlockingTest { val test = viewModel.test(this) - val flowResult = FlowResult(missingStages = listOf(Stage.Email(true)), completedStages = listOf(Stage.Email(true))) - givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.FlowResponse(flowResult)) + givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT) viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) @@ -129,7 +130,20 @@ class OnboardingViewModelTest { { copy(asyncRegistration = Loading()) }, { copy(asyncRegistration = Uninitialized) } ) - .assertEvents(OnboardingViewEvents.RegistrationFlowResult(flowResult, isRegistrationStarted = true)) + .assertEvents(OnboardingViewEvents.RegistrationFlowResult(ANY_CONTINUING_REGISTRATION_RESULT.flowResult, isRegistrationStarted = true)) + .finish() + } + + @Test + fun `given register action is non loadable, when handling action, then posts next steps without loading`() = runBlockingTest { + val test = viewModel.test(this) + givenRegistrationResultFor(A_NON_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT) + + viewModel.handle(OnboardingAction.PostRegisterAction(A_NON_LOADABLE_REGISTER_ACTION)) + + test + .assertState(initialState) + .assertEvents(OnboardingViewEvents.RegistrationFlowResult(ANY_CONTINUING_REGISTRATION_RESULT.flowResult, isRegistrationStarted = true)) .finish() } From fc5c0579bbc5b22dac1198f52f903b7723d06d85 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 2 Mar 2022 18:24:22 +0000 Subject: [PATCH 082/152] adding changelog entry --- changelog.d/5408.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/5408.misc diff --git a/changelog.d/5408.misc b/changelog.d/5408.misc new file mode 100644 index 0000000000..3807ee1da8 --- /dev/null +++ b/changelog.d/5408.misc @@ -0,0 +1 @@ +Improved onboarding registration unit test coverage \ No newline at end of file From fe206fe130f4729f61785fa4000e035464a5e2ef Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 4 Mar 2022 14:00:59 +0000 Subject: [PATCH 083/152] fixing wrong action for starting the sign up --- .../onboarding/OnboardingViewModel.kt | 2 +- .../onboarding/OnboardingViewModelTest.kt | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 6c3c7b02c1..cfa65e0874 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -373,7 +373,7 @@ class OnboardingViewModel @AssistedInject constructor( } when (action.signMode) { - SignMode.SignUp -> handleRegisterAction(RegisterAction.RegisterDummy) + SignMode.SignUp -> handleRegisterAction(RegisterAction.StartRegistration) SignMode.SignIn -> startAuthenticationFlow() SignMode.SignInWithMatrixId -> _viewEvents.post(OnboardingViewEvents.OnSignModeSelected(SignMode.SignInWithMatrixId)) SignMode.Unknown -> Unit diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index ec9851ebc8..5d419c09c9 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -23,6 +23,7 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.test.MvRxTestRule import im.vector.app.features.login.ReAuthHelper +import im.vector.app.features.login.SignMode import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeAnalyticsTracker import im.vector.app.test.fakes.FakeAuthenticationService @@ -117,6 +118,24 @@ class OnboardingViewModelTest { .finish() } + @Test + fun `when handling SignUp then sets sign mode to sign up and starts registration`() = runBlockingTest { + givenRegistrationResultFor(RegisterAction.StartRegistration, ANY_CONTINUING_REGISTRATION_RESULT) + val test = viewModel.test(this) + + viewModel.handle(OnboardingAction.UpdateSignMode(SignMode.SignUp)) + + test + .assertStatesWithPrevious( + initialState, + { copy(signMode = SignMode.SignUp) }, + { copy(asyncRegistration = Loading()) }, + { copy(asyncRegistration = Uninitialized) } + ) + .assertEvents(OnboardingViewEvents.RegistrationFlowResult(ANY_CONTINUING_REGISTRATION_RESULT.flowResult, isRegistrationStarted = true)) + .finish() + } + @Test fun `given register action requires more steps, when handling action, then posts next steps`() = runBlockingTest { val test = viewModel.test(this) From 3d20d46eb3f0d440db2faf3fc0d53e985bd67308 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Mon, 7 Mar 2022 17:40:07 +0000 Subject: [PATCH 084/152] enabling the personalize step for the unit tests preemptively for the feature to be enabled --- .../test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt index 265941a531..b6e06bcdda 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt @@ -23,5 +23,5 @@ class FakeVectorFeatures : VectorFeatures { override fun isOnboardingAlreadyHaveAccountSplashEnabled() = true override fun isOnboardingSplashCarouselEnabled() = true override fun isOnboardingUseCaseEnabled() = true - override fun isOnboardingPersonalizeEnabled() = false + override fun isOnboardingPersonalizeEnabled() = true } From 4a7646a7ba7fcf4896c50645038e3c5ba6019ee6 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 15 Mar 2022 17:59:37 +0000 Subject: [PATCH 085/152] providing online indicator color from the colors file instead of the element palette --- library/ui-styles/src/main/res/values/colors.xml | 4 ++-- library/ui-styles/src/main/res/values/palette_mobile.xml | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/library/ui-styles/src/main/res/values/colors.xml b/library/ui-styles/src/main/res/values/colors.xml index 0578a598e9..d887e7774e 100644 --- a/library/ui-styles/src/main/res/values/colors.xml +++ b/library/ui-styles/src/main/res/values/colors.xml @@ -123,8 +123,8 @@ @color/palette_gray_450 - @color/presence_online - @color/presence_online + @color/palette_element_green + @color/palette_element_green diff --git a/library/ui-styles/src/main/res/values/palette_mobile.xml b/library/ui-styles/src/main/res/values/palette_mobile.xml index 0e5a6865da..5610771f8a 100644 --- a/library/ui-styles/src/main/res/values/palette_mobile.xml +++ b/library/ui-styles/src/main/res/values/palette_mobile.xml @@ -53,8 +53,4 @@ @color/palette_verde @color/palette_azure @color/palette_grape - - - @color/palette_element_green - \ No newline at end of file From 856f25f6844a8c0d56f5ba3289189778a249f251 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Tue, 15 Mar 2022 19:31:20 +0100 Subject: [PATCH 086/152] Fix local echos not being shown when re-opening rooms --- changelog.d/5551.bugfix | 1 + .../internal/session/room/timeline/SendingEventsDataSource.kt | 1 + 2 files changed, 2 insertions(+) create mode 100644 changelog.d/5551.bugfix diff --git a/changelog.d/5551.bugfix b/changelog.d/5551.bugfix new file mode 100644 index 0000000000..22f9d51e18 --- /dev/null +++ b/changelog.d/5551.bugfix @@ -0,0 +1 @@ +Fix local echos not being shown when re-opening rooms diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt index 1262c09d97..cb61222de7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt @@ -55,6 +55,7 @@ internal class RealmSendingEventsDataSource( roomEntity = RoomEntity.where(safeRealm, roomId = roomId).findFirst() sendingTimelineEvents = roomEntity?.sendingTimelineEvents sendingTimelineEvents?.addChangeListener(sendingTimelineEventsListener) + updateFrozenResults(sendingTimelineEvents) } override fun stop() { From 91259bef40623773b123ad57aa3fc33dc8bd8a47 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Thu, 17 Mar 2022 11:02:32 +0100 Subject: [PATCH 087/152] Ensure proper double linking of TimelineChunks We need both directions so getOffsetIndex() produces correct results in all cases. --- changelog.d/5564.bugfix | 1 + .../session/room/timeline/TimelineChunk.kt | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 changelog.d/5564.bugfix diff --git a/changelog.d/5564.bugfix b/changelog.d/5564.bugfix new file mode 100644 index 0000000000..64891b503c --- /dev/null +++ b/changelog.d/5564.bugfix @@ -0,0 +1 @@ +Fix sometimes read marker not properly updating diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 8a7078fdf9..c8f2132ae6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -83,11 +83,15 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity, isLastBackward.set(chunkEntity.isLastBackward) } if (changeSet.isFieldChanged(ChunkEntityFields.NEXT_CHUNK.`$`)) { - nextChunk = createTimelineChunk(chunkEntity.nextChunk) + nextChunk = createTimelineChunk(chunkEntity.nextChunk).also { + it?.prevChunk = this + } nextChunkLatch?.complete(Unit) } if (changeSet.isFieldChanged(ChunkEntityFields.PREV_CHUNK.`$`)) { - prevChunk = createTimelineChunk(chunkEntity.prevChunk) + prevChunk = createTimelineChunk(chunkEntity.prevChunk).also { + it?.nextChunk = this + } prevChunkLatch?.complete(Unit) } } @@ -194,7 +198,9 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity, when { nextChunkEntity != null -> { if (nextChunk == null) { - nextChunk = createTimelineChunk(nextChunkEntity) + nextChunk = createTimelineChunk(nextChunkEntity).also { + it?.prevChunk = this + } } nextChunk?.loadMore(offsetCount, direction, fetchFromServerIfNeeded) ?: LoadMoreResult.FAILURE } @@ -210,7 +216,9 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity, when { prevChunkEntity != null -> { if (prevChunk == null) { - prevChunk = createTimelineChunk(prevChunkEntity) + prevChunk = createTimelineChunk(prevChunkEntity).also { + it?.nextChunk = this + } } prevChunk?.loadMore(offsetCount, direction, fetchFromServerIfNeeded) ?: LoadMoreResult.FAILURE } From d77061b2295dab51b7aaabf41468c7c4dd4e0cfc Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 17 Mar 2022 16:38:42 +0000 Subject: [PATCH 088/152] removing fully qualified import --- .../im/vector/app/features/onboarding/OnboardingViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index cfa65e0874..3f2b5adcbe 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -273,7 +273,7 @@ class OnboardingViewModel @AssistedInject constructor( if (action.hasLoadingState()) { setState { copy(asyncRegistration = Loading()) } } - kotlin.runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) } + runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) } .fold( onSuccess = { when { From 5df2ae9ae2e65e92c624ac57f862b65ef3809b4f Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 17 Mar 2022 16:50:20 +0000 Subject: [PATCH 089/152] updating with previous state helper and including javadoc to help explain its usage --- .../onboarding/OnboardingViewModelTest.kt | 16 ++++++++-------- .../test/java/im/vector/app/test/Extensions.kt | 10 +++++++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index 5d419c09c9..f6c322af40 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -126,7 +126,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.UpdateSignMode(SignMode.SignUp)) test - .assertStatesWithPrevious( + .assertStatesChanges( initialState, { copy(signMode = SignMode.SignUp) }, { copy(asyncRegistration = Loading()) }, @@ -144,7 +144,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) test - .assertStatesWithPrevious( + .assertStatesChanges( initialState, { copy(asyncRegistration = Loading()) }, { copy(asyncRegistration = Uninitialized) } @@ -174,7 +174,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.PostRegisterAction(A_RESULT_IGNORED_REGISTER_ACTION)) test - .assertStatesWithPrevious( + .assertStatesChanges( initialState, { copy(asyncRegistration = Loading()) }, { copy(asyncRegistration = Uninitialized) } @@ -192,7 +192,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) test - .assertStatesWithPrevious( + .assertStatesChanges( initialState, { copy(asyncRegistration = Loading()) }, { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }, @@ -210,7 +210,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION)) test - .assertStatesWithPrevious( + .assertStatesChanges( initialState, { copy(asyncRegistration = Loading()) }, { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }, @@ -229,7 +229,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME)) test - .assertStatesWithPrevious(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates()) + .assertStatesChanges(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates()) .assertEvents(OnboardingViewEvents.OnChooseProfilePicture) .finish() fakeSession.fakeProfileService.verifyUpdatedName(fakeSession.myUserId, A_DISPLAY_NAME) @@ -244,7 +244,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME)) test - .assertStatesWithPrevious(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates()) + .assertStatesChanges(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates()) .assertEvents(OnboardingViewEvents.OnPersonalizationComplete) .finish() fakeSession.fakeProfileService.verifyUpdatedName(fakeSession.myUserId, A_DISPLAY_NAME) @@ -258,7 +258,7 @@ class OnboardingViewModelTest { viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME)) test - .assertStatesWithPrevious( + .assertStatesChanges( initialState, { copy(asyncDisplayName = Loading()) }, { copy(asyncDisplayName = Fail(AN_ERROR)) }, diff --git a/vector/src/test/java/im/vector/app/test/Extensions.kt b/vector/src/test/java/im/vector/app/test/Extensions.kt index 5fe07b967a..67eff7ca11 100644 --- a/vector/src/test/java/im/vector/app/test/Extensions.kt +++ b/vector/src/test/java/im/vector/app/test/Extensions.kt @@ -55,11 +55,15 @@ class ViewModelTest( return this } - fun assertStatesWithPrevious(initial: S, vararg expected: S.() -> S): ViewModelTest { - return assertStatesWithPrevious(initial, expected.toList()) + fun assertStatesChanges(initial: S, vararg expected: S.() -> S): ViewModelTest { + return assertStatesChanges(initial, expected.toList()) } - fun assertStatesWithPrevious(initial: S, expected: List S>): ViewModelTest { + /** + * Asserts the expected states are in the same order as the actual state emissions + * Each expected lambda is given the previous expected state, starting with the initial + */ + fun assertStatesChanges(initial: S, expected: List S>): ViewModelTest { val reducedExpectedStates = expected.fold(mutableListOf(initial)) { acc, curr -> val next = curr.invoke(acc.last()) acc.add(next) From d514751ffd5f8e5ea6f35c1837235d29d995b428 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 17 Mar 2022 16:52:37 +0000 Subject: [PATCH 090/152] avoiding shadowed lambda parameters --- .../im/vector/app/test/fakes/FakeRegisterActionHandler.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt index 6c01779a02..3122e29c3b 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt @@ -28,15 +28,15 @@ class FakeRegisterActionHandler { val instance = mockk() fun givenResultFor(wizard: RegistrationWizard, action: RegisterAction, result: RegistrationResult) { - coEvery { instance.handleRegisterAction(wizard, action) } answers { - it.invocation.args.first() + coEvery { instance.handleRegisterAction(wizard, action) } answers { call -> + call.invocation.args.first() result } } fun givenResultsFor(wizard: RegistrationWizard, result: List>) { - coEvery { instance.handleRegisterAction(wizard, any()) } answers { - val actionArg = it.invocation.args[1] as RegisterAction + coEvery { instance.handleRegisterAction(wizard, any()) } answers { call -> + val actionArg = call.invocation.args[1] as RegisterAction result.first { it.first == actionArg }.second } } From ba76aac9659b6c2af9b5a91bc6d0bea3b6b982ae Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 17 Mar 2022 16:54:51 +0000 Subject: [PATCH 091/152] removing unused fake helper methods --- .../im/vector/app/test/fakes/FakeRegisterActionHandler.kt | 7 ------- .../im/vector/app/test/fakes/FakeRegistrationWizard.kt | 8 -------- 2 files changed, 15 deletions(-) diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt index 3122e29c3b..8d595d91e9 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt @@ -27,13 +27,6 @@ class FakeRegisterActionHandler { val instance = mockk() - fun givenResultFor(wizard: RegistrationWizard, action: RegisterAction, result: RegistrationResult) { - coEvery { instance.handleRegisterAction(wizard, action) } answers { call -> - call.invocation.args.first() - result - } - } - fun givenResultsFor(wizard: RegistrationWizard, result: List>) { coEvery { instance.handleRegisterAction(wizard, any()) } answers { call -> val actionArg = call.invocation.args[1] as RegisterAction diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt index 2fc830e94a..723ed4ec27 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeRegistrationWizard.kt @@ -24,15 +24,7 @@ import org.matrix.android.sdk.api.session.Session class FakeRegistrationWizard : RegistrationWizard by mockk() { - fun givenSuccessfulDummy(session: Session) { - givenSuccessFor(session) { dummy() } - } - fun givenSuccessFor(result: Session, expect: suspend RegistrationWizard.() -> RegistrationResult) { coEvery { expect(this@FakeRegistrationWizard) } returns RegistrationResult.Success(result) } - - fun givenSuccessfulAcceptTerms(session: Session) { - coEvery { acceptTerms() } returns RegistrationResult.Success(session) - } } From 192d1c4f2dd849495102da149ecad9e0a5bcb61f Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 17 Mar 2022 17:01:16 +0000 Subject: [PATCH 092/152] converting open class to sealed interface for extra type safety --- .../app/features/onboarding/OnboardingAction.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt index 8b17b318c1..7fa75d1544 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt @@ -46,13 +46,13 @@ sealed interface OnboardingAction : VectorViewModelAction { data class PostRegisterAction(val registerAction: RegisterAction) : OnboardingAction // Reset actions - open class ResetAction : OnboardingAction + sealed interface ResetAction : OnboardingAction - object ResetHomeServerType : ResetAction() - object ResetHomeServerUrl : ResetAction() - object ResetSignMode : ResetAction() - object ResetLogin : ResetAction() - object ResetResetPassword : ResetAction() + object ResetHomeServerType : ResetAction + object ResetHomeServerUrl : ResetAction + object ResetSignMode : ResetAction + object ResetLogin : ResetAction + object ResetResetPassword : ResetAction // Homeserver history object ClearHomeServerHistory : OnboardingAction From abf62aff475e6003fc3796cd74338a43b23f33e5 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 17 Mar 2022 17:51:01 +0000 Subject: [PATCH 093/152] extracting named function out for cancelling the email validation job, giving more context to the currentjob=null --- .../vector/app/features/onboarding/OnboardingViewModel.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 3f2b5adcbe..6659058b4e 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -165,7 +165,7 @@ class OnboardingViewModel @AssistedInject constructor( is OnboardingAction.ProfilePictureSelected -> handleProfilePictureSelected(action) OnboardingAction.SaveSelectedProfilePicture -> updateProfilePicture() is OnboardingAction.PostViewEvent -> _viewEvents.post(action.viewEvent) - OnboardingAction.StopEmailValidationCheck -> currentJob = null + OnboardingAction.StopEmailValidationCheck -> cancelWaitForEmailValidation() }.exhaustive } @@ -915,6 +915,10 @@ class OnboardingViewModel @AssistedInject constructor( private fun completePersonalization() { _viewEvents.post(OnboardingViewEvents.OnPersonalizationComplete) } + + private fun cancelWaitForEmailValidation() { + currentJob = null + } } private fun LoginMode.supportsSignModeScreen(): Boolean { From 2ca3387ab3648034f6e3a04f497e89eb415499bb Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Thu, 17 Mar 2022 18:51:54 +0100 Subject: [PATCH 094/152] Migrate Threads and notify user --- .../android/sdk/api/MatrixConfiguration.kt | 6 +- .../lightweight/LightweightSettingsStorage.kt | 8 ++- .../session/sync/SyncResponseHandler.kt | 2 +- .../src/main/res/values/config-settings.xml | 3 +- .../im/vector/app/core/di/SingletonModule.kt | 8 ++- .../im/vector/app/features/MainActivity.kt | 2 +- .../vector/app/features/home/HomeActivity.kt | 48 +++++++++++++++ .../features/home/HomeActivityViewEvents.kt | 3 + .../features/home/HomeActivityViewModel.kt | 46 +++++++++++++++ .../features/settings/VectorPreferences.kt | 58 ++++++++++++++++++- .../settings/VectorSettingsLabsFragment.kt | 1 + .../src/main/res/xml/vector_settings_labs.xml | 4 +- 12 files changed, 177 insertions(+), 12 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt index c87f21d7ac..f8472319fd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt @@ -60,7 +60,11 @@ data class MatrixConfiguration( /** * RoomDisplayNameFallbackProvider to provide default room display name. */ - val roomDisplayNameFallbackProvider: RoomDisplayNameFallbackProvider + val roomDisplayNameFallbackProvider: RoomDisplayNameFallbackProvider, + /** + * Thread messages default enable/disabled value + */ + val threadMessagesEnabledDefault: Boolean = false, ) { /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt index 700b94a985..65c98ab872 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt @@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.database.lightweight import android.content.Context import androidx.core.content.edit import androidx.preference.PreferenceManager +import org.matrix.android.sdk.api.MatrixConfiguration import javax.inject.Inject /** @@ -27,7 +28,10 @@ import javax.inject.Inject * not for large data sets */ -class LightweightSettingsStorage @Inject constructor(context: Context) { +class LightweightSettingsStorage @Inject constructor( + context: Context, + val matrixConfiguration: MatrixConfiguration +) { private val sdkDefaultPrefs = PreferenceManager.getDefaultSharedPreferences(context.applicationContext) @@ -38,7 +42,7 @@ class LightweightSettingsStorage @Inject constructor(context: Context) { } fun areThreadMessagesEnabled(): Boolean { - return sdkDefaultPrefs.getBoolean(MATRIX_SDK_SETTINGS_THREAD_MESSAGES_ENABLED, false) + return sdkDefaultPrefs.getBoolean(MATRIX_SDK_SETTINGS_THREAD_MESSAGES_ENABLED, matrixConfiguration.threadMessagesEnabledDefault) } companion object { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index 1bbf54a788..ac3ae3df91 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -75,7 +75,7 @@ internal class SyncResponseHandler @Inject constructor( suspend fun handleResponse(syncResponse: SyncResponse, fromToken: String?, reporter: ProgressReporter?) { - val isInitialSync = fromToken == null + var isInitialSync = fromToken == null Timber.v("Start handling sync, is InitialSync: $isInitialSync") measureTimeMillis { diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml index 0121ee9ae7..40fc68bbae 100755 --- a/vector-config/src/main/res/values/config-settings.xml +++ b/vector-config/src/main/res/values/config-settings.xml @@ -36,8 +36,9 @@ + false - + diff --git a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt index a5575ef536..211bc3987f 100644 --- a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt @@ -46,6 +46,7 @@ import im.vector.app.features.navigation.Navigator import im.vector.app.features.pin.PinCodeStore import im.vector.app.features.pin.SharedPrefPinCodeStore import im.vector.app.features.room.VectorRoomDisplayNameFallbackProvider +import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.ui.SharedPreferencesUiStateRepository import im.vector.app.features.ui.UiStateRepository import kotlinx.coroutines.CoroutineScope @@ -113,10 +114,13 @@ object VectorStaticModule { } @Provides - fun providesMatrixConfiguration(vectorRoomDisplayNameFallbackProvider: VectorRoomDisplayNameFallbackProvider): MatrixConfiguration { + fun providesMatrixConfiguration( + vectorPreferences: VectorPreferences, + vectorRoomDisplayNameFallbackProvider: VectorRoomDisplayNameFallbackProvider): MatrixConfiguration { return MatrixConfiguration( applicationFlavor = BuildConfig.FLAVOR_DESCRIPTION, - roomDisplayNameFallbackProvider = vectorRoomDisplayNameFallbackProvider + roomDisplayNameFallbackProvider = vectorRoomDisplayNameFallbackProvider, + threadMessagesEnabledDefault = vectorPreferences.areThreadMessagesEnabled() ) } diff --git a/vector/src/main/java/im/vector/app/features/MainActivity.kt b/vector/src/main/java/im/vector/app/features/MainActivity.kt index 33b735551c..42bd2318b3 100644 --- a/vector/src/main/java/im/vector/app/features/MainActivity.kt +++ b/vector/src/main/java/im/vector/app/features/MainActivity.kt @@ -241,7 +241,7 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity // We have a session. // Check it can be opened if (sessionHolder.getActiveSession().isOpenable) { - HomeActivity.newIntent(this) + HomeActivity.newIntent(this, existingSession = true) } else { // The token is still invalid navigator.softLogout(this) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 964fb6f365..1bd61c0f9e 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -90,6 +90,7 @@ import javax.inject.Inject data class HomeActivityArgs( val clearNotification: Boolean, val accountCreation: Boolean, + val existingSession: Boolean = false, val inviteNotificationRoomId: String? = null ) : Parcelable @@ -253,6 +254,8 @@ class HomeActivity : HomeActivityViewEvents.PromptToEnableSessionPush -> handlePromptToEnablePush() is HomeActivityViewEvents.OnCrossSignedInvalidated -> handleCrossSigningInvalidated(it) HomeActivityViewEvents.ShowAnalyticsOptIn -> handleShowAnalyticsOptIn() + HomeActivityViewEvents.NotifyUserForThreadsMigration -> handleNotifyUserForThreadsMigration() + is HomeActivityViewEvents.MigrateThreads -> migrateThreadsIfNeeded(it.checkSession) }.exhaustive } homeActivityViewModel.onEach { renderState(it) } @@ -269,6 +272,49 @@ class HomeActivity : navigator.openAnalyticsOptIn(this) } + /** + * Migrating from old threads io.element.thread to new m.thread needs an initial sync to + * sync and display existing messages appropriately + */ + private fun migrateThreadsIfNeeded(checkSession: Boolean) { + + if (checkSession) { + // We should check session to ensure we will only clear cache if needed + val args = intent.getParcelableExtra(Mavericks.KEY_ARG) + if (args?.existingSession == true) { + // existingSession --> Will be true only if we came from an existing active session + Timber.i("----> Migrating threads from an existing session..") + handleThreadsMigration() + } else { + // We came from a new session and not an existing one, + // so there is no need to migrate threads while an initial synced performed + Timber.i("----> No thread migration needed, we are ok") + vectorPreferences.threadsMigrated() + } + } else { + // Proceed with migration + handleThreadsMigration() + } + } + + /** + * Clear cache and restart to invoke an initial sync for threads migration + */ + private fun handleThreadsMigration() { + Timber.i("----> Threads Migration detected, clearing cache and sync...") + vectorPreferences.threadsMigrated() + MainActivity.restartApp(this, MainActivityArgs(clearCache = true)) + } + + private fun handleNotifyUserForThreadsMigration() { + MaterialAlertDialogBuilder(this) + .setTitle("Threads, no longer experimental") + .setMessage("All \uD83C\uDF89 \uD83C\uDF89 threads created during experimental period will\n\n now be rendered as regular replies. This will be an one-off transition, as threads are now part of the matrix specification") + .setCancelable(true) + .setPositiveButton(R.string.ok) { _, _ -> } + .show() + } + private fun handleIntent(intent: Intent?) { intent?.dataString?.let { deepLink -> val resolvedLink = when { @@ -546,11 +592,13 @@ class HomeActivity : fun newIntent(context: Context, clearNotification: Boolean = false, accountCreation: Boolean = false, + existingSession: Boolean = false, inviteNotificationRoomId: String? = null ): Intent { val args = HomeActivityArgs( clearNotification = clearNotification, accountCreation = accountCreation, + existingSession = existingSession, inviteNotificationRoomId = inviteNotificationRoomId ) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt index adc44a57bd..e301967884 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt @@ -25,4 +25,7 @@ sealed interface HomeActivityViewEvents : VectorViewEvents { data class OnCrossSignedInvalidated(val userItem: MatrixItem.UserItem) : HomeActivityViewEvents object PromptToEnableSessionPush : HomeActivityViewEvents object ShowAnalyticsOptIn : HomeActivityViewEvents + object NotifyUserForThreadsMigration : HomeActivityViewEvents + data class MigrateThreads(val checkSession: Boolean) : HomeActivityViewEvents + } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt index 35c112b63a..bb248965e4 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt @@ -51,6 +51,7 @@ import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.flow.flow import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap +import org.matrix.android.sdk.internal.database.lightweight.LightweightSettingsStorage import org.matrix.android.sdk.internal.util.awaitCallback import timber.log.Timber import kotlin.coroutines.Continuation @@ -62,6 +63,7 @@ class HomeActivityViewModel @AssistedInject constructor( private val activeSessionHolder: ActiveSessionHolder, private val reAuthHelper: ReAuthHelper, private val analyticsStore: AnalyticsStore, + private val lightweightSettingsStorage: LightweightSettingsStorage, private val vectorPreferences: VectorPreferences ) : VectorViewModel(initialState) { @@ -84,6 +86,7 @@ class HomeActivityViewModel @AssistedInject constructor( checkSessionPushIsOn() observeCrossSigningReset() observeAnalytics() + initThreadsMigration() } private fun observeAnalytics() { @@ -130,6 +133,49 @@ class HomeActivityViewModel @AssistedInject constructor( .launchIn(viewModelScope) } + /** + * Handle threads migration. The migration includes: + * - Notify users that had io.element.thread enabled from labs + * - Re-Enable m.thread to those users (that they had enabled labs threads) + * - Handle migration when threads are enabled by default + */ + private fun initThreadsMigration() { + + // Notify users + if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.areThreadMessagesEnabled()) { + Timber.i("----> Notify users about threads") + // Notify the user if needed that we migrated to support m.thread + // instead of io.element.thread so old thread messages will be displayed as normal timeline messages + _viewEvents.post(HomeActivityViewEvents.NotifyUserForThreadsMigration) + vectorPreferences.userNotifiedAboutThreads() + return + } + + // Migrate users with enabled lab settings + if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.shouldMigrateThreads()) { + Timber.i("----> Migrate threads with enabled labs") + // If user had io.element.thread enabled then enable the new thread support, + // clear cache to sync messages appropriately + vectorPreferences.setThreadMessagesEnabled() + lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled()) + // Clear Cache + _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = false)) + return + } + // Enable all users + // When we would to enable threads for all + // if(vectorPreferences.shouldMigrateThreads) --> + // vectorPreferences.setThreadMessagesEnabled() && + // lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled()) + if(vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()){ + Timber.i("----> Try to migrate threads") + _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true)) + return + } + + + } + private fun observeInitialSync() { val session = activeSessionHolder.getSafeActiveSession() ?: return diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index 352c5768fb..d263dc1cbb 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -201,7 +201,13 @@ class VectorPreferences @Inject constructor(private val context: Context) { private const val TAKE_PHOTO_VIDEO_MODE = "TAKE_PHOTO_VIDEO_MODE" private const val SETTINGS_LABS_RENDER_LOCATIONS_IN_TIMELINE = "SETTINGS_LABS_RENDER_LOCATIONS_IN_TIMELINE" - const val SETTINGS_LABS_ENABLE_THREAD_MESSAGES = "SETTINGS_LABS_ENABLE_THREAD_MESSAGES" + + // This key will be used to identify clients with the old thread support enabled io.element.thread + const val SETTINGS_LABS_ENABLE_THREAD_MESSAGES_OLD_CLIENTS = "SETTINGS_LABS_ENABLE_THREAD_MESSAGES" + + // This key will be used to identify clients with the new thread support enabled m.thread + const val SETTINGS_LABS_ENABLE_THREAD_MESSAGES = "SETTINGS_LABS_ENABLE_THREAD_MESSAGES_FINAL" + const val SETTINGS_THREAD_MESSAGES_SYNCED = "SETTINGS_THREAD_MESSAGES_SYNCED" // Possible values for TAKE_PHOTO_VIDEO_MODE const val TAKE_PHOTO_VIDEO_MODE_ALWAYS_ASK = 0 @@ -1006,7 +1012,55 @@ class VectorPreferences @Inject constructor(private val context: Context) { return defaultPrefs.getBoolean(SETTINGS_LABS_RENDER_LOCATIONS_IN_TIMELINE, true) } + /** + * Indicates whether or not thread messages are enabled + */ fun areThreadMessagesEnabled(): Boolean { - return defaultPrefs.getBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, false) + return defaultPrefs.getBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, getDefault(R.bool.settings_labs_thread_messages_default)) + } + + /** + * Manually sets thread messages enabled, useful for migrating users from io.element.thread + */ + fun setThreadMessagesEnabled() { + defaultPrefs + .edit() + .putBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, true) + .apply() + } + /** + * Indicates whether or not the user will be notified about the new thread support + * We should notify the user only if he had old thread support enabled + */ + fun shouldNotifyUserAboutThreads(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES_OLD_CLIENTS, false) + } + + /** + * Indicates that the user have been notified about threads migration + */ + fun userNotifiedAboutThreads() { + defaultPrefs + .edit() + .putBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES_OLD_CLIENTS, false) + .apply() + } + + /** + * Indicates whether or not we should clear cache for threads migration. + * Default value is true, for fresh installs and updates + */ + fun shouldMigrateThreads(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_THREAD_MESSAGES_SYNCED, true) + } + + /** + * Indicates that there no longer threads migration needed + */ + fun threadsMigrated() { + defaultPrefs + .edit() + .putBoolean(SETTINGS_THREAD_MESSAGES_SYNCED, false) + .apply() } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt index 118e820f84..683c1e1dd2 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt @@ -42,6 +42,7 @@ class VectorSettingsLabsFragment @Inject constructor( // clear cache findPreference(VectorPreferences.SETTINGS_LABS_ENABLE_THREAD_MESSAGES)?.let { it.onPreferenceClickListener = Preference.OnPreferenceClickListener { + vectorPreferences.threadsMigrated() // Manual actions should disable the ato enable mechanism lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled()) displayLoadingView() MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true)) diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index 73193edfd5..5144f6fe1f 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -52,8 +52,8 @@ From 61cb7a6ffb41a8775eb9389923c346b7736b5456 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Thu, 17 Mar 2022 19:09:09 +0100 Subject: [PATCH 095/152] Prepare next RC threads migration to all users --- .../im/vector/app/features/home/HomeActivityViewModel.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt index bb248965e4..ba91ac7ae1 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt @@ -164,9 +164,10 @@ class HomeActivityViewModel @AssistedInject constructor( } // Enable all users // When we would to enable threads for all - // if(vectorPreferences.shouldMigrateThreads) --> - // vectorPreferences.setThreadMessagesEnabled() && - // lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled()) +// if(vectorPreferences.shouldMigrateThreads()) { +// vectorPreferences.setThreadMessagesEnabled() +// lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled()) +// } if(vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()){ Timber.i("----> Try to migrate threads") _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true)) From e5c04d9cc8bb92e0092518022928e3b4a7f0382b Mon Sep 17 00:00:00 2001 From: sim Date: Fri, 18 Mar 2022 00:47:08 +0100 Subject: [PATCH 096/152] Show stickers on click Play animated stickers Signed-off-by: sim --- changelog.d/5572.misc | 2 ++ .../home/room/detail/TimelineFragment.kt | 9 +++-- .../timeline/TimelineEventController.kt | 6 +++- .../timeline/factory/MessageItemFactory.kt | 5 ++- .../media/RoomEventsAttachmentProvider.kt | 33 ++++++++++++++++++- 5 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 changelog.d/5572.misc diff --git a/changelog.d/5572.misc b/changelog.d/5572.misc new file mode 100644 index 0000000000..d37d8fe07d --- /dev/null +++ b/changelog.d/5572.misc @@ -0,0 +1,2 @@ +Show stickers on click + diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt index ab64f40159..08622a7671 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt @@ -177,6 +177,7 @@ import im.vector.app.features.html.PillsPostProcessor import im.vector.app.features.invite.VectorInviteView import im.vector.app.features.location.LocationSharingMode import im.vector.app.features.location.toLocationData +import im.vector.app.features.media.AttachmentData import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.VideoContentRenderer import im.vector.app.features.notifications.NotificationDrawerManager @@ -1868,12 +1869,16 @@ class TimelineFragment @Inject constructor( vectorBaseActivity.notImplemented("encrypted message click") } - override fun onImageMessageClicked(messageImageContent: MessageImageInfoContent, mediaData: ImageContentRenderer.Data, view: View) { + override fun onImageMessageClicked(messageImageContent: MessageImageInfoContent, + mediaData: ImageContentRenderer.Data, + view: View, + inMemory: List) { navigator.openMediaViewer( activity = requireActivity(), roomId = timelineArgs.roomId, mediaData = mediaData, - view = view + view = view, + inMemory = inMemory ) { pairs -> pairs.add(Pair(views.roomToolbar, ViewCompat.getTransitionName(views.roomToolbar) ?: "")) pairs.add(Pair(views.composerLayout, ViewCompat.getTransitionName(views.composerLayout) ?: "")) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt index fb47fb5136..a14888362b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt @@ -57,6 +57,7 @@ import im.vector.app.features.home.room.detail.timeline.item.ReactionsSummaryEve import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptsItem import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever +import im.vector.app.features.media.AttachmentData import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.VideoContentRenderer import im.vector.app.features.settings.VectorPreferences @@ -127,7 +128,10 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec fun onEventVisible(event: TimelineEvent) fun onRoomCreateLinkClicked(url: String) fun onEncryptedMessageClicked(informationData: MessageInformationData, view: View) - fun onImageMessageClicked(messageImageContent: MessageImageInfoContent, mediaData: ImageContentRenderer.Data, view: View) + fun onImageMessageClicked(messageImageContent: MessageImageInfoContent, + mediaData: ImageContentRenderer.Data, + view: View, + inMemory: List) fun onVideoMessageClicked(messageVideoContent: MessageVideoContent, mediaData: VideoContentRenderer.Data, view: View) // fun onFileMessageClicked(eventId: String, messageFileContent: MessageFileContent) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index 3189954e20..5ce9589ca3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -480,9 +480,12 @@ class MessageItemFactory @Inject constructor( .apply { if (messageContent.msgType == MessageType.MSGTYPE_STICKER_LOCAL) { mode(ImageContentRenderer.Mode.STICKER) + clickListener { view -> + callback?.onImageMessageClicked(messageContent, data, view, listOf(data)) + } } else { clickListener { view -> - callback?.onImageMessageClicked(messageContent, data, view) + callback?.onImageMessageClicked(messageContent, data, view, emptyList()) } } } diff --git a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt index 1e0a3a2ad9..781a176550 100644 --- a/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt +++ b/vector/src/main/java/im/vector/app/features/media/RoomEventsAttachmentProvider.kt @@ -25,6 +25,7 @@ import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.file.FileService import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.model.message.MessageImageContent +import org.matrix.android.sdk.api.session.room.model.message.MessageStickerContent import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent import org.matrix.android.sdk.api.session.room.model.message.MessageWithAttachmentContent import org.matrix.android.sdk.api.session.room.model.message.getFileUrl @@ -52,7 +53,10 @@ class RoomEventsAttachmentProvider( override fun getAttachmentInfoAt(position: Int): AttachmentInfo { return getItem(position).let { - val content = it.root.getClearContent().toModel() as? MessageWithAttachmentContent + val clearContent = it.root.getClearContent() + val content = clearContent.toModel() + ?: clearContent.toModel() + as? MessageWithAttachmentContent if (content is MessageImageContent) { val data = ImageContentRenderer.Data( eventId = it.eventId, @@ -66,6 +70,33 @@ class RoomEventsAttachmentProvider( height = null, allowNonMxcUrls = it.root.sendState.isSending() + ) + if (content.mimeType == MimeTypes.Gif) { + AttachmentInfo.AnimatedImage( + uid = it.eventId, + url = content.url ?: "", + data = data + ) + } else { + AttachmentInfo.Image( + uid = it.eventId, + url = content.url ?: "", + data = data + ) + } + } else if (content is MessageStickerContent) { + val data = ImageContentRenderer.Data( + eventId = it.eventId, + filename = content.body, + mimeType = content.mimeType, + url = content.getFileUrl(), + elementToDecrypt = content.encryptedFileInfo?.toElementToDecrypt(), + maxHeight = -1, + maxWidth = -1, + width = null, + height = null, + allowNonMxcUrls = false + ) if (content.mimeType == MimeTypes.Gif) { AttachmentInfo.AnimatedImage( From f00b1f29bf5562c7f767f0758a16b9e92c5d0fe8 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Fri, 18 Mar 2022 11:58:29 +0100 Subject: [PATCH 097/152] Enhance text context for thread migration notice --- .../main/java/im/vector/app/features/home/HomeActivity.kt | 7 +++---- .../im/vector/app/features/home/HomeActivityViewEvents.kt | 1 - .../im/vector/app/features/home/HomeActivityViewModel.kt | 5 +---- vector/src/main/res/values/strings.xml | 2 ++ 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 1bd61c0f9e..f6ee160104 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -277,7 +277,6 @@ class HomeActivity : * sync and display existing messages appropriately */ private fun migrateThreadsIfNeeded(checkSession: Boolean) { - if (checkSession) { // We should check session to ensure we will only clear cache if needed val args = intent.getParcelableExtra(Mavericks.KEY_ARG) @@ -308,10 +307,10 @@ class HomeActivity : private fun handleNotifyUserForThreadsMigration() { MaterialAlertDialogBuilder(this) - .setTitle("Threads, no longer experimental") - .setMessage("All \uD83C\uDF89 \uD83C\uDF89 threads created during experimental period will\n\n now be rendered as regular replies. This will be an one-off transition, as threads are now part of the matrix specification") + .setTitle(R.string.threads_notice_migration_title) + .setMessage(R.string.threads_notice_migration_message) .setCancelable(true) - .setPositiveButton(R.string.ok) { _, _ -> } + .setPositiveButton(R.string.sas_got_it) { _, _ -> } .show() } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt index e301967884..5efd49a579 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt @@ -27,5 +27,4 @@ sealed interface HomeActivityViewEvents : VectorViewEvents { object ShowAnalyticsOptIn : HomeActivityViewEvents object NotifyUserForThreadsMigration : HomeActivityViewEvents data class MigrateThreads(val checkSession: Boolean) : HomeActivityViewEvents - } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt index ba91ac7ae1..e6a7fd37a2 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt @@ -140,7 +140,6 @@ class HomeActivityViewModel @AssistedInject constructor( * - Handle migration when threads are enabled by default */ private fun initThreadsMigration() { - // Notify users if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.areThreadMessagesEnabled()) { Timber.i("----> Notify users about threads") @@ -168,13 +167,11 @@ class HomeActivityViewModel @AssistedInject constructor( // vectorPreferences.setThreadMessagesEnabled() // lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled()) // } - if(vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()){ + if (vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()) { Timber.i("----> Try to migrate threads") _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true)) return } - - } private fun observeInitialSync() { diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 162ab3e119..fbb3b81efa 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -731,6 +731,8 @@ Tip: Long tap a message and use “%s”. From a Thread + Threads no longer experimental + All threads created during the experimental period will now be rendered as regular replies.\n\nThis will be a one-off transition, as threads are now part of the Matrix specification.\n\nThank you for helping us test Threads! 🎉 Search From 2e5d45ec6e9e403cf047c2aa2954babff4da36f2 Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Fri, 18 Mar 2022 12:03:17 +0100 Subject: [PATCH 098/152] Format code --- .../java/im/vector/app/features/settings/VectorPreferences.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index d263dc1cbb..bd20c57ca5 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -1028,6 +1028,7 @@ class VectorPreferences @Inject constructor(private val context: Context) { .putBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, true) .apply() } + /** * Indicates whether or not the user will be notified about the new thread support * We should notify the user only if he had old thread support enabled From 32f18d5af31bd67c2547fb070a77b502f20a097c Mon Sep 17 00:00:00 2001 From: Maxime Naturel Date: Thu, 17 Mar 2022 17:14:53 +0100 Subject: [PATCH 099/152] Adding changelog entry --- changelog.d/5571.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/5571.feature diff --git a/changelog.d/5571.feature b/changelog.d/5571.feature new file mode 100644 index 0000000000..04b62b8940 --- /dev/null +++ b/changelog.d/5571.feature @@ -0,0 +1 @@ +Live location sharing: Adding indicator view when enabled From 70ab5354c37fe11bbf5e22c2d788502a8b6a2490 Mon Sep 17 00:00:00 2001 From: Maxime Naturel Date: Thu, 17 Mar 2022 17:15:04 +0100 Subject: [PATCH 100/152] Adding strings of the view --- vector/src/main/res/values/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 428be3209f..aae3d2bc36 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -2946,6 +2946,9 @@ Once enabled you will be able to send your location to any room Render user locations in the timeline Failed to load map + Live location enabled + + Stop Show Message bubbles From 67297bbdef5caecdde38fe86e7199847b550396a Mon Sep 17 00:00:00 2001 From: Maxime Naturel Date: Fri, 18 Mar 2022 10:21:37 +0100 Subject: [PATCH 101/152] Custom View in timeline screen without stop button --- .../location/live/LocationLiveStatusView.kt | 33 +++++++++++++ .../src/main/res/layout/fragment_timeline.xml | 38 +++++++++----- .../res/layout/view_location_live_status.xml | 49 +++++++++++++++++++ 3 files changed, 107 insertions(+), 13 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/location/live/LocationLiveStatusView.kt create mode 100644 vector/src/main/res/layout/view_location_live_status.xml diff --git a/vector/src/main/java/im/vector/app/features/location/live/LocationLiveStatusView.kt b/vector/src/main/java/im/vector/app/features/location/live/LocationLiveStatusView.kt new file mode 100644 index 0000000000..9c724c9767 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/location/live/LocationLiveStatusView.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 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. + */ + +package im.vector.app.features.location.live + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import im.vector.app.databinding.ViewLocationLiveStatusBinding + +class LocationLiveStatusView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + private val binding = ViewLocationLiveStatusBinding.inflate( + LayoutInflater.from(context), + this + ) +} diff --git a/vector/src/main/res/layout/fragment_timeline.xml b/vector/src/main/res/layout/fragment_timeline.xml index 6ba326bcc4..14eac04db2 100644 --- a/vector/src/main/res/layout/fragment_timeline.xml +++ b/vector/src/main/res/layout/fragment_timeline.xml @@ -17,7 +17,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="48dp" - android:visibility="gone"/> + android:visibility="gone" /> + + + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@id/locationLiveStatusIndicator" /> + app:layout_constraintTop_toBottomOf="@id/removeJitsiWidgetView" /> + app:layout_constraintBottom_toTopOf="@id/composerLayout" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/timelineRecyclerView" + tools:visibility="visible" /> + tools:visibility="visible" /> + app:layout_constraintStart_toStartOf="parent" /> + + + + + + + + +