From fe809ca2f1ad9ce13ff8d9a53c604055d5f30ffe Mon Sep 17 00:00:00 2001 From: Tfrdh gfxft Date: Wed, 26 May 2021 00:52:58 +0000 Subject: [PATCH 001/254] Translated using Weblate (Arabic) Currently translated at 37.1% (919 of 2475 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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml index d82181d374..e5de0bfc96 100644 --- a/vector/src/main/res/values-ar/strings.xml +++ b/vector/src/main/res/values-ar/strings.xml @@ -62,7 +62,7 @@ أرسلتَ صورةً. أرسلتَ ملصقًا. - دعوة منك + دعوتك أنشأ ⁨%1$s⁩ الغرفة أنشأتَ الغرفة دعوتَ ⁨%1$s⁩ @@ -1135,4 +1135,12 @@ المزامنة الأولية: \nينتظر رد الخادم… غير %1$s اسمه الى %2$s + + + أضف كعنوان لهذه الغرفة + + + أضف كعناوان لهذه الغرفة + + \ No newline at end of file From 34f797c1814d40d749aaef190b86f06d52881101 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 26 May 2021 09:45:41 +0000 Subject: [PATCH 002/254] Translated using Weblate (Czech) Currently translated at 100.0% (2475 of 2475 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 | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 663ee6b641..a7848a1db1 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -2726,7 +2726,7 @@ Zpráva odeslána Neoznačeno Experimentální, prostor - omezená místnost. - Prostory jsou způsob organizace místností a lidí k práci, zábavě anebo jen pro Vás. + Prostory představují nový způsob seskupování místností a osob. Založme pro každé místnost. Později můžete přidat i další, včetně již existujících. Na jakých tématech pracujete\? Založíme pro ně místnosti. Můžete přidat další později. @@ -2824,4 +2824,27 @@ Komprimuji obrázek… Použít výchozí a dále se neptat Vždy se dotázat + Některé místnosti mohou být skryté, protože jsou soukromé a potřebujete pozvánku. + Některé místnosti mohou být skryté, protože jsou soukromé a potřebujete pozvánku. +\nK přidávání místností nemáte oprávnění. + Tento prostor nemá žádné místnosti + Další informace získáte od správce domovského serveru + Vypadá to, že váš domovský server zatím Prostory nepodporuje + Chcete experimentovat\? +\nDo prostoru můžete přidat existující prostory. + Experimentální prostor - Zobrazit pouze sirotky v Domově + Přidat místnosti + Jste administrátorem tohoto prostoru, ujistěte se, že jste před odchodem převedli administrátorská práva na jiného člena. + Tento prostor není veřejný. Bez pozvánky se do něj nebudete moci znovu připojit. + Jste tu jediný člověk. Pokud odejdete, nikdo se k vám v budoucnu nebude moci připojit, včetně vás. + Pozvat do %s + Tato funkce je ve fázi beta + Poskytněte zpětnou vazbu + Zpětnou vazbu se nepodařilo odeslat (%s) + Děkujeme, vaše zpětná vazba byla úspěšně odeslána + V případě dalších dotazů se na mě můžete obrátit + Používáte beta verzi prostorů. Vaše zpětná vazba pomůže při tvorbě dalších verzí. Vaše platforma a uživatelské jméno budou zaznamenány, abychom mohli vaši zpětnou vazbu co nejlépe využít. + Zpětná vazba + Zpětná vazba prostorů + Omlouváme se, při pokusu o připojení ke konferenci došlo k chybě \ No newline at end of file From f543dc318a94a8841baedfdb5c1c1fa6377028b1 Mon Sep 17 00:00:00 2001 From: Jeanne Lavoie Date: Thu, 27 May 2021 09:01:27 +0000 Subject: [PATCH 003/254] Translated using Weblate (German) Currently translated at 99.1% (2453 of 2475 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 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index 03e03cb845..25ecbbc508 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -1530,13 +1530,13 @@ Schnelle Reaktionen Allgemein Einstellungen - Sicherheit & Privatsphäre + Sicherheit und Privatsphäre Experte Push-Regeln Keine Push-Regeln definiert Keine registrierten Push-Gateways - Sprache & Video - Hilfe & Über + Sprache und Video + Hilfe und Über Token registrieren Mache einen Vorschlag Bitte schreibe unten deine Anmerkungen. @@ -2813,8 +2813,8 @@ Suchst du jemanden außerhalb %s\? Wir erstellen dir für jedes einen Raum. Du kannst jederzeit weitere Räume hinzufügen. Räume und Spaces verwalten - Als \"vorgeschlagen\" markieren - Als \"nicht vorgeschlagen\" markieren + Als vorgeschlagen markieren + Als nicht vorgeschlagen markieren Vorgeschlagen Teile deinen öffentlichen Space mit der Welt Räume verwalten From a99393b4eba68ea6b4fb3ecbf1ff04e04a731d8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 26 May 2021 13:57:59 +0000 Subject: [PATCH 004/254] Translated using Weblate (Estonian) Currently translated at 100.0% (2475 of 2475 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 | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index cd58abcbf7..c911a3176b 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -2676,7 +2676,7 @@ Hoiatus: eeldab serveripoolset tuge ning katselise jututoa versiooni kasutamist Katseline kogukonnakeskus - ligipääs on piiratud. Sa oled saanud kutse - Kogukonnakeskused on võimalus siduda jututubasid ja inimesi nii tööks, meelelahutuseks kui lihtsalt sinu jaoks. + Kogukonnakeskused on uus võimalus siduda jututubasid ja inimesi. Tere tulemast kasutama kogukonnakeskuseid! Lisa olemasolevaid jututubasid ja kogukonnakeskuseid Kas oled kindel, et soovid lahkuda kogukonnakeskusest\? @@ -2771,4 +2771,27 @@ Teen pildi väiksemaks… Kasuta vaikeseadistusena ja ära küsi uuesti Alati küsi + Mõned mitteavalikud jututoad võivad olla peidetud. Nendega liitumiseks vajad kutset. + Mõned mitteavalikud jututoad võivad olla peidetud. Nendega liitumiseks vajad kutset. +\nUue jututubade lisamiseks sul õigused puuduvad. + Selles kogukonnakeskuses pole jututube + Lisateavet saad oma koduserveri haldajalt + Tundub, et sinu koduserver veel ei võimalda kogukonnakeskuste kasutamist + Kas sa tahad katsetada\? +\nSa võid kogukonnakeskusele lisada ka teisi kogukonnakeskuseid. + Katseline kogukonnakeskus, mis näitab avalehel vaid hüljatud jututube + Lisa jututube + Sa oled selle kogukonnakeskuse haldaja. Enne oma lahkumist palun lisa siia veel vähemalt üks uus haldaja. + See ei ole avalik kogukonnakeskus. Ilma kutseta sa ei saa uuesti liituda. + Sa oled siin viimane osaleja. Kui sa nüüd lahkud, siis mitte keegi, kaasa arvatud sa ise, ei saa hiljem enam liituda. + Kutse kogukonnakeskusesse %s + Tegemist on beeta-taseme funktsionaalsusega + Jaga tagasisidet + Tagasiside saatmine ei õnnestunud (%s) + Tänud, sinu tagasiside saatmine õnnestus + Kui sul on lisaküsimusi, siis vastan neile hea meelega + Sa kasutad kogukonnakeskuste beetaversiooni. Sinu saadetud teabe alusel saame teha parandusi selle järgmistes versioonides. Saadetud info parimaks kasutamiseks lisame sinna ka sinu kasutatava operatsioonisüsteemi nime ja sinu kasutajanime. + Tagasiside + Tagasiside kogukonnakeskuste kohta + Vabandust, rühmakõnega liitumisel tekkis viga \ No newline at end of file From 7e70d8448265bb149100b66eb481ceea4cf00094 Mon Sep 17 00:00:00 2001 From: Jeanne Lavoie Date: Thu, 27 May 2021 09:03:51 +0000 Subject: [PATCH 005/254] Translated using Weblate (French (Canada)) Currently translated at 100.0% (2475 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr_CA/ --- vector/src/main/res/values-fr-rCA/strings.xml | 80 ++++++++++++++++++- 1 file changed, 76 insertions(+), 4 deletions(-) diff --git a/vector/src/main/res/values-fr-rCA/strings.xml b/vector/src/main/res/values-fr-rCA/strings.xml index e9e6e66d7c..fe2e08780e 100644 --- a/vector/src/main/res/values-fr-rCA/strings.xml +++ b/vector/src/main/res/values-fr-rCA/strings.xml @@ -369,8 +369,8 @@ Saisissez votre suggestion ci-dessous. Faire une suggestion Inscrire le jeton - Aide & à propos - Voix & vidéo + Aide et à propos + Voix et vidéo Format : URL : session_name : @@ -381,7 +381,7 @@ Aucune règle de notification définie Règles de notification Expert - Sécurité & vie privée + Sécurité et vie privée Préférences Général Réactions rapides @@ -2171,7 +2171,7 @@ Désactiver le compte Ceci remplacera votre clé ou phrase actuelle. Générer une nouvelle clé de sécurité ou définir une nouvelle phrase de sécurité pour votre sauvegarde existante. - Protection contre la perte d\'accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur. + Protection contre la perte d’accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur. Activer sur cet appareil Réinitialiser la sauvegarde sécurisée Activer la sauvegarde sécurisée @@ -2722,4 +2722,76 @@ Espaces Invitations Salons recommandés + Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. + Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. +\nVous n’avez pas l’autorisation d’ajouter des salons. + Cet espace n’a pas de salons + Veuillez contacter votre admin de serveur pour plus d’informations + Il semble que votre serveur d’accueil ne prend pas encore en charge les espaces + Envie d’expérimenter\? +\nVous pouvez ajouter des espaces existants à un espace. + Espace expérimental – afficher seulement les orphelins dans Accueil + Gérer les salons et les espaces + Marquer comme non recommandé + Marquer comme recommandé + Recommandé + Rendre cet espace public + Gérer les salons + Vous cherchez quelqu’un qui n’est pas dans %s\? + %s vous invite + Attention, nécessite la prise en charge par le serveur ainsi qu’une version de salon expérimentale + Espace expérimental – salon restreint. + Vous êtes invité·e + Les espaces sont une nouvelle manière de regrouper les salons et les gens. + Bienvenue dans les espaces! + Ajouter des salons + Ajouter des salons et espaces existants + Vous êtes admin de cet espace, assurez-vous d’avoir transféré les droits d’admin à un autre membre avant de partir. + Cet espace n’est pas public. Vous ne pourrez pas le rejoindre sans invitation. + Vous êtes la seule personne ici. Si vous partez, personne ne pourra entrer à l’avenir, même pas vous. + Voulez-vous vraiment quitter l’espace\? + Quitter l’espace + Ajouter des salons + Parcourir les salons + + %d personne que vous connaissez en fait partie + %d personnes que vous connaissez en font partie + + Bienvenue dans %1$s, %2$s. + Vous ne faites partie d’aucun salon pour l’instant. Vous trouverez ci-dessous les salons recommandés, mais vous pouvez en voir plus avec le bouton vert en bas à droite. + Cet alias n’est pas accessible en ce moment. +\nRéessayez plus tard, ou demandez à un administrateur de ce salon de vérifier que vous pouvez y accéder. + Rejoindre quand même + Rejoindre l’espace + Créer un espace + Passer pour l’instant + Rejoignez mon espace %1$s %2$s + Ne fera pas partie de %s + Seulement ce salon + Permettra de parcourir les salons de %s + Inviter dans %s + Partager le lien + Inviter par nom d’utilisateur + Inviter par courriel + Vous êtes seul·e pour l’instant. %s sera plus agréable avec de la compagnie. + Inviter à %s + Inviter des personnes + Invitez des personnes dans votre espace + Description + Création de l’espace… + Aléatoire + Général + Créons un salon pour chacun d’entre eux. Vous pourrez en ajouter plus tard, y compris certains déjà existant. + Sur quels projets travaillez-vous\? + Nous allons créer les salons pour ces sujets. Vous pourrez en ajouter d’autres plus tard. + De quoi allez-vous parler dans %s\? + Cette fonctionnalité est en bêta + Envoyer des remarques + L’envoi des remarques a échoué (%s) + Merci, vos remarques ont bien été envoyées + Vous pouvez me contacter si vous avez des questions + Vous utilisez une version bêta des espaces. Vos remarques aideront à concevoir les prochaines versions. Votre plateforme et votre nom d’utilisateur seront marqués pour nous aider à utiliser vos remarques autant que possible. + Remarques + Remarques sur les espaces + Désolé, une erreur s’est produite en essayant d’entrer dans la conférence \ No newline at end of file From 1f076366747fd19ece09c292b4498aca7e3e4ee8 Mon Sep 17 00:00:00 2001 From: Jeanne Lavoie Date: Thu, 27 May 2021 09:04:00 +0000 Subject: [PATCH 006/254] Translated using Weblate (French) Currently translated at 100.0% (2475 of 2475 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 | 33 +++++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 9fb56dd860..760b0aa159 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -1444,7 +1444,7 @@ Réactions rapides Général Préférences - Sécurité & vie privée + Sécurité et vie privée Expert Règles de notification Aucune règle de notification définie @@ -1455,8 +1455,8 @@ session_name : URL : Format : - Voix & vidéo - Aide & à propos + Voix et vidéo + Aide et à propos Inscrire le jeton Faire une suggestion Saisissez votre suggestion ci-dessous. @@ -2358,7 +2358,7 @@ Rétrograder Ceci remplacera votre clé ou phrase actuelle. Générer une nouvelle clé de sécurité ou définir une nouvelle phrase de sécurité pour votre sauvegarde existante. - Protection contre la perte d\'accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur. + Protection contre la perte d’accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur. Activer sur cet appareil Gérer Inclure les événement d’invitation/ajout/départ/expulsion/exclusion ainsi que les changements d’avatar et de nom d’affichage. @@ -2705,7 +2705,7 @@ Salons recommandés Espace expérimental – salon restreint. Vous êtes invité - Les espaces sont un moyen de regrouper les salons et personnes pour travailler, s’amuser, ou juste pour vous-même. + Les espaces sont une nouvelle manière de regrouper les salons et les gens. Bienvenue dans les espaces ! Ajouter des salons et espaces existants Voulez-vous vraiment quitter l’espace \? @@ -2778,4 +2778,27 @@ Envoyer la vidéo en taille originale Envoyer les vidéos en taille originale + Espace expérimental – afficher seulement les orphelins dans Accueil + Vous êtes admin de cet espace, assurez-vous d’avoir transféré les droits d’admin à un autre membre avant de partir. + Vous utilisez une version bêta des espaces. Vos remarques aideront à concevoir les prochaines versions. Votre plateforme et votre nom d’utilisateur seront marqués pour nous aider à utiliser vos remarques autant que possible. + Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. + Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. +\nVous n’avez pas l’autorisation d’ajouter des salons. + Cet espace n’a pas de salons + Veuillez contacter votre admin de serveur pour plus d’informations + Il semble que votre serveur d’accueil ne prend pas encore en charge les espaces + Envie d’expérimenter \? +\nVous pouvez ajouter des espaces existants à un espace. + Ajouter des salons + Cet espace n’est pas public. Vous ne pourrez pas le rejoindre sans invitation. + Vous êtes la seule personne ici. Si vous partez, personne ne pourra entrer à l’avenir, même pas vous. + Inviter à %s + Cette fonctionnalité est en bêta + Remarques sur les espaces + Vous pouvez me contacter si vous avez des questions + Envoyer des remarques + L’envoi des remarques a échoué (%s) + Merci, vos remarques ont bien été envoyées + Remarques + Désolé, une erreur s’est produite en essayant d’entrer dans la conférence \ No newline at end of file From 28e34aa5812ff0b298e8101e375a05a01a4861dd Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 25 May 2021 20:22:09 +0000 Subject: [PATCH 007/254] Translated using Weblate (Hungarian) Currently translated at 84.3% (2088 of 2475 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 | 67 +++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 0c6558bcc9..04360bd63e 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -2340,4 +2340,71 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Nincs több eredmény Visszavonás Alapértelmezett rendszertéma + A szoba címeit megváltoztattad. + %1$s megváltoztatta a szoba címeit. + A szoba elsődleges és alternatív címeit megváltoztattad. + %1$s megváltoztatta a szoba elsődleges és alternatív címeit. + A szoba alternatív címét megváltoztattad. + %1$s megváltoztatta a szoba alternatív címét. + + A szobához tartozó alternatív címet törölted: %1$s. + A szobához tartozó alternatív címeket törölted: %1$s. + + + %1$s törölte a szobához tartozó alternatív címet: %2$s. + %1$s törölte a szobához tartozó alternatív címeket: %2$s. + + + A szobához hozzáadtad, mint alternatív cím: %1$s. + A szobához hozzáadtad, mint alternatív címek: %1$s. + + + %1$s hozzáadta a szobához, mint alternatív cím: %2$s. + %1$s hozzáadta a szobához, mint alternatív címek: %2$s. + + A szoba elsődleges címét törölted. + A szoba elsődleges címét beállítottad erre: %1$s. + A szoba címét hozzáadtad: %1$s és törölted: %2$s. + + A szoba címét törölted: %1$s. + A szoba címeit törölted: %1$s. + + + A szobához hozzáadtad mint cím: %1$s. + A szobához hozzáadtad mint címek: %1$s. + + %1$s meghívóját visszavontad. Ok: %2$s + A meghívót elfogadtad ehhez: %1$s. Ok: %2$s + A meghívót visszavontad tőle, hogy beléphessen a szobába: %1$s. Ok: %2$s + Meghívót küldtél neki, hogy belépjen a szobába: %1$s. Ok: %2$s + Kitiltottad: %1$s. Ok: %2$s + Visszaengedted: %1$s. Ok: %2$s + Kirúgtad: %1$s. Ok: %2$s + A meghívót elutasítottad. Ok: %1$s + Kiléptél. Ok: %1$s + %1$s kilépett. Ok: %2$s + A szobát elhagytad. Ok: %1$s + Beléptél. Ok: %1$s + %1$s belépett. Ok: %2$s + Beléptél a szobába: Ok: %1$s + Meghívtad: %1$s. Ok: %2$s + Meghívód. Ok: %1$s + Üzenet elküldve + Kezdeti szinkronizálás: +\nAdatok letöltése… + Kezdeti szinkronizálás: +\nA szerver válaszára várakozás… + Üres szoba (%s volt) + + %1$s, %2$s, %3$s és még %4$d + %1$s, %2$s, %3$s és még %4$d + + %1$s, %2$s, %3$s és %4$s + %1$s, %2$s és %3$s + Videó konferenciát módosítottad + Videó konferenciát módosította: %1$s + Befejezted a videó konferenciát + Videó konferenciát befejezte: %1$s + Videó konferenciát indítottál + Videó konferenciát elindította: %1$s \ No newline at end of file From e0b066380a520954c4d86890dcd79f94dc969829 Mon Sep 17 00:00:00 2001 From: Kaa Jii Date: Wed, 26 May 2021 18:35:49 +0000 Subject: [PATCH 008/254] Translated using Weblate (Italian) Currently translated at 99.9% (2474 of 2475 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 | 973 +++++++++++----------- 1 file changed, 498 insertions(+), 475 deletions(-) diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 520fac1900..2ea18d9ae2 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -9,17 +9,17 @@ %1$s è uscito dalla stanza %1$s ha rifiutato l\'invito %1$s ha buttato fuori %2$s - %1$s ha tolto il bando a %2$s - %1$s ha bandito %2$s - %1$s ha revocato l\'invito per %2$s - %1$s ha modificato il suo avatar - %1$s hanno cambiato il nome visualizzato con %2$s - %1$s ha cambiato il nome visualizzato da %2$s a %3$s - %1$s ha rimosso il nome visibile (%2$s) - %1$s ha cambiato l\'argomento con: %2$s - %1$s ha cambiato il nome della stanza con: %2$s - %s ha iniziato una chiamata video. - %s ha iniziato una chiamata vocale. + %1$s ha rimosso il ban nei confronti di %2$s + %1$s ha bannato %2$s + %1$s ha revocato l\'invito a %2$s + %1$s ha modificato la sua immagine profilo + %1$s hanno cambiato il nome in %2$s + %1$s ha cambiato il nome da %2$s a %3$s + %1$s ha rimosso il nome (%2$s) + %1$s ha cambiato l\'argomento in: %2$s + %1$s ha cambiato il nome della stanza in: %2$s + %s ha iniziato una videochiamata. + %s ha iniziato una chiamata audio. %s ha risposto alla chiamata. %s ha terminato la chiamata. %1$s ha reso la futura cronologia della stanza visibile a %2$s @@ -28,19 +28,19 @@ tutti i membri della stanza. chiunque. sconosciuto (%s). - %1$s ha attivato la crittografia end-to-end (%2$s) + %1$s ha attivato la crittografia E2E (%2$s) %1$s ha richiesto una conferenza VoIP Conferenza VoIP iniziata Conferenza VoIP terminata - (anche l\'avatar è cambiato) + (anche l\'avatar è stato cambiato) %1$s ha rimosso il nome della stanza %1$s ha rimosso l\'argomento della stanza %1$s ha aggiornato il profilo %2$s - %1$s ha mandato un invito a %2$s per unirsi alla stanza - %1$s ha accettato l\'invito per %2$s + %1$s ha mandato un invito a %2$s per entrare alla stanza + %1$s ha accettato l\'invito a %2$s ** Impossibile decriptare: %s ** - Il dispositivo del mittente non ci ha inviato le chiavi per questo messaggio. - Impossibile revisionare + Il dispositivo del mittente non ha inviato le chiavi per questo messaggio. + Impossibile riscrivere Impossibile inviare il messaggio Invio dell\'immagine fallito Errore di rete @@ -48,7 +48,7 @@ Al momento non è possibile rientrare in una stanza vuota. Indirizzo email Numero di telefono - %1$s ha inviato un adesivo. + %1$s ha inviato uno sticker. Invito da %s Invito nella stanza @@ -62,37 +62,37 @@ Messaggio rimosso da %1$s Messaggio rimosso [motivo: %1$s] Messaggio rimosso da %1$s [motivo: %2$s] - Sync iniziale: + Sincronizzazione iniziale: \nImportazione account… - Sync iniziale: -\nImportazione cifratura - Sync iniziale: + Sincronizzazione iniziale: +\nImportazione crittografia + Sincronizzazione iniziale: \nImportazione stanze - Sync iniziale: + Sincronizzazione iniziale: \nImportazione stanze partecipate - Sync iniziale: -\nImportazione stanze invitate - Sync iniziale: + Sincronizzazione iniziale: +\nImportazione stanze con invito + Sincronizzazione iniziale: \nImportazione stanze lasciate - Sync iniziale: + Sincronizzazione iniziale: \nImportazione comunità - Sync iniziale: + Sincronizzazione iniziale: \nImportazione dati account %s ha aggiornato questa stanza. Invio messaggio in corso … Cancella la coda di invio - %1$s ha revocato l\'invito a %2$s di unirsi alla stanza + %1$s ha revocato l\'invito a %2$s per entrare alla stanza Invito di %1$s. Motivo: %2$s %1$s ha invitato %2$s. Motivo: %3$s %1$s ti ha invitato. Motivo: %2$s %1$s è entrato nella stanza. Motivo: %2$s %1$s è uscito dalla stanza. Motivo: %2$s %1$s ha rifiutato l\'invito. Motivo: %2$s - %1$s ha buttato fuori %2$s. Motivo: %3$s + %1$s ha cacciato fuori %2$s. Motivo: %3$s %1$s ha riammesso %2$s. Motivo: %3$s - %1$s ha bandito %2$s. Motivo: %3$s - %1$s ha inviato un invito a %2$s di unirsi alla stanza. Motivo: %3$s - %1$s ha revocato l\'invito a %2$s di unirsi alla stanza. Motivo: %3$s + %1$s ha bannato %2$s. Motivo: %3$s + %1$s ha mandato un invito a %2$s per entrare nella stanza. Motivo: %3$s + %1$s ha revocato l\'invito a %2$s per entrare nella stanza. Motivo: %3$s %1$s ha accettato l\'invito per %2$s. Motivo: %3$s %1$s ha rifiutato l\'invito di %2$s. Motivo: %3$s @@ -108,11 +108,11 @@ %1$s ha rimosso l\'indirizzo principale per questa stanza. %1$s ha permesso l\'accesso alla stanza per gli ospiti. %1$s ha impedito l\'accesso alla stanza per gli ospiti. - %1$s ha attivato la cifratura end-to-end. - %1$s ha attivato la cifratura end-to-end (algoritmo %2$s non riconosciuto). + %1$s ha attivato la crittografia E2E. + %1$s ha attivato la crittografia E2E (algoritmo %2$s non riconosciuto). %1$s ha creato la stanza Hai inviato un\'immagine. - Hai inviato un adesivo. + Hai inviato uno sticker. Il tuo invito Hai creato la stanza Hai invitato %1$s @@ -120,25 +120,25 @@ Sei uscito dalla stanza Hai rifiutato l\'invito Hai buttato fuori %1$s - Hai riammesso %1$s - Hai bandito %1$s - Hai ritirato l\'invito di %1$s - Hai cambiato il tuo avatar - Hai impostato il tuo nome visualizzato a %1$s - Hai cambiato il tuo nome visualizzato da %1$s a %2$s - Hai rimosso il tuo nome visibile (era %1$s) - Hai cambiato l\'argomento a: %1$s + Hai rimosso il ban nei confronti di %1$s + Hai bannato %1$s + Hai revocato l\'invito a %1$s + Hai cambiato la tua immagine profilo + Hai impostato il tuo nome in %1$s + Hai cambiato il tuo nome da %1$s a %2$s + Hai rimosso il tuo nome (era %1$s) + Hai cambiato l\'argomento in: %1$s %1$s ha modificato l\'avatar della stanza Hai modificato l\'avatar della stanza - Hai cambiato il nome della stanza a: %1$s + Hai cambiato il nome della stanza in: %1$s Hai iniziato una videochiamata. - Hai iniziato una telefonata. - %s ha inviato dati per impostare la chiamata. - Hai inviato dati per impostare la chiamata. + Hai iniziato una chiamata audio. + %s ha inviato i dati per impostare la chiamata. + Hai inviato i dati per impostare la chiamata. Hai risposto alla chiamata. Hai terminato la chiamata. Hai reso visibile la futura cronologia della stanza a %1$s - Hai attivato la crittografia end-to-end (%1$s) + Hai attivato la crittografia E2E (%1$s) Hai aggiornato questa stanza. Hai richiesto una conferenza VoIP Hai rimosso il nome della stanza @@ -146,9 +146,9 @@ %1$s ha rimosso l\'avatar della stanza Hai rimosso l\'avatar della stanza Hai aggiornato il tuo profilo %1$s - Hai mandato un invito a %1$s a unirsi alla stanza - Hai revocato l\'invito per %1$s a unirsi alla stanza - Hai accettato l\'invito per %1$s + Hai mandato un invito a %1$s per entrare nella stanza + Hai revocato l\'invito a %1$s per entrare alla stanza + Hai accettato l\'invito a %1$s %1$s ha aggiunto il widget %2$s Hai aggiunto il widget %1$s %1$s ha rimosso il widget %2$s @@ -157,22 +157,22 @@ Hai modificato il widget %1$s Amministratore Moderatore - Predefinito + Standard Personalizzato (%1$d) Personalizzato - Hai cambiato il livello di potere di %1$s. - %1$s ha cambiato il livello di potere di %2$s. + Hai cambiato le autorizzazioni di %1$s. + %1$s ha cambiato le autorizzazioni di %2$s. %1$s da %2$s a %3$s Il tuo invito. Motivo: %1$s Hai invitato %1$s. Motivo: %2$s Sei entrato nella stanza. Motivo: %1$s Sei uscito dalla stanza. Motivo: %1$s Hai rifiutato l\'invito. Motivo: %1$s - Hai buttato fuori %1$s. Motivo: %2$s + Hai cacciato %1$s. Motivo: %2$s Hai riammesso %1$s. Motivo: %2$s - Hai bandito %1$s. Motivo: %2$s - Hai mandato un invito a %1$s a unirsi alla stanza. Motivo: %2$s - Hai revocato l\'invito a %1$s a unirsi alla stanza. Motivo: %2$s + Hai bannato %1$s. Motivo: %2$s + Hai mandato un invito a %1$s per entrare nella stanza. Motivo: %2$s + Hai revocato l\'invito a %1$s per entrare nella stanza. Motivo: %2$s Hai accettato l\'invito per %1$s. Motivo: %2$s Hai ritirato l\'invito di %1$s. Motivo: %2$s @@ -189,7 +189,7 @@ Hai permesso l\'accesso alla stanza per gli ospiti. Hai impedito l\'accesso alla stanza per gli ospiti. Hai attivato la crittografia end-to-end. - Hai attivato la crittografia end-to-end (algoritmo %1$s sconosciuto). + Hai attivato la crittografia E2E (algoritmo %1$s sconosciuto). Hai impedito l\'accesso alla stanza agli ospiti. %1$s ha impedito l\'accesso alla stanza agli ospiti. Hai permesso l\'accesso agli ospiti. @@ -198,8 +198,8 @@ Sei uscito. Motivo: %1$s %1$s è uscito. Motivo: %2$s %1$s è entrato. Motivo: %2$s - Hai revocato l\'invito per %1$s - %1$s ha revocato l\'invito per %2$s + Hai revocato l\'invito a %1$s + %1$s ha revocato l\'invito a %2$s Hai invitato %1$s %1$s ha invitato %2$s Hai aggiornato la stanza. @@ -219,19 +219,19 @@ %1$s, %2$s, %3$s e %4$s %1$s, %2$s e %3$s - 🎉 Tutti i server sono banditi dalla partecipazione! Questa stanza non può più essere usata. + 🎉 Tutti i server sono banditi! Questa stanza non può più essere usata. Nessuna modifica. - • I server che corrispondono a IP letterali ora sono banditi. - • I server che corrispondono a IP letterali ora sono permessi. - • I server che corrispondono a %s sono stati rimossi dalla lista dei consentiti. - • I server che corrispondono a %s ora sono permessi. + • I server che corrispondono a IP alfabetici ora sono banditi. + • I server che corrispondono a IP alfabetici ora sono permessi. + • I server che corrispondono a %s sono stati rimossi dalla lista degli ammessi. + • I server che corrispondono a %s ora sono ammessi. • I server che corrispondono a %s sono stati rimossi dalla lista di ban. • I server che corrispondono a %s ora sono banditi. Hai cambiato le ACL del server per questa stanza. %s ha cambiato le ACL del server per questa stanza. - • I server che corrispondono a IP letterali sono banditi. - • I server che corrispondono a IP letterali sono permessi. - • I server che corrispondono a %s sono permessi. + • I server che corrispondono a IP alfabetici sono banditi. + • I server che corrispondono a IP alfabetici sono permessi. + • I server che corrispondono a %s sono ammessi. • I server che corrispondono a %s sono banditi. Hai impostato le ACL del server per questa stanza. %s ha impostato le ACL del server per questa stanza. @@ -257,12 +257,12 @@ %1$s ha aggiunto l\'indirizzo alternativo %2$s per questa stanza. %1$s ha aggiunto gli indirizzi alternativi %2$s per questa stanza. - Hai modificato la video conferenza - Video conferenza modificata da %1$s - Hai iniziato la video conferenza - Hai terminato la video conferenza - Video conferenza terminata da %1$s - Video conferenza iniziata da %1$s + Hai modificato la videoconferenza + Videoconferenza modificata da %1$s + Hai iniziato la videoconferenza + Hai terminato la videoconferenza + Videoconferenza terminata da %1$s + Videoconferenza iniziata da %1$s Messaggi Stanza @@ -281,7 +281,7 @@ Condividi Ultimi Inoltra - Collegamento permanente + URL Link Vedi il codice sorgente Vedi il codice sorgente decifrato Elimina @@ -497,7 +497,7 @@ ${app_name} può usare tua Rubrica locale per trovare altri utenti Matrix grazie alle loro email e numeri di telefono. \n \nTi sta bene comunicare i dati di tutti i tuoi contatti per questo scopo\? - Purtroppo l\'azione non è stata eseguita poiché mancano i permessi + Purtroppo l\'azione non è stata eseguita a causa di autorizzazioni mancanti Salvato Salvare nei download? @@ -506,16 +506,16 @@ Continua Rimuovi - Unisciti + Entra Anteprima Rifiuta Vai al primo messaggio non letto. - Sei stato invitato ad entrare in questa stanza da %s + Sei stato invitato da %s a entrare in questa stanza Questo invito è stato spedito a %s, che non è associato a questo account. \nPuoi aggiungere questa email al tuo account o provare ad accedere con un account differente. - Stai provando ad accedere a %s. Desideri entrare per partecipare alla discussione? + Stai provando ad accedere a %s. Vuoi entrare e partecipare alla discussione\? una stanza Questa è l\'anteprima della stanza. Le interazioni sono disabilitate. @@ -530,7 +530,7 @@ Online Offline Inattivo - STRUMENTI ADMIN + STRUMENTI DELL\'AMMINISTRATORE CHIAMATA CHAT DIRETTE SESSIONI @@ -599,8 +599,8 @@ Desideri nascondere tutti i messaggi di questo utente\? \n \nTieni presente che questa azione riavvierà l\'app e ciò potrebbe richiedere molto tempo. - Annulla il caricamento - Annulla lo scaricamento + Annulla l\'Upload + Annulla il Download Cerca Cerca tra i membri della stanza @@ -661,7 +661,7 @@ La richiesta di sincronizzazione sta impiegando troppo tempo Ritardo tra ogni sincronizzazione Versione - Versione olm + Versione OLM Termini e condizioni Avvisi di terze parti Copyright @@ -697,10 +697,10 @@ Invia Autenticato come Home Server - Server identità + Server di identità Interfaccia utente Lingua - Scegli una lingua + Scegli la lingua In attesa di verifica Controlla la tua email e clicca sul link che ti è stato spedito. Fatto questo, clicca su Continua. Impossibile verificare l\'indirizzo email. Controlla la tua email e clicca sul link che ti è stato spedito. Fatto questo, clicca su Continua. @@ -711,9 +711,9 @@ Password attuale Nuova password Conferma la nuova password - Fallito l\'aggiornamento della password + L\'aggiornamento della password è fallito La tua password è stata aggiornata - Mostrare tutti i messaggi di %s\? + Mostra tutti i messaggi di %s\? \n \nTieni presente che questa azione riavvierà l\'app e ciò potrebbe richiedere molto tempo. Sicuro di voler rimuovere questo target di notifica? @@ -723,10 +723,10 @@ Per favore scegli un paese Numero di telefono Numero di telefono non valido per il paese selezionato - Verifica numero di telefono + Verifica il numero di telefono E\' stato spedito un SMS con il codice di attivazione. Per favore inserisci il codice qui sotto. Inserisci un codice di attivazione - Errore durante la convalida del numero di telefono + Errore durante la verifica del numero di telefono Codice 3 giorni @@ -738,7 +738,7 @@ Icona della stanza Nome della stanza Argomento - Etichetta + Etichetta dela stanza Etichetta come: Preferito @@ -768,12 +768,12 @@ ID interno della stanza Indirizzi Laboratorio - Queste sono caratteristiche sperimentali che potrebbero dare risultati inattesi. Usare con cautela. - Crittografia da-utente-a-utente - La crittografia da-utente-a-utente è attiva - Devi disconnetterti per abilitare la crittografia. + Queste sono caratteristiche sperimentali che potrebbero dare risultati inattesi. Usali con cautela. + Crittografia E2E + La crittografia E2E è attiva + Per abilitare la crittografia devi disconnetterti. Cripta solo per le sessioni verificate - Non inviare mai da questa sessione messaggi cifrati verso sessioni in questa stanza non verificate. + Da questa sessione non inviare mai messaggi cifrati alle sessioni non verificate presenti in questa stanza. Questa stanza non ha indirizzi locali Nuovo indirizzo stanza (es. #foo:matrix.org) @@ -785,15 +785,15 @@ Non usare più come indirizzo principale Copia ID stanza Copia indirizzo stanza - Crittografia abilitata in questa stanza. - Crittografia disabilitata in questa stanza. + La Crittografia in questa stanza é attiva. + La Crittografia in questa stanza non è attiva. Attiva crittografia \n(attenzione: non potrà più essere disattivata!) Elenco Tema - %s stava cercando di caricare un punto specifico tra i messaggi passati di questa stanza, ma non l\'ha trovato. + %s stava cercando di caricare un punto specifico nella cronologia di questa stanza ma non è stato in grado di trovarlo. Informazioni sulla crittografia E2E Informazioni sull\'evento @@ -803,29 +803,29 @@ Algoritmo ID sessione Errore di decriptazione - Informazioni sessione del mittente + Informazioni sulla sessione del mittente Nome pubblico Nome pubblico ID sessione Chiave sessione Verifica Impronta digitale Ed25519 - Esporta le chiavi di crittografia delle stanze + Esporta le chiavi di crittografia E2E delle stanze Esporta le chiavi delle stanze Esporta le chiavi in un file locale Esporta - Inserisci password - Conferma password - Le chiavi di crittografia della stanza sono state salvate su \'%s\'. + Inserisci frase di sicurezza + Conferma frase di sicurezza + Le chiavi di crittografia E2E della stanza sono state salvate su \'%s\'. \n -\nAttenzione: se si disinstalla quest\'applicazione il file, viene eliminato. - Importa le chiavi di crittografia della stanza +\nAttenzione: se si disinstalla quest\'applicazione il file viene eliminato. + Importa le chiavi di crittografia E2E della stanza Importa le chiavi della stanza Importa le chiavi da un file locale Importa Cripta solo per le sessioni verificate - Non inviare mai da questa sessione messaggi cifrati verso sessioni non verificate. - NON verificato + Da questa sessione non inviare mai messaggi cifrati verso sessioni non verificate. + Non verificato Verificato Metti in lista nera sessione sconosciuta @@ -855,7 +855,7 @@ Cerca tra i messaggi passati - Grandezza font + Dimensione font Minuscolo Piccolo Normale @@ -902,10 +902,10 @@ Per segnalare un errore agita il dispositivo con rabbia Sicuro di voler avviare una nuova chat con %s\? Sicuro di voler fare una chiamata audio\? - Sicuro di voler fare una chiamata video\? + Sicuro di voler fare una videochiamata\? Elenco gruppi Elenco dei membri - Apri descrizione + Apri intestazione Sincronizzazione… %d utente attivo @@ -938,8 +938,8 @@ Statistiche Notifiche Nuovo ID della comunità (es. +foo:matrix.org) - L\'ID comunità non è valido - \'%s\' non è un ID comunità valido + L\'ID della comunità non è valido + \'%s\' non è un ID della comunità valido %d messaggio notificato non letto %d messaggi notificati non letti @@ -999,7 +999,7 @@ Dimentica la stanza Avatar Predisposizione - Questa stanza non mostra predisposizione per alcuna comunità + Questa stanza non mostra predisposizioni per alcuna comunità Il livello di potere deve essere un intero positivo. Avatar di avviso Avatar di ricezione @@ -1051,7 +1051,7 @@ Richiedi di nuovo le chiavi di crittografia dalle tue altre sessioni. La richiesta della chiave è stata inviata. Richiesta inviata - Avvia ${app_name} su un altro dispositivo che possa decifrare il messaggio, in modo che possa inviare le chiavi a questa sessione. + Avvia ${app_name} su un altro dispositivo capace di decifrare il messaggio in modo che poi possa inviarti le chiavi su questa sessione. Digita qui… Invia messaggio vocale prosegui con… @@ -1118,7 +1118,7 @@ Avvisi di sistema Limite di risorse superato - Contatta l\'amministratore + Contatta l\'Amministratore contatta l\'amministratore del servizio L\'Home Server ha superato uno dei limiti delle risorse, pertanto alcuni utenti non potranno accedere. L\'Home Server ha superato uno dei limiti delle risorse. @@ -1133,8 +1133,8 @@ Caricamento differito dei membri della stanza Versione %s Crea una password per mettere al sicuro le chiavi esportate. La stessa password dovrà essere usata per poter importare le chiavi. - Crea una password - Le password devono corrispondere + Crea una frase di sicurezza + La frase di sicurezza non corrisponde espandi riduci Mostra l\'area informazioni @@ -1172,7 +1172,7 @@ Accetta Per favore, leggi e accetta i termini di servizio di questo Home Server: Diagnostica delle notifiche - Diagnosi + Diagnosi dei problemi Esegui i test In esecuzione… (%1$d di %2$d) La diagnostica di base risponde correttamente. Se continui a non ricevere notifiche, invia una segnalazione errore per aiutarci a indagare. @@ -1207,7 +1207,7 @@ Token FCM registrato con successo sull\'Home Server. E\'fallita la registrazione del Token FCM sull\'Home Server: \n %1$s - Servizio di notifiche + Servizi di notifica Servizio di notifiche in esecuzione. Servizio di notifiche non in esecuzione. \nProva a riavviare l\'applicazione. @@ -1225,7 +1225,7 @@ ${app_name} è stato configurato per funzionare in modo limitato quando è eseguito in background. \nIl funzionamento dell\'App, quando è eseguita in background, è stato fortemente limitato e ciò potrebbe influenzare la ricezione delle notifiche. \n%1$s - Non limitare + Disabilita le restrizioni Ottimizzazione della batteria ${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. @@ -1285,17 +1285,17 @@ Aggiorna la password La password non è valida Le password non corrispondono - Ripristino dei messaggi cifrati + Ripristino dei messaggi criptati Gestisci il Backup delle chiavi Silenzioso Inserisci un nome utente. Inserisci una password - La password è troppo debole + La frase di sicurezza è troppo debole Cancella la password se vuoi che ${app_name} generi un codice di recupero. Non c\'è alcuna sessione Matrix disponibile Non perdere mai i messaggi cifrati - I messaggi nelle stanze cifrate sono protetti con crittografia E2E. Solo tu e il/i destinatario/i avete le chiavi crittografiche per leggere questi messaggi. -\n + I messaggi nelle stanze cifrate sono protetti con crittografia E2E. Solo tu e i destinatarii avete le chiavi crittografiche per leggere questi messaggi. +\n \nRicorda di fare un backup delle tue chiavi crittografiche per evitare di perderle. Inizia ad usare il Backup delle chiavi crittografiche (Avanzato) @@ -1304,7 +1304,7 @@ Una copia cifrata delle tue chiavi crittografiche sarà salvata sul tuo Home Server. Proteggi il tuo Backup con una password per tenerlo al sicuro. \n \nPer una maggior sicurezza, è meglio che la password del Backup delle chiavi sia diversa da quella del tuo account. - Imposta password + Imposta frase di sicurezza Creazione backup Oppure, proteggi il tuo Backup con un codice di recupero, salvandolo in un luogo sicuro. (Avanzato) Imposta un codice di recupero @@ -1344,7 +1344,7 @@ Codice di recupero in elaborazione… Download chiavi… Importazione chiavi… - Sblocca Timeline + Sblocca Cronologia Inserisci un codice di recupero Impossibile decifrare il backup con questo codice di recupero: verifica di avere inserito il codice di recupero corretto. Backup ripristinato %s ! @@ -1359,7 +1359,7 @@ Rilevazione ultima versione codici di recupero fallita (%s). La cifratura della sessione non è stata attivata Ripristina da backup - Elimina backup + Elimina Backup Il backup delle chiavi è stato impostato correttamente per questa sessione. Il backup delle chiavi non è attivo su questa sessione. Questa sessione non sta facendo il backup delle chiavi. @@ -1371,9 +1371,9 @@ Il backup ha una firma non valida dalla sessione non verificata %s Impossibile ottenere info di fiducia per il backup (%s). Per usare il backup delle chiavi crittografiche su questa sessione, devi accedervi con la password o con il codice di recupero. - Eliminazione backup… + Eliminazione Backup… Eliminazione backup fallita (%s) - Elimina 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. Nuovo Backup delle chiavi È stato rilevato un nuovo Backup delle chiavi crittografiche. @@ -1397,7 +1397,7 @@ Firma Risposta Home Server non valida Opzioni autocompletamento server - ${app_name} ha rilevato una configurazione server personalizzata per il tuo dominio userId \"%1$s\": + ${app_name} ha rilevato una configurazione server personalizzata per il tuo dominio userID \"%1$s\": \n%2$s Usa configurazione Inizializzazione del servizio @@ -1439,13 +1439,13 @@ Richiesta condivisione chiavi crittografiche Ignora Verifica confrontando una breve stringa. - Per la massima sicurezza, consigliamo di farlo di persona o di utilizzare un altro metodo di comunicazione fidato. + Per una miglior sicurezza consigliamo di farlo di persona o di utilizzare altri metodi di comunicazione sicuri. Inizia la verifica Richiesta di verifica in arrivo - Verifica questa sessione per segnarla come fidata. Verificare le sessioni dei partner ti dà una maggiore tranquillità quando usi messaggi cifrati end-to-end. - Verificare questa sessione la segnerà come fidata e segnerà anche la tua sessione come fidata per il tuo partner. - Verifica questa sessione confermando che le seguenti emoji appaiono sullo schermo del partner - Verifica questa sessione confermando che i seguenti numeri appaiono sullo schermo del partner + Verifica questa sessione per segnarla come affidabile. Verificare le sessioni degli utenti offre maggiori sicurezze quando usi messaggi cifrati end-to-end. + Verificando questa sessione verrà contrassegnata come affidabile anche per l\'altro utente. + Verifica questa sessione confermando che le seguenti emoji appaiono sullo schermo dell\'altro utente + Verifica questa sessione confermando che i seguenti numeri appaiono sullo schermo dell\'altro utente Hai ricevuto una richiesta di verifica. Vedi la richiesta In attesa che il partner confermi… @@ -1457,7 +1457,7 @@ Usa la verifica classica. Verifica chiave Richiesta annullata - L\'altra parte ha annullato la verifica. + L\'altro utente ha annullato la verifica. \n%s La verifica è annullata. \nMotivo: %s @@ -1468,12 +1468,12 @@ Il processo di verifica è scaduto La sessione non sa della transazione La sessione non riesce ad accordarsi sulla chiave, hash, MAC, o metodo SAS - L\'hash non corrispondeva + L\'hash inviato non corrisponde Il SAS non corrispondeva La sessione ha ricevuto un messaggio inaspettato È stato ricevuto un messaggio non valido Le chiavi non corrispondono - Utente non corrispondente + L\'utente non corrisponde Errore sconosciuto Esiste già un backup sul tuo Home Server Sembra tu abbia già impostato il backup delle chiavi crittografiche da un\'altra sessione. Vuoi sostituirlo con il backup che stai creando\? @@ -1566,14 +1566,14 @@ Non trovi quello che cerchi\? Crea un nuova stanza Invia un nuovo messaggio diretto - Vedi l\'elenco delle stanze + Guarda l\'elenco delle stanze pubbliche Nome o ID stanza (#esempio:matrix.org) - Attiva swipe per rispondere nella timeline - Collegamento copiato negli appunti - Gestore dell\'integrazione + Attiva lo swipe per rispondere nella timeline + Link URL copiato negli appunti + Gestore delle integrazioni Non è stato configurato nessun Integration Manager. Aggiungi per ID utente - Creare una stanza … + Creazione stanza … Nessun risultato trovato. Usa \"Aggiungi per ID utente\" per cercare sul server. Inizia a digitare per ottenere risultati Cerca per nome o ID utente … @@ -1584,7 +1584,7 @@ Per continuare devi accettare i termini di servizio. Termini di servizio Leggi i termini di servizio - Fatti trovare dagli altri utenti + Fatti rintracciare dagli altri utenti Usa bot, bridge, widget e pacchetti di sticker Leggi su Nessuno @@ -1629,20 +1629,20 @@ Disconnetti Identity Server Configura Identity Server Cambia Identity Server - Stai usando l\'Identity Server %1$s per trovare e farti trovare da altri utenti. - In questo momento non stai usando alcun Identity Server. Per trovare e farti trovare dagli altri utenti, configurane uno qua sotto. + Stai usando l\'Identity Server %1$s per trovare altri utenti e essere a tua volta rintracciabile da loro. + In questo momento non stai usando alcun Identity Server. Per trovare e farti rintracciare dagli altri utenti, configurane uno qua sotto. Indirizzi email visibili pubblicamente - Le opzioni su come farsi trovare da altri utenti appariranno dopo avere aggiunto un\'email. - Le opzioni su come farsi trovare da altri utenti appariranno dopo avere aggiunto un numero di telefono. - Se ti disconnetti dall\'Identity Server gli altri utenti non potranno trovarti e tu non potrai invitarne di nuovi per email o telefono. + Le opzioni su come farsi trovare da altri utenti appariranno dopo che avrai aggiunto un\'email. + Le opzioni su come farsi trovare da altri utenti appariranno dopo che avrai aggiunto un numero di telefono. + Se ti disconnetti dall\'Identity Server gli altri utenti non potranno trovarti e tu non potrai invitarli tramite le loro email e numeri di telefono. Numeri di telefono visibili pubblicamente - Abbiamo inviato un\'email di conferma a %s, controlla l\'email e clicca sul link di conferma + Abbiamo inviato un\'email di conferma a %s. Controlla l\'email e clicca sul link di conferma In attesa - Inserisci un URL di server di identità + Inserisci l\'URL di un Identity Server Impossibile connettersi all\'Identity Server Inserisci l\'URL dell\'Identity Server L\'Identity Server non ha reso noti i propri termini di servizio - L\'Identity Server che hai scelto non ha freso noti i propri termini di servizio. Continua solo se ti fidi + L\'Identity Server che hai scelto non ha reso noti i propri termini di servizio. Continua solo se ti fidi È stato inviato un messaggio a %s. Inserisci il codice di verifica che contiene. In questo momento stai condividendo i tuoi indirizzi email o numeri di telefono sull\'Identity Server %1$s. Dovrai riconnetterti a %2$s per interromperne la condivisione. Accetta i termini di servizio dell\'Identity Server (%s) per permettere ad altri utenti di trovarti tramite la tua email o numero di telefono. @@ -1653,13 +1653,13 @@ Invia allegato Apri il pannello di navigazione Apri il menu \"Crea nuova stanza\" - Chiudi il menu di \"Crea nuova stanza\"… + Chiudi il menu \"Crea nuova stanza\"… Crea una nuova conversazione diretta Crea nuova stanza Chiudi il banner del Backup delle chiavi Mostra password Nascondi password - Salta in fondo + Vai in fondo %1$s, %2$s e %3$s hanno letto %1$s e %2$s hanno letto %s ha letto @@ -1667,14 +1667,14 @@ %d utente ha letto %d utenti hanno letto - Il file \'%1$s\' (%2$s) è troppo grande da inviare. Il limite è %3$s. - Si è verificato un errore ricevendo l\'allegato. + Il file \'%1$s\' (%2$s) è troppo grande per essere inviato. Il limite è %3$s. + Si è verificato un errore nella ricezione dell\'allegato. File Contatto Fotocamera Audio Galleria - Adesivo + Sticker Errore nella gestione dei dati condivisi È spam È inappropriato @@ -1684,19 +1684,19 @@ SEGNALA IGNORA UTENTE Contenuto segnalato - Questo contenuto è stato segnalato. -\n -\nSe non vuoi più vedere contenuti da questo utente, puoi ignorarlo per nascondere i suoi messaggi. + Questo contenuto è stato segnalato. +\n +\nSe non vuoi più vedere i contenuti di questo utente puoi ignorarlo. Ciò nasconderà i suoi messaggi dalla tua vista. Segnalato come spam - Questo contenuto è stato segnalato come spam. -\n -\nSe non vuoi più vedere contenuti da questo utente, puoi ignorarlo per nascondere i suoi messaggi. + Questo contenuto è stato segnalato come spam. +\n +\nSe non vuoi più vedere i contenuti di questo utente puoi ignorarlo. Ciò nasconderà i suoi messaggi dalla tua vista. Segnalato come inappropriato - Questo contenuto è stato segnalato come inappropriato. -\n -\nSe non vuoi più vedere contenuti da questo utente, puoi ignorarlo per nascondere i suoi messaggi. - ${app_name} richiede l\'autorizzazione per salvare le tue chiavi crittografiche sul disco. -\n + 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. + ${app_name} richiede l\'autorizzazione per salvare sul disco le tue chiavi crittografiche. +\n \nPermetti l\'accesso nel prossimo pop-up per poter esportare le chiavi manualmente. In questo momento non c\'è nessuna connessione di rete Conferma la tua password @@ -1725,7 +1725,7 @@ Questo widget vuole usare le seguenti risorse: Permetti Blocca tutto - Usare la fotocamera + Usa la fotocamera Usa il microfono Leggi media protetti da DRM Questo non è un indirizzo di server Matrix valido @@ -1735,93 +1735,93 @@ Solo citazioni Silenzioso Impostazioni - Lascia la stanza + Esci dalla stanza %1$s non ha fatto modifiche Invia il messaggio come spoiler Spoiler - Digita parole chiave per trovare una reazione. + Digita parole chiave per trovare le reazioni. Non stai ignorando alcun utente Tieni premuto su una stanza per altre opzioni - %1$s ha reso pubblica la stanza a chiunque conosca il collegamento. - %1$s ha reso la stanza solo ad invito. + %1$s ha reso la stanza pubblica. Ora è raggiungibile da chiunque ne conosca l\'indirizzo. + %1$s ha reso la stanza accessibile solo su invito. Messaggi non letti - È la tua conversazione. Tienitela. - Chatta con persone direttamente o in gruppi - Tieni private le conversazioni con la crittografia + Detieni il controllo sulle -tue- conversazioni. + Scambia messaggi diretti o nei gruppi + Rendi sicure le tue conversazioni grazie alla crittografia Estendi e personalizza la tua esperienza Inizia Seleziona un server - Proprio come le email, gli account hanno una sola origine, ma puoi parlare con chiunque - Unisciti a milioni gratuitamente sul server pubblico più grande + Proprio come le email: puoi fare un account dove preferisci e interagire con tutti + Unisciti gratuitamente a milioni di utenti sul più grande server pubblico Hosting premium per organizzazioni Maggiori info Altro Impostazioni personalizzate ed avanzate Continua Connetti a %1$s - Connetti a Element Matrix Services - Connetti ad un server personalizzato + Connettiti a Element Matrix Services + Connettiti a un server personalizzato Accedi a %1$s Registrati Accedi - Continua con SSO + Continua con l\'autenticazione (SSO) Indirizzo Element Matrix Services Indirizzo Hosting premium per organizzazioni - Inserisci l\'indirizzo del Element Modular o del server che vuoi usare + Inserisci l\'indirizzo Element Modular o del server che vuoi usare Si è verificato un errore caricando la pagina: %1$s (%2$d) - L\'applicazione non riesce ad accedere a questo homeserver. L\'homeserver supporta i seguenti tipi di accesso: %1$s. + L\'applicazione non riesce ad accedere a questo Home Server. L\'Home Server supporta i seguenti tipi di accesso: %1$s. \n \nVuoi accedere usando un client web\? Spiacenti, questo server non accetta nuovi account. - L\'applicazione non riesce a creare un account su questo homeserver. + L\'applicazione non riesce a creare un account su questo Home Server. \n \nVuoi registrarti usando un client web\? Questa email non è associata ad alcun account. - Reimposta password su %1$s - Verrà inviata un\'email di verifica nella tua posta per confermare l\'impostazione della nuova password. + Reimposta la password su %1$s + Per confermare la nuova password ti verrà inviata un\'email di verifica. Avanti Email Nuova password Attenzione! - Cambiare la password reimposterà qualunque chiave di cifratura end-to-end su tutte le tue sessioni, rendendo illeggibile la cronologia delle chat criptate. Imposta il Backup Chiavi o esporta le tue chiavi della stanza da un\'altra sessione prima di reimpostare la password. + Cambiando la password verranno reimpostate le chiavi crittografiche E2E di tutte le tue sessioni rendendo illeggibile la cronologia delle chat criptate. Prima di reimpostare la password imposta il Backup delle Chiavi o esporta le chiavi della tua stanza da un\'altra sessione. Continua Questa email non è collegata ad alcun account Controlla la tua posta Un\'email di verifica è stata inviata a %1$s. - Tocca il collegamento per confermare la tua nuova password. Una volta seguito il collegamento contenuto, clicca sotto. + Clicca sul link per confermare la tua nuova password. Una volta fatto, clicca sotto. Ho verificato il mio indirizzo email - Successo! + Fatto! La tua password è stata reimpostata. - Sei stato disconnesso da tutte le sessioni e non riceverai più notifiche push. Per riattivare le notifiche, riaccedi su ogni dispositivo. + Sei stato disconnesso da tutte le sessioni e non riceverai più notifiche push. Per riattivare le notifiche, accedi nuovamente su ogni dispositivo. Torna all\'accesso Attenzione La tua password non è ancora cambiata. \n \nFermare il processo di cambio password\? Imposta indirizzo email - Imposta un\'email per recuperare il tuo account. Più tardi potrai permettere facoltativamente alle persone che conosci di trovarti tramite la tua email. + Imposta un\'email per recuperare il tuo account. Più tardi potrai decidere se permettere alle persone che conosci di trovarti tramite questa email. Email Email (facoltativa) Avanti Imposta numero di telefono - Imposta un numero di telefono per permettere facoltativamente alle persone che conosci di trovarti. + Imposta un numero di telefono per permettere alle persone che conosci di trovarti (facoltativo). Si prega di usare il formato internazionale. Numero di telefono Numero di telefono (facoltativo) Avanti - Conferma numero di telefono - Abbiamo inviato un codice a %1$s. Inseriscilo sotto per verificare che sei tu. - Inserisci codice + Conferma il numero di telefono + Abbiamo inviato un codice a %1$s. Inseriscilo qui sotto per verificare che sei davvero tu. + Inserisci il codice Invia di nuovo Avanti I numeri di telefono internazionali devono iniziare con \'+\' - Il numero di telefono non sembra valido. Ricontrollalo + Il numero di telefono non sembra valido. Controlla di nuovo Registrati su %1$s Nome utente o email Password Avanti - Quel nome utente esiste già + Questo nome utente è già in uso Attenzione Il tuo account non è ancora stato creato. \n @@ -1829,17 +1829,17 @@ Seleziona matrix.org Seleziona Element Matrix Services Seleziona un server personalizzato - Completa la verifica Captcha - Accetta le condizioni per continuare + Completa il Captcha + Per continuare accetta le condizioni Controlla la tua email - Abbiamo inviato un\'email a %1$s. -\nClicca il collegamento contenuto per continuare la creazione dell\'account. - Il codice inserito non è corretto. Ricontrollalo. - Homeserver obsoleto - Questo homerserver è di una versione troppo vecchia per connettersi. Chiedi all\'amministratore dell\'homeserver di aggiornarlo. + Abbiamo inviato un\'email a %1$s contenente un link. +\nClicca sul link per continuare la creazione dell\'account. + Il codice inserito non è corretto. Controllalo nuovamente. + Home Server obsoleto + Impossibile connettersi: questo Home Server utilizza una versione obsoleta del software. Chiedi all\'amministratore dell\'Home Server di aggiornarlo. - Sono state inviate troppe richieste. Puoi riprovare in %1$d secondo… - Sono state inviate troppe richieste. Puoi riprovare in %1$d secondi… + Sono state inviate troppe richieste. Puoi riprovare tra %1$d secondo… + Sono state inviate troppe richieste. Puoi riprovare tra %1$d secondi… Visto da Sei disconnesso @@ -1853,54 +1853,54 @@ Accedi di nuovo Sei disconnesso Accedi - L\'amministratore dell\'homeserver (%1$s) ti ha disconnesso dall\'account %2$s (%3$s). - Accedi per recuperare le chiavi di cifratura memorizzate esclusivamente su questo dispositivo. Ti servono per leggere tutti i tuoi messaggi sicuri su qualsiasi dispositivo. + L\'amministratore dell\'Home Server (%1$s) ti ha disconnesso dall\'account %2$s (%3$s). + Accedi per recuperare le chiavi crittografiche memorizzate esclusivamente su questo dispositivo. Sono indispensabili per poter leggere i tuoi messaggi criptati su altri dispositivi. Accedi Password Elimina i dati personali - Attenzione: i tuoi dati personali (incluse chiavi di cifratura) sono ancora in questo dispositivo. + Attenzione: i tuoi dati personali (incluse le chiavi crittografiche) sono ancora su questo dispositivo. \n -\nEliminali se hai finito di usare questo dispositivo, o se vuoi accedere ad un altro account. +\nEliminali se non userai più questo dispositivo o se vuoi usare un altro account. Elimina tutti i dati Elimina i dati - Eliminare tutti i dati attualmente presenti in questo dispositivo\? -\nRiaccedi per avere accesso ai dati dell\'account e ai messaggi. - Perderai l\'accesso ai messaggi sicuri a meno che non accedi per recuperare le tue chiavi di cifratura. + Eliminare tutti i dati attualmente presenti su questo dispositivo\? +\nAccedi nuovamente per avere accesso ai dati dell\'account e ai messaggi. + Se non accedi per recuperare le tue chiavi crittografiche perderai l\'accesso ai messaggi criptati. Elimina i dati La sessione attuale è per l\'utente %1$s e hai fornito le credenziali per l\'utente %2$s. Ciò non è supportato da ${app_name}. \nPrima elimina i dati, poi accedi di nuovo con un altro account. - Il tuo collegamento matrix.to non è corretto + Il tuo link matrix.to non è corretto La descrizione è troppo breve - Sync iniziale… + Sincronizzazione iniziale… Vedi tutte le mie sessioni Impostazioni avanzate Modalità sviluppatore - La modalità sviluppatore abilita funzionalità nascoste e potrebbe anche rendere l\'app meno stabile. Solo per sviluppatori! + La modalità sviluppatore abilita funzionalità nascoste che potrebberorendere l\'app instabile. Solo per sviluppatori! Scuotimento - Soglia di rilevamento - Scuoti il telefono per testare la soglia di rilevamento + Sensibilità scuotimento + Agita il telefono per testare la sensibilità di scuotimento Scuotimento rilevato! Impostazioni Sessione attuale Altre sessioni - Mostrati solo i primi risultati, digita più lettere… - Crash facile - ${app_name} potrebbe crashare più spesso quando si verifica un errore imprevisto - Antepone ¯\\_(ツ)_/¯ ad un messaggio testuale - Attiva la cifratura - Una volta attivata, la cifratura non può essere disattivata. + Si vedono solo i primi risultati: digita più lettere… + Fail-fast + Se si verifica un errore imprevisto ${app_name} potrebbe crashare più spesso + Antepone ¯\\_(ツ)_/¯ in un messaggio testuale + Attiva la crittografia + Una volta attivata, la crittografia non può più essere disattivata. Il dominio della tua email non è autorizzato alla registrazione in questo server - Accesso non fidato + Accesso non affidabile Corrispondono Non corrispondono - Verifica questo utente confermando che le seguenti emoji appaiono sul suo schermo, nello stesso ordine. - Per la massima sicurezza, usate un\'altra via di comunicazione fidata o fatelo di persona. - Cerca lo scudo verde per garantire la fiducia dell\'utente. Fidati di tutti gli utenti in una stanza per garantire che essa sia sicura. + Verifica questo utente confermando che le seguenti emoji appaiono sul suo schermo nello stesso ordine. + Per avere la massima certezza effettuate l\'operazione tramite un mezzo di comunicazione già fidato oppure fatelo di persona. + Il badge verde garantisce che l\'identità dell\'utente è verificata. Verifica tutti gli utenti in una stanza per assicurarti che sia sicura. Non sicuro Uno dei seguenti potrebbe essere compromesso: \n -\n - Il tuo homeserver -\n - L\'homeserver al quale è connesso l\'utente che stai verificando +\n - Il tuo Home Server +\n - L\'Home Server al quale è connesso l\'utente che stai verificando \n - La tua connessione internet o quella dell\'altro utente \n - Il tuo dispositivo o quello dell\'altro utente Video. @@ -1920,19 +1920,19 @@ Scansiona il codice con il dispositivo dell\'altro utente per verificarvi a vicenda Scansiona il suo codice Impossibile scansionare - Se non siete di persona, confrontate invece le emoji + Se non siete fisicamente vicini potete fare la verifica con le emoji Verifica confrontando le emoji Verifica via emoji - Se non potete scansionare il codice sopra, verificate confrontando una breve selezione univoca di emoji. + Se non puoi scansionare il codice qui sopra, potete fare la verifica confrontando una breve sequenza di emoji. Immagine codice QR Verifica %s %s verificato In attesa di %s… - Per maggiore sicurezza, verifica %s controllando un codice univoco su entrambi i dispositivi. + Per maggiore sicurezza, verifica %s confrontando un codice univoco su entrambi i dispositivi. \n \nPer la massima sicurezza, fatelo di persona. - I messaggi in questa stanza non sono cifrati end-to-end. - I messaggi in questa stanza sono cifrati end-to-end. + I messaggi in questa stanza non sono cifrati E2E. + I messaggi in questa stanza sono cifrati E2E. \n \nI tuoi messaggi sono protetti con lucchetti e solo tu e il destinatario avete le chiavi univoche per sbloccarli. Sicurezza @@ -1945,7 +1945,7 @@ %1$d persone File caricati - Lascia stanza + Esci dalla stanza Uscita dalla stanza… Amministratori Moderatori @@ -1959,32 +1959,32 @@ ${app_name} non gestisce eventi del tipo \'%1$s\' ${app_name} non gestisce messaggi del tipo \'%1$s\' ${app_name} ha riscontrato un errore con il rendering del contenuto dell\'evento con id \'%1$s\' - Non ignorare + Non ignorare più Questa sessione non riesce a condividere questa verifica con le tue altre sessioni. \nLa verifica sarà salvata in locale e condivisa in una versione futura dell\'app. Stanze recenti Altre stanze - Invia il messaggio in questione colorato ad arcobaleno - Invia l\'emoticon in questione colorata ad arcobaleno + Invia il messaggio coi colori dell\'arcobaleno + Invia l\'emoticon coi colori dell\'arcobaleno Cronologia Editor messaggi - Attiva crittografia end-to-end… - Una volta attivata, la cifratura non può essere disattivata. - Attivare la cifratura\? - Una volta attivata, la cifratura di una stanza non può essere disattivata. I messaggi inviati in una stanza cifrata non possono essere visti dal server, solo dai partecipanti della stanza. L\'attivazione della cifratura può impedire il funzionamento di molti bot e bridge. - Attiva cifratura - Per sicurezza, verifica %s controllando un codice univoco. - Per sicurezza, fatelo di persona o usate un\'altra via di comunicazione. - Confronta le emoji, assicurandoti che appaiono nello stesso ordine. - Confronta il codice con quello mostrato nello schermo dell\'altro utente. - I messaggi con questo utente sono cifrati end-to-end e non possono essere letti da terze parti. - La tua nuova sessione ora è verificata. Ha accesso ai messaggi cifrati e gli altri utenti la vedranno come fidata. + Attiva crittografia E2E… + Una volta attivata, la crittografia non può più essere disattivata. + Attivare la crittografia\? + Una volta attivata, la crittografia di una stanza non può più essere disattivata. I messaggi inviati in una stanza criptata non possono essere letti dal server ma solo dai partecipanti della stanza. L\'attivazione della crittografia può impedire il funzionamento di molti bot e bridge. + Attiva crittografia + Per sicurezza, verifica %s confrontando un codice univoco. + Per sicurezza, fatelo di persona o usate un\'altra via di comunicazione fidata. + Confronta le emoji assicurandoti che siano nello stesso ordine. + Confronta il codice con quello mostrato sullo schermo dell\'altro utente. + I messaggi con questo utente sono cifrati E2E e non possono essere letti da altri. + La tua nuova sessione ora è verificat ed ha accesso ai messaggi criptati. Gli altri utenti la vedranno come affidabile. Firma incrociata La firma incrociata è attiva -\nChiavi private nel dispositivo. +\nLe chiavi private sono nel dispositivo. La firma incrociata è attiva \nLe chiavi sono fidate. -\nChiavi private non conosciute +\nChiavi private non sono note La firma incrociata è attiva. \nLe chiavi non sono fidate La firma incrociata non è attiva @@ -1994,34 +1994,34 @@ Disconnetti questa sessione Nessuna informazione crittografica disponibile Questa sessione è fidata per i messaggi sicuri perché l\'hai verificata: - Verifica questa sessione per segnarla come fidata e darle l\'accesso ai messaggi cifrati. Se non hai fatto l\'accesso a questa sessione il tuo account potrebbe essere compromesso: + Verifica questa sessione per segnarla come affidabile e darle l\'accesso ai messaggi criptati. Se non hai effettuato l\'accesso a questa sessione il tuo account potrebbe essere compromesso: %d sessione attiva %d sessioni attive Verifica questo accesso Gli altri utenti potrebbero non fidarsi - Completa la sicurezza - Usa una sessione esistente per verificare questa, dandole l\'accesso ai messaggi cifrati. + Completa la messa in sicurezza + Usa una sessione esistente per verificare questa, dandole l\'accesso ai messaggi criptati. Verifica Verificato Attenzione - Rilevazione sessioni fallita + Rilevamento sessioni fallito Sessioni - Fidato - Non fidato - Questa sessione è fidata per i messaggi sicuri perché %1$s (%2$s) l\'ha verificata: + Affidabile + Inaffidabile + Questa sessione è affidabile per i messaggi criptati perché %1$s (%2$s) l\'ha verificata: %1$s (%2$s) ha fatto l\'accesso con una nuova sessione: - Finché questo utente non si fida di questa sessione, i messaggi inviati da e verso di essa sono etichettati con avvisi. In alternativa, puoi verificarlo manualmente. + Finché questo utente non verificherà questa sessione, i messaggi inviati da e verso di essa saranno etichettati con un avviso. In alternativa, puoi verificarlo manualmente. Inizializza la firma incrociata Reimposta chiavi Codice QR - Quasi fatto! %s sta mostrando lo stesso scudo\? + Quasi fatto! %s sta mostrando lo stesso badge\? No La connessione al server è stata persa Nome utente - Strumenti Svil + Strumenti per sviluppatori Dati account %d voto @@ -2033,11 +2033,11 @@ Opzione selezionata Crea un semplice sondaggio - Usa una password o chiave di recupero + Usa una frase o chiave di recupero Se non puoi accedere a una sessione esistente Nuovo accesso Impossibile trovare segreti nell\'archivio - Inserisci la password dell\'archivio segreto + Inserisci la frase di sicurezza dell\'archivio segreto Attenzione: Dovresti accedere all\'archivio segreto solo da un dispositivo fidato Rimuovi… @@ -2050,8 +2050,8 @@ Sei sicuro di volere rimuovere (eliminare) questo evento\? Nota che se elimini il nome della stanza o cambi l\'argomento, ciò potrebbe annullare la modifica. Includi un motivo Motivo della revisione - Evento eliminato da un utente, motivo: %1$s - Evento moderato da un admin della stanza, motivo: %1$s + Evento eliminato dall\'utente, motivo: %1$s + Evento moderato dll\'Amministratore della stanza, motivo: %1$s Le chiavi sono già aggiornate! ${app_name} Android Richieste di chiavi @@ -2062,79 +2062,79 @@ Usa questa sessione per verificare quella nuova, dandole l\'accesso ai messaggi cifrati. Non ero io Il tuo account potrebbe essere compromesso - Se annulli, non potrai leggere i messaggi cifrati su questo dispositivo e altri utenti non si fideranno di esso - Se annulli, non potrai leggere i messaggi cifrati sul tuo nuovo dispositivo e altri utenti non si fideranno di esso + Se annulli, non potrai leggere i messaggi criptati su questo dispositivo e altri utenti non lo considereranno affidabile + Se annulli, non potrai leggere i messaggi criptati sul nuovo dispositivo e altri utenti non lo considereranno affidabile Non verificherai %1$s (%2$s) se annulli adesso. Ricomincia nel suo profilo utente. Uno dei seguenti potrebbe essere compromesso: \n \n- La tua password -\n- Il tuo homeserver +\n- Il tuo Home Server \n- Questo dispositivo, o l\'altro \n- La connessione internet usata da uno dei dispositivi \n \nTi consigliamo di cambiare immediatamente la password e le chiavi di recupero nelle impostazioni. - Verifica i tuoi dispositivi dalle impostazioni. + Verifica i tuoi dispositivi nelle impostazioni. Verifica annullata - Password di ripristino - chiave dei messaggi - password dell\'account + Frase di ripristino + Chiave dei messaggi + Password dell\'account Imposta una %s Genera una chiave dei messaggi Conferma la %s Inserisci la tua %s per continuare. - Proteggi e sblocca i messaggi cifrati e fidati con una %s. - Inserisci la tua %s di nuovo per confermarla. - Non riutilizzare la tua password dell\'account. + Proteggi e sblocca i messaggi criptati e fidati con una %s. + Inserisci di nuovo la tua %s per confermarla. + Non riutilizzare la password del tuo account. Potrebbe impiegarci qualche secondo, porta pazienza. Inizializzazione del ripristino. La tua chiave di recupero Hai finito! Tienila al sicuro Fine - Usa questa %1$s come una rete di salvataggio in caso ti dimentichi la tua %2$s. + Usa questa %1$s come una rete di salvataggio in caso dimenticassi la tua %2$s. Pubblicazione delle chiavi di identità create - Generazione della chiave sicura dalla password + Generazione della chiave di sicurezza dalla password Definizione della chiave predefinita SSSS Sincronizzazione della chiave principale Sincronizzazione della chiave utente Sincronizzazione della chiave di auto-firma Inizializzazione del backup chiavi - La tua %2$s e la %1$s sono ora impostate. + La tua %2$s e la %1$s ora sono impostate. \n -\nTienile al sicuro! Ti serviranno per sbloccare i messaggi cifrati e informazioni sicure se perdi tutte le tue sessioni attive. +\nTienile al sicuro! Ti serviranno per poter sbloccare i messaggi criptati se perdessi tutte le tue sessioni attive. Stampala e conservala in un posto sicuro Salvala in una penna USB o disco di backup - Copiala nella tua archiviazione online - Non puoi farlo da mobile - Impostare una password dei messaggi ti consente di proteggere e sbloccare i messaggi cifrati e di fidarti. + Copiala sul Cloud + Non puoi farlo dallo smartphone + Impostare una password dei messaggi ti consente di proteggere e sbloccare i messaggi criptati e verifiche. \n -\nSe non vuoi impostare una password dei messaggi, genera una chiave dei messaggi. - Impostare una password di ripristino ti consente di proteggere e sbloccare i messaggi cifrati e di fidarti. - Cifratura attiva - I messaggi in questa stanza sono cifrati end-to-end. Maggiori info e verifica degli utenti nel loro profilo. - Cifratura non attiva - La cifratura usata da questa stanza non è supportata +\nSe non vuoi impostare una password dei messaggi puoi generare una chiave dei messaggi. + Impostare una password di ripristino ti consente di proteggere e sbloccare i messaggi cifrati le verifiche. + Crittografia attiva + I messaggi in questa stanza sono crittografati E2E. Maggiori info e verifica degli utenti nel loro profilo. + Crittografia non attiva + La crittografia usata in questa stanza non è supportata %s ha creato e configurato la stanza. - Quasi fatto! L\'altro dispositivo sta mostrando lo stesso scudo\? + Quasi fatto! L\'altro dispositivo sta mostrando lo stesso badge\? Quasi fatto! In attesa della conferma… In attesa di %s… Importazione chiavi fallita Configurazione delle notifiche Messaggi contenenti @room - Messaggi cifrati in conversazioni private - Messaggi cifrati in chat di gruppo + Messaggi criptati in conversazioni private + Messaggi criptati in chat di gruppo Quando le stanze vengono aggiornate - Risoluzione problemi - Imposta l\'importanza della notifica per evento - Invia un messaggio come testo semplice, senza interpretarlo come markdown - Nome utente e/o password errati. La password inserita inizia o termina con spazi, controllala. + Risoluzione dei problemi + Personalizza importanza per evento + Invia in testo semplice senza interpretarlo come markdown + Nome utente e/o password errati. La password inserita inizia o termina con spazi. Controllala. Messaggio… - Aggiornamento cifratura disponibile + È disponibile un aggiornamento della crittografia Verifica te stesso e gli altri per tenere al sicuro le chat Inserisci la tua %s per continuare Usa file - Inserisci la %s - Password di ripristino + Inserisci %s + Frase di recupero Non è una chiave di ripristino valida Inserisci una chiave di ripristino Controllo della chiave di backup @@ -2150,26 +2150,26 @@ Non conosci la password del backup chiavi, puoi %s. Chiave di ripristino del backup chiavi Impedisci la cattura di schermate dell\'app - Attivandolo verrà aggiunto FLAG_SECURE a tutte le Activity. Riavvia l\'applicazione per applicare le modifiche. + Attivandolo verrà aggiunto FLAG_SECURE a tutte le attività. Riavvia l\'applicazione per applicare le modifiche. File multimediale aggiunto alla galleria Impossibile aggiungere il file multimediale alla galleria Imposta una nuova password dell\'account… - Usa l\'ultima versione di ${app_name} sui tuoi altri dispositivi, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} per Android o un altro client Matrix che supporti la firma incrociata + Usa l\'ultima versione di ${app_name} sui tuoi altri dispositivi, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} Android o un altro client Matrix che supporti la firma incrociata ${app_name} Web \n${app_name} Desktop ${app_name} iOS \n${app_name} Android o un altro client Matrix che supporti la firma incrociata - Usa l\'ultimo ${app_name} sui tuoi altri dispositivi: + Usa l\'ultima versione di ${app_name} anche sui tuoi altri dispositivi: Forza l\'attuale sessione di gruppo in uscita in una stanza cifrata ad essere scartata - Supportato solo nelle stanze cifrate + Supportato solo nelle stanze criptate Usa la tua %1$s o la %2$s per continuare. Usa la chiave di recupero - Seleziona la tua chiave di recupero, oppure inseriscila a mano digitandola o incollando dagli appunti + Seleziona la tua chiave di recupero, oppure digitala a mano o copia/incollala Impossibile decifrare il backup con questa chiave di recupero: verifica di avere inserito la chiave giusta. Accesso all\'archivio sicuro fallito - Non cifrato - Cifrato da un dispositivo non verificato + Non criptato + Criptato da un dispositivo non verificato Controlla dove hai fatto l\'accesso Verifica tutte le tue sessioni per assicurarti che il tuo account e i messaggi siano protetti Verifica il nuovo accesso entrando nel tuo account: %1$s @@ -2177,11 +2177,11 @@ Verifica accesso Verifica interattivamente con emoji Conferma la tua identità verificando questo accesso da una delle tua altre sessioni, dandole l\'accesso ai messaggi cifrati. - Segna come fidato + Segna come affidabile Scegli un nome utente. Scegli una password. - Verifica questo collegamento - Il collegamento %1$s ti sta portando ad un altro sito: %2$s. + Verifica questo link + Il link %1$s aprirà una nuova pagina web: %2$s. \n \nSei sicuro di volere continuare\? Impossibile creare il messaggio diretto. Controlla gli utenti che vuoi invitare e riprova. @@ -2201,39 +2201,39 @@ Messaggio eliminato Mostra messaggi rimossi Mostra un segnaposto per i messaggi rimossi - Ti abbiamo inviato un\'email di conferma a %s, prima controlla la tua posta e clicca sul link di conferma + Ti abbiamo inviato un\'email di conferma a %s. Per proseguire controlla la tua posta e clicca sul link di conferma Il codice di verifica non è corretto. MEDIA - Non ci sono file multimediali in questa stanza + In questa stanza non ci sono file multimediali FILE %1$s alle %2$s - Non ci sono file in questa stanza - In alternativa, se hai già un account e conosci il tuo identificativo e password di Matrix, puoi usare questo metodo: - Accedi con il mio identificativo di Matrix - Accedi - Se configuri un account in un homeserver, usa il tuo ID Matrix (es. @utente:dominio.com) e la password qua sotto. - Identificativo utente - Non è un identificativo valido. Formato previsto: \'@utente:homeserver.org\' - Impossibile trovare un homeserver valido. Controlla il tuo identificativo + In questa stanza non ci sono file + In alternativa, se hai già un account e conosci il tuo ID utente e password, puoi usare questo metodo: + Accedi con il tuo ID utente + Accedi con il tuo ID utente + Se hai un account su un Home Server, usa il tuo ID utente (es. @utente:homeserver.org) e la password qua sotto. + ID utente + Non è un ID utente valido. Il formato corretto è del tipo: \'@utente:homeserver.org\' + Impossibile trovare un Home Server valido. Controlla il tuo ID utente Modalità aereo attiva Lingua attuale Altre lingue disponibili Caricamento lingue disponibili… Apri condizioni di %s - Disconnettere dal server di identitià %s\? - Questo server di identità è obsoleto. ${app_name} supporta solo API V2. - Questa operazione non è possibile. L\'homeserver è obsoleto. - Prima configura un server di identità. - Prima accetta le condizioni del server di identità nelle impostazioni. - Per la tua privacy, ${app_name} supporta solo l\'invio di email utente e numeri di telefono in formato hash. - L\'associamento è fallito. - Non c\'è alcun associamento attuale con questo identificativo. - Il tuo homeserver (%1$s) propone di usare %2$s come tuo server di identità + Disconnettere dall\'Identity Server %s\? + Questo Identity Server è obsoleto. ${app_name} supporta solo API V2. + Questa operazione non è possibile. L\'Home Server è obsoleto. + Prima configura un Identity Server. + Prima accetta le condizioni dell\'Identity Server nelle impostazioni. + Per la tua privacy, ${app_name} supporta solo l\'invio di email e numeri di telefono degli utenti in modalità oscurata (hash). + L\'associazione è fallita. + Non c\'è alcuna associazione con questo identificativo. + Il tuo Home Server (%1$s) propone di usare %2$s come tuo Identity Server Usa %1$s - In alternativa, puoi inserire un qualsiasi altro URL di server di identità - Inserisci l\'URL di un server di identità + In alternativa, puoi inserire l\'URL di un qualsiasi altro Identity Server + Inserisci l\'URL di un Identity Server Invia - Riproduci + Avvia Pausa Annulla Copia @@ -2246,7 +2246,7 @@ Telefono Altoparlante Cuffie - Cuffie senza fili + Cuffie wireless Cambia fotocamera Frontale Posteriore @@ -2282,14 +2282,14 @@ Imposta il Backup Sicuro Reimposta il Backup Sicuro Configura in questo dispositivo - Proteggiti contro la perdita dell\'accesso ai messaggi e dati cifrati facendo un backup delle chiavi crittografiche sul tuo server. + Per evitare di non poter più accedere ai messaggi e dati cifrati fai un backup delle chiavi crittografiche sul tuo server. Genera una nuova chiave di sicurezza o imposta una nuova frase di sicurezza per il backup esistente. Ciò sostituirà la tua attuale chiave o frase. Le integrazioni sono disattivate Attiva \'Permetti integrazioni\' nelle impostazioni per continuare. - %d utente bandito - %d utenti banditi + %d utente bannato + %d utenti bannati Chiavi esportate correttamente VEDI @@ -2298,20 +2298,20 @@ Backup Sicuro Proteggiti dalla perdita dei messaggi e dati crittografati Imposta il Backup Sicuro - Aggiungi una scheda dedicata per le notifiche non lette nella schermata principale. + Aggiungi una scheda per le notifiche non lette nella schermata principale. Aggiungi ai preferiti Rimuovi dai preferiti Non hai fatto modifiche - Hai reso pubblica la stanza a chiunque conosca il link. - Hai reso la stanza solo su invito. + Hai reso la stanza pubblica. Ora è raggiungibile da chiunque ne conosca l\'indirizzo. + Hai reso la stanza accessibile solo su invito. Inserisci l\'indirizzo del server che vuoi usare Se non sai la tua password, torna indietro per reimpostarla. - Adesivo - Azioni amministratore - Predefinito in %1$s - L\'amministratore del server ha disattivato la crittografia end-to-end in modo predefinito nelle stanze private e nei messaggi diretti. - Inserisci una frase di sicurezza che conosci solo tu, usata per proteggere i segreti nel tuo server. - Se annulli ora, potresti perdere i messaggi e dati cifrati se perdi l\'accesso ai tuoi login. + Sticker + Azioni Amministratore + Standard in %1$s + L\'amministratore del server ha disattivato di default la crittografia E2E sia nelle stanze private che nei messaggi diretti. + Inserisci una frase di sicurezza che conosci solo tu per proteggere i segreti nel tuo server. + Se annulli ora, potresti perdere i messaggi e i dati criptati qualora perdessi l\'accesso ai tuoi login. \n \nPuoi anche configurare il backup sicuro e gestire le tue chiavi nelle impostazioni. Hai creato e configurato la stanza. @@ -2327,31 +2327,31 @@ Avvia la fotocamera Imposta il Backup Sicuro Backup sicuro - Proteggiti contro la perdita dell\'accesso ai messaggi e dati cifrati facendo un backup delle chiavi crittografiche sul tuo server. + Per prevenire la perdita dell\'accesso ai messaggi e dati criptati fai un backup delle chiavi crittografiche sul tuo server. Configura Usa una chiave di sicurezza - Genera una chiave di sicurezza da conservare in qualche posto sicuro, come un gestore di password o una cassaforte. + Genera una chiave di sicurezza da conservare in un posto sicuro, come un gestore di password o una cassaforte. Usa una frase di sicurezza Inserisci una frase segreta che conosci solo tu e genera una chiave per backup. Salva la chiave di sicurezza - Conserva la chiave di sicurezza in qualche posto sicuro, come un gestore di password o una cassaforte. + Conserva la chiave di sicurezza in un posto sicuro, come un password manager o una cassaforte. Imposta una frase di sicurezza Inserisci una frase di sicurezza che conosci solo tu, usata per proteggere i segreti nel tuo server. Frase di sicurezza - Inserisci la frase di sicurezza di nuovo per confermarla. + Inserisci di nuovo la frase di sicurezza per confermarla. Salva la chiave di sicurezza - Conserva la chiave di sicurezza in qualche posto sicuro, come un gestore di password o una cassaforte. + Conserva la chiave di sicurezza in un posto sicuro, come un gestore di password o una cassaforte. Nome stanza Argomento - Hai cambiato le impostazioni della stanza correttamente + Hai cambiato correttamente le impostazioni della stanza Non puoi accedere a questo messaggio In attesa del messaggio, potrebbe volerci un po\' - Impossibile decifrare - A causa della crittografia end-to-end, devi aspettare che arrivi un messaggio di qualcuno poiché non ti sono state inviate correttamente le chiavi di crittografia. + Impossibile decrittare + Per via della crittografia E2E devi aspettare finchè non ti arriva un messaggio da qualcuno poiché al momento non ti sono ancora state inviate le chiavi di crittografia corrette. Non puoi accedere a questo messaggio perché sei stato bloccato dal mittente - Non puoi accedere a questo messaggio perché la tua sessione non è fidata dal mittente + Non puoi accedere a questo messaggio perché il mittente non ha verificato la tua sessione Non puoi accedere a questo messaggio perché il mittente non ha inviato le chiavi di proposito - In attesa della cronologia di crittografia + In attesa che la cronologia venga crittografata Riot ora si chiama Element! Siamo entusiasti di annunciare che abbiamo cambiato nome! La tua app è aggiornata e hai fatto l\'accesso al tuo account. CAPITO @@ -2362,11 +2362,11 @@ Rubrica Cerca nei miei contatti Rilevazione dei tuoi contatti… - Il tuo elenco di contatti è vuoto + Il tuo elenco contatti è vuoto Elenco contatti - Revoca invito + Revoca l\'invito Revocare l\'invito a %1$s\? - Bandito da %1$s + Bannato da %1$s Rimozione ban fallita Le notifiche push sono disattivate Verifica le tue impostazioni per attivare le notifiche push @@ -2375,11 +2375,11 @@ Validazione PIN fallita, inseriscine uno nuovo. Inserisci il tuo PIN PIN dimenticato\? - Reimposta PIN + Reimposta il PIN Nuovo PIN - Per reimpostare il PIN, dovrai riaccedere e crearne uno nuovo. - Attiva PIN - Se vuoi reimpostare il PIN, tocca \"PIN dimenticato\" per disconnetterti e reimpostarlo. + Per reimpostare il PIN dovrai riaccedere e crearne uno nuovo. + Attiva il PIN + Se vuoi reimpostare il PIN tocca \"PIN dimenticato\" per disconnetterti e reimpostarlo. Conferma il PIN per disattivarlo Impedisci chiamate accidentali Chiedi conferma prima di iniziare una chiamata @@ -2409,7 +2409,7 @@ Codice sbagliato, %d tentativo rimasto Codice sbagliato, %d tentativi rimasti - Attenzione! Ultimo tentativo rimasto prima di venire disconnesso! + Attenzione! Ultimo tentativo rimasto prima di esser disconnesso! Troppi errori, sei stato disconnesso Questo numero di telefono è già definito. Nessun numero di telefono aggiunto al tuo account @@ -2423,7 +2423,7 @@ Codice Si prega di usare il formato internazionale (il numero deve iniziare con \'+\') Conferma la tua identità verificando questo accesso, dandogli l\'accesso ai messaggi cifrati. - Impossibile aprire una stanza dove sei stato bandito. + È impossibile entrare in una stanza da cui sei stato bannato. Impossibile trovare questa stanza. Assicurati che esista. Non hai il permesso di avviare una chiamata in questa stanza @@ -2435,40 +2435,40 @@ Sondaggio Pulsanti bot Reagito con: %s - Conclusione della verifica - Eliminare i dati dell\'account di tipo %1$s\? + Verifica conclusa + Vuoi eliminare i dati dell\'account di tipo %1$s\? \n -\nUsalo con attenzione, può avere comportamenti imprevisti. - Il collegamento non è corretto +\nProcedi con cautela: quest\'azione può provocare comportamenti imprevisti. + Il link non è corretto Mostra solo il numero di messaggi non letti in una semplice notifica. Mostra dettagli come il nome delle stanze e il contenuto dei messaggi. Mostra il contenuto nelle notifiche Il codice PIN è l\'unico modo per sbloccare ${app_name}. - Attiva la biometria specifica del dispositivo, come impronte e riconoscimento facciale. + Attiva la biometria specifica del dispositivo, come le impronte digitali e il riconoscimento facciale. Attiva la biometria Configura protezione Proteggi l\'accesso usando un PIN e la biometria. - Proteggi accesso + Proteggi l\'accesso Mostra il dispositivo con cui puoi verificare ora Mostra %d dispositivi con cui puoi verificare ora Ricomincerai senza cronologia, messaggi, dispositivi o utenti fidati Se reimposti tutto - Fallo solo se non hai altri dispositivi con cui verificare questo. + Fallo solo se non hai altri dispositivi con cui fare la verifica. Reimposta tutto Dimenticato o perso tutte le opzioni di recupero\? Reimposta tutto Sei entrato. - I messaggi in questa stanza sono cifrati end-to-end. + I messaggi in questa stanza sono crittografati E2E. Esci Impostazioni - I messaggi qui sono cifrati end-to-end. -\n + I messaggi qui sono cifrati E2E. +\n \nI tuoi messaggi sono protetti con lucchetti e solo tu e il destinatario avete le chiavi univoche per sbloccarli. - I messaggi qui non sono cifrati end-to-end. - L\'homeserver gira su una versione vecchia. Chiedi al tuo amministratore di aggiornare. Puoi continuare, ma alcune funzionalità potrebbero non funzionare correttamente. - L\'hai resa solo su invito. - %1$s l\'ha resa solo su invito. + I messaggi qui non sono cifrati E2E. + Questo Home Server utilizza una versione obsoleta del software: chiedi all\'amministratore dell\'Home Server di aggiornarlo. Puoi connetterti, ma alcune funzionalità potrebbero non funzionare correttamente. + Hai reso la stanza accessibile solo su invito. + %1$s ha reso la stanza accessibile solo su invito. Mostra la cronologia completa nelle stanze cifrate %1$s e %2$s %1$s in %2$s e %3$s @@ -2489,15 +2489,15 @@ Non hai il permesso di avviare una chiamata di gruppo Reimposta Il codice PIN è richiesto ogni volta che apri ${app_name}. - È necessario il codice PIN dopo 2 minuti di inattività con ${app_name}. + Il codice PIN è richiesto dopo 2 minuti di inattività su ${app_name}. Richiedi il PIN dopo 2 minuti %s è entrato. L\'applicazione è in attesa del PUSH - Scarta modifiche + Scarta le modifiche Ci sono modifiche non salvate. Scartare le modifiche\? La stanza non è ancora stata creata. Annullare la creazione della stanza\? - Rimuovi da priorità bassa - Aggiungi in priorità bassa + Rimuovi da bassa priorità + Imposta come bassa priorità Ruota e ritaglia Aggiungi immagine da Impostazioni stanza @@ -2508,50 +2508,50 @@ Messaggio diretto Invia cronologia di richieste condivisione chiave Nessun altro risultato - Collegamento Matrix + Link Matrix Codice QR non scansionato! Codice QR non valido (URI non valido)! Non puoi messaggiare te stesso! Condividi via testo Cerca contatti su Matrix - Imposta avatar + Imposta l\'immagine della stanza Non è stato fornito il consenso dell\'utente. - Condividi questo codice con le persone consentendo la scansione per aggiungerti e iniziare a chattare. + Condividi questo codice con i tuoi contatti! Basta una scansione per aggiungerti ed iniziare a chattare. Il mio codice Condividi il mio codice Scansiona un codice QR Non è un codice QR Matrix valido - 🔐️ Unisciti a me su ${app_name} - Ehy, parliamo su ${app_name}: %s + 🔐️ Puoi trovarmi su ${app_name} + Ehy, chattiamo su ${app_name}: %s Invita amici Aggiungi persone "Argomento: " Aggiungi un argomento - %s per far sapere alle persone di cosa parla questa stanza. - Questo è l\'inizio della tua cronologia di messaggi diretti con %s. - Questo è l\'inizio di questa conversazione. - Questo è l\'inizio di %s. - Non hai il permesso di attivare la crittografia in questa stanza. + %s per far sapere alle persone l\'argomento di questa stanza. + Qui comincia la cronologia dei messaggi diretti con %s. + Qui comincia questa conversazione. + Qui comincia %s. + Non sei autorizzato ad attivare la crittografia in questa stanza. Creazione stanza… Alcuni caratteri non sono permessi - Inserisci un indirizzo della stanza + Attribuisci un indirizzo alla stanza Questo indirizzo è già in uso Indirizzo stanza - Dovresti attivarlo se questa stanza verrà usata solo per collaborazioni tra squadre interne nel tuo homeserver. Non può essere cambiato in seguito. - Impedisci a chiunque non faccia parte di %s di entrare in questa stanza + Dovresti attivarlo solo se vuoi che questa stanza sia usata solamente da utenti registrati sul tuo stesso Home Server. Questa impostazione non potrà essere cambiata in seguito. + Impedisci a chiunque non sia registrato su %s di entrare in questa stanza Nascondi avanzate Mostra avanzate %1$d di %2$d Crea una nuova conversazione diretta scansionando un codice QR - Crea una nuova conversazione diretta via ID Matrix - Per trovare i contatti esistenti che conosci, accetti di inviare i dati di contatto (numeri di telefono e/o email) al server d\'identità configurato (%1$s)\? + Crea una nuova conversazione diretta tramite ID utente + Per trovare gli utenti che già conosci, accetti di inviare le informazioni di contatto (numeri di telefono e/o email) all\'Identity Server configurato (%1$s)\? \n -\nPer privacy, sarà inviato solo l\'hash dei dati da inviare. +\nPer garantire la privacy, i dati verranno inviati in forma oscurata (hashing). Invio di email e numeri di telefono Accetta Revoca il mio consenso - Non hai accettato l\'invio di email e numeri di telefono a questo server d\'identità per trovare altri utenti dai tuoi contatti. - Hai accettato l\'invio di email e numeri di telefono a questo server d\'identità per trovare altri utenti dai tuoi contatti. + Non hai acconsentito ad inviare email e numeri di telefono a questo Identity Server per poter rintracciare altri utenti tra i tuoi contatti. + Hai acconsentito ad inviare email e numeri di telefono a questo Identity Server per poter rintracciare altri utenti tra i tuoi contatti. Invia email e numeri di telefono Suggerimenti Contatti @@ -2560,26 +2560,26 @@ Codice QR Aggiungi da codice QR Cerca per nome o ID - Per scansionare un codice QR, devi permettere l\'accesso alla fotocamera. - Permetti l\'autorizzazione per l\'accesso ai contatti. + Per scansionare un codice QR devi permettere l\'accesso alla fotocamera. + Autorizza ad accedere ai tuoi contatti. Inizia a chattare Cambia il tuo PIN attuale Cambia PIN Anteprima della stanza non disponibile. Vuoi entrare\? Questa stanza non è accessibile al momento. \nRiprova più tardi, o chiedi ad un admin della stanza di controllare se ne hai l\'accesso. - Impossibile rilevare l\'attuale visibilità dell\'elenco di stanze (%1$s). - Pubblicare questa stanza nell\'elenco pubblico delle stanze di %1$s\? + Impossibile rilevare l\'attuale visibilità dell\'elenco stanze (%1$s). + Inserire questa stanza nell\'elenco delle stanze pubbliche di %1$s\? Revoca questo indirizzo Pubblica questo indirizzo Aggiungi un indirizzo locale Questa stanza non ha indirizzi locali - Imposta gli indirizzi per la stanza affinché gli utenti la trovino attraverso il tuo homeserver (%1$s) + Imposta gli indirizzi per la stanza affinché gli utenti la trovino attraverso il tuo Homeserver (%1$s) Indirizzi locali - Nuovo indirizzo pubblicato (es. #alias:server) - Nessun altro indirizzo ancora pubblicato. - Nessun altro indirizzo ancora pubblicato, aggiungine uno sotto. - Pubblicare questa stanza nell\'elenco pubblico delle stanze di %1$s\? + Nuovo indirizzo pubblico (es. #alias:server) + Nessun altro indirizzo pubblico finora. + Nessun altro indirizzo pubblico finora. Aggiungine uno sotto. + Inserire questa stanza nell\'elenco delle stanze pubbliche di %1$s\? Eliminare l\'indirizzo \"%1$s\"\? Revocare la pubblicazione dell\'indirizzo \"%1$s\"\? Pubblica @@ -2587,21 +2587,21 @@ Altri indirizzi pubblicati: Indirizzo principale Questo è l\'indirizzo principale - Gli indirizzi pubblicati possono essere usati da chiunque su qualsiasi server per entrare nella stanza. Per pubblicare un indirizzo, deve essere prima impostato come indirizzo locale. - Indirizzi pubblicati + Gli indirizzi pubblici possono essere usati da chiunque su qualsiasi server per entrare nella stanza. Per poter impostare un indirizzo pubblico prima è necessario aver dato alla stanza un indirizzo locale. + Indirizzi pubblici Indirizzi stanza - Vedi e gestisci gli indirizzi di questa stanza e la sua visibilità nell\'elenco delle stanze. + Vedi e gestisci gli indirizzi di questa stanza e la sua visibilità nell\'elenco delle stanze pubbliche. Indirizzi stanza Accesso alla stanza - La leggibilità della cronologia sarà modificata solo per i futuri messaggi di questa stanza. La visibilità dei messaggi esistenti rimarrà invariata. + La visibilità della cronologia sarà modificata solo per i messaggi futuri. La visibilità dei messaggi esistenti rimarrà invariata. Revoca pubblicazione Aggiungi invia neve ❄️ invia coriandoli 🎉 - Invia il messaggio in questione con neve - Invia il messaggio in questione con coriandoli + Invia il messaggio con neve + Invia il messaggio con coriandoli Svuota cronologia - single sign-on + Autenticazione unica (SSO) Accedi con %s Registrati con %s Continua con %s @@ -2628,16 +2628,16 @@ Invita utenti Invia messaggi Ruolo predefinito - Non hai l\'autorizzazione di aggiornare i ruoli necessari per cambiare varie parti della stanza + Non hai l\'autorizzazione ad aggiornare i ruoli necessari per cambiare diverse parti della stanza Seleziona i ruoli necessari per cambiare varie parti della stanza Autorizzazioni Vedi e aggiorna i ruoli necessari per cambiare varie parti della stanza. Autorizzazioni stanza - Questa stanza non è pubblica. Non potrai rientrare senza un invito. + Questa non è una stanza pubblica. Senza un invito non potrai rientrare. Predefinito di sistema Autenticazione fallita - ${app_name} richiede di reinserire le credenziali per eseguire questa azione. - Necessario riautenticarsi + ${app_name} chiede siano reinserite le credenziali per eseguire questa azione. + È necessario riautenticarsi Utenti Si è verificato un errore trasferendo la chiamata Trasferisci @@ -2658,7 +2658,7 @@ Questa chiamata è terminata %1$s ha rifiutato questa chiamata Hai rifiutato questa chiamata %1$s - Sei attualmente in questa chiamata + Stai partecipando a questa chiamata %1$s ha iniziato una chiamata Hai iniziato una chiamata Impostazione della firma incrociata fallita @@ -2690,8 +2690,8 @@ Eventi di stato Invia evento di stato Invia evento personalizzato - Esplora stato stanza - Strumenti Svil + Esplora lo stato della stanza + Strumenti per Sviluppatori Vedi le conferme di lettura Non notificare Notifica senza suono @@ -2707,15 +2707,15 @@ Video Questa stanza ha una bozza non inviata Alcuni messaggi non sono stati inviati - Elimina avatar - Cambia avatar + Elimina immagine profilo + Cambia immagine profilo Immagine Importa chiave da file Apri i widget Schermata - %d elemento - %d elementi + %d inserimento + %d inserimenti Il limite è sconosciuto. Il tuo homeserver accetta allegati (file, multimedia, ecc.) di una dimensione fino a %s. @@ -2730,97 +2730,97 @@ Elenco delle stanze Nuovo valore Cambia - Sinc. iniziale: -\nScaricamento dati… - Sinc. iniziale: + Sincronizzazione iniziale: +\nDownload dei dati… + Sincronizzazione iniziale: \nIn attesa di risposta dal server… Messaggio inviato L\'avviso richiede il supporto del server e una versione di stanza sperimentale Spazio sperimentale - stanza riservata. - Sei invitato - Gli spazi sono modi di raggruppare stanze e persone per lavoro, divertimento o solo per te stesso. - Benvenuti negli spazi! - Aggiungi stanze e spazi esistenti - Vuoi veramente uscire dallo spazio\? - Esci dallo spazio + Sei stato invitato + Gli Spazi sono un nuovo modo per raggruppare stanze e contatti. + Benvenuto negli Spazi! + Aggiungi stanze e Spazi esistenti + Vuoi veramente uscire dallo Spazio\? + Esci dallo Spazio Aggiungi stanze - Esplora stanze + Guarda le stanze %d persona che conosci si è già unita %d persone che conosci si sono già unite Benvenuti a %1$s, %2$s. - Non sei ancora in nessuna stanza. Sotto trovi alcune stanze consigliate, ma puoi vederne altre con il pulsante verde in fondo a destra. - Questo alias non è accessibile al momento. -\nRiprova più tardi, o chiedi ad un amministratore della stanza di controllare se hai l\'accesso. + Non sei ancora entrato in nessuna stanza. Sotto ne trovi alcune consigliate ma puoi trovarne altre con il pulsante verde in fondo a destra. + Al momento questo alias non è accessibile. +\nRiprova più tardi, o chiedi a un amministratore della stanza di controllare se hai l\'accesso. Unisciti comunque - Unisciti ad uno spazio - Crea spazio - Salta per adesso - Unisciti al mio spazio %1$s %2$s + Unisciti a uno Spazio + Crea Spazio + Per il momento, salta + Unisciti al mio Spazio %1$s %2$s Non faranno parte di %s Solo in questa stanza Potranno esplorare %s Invita in %s - Condividi collegamento + Condividi link Invita per nome utente Invita per email - Ci sei solo tu al momento. %s sarà ancora meglio con gli altri. + Al momento ci sei solo tu. Con più persone %s sarà ancora migliore. Invita persone - Invita persone nel tuo spazio + Invita persone nel tuo Spazio Descrizione - Creazione spazio… + Creazione Spazio… Casuale Generale - Creiamo una stanza per ognuno di esse. Puoi aggiungerne altre in seguito, incluse quelle già esistenti. - Su quali cose stai lavorando\? + Creiamo una stanza per ognuno di essi. Potrai sempre aggiungerne altre a quelle già esistenti. + A cosa stai lavorando\? Creeremo delle stanze per ognuno di essi. Puoi aggiungerne altre in seguito. Di quali argomenti vorresti parlare in %s\? Dagli un nome per continuare. - Aggiungi alcuni dettagli per aiutare le persone ad identificarlo. Puoi modificarli in qualsiasi momento. - Aggiungi alcuni dettagli per renderlo più distinguibile. Puoi modificarli in qualsiasi momento. - Crea uno spazio - Solo su invito, consigliato per te o i team + Aggiungi alcuni dettagli per aiutare le persone ad identificarlo. Potrai modificarli in qualsiasi momento. + Aggiungi alcuni dettagli per renderlo più distinguibile. Potrai modificarli in qualsiasi momento. + Crea uno Spazio + Solo su invito (consigliato per te e per i team di lavoro) Privato - Aperto a tutti, consigliato per le comunità + Aperto a tutti (consigliato per le comunità pubbliche) Pubblico - Uno spazio privato per te e i tuoi compagni + Uno Spazio privato per te e i tuoi compagni Io e i miei compagni - Uno spazio privato per organizzare le tue stanze + Uno Spazio privato per organizzare le tue stanze Solo io Assicurati che le persone giuste abbiano accesso a %s. Puoi cambiarlo in seguito. Con chi stai lavorando\? - Per unirti ad uno spazio esistente, ti serve un invito. + Per unirti ad uno Spazio già esistente, ti serve un invito. Puoi cambiarlo in seguito - Che tipo di spazio vuoi creare\? - Gli spazi sono un nuovo modo di raggruppare stanze e persone - Il tuo spazio privato - Il tuo spazio pubblico - Aggiungi spazio - Esci dalla stanza con un dato ID (o dalla stanza attuale se vuoto) - Unisciti allo spazio con un dato ID - Crea uno spazio - Non controllato + Che tipo di Spazio vuoi creare\? + Gli Spazi sono un nuovo modo di raggruppare stanze e contatti + Il tuo Spazio privato + Il tuo Spazio pubblico + Aggiungi Spazio + Esci dalla stanza con un ID (o dalla stanza attuale se vuota) + Unisciti allo Spazio con un ID + Crea uno Spazio + Deselezionato Cerca nome - Chiunque in uno spazio con questa stanza può trovarla ed entrarci. Solo gli amministratori della stanza possono aggiungerla ad uno spazio. + Chiunque in uno Spazio con questa stanza può trovarla ed entrarci. Solo gli amministratori della stanza possono aggiungerla ad uno Spazio. Spazi Chiunque può trovarla ed entrare Pubblica Solo le persone invitate possono trovarla ed entrare Privata Impostazione di accesso sconosciuta (%s) - Chiunque può bussare alla porta, poi i membri possono accettare o rifiutare + Chiunque può chiedere di poter entrare, poi i membri decidono se accettare o rifiutare Permetti l\'ingresso agli ospiti Spazi Inviti Stanze suggerite - Gestisci stanze e spazi + Gestisci stanze e Spazi Segna come non consigliato Segna come consigliato Consigliato - Rendi questo spazio pubblico + Rendi pubblico questo Spazio Gestisci stanze - Cerchi qualcuno non in %s\? + Cerchi qualcuno che non è in %s\? %s ti ha invitato Questa stanza è pubblica Invia i file multimediali nella dimensione originale @@ -2829,8 +2829,31 @@ Invia i video nella dimensione originale Il file è troppo grande per essere inviato. - Compressione video %d%% - Compressione immagine… + Compressione del video %d%% + Compressione dell\'immagine… Usa come predefinito e non chiedere più Chiedi sempre + In questo Spazio non ci sono stanze + Invita a %s + Questa funzione è in via di sviluppo + Invia un feedback + L\'invio del feedback non è riuscito (%s) + Grazie! Il tuo feedback è stato ricevuto + Se hai altre domande puoi contattarmi + Gli Spazi sono ancora in via di sviluppo. Il tuo feedback ci è utile per migliorarli. Il tuo nome utente e i dati sull\'App verranno comunicati per permetterci di utilizzare il tuo feedback al meglio. + Feedback + Feedback sugli Spazi + Ops! Qualcosa è andato storto nel cercar di entrare nella conferenza + Sei l\'Amministratore di questo Spazio. Assicurati di aver nominato un altro amministratore prima di uscire. + Sei l\'unico utente di questo Spazio. Se esci nessuno potrà più entrarci. Nemmeno tu. + Aggiungi stanze + Spazio sperimentale - Mostra solo stanze orfane nella Home + Alcune stanze potrebbero essere nascoste perché sono private e ti serve il loro invito. + Alcune stanze potrebbero essere nascoste perché sono private e ti serve il loro invito. +\nNon hai il permesso di aggiungere stanze. + Per maggiori informazioni contatta il tuo Home Server + Pare che il tuo Home Server non supporti ancora gli Spazi + Ti piace sperimentare\? +\nProva ad inserire uno Spazio all\'interno di un altro Spazio. + Questo non è uno Spazio pubblico. Senza un invito non potrai più rientrare. \ No newline at end of file From dd0c813e71950294ab0be009e5859124e819f974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viorel-C=C4=83t=C4=83lin=20R=C4=83pi=C8=9Beanu?= Date: Wed, 26 May 2021 16:32:52 +0000 Subject: [PATCH 009/254] Translated using Weblate (Romanian) Currently translated at 8.7% (216 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ro/ --- vector/src/main/res/values-ro/strings.xml | 49 +++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/vector/src/main/res/values-ro/strings.xml b/vector/src/main/res/values-ro/strings.xml index 866c827cf2..43fc70ba2b 100644 --- a/vector/src/main/res/values-ro/strings.xml +++ b/vector/src/main/res/values-ro/strings.xml @@ -197,4 +197,53 @@ Mesaje directe Mesaje directe Nu vreau mesajele mele criptate + Format Markdown + Sesiuni + Contacte locale + Criptografie + Integrări + Avansat + Utilizatori ignorați + Notificări + Setările utilizatorului + Politica de confidențialitate + Drepturi de autor + Termene și condiții + Versiune olm + Versiune + Optimizat pentru baterie + Când sunt invitat într-o cameră + Configurează notificările silențioase + Sunet de notificare + Confidențialitate redusă + Adaugă un cont + Repară serviciile Google Play + Verifică setările + Setări personalizate. + Activează + Setările sesiunii. + Activează + Setările contului. + Deschide setările + Setări de sistem. + Numere de telefon + Nu a fost adăugat nicio adresă de e-mail pentru contul dumneavoastră + Adrese de e-mail + Adaugă un număr de telefon + Nu a fost adăugat niciun număr de telefon pentru contul dumneavoastră + Telefon + Adaugă o adresă de e-mail + E-mail + Numele afișat + Poza de profil + Setări + Adaugă la ecranul de pornire + Uită + Părăsește conversația + Deprioritizează + Favorite + Mut + Doar mențiunile + Toate mesajele + Schimbă setările \ No newline at end of file From 31c90d9810aa8daa3ee4225f1ce7ba21d512eb8f Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 25 May 2021 16:16:30 +0000 Subject: [PATCH 010/254] Translated using Weblate (Albanian) Currently translated at 99.5% (2464 of 2475 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 | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index 2a597dd978..2a029284c5 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -2662,7 +2662,7 @@ \nPo shkarkohen të dhëna… Njëkohësimi Fillestar: \nPo pritet për përgjigje nga shërbyesi… - Hapësirat janë mënyra për të grupuar dhoma dhe persona për punë, zbavitje ose thjesht për veten tuaj. + Hapësirat janë mënyra për të grupuar dhoma dhe persona. Sinjalizimi lyp mbulim nga shërbyesi dhe version eksperimental dhome Hapësirë Eksperimentale - Dhomë e Kufizuar. Jeni ftuar @@ -2761,4 +2761,27 @@ Po ngjeshet figurë… Përdore si parazgjedhje dhe mos pyet sërish Pyet përherë + Disa dhoma mund të jenë të fshehura, ngaqë janë private dhe mund t’ju duhet një ftesë. + Disa dhoma mund të jenë të fshehura, ngaqë janë private dhe ju duhet një ftesë. +\nS’keni leje të shtoni dhoma. + Kjo hapësirë s’ka dhoma + Ju lutemi, për më tepër hollësi, lidhuni me përgjegjësin e shërbyesit tuaj Home + Duket sikur shërbyesi juaj Home nuk mbulon ende Hapësira + Ndiheni eksperimentues\? +\nMund të shtoni te një hapësirë hapësira ekzistuese. + Hapësirë Eksperimentale - Shfaq jetimë te Kreu + Shtoni dhoma + Jeni përgjegjës i kësaj hapësirë, sigurohuni se keni shpërngulur të drejt përgjegjësi te një anëtar tjetër, përpara braktisjes. + Kjo hapësirë s’është publike. S’do të jeni në gjendje të rihyni pa një ftesë. + Jeni personi i vetëm këtu. Nëse ikni, askush s’do të jetë në gjendje të marrë pjesë në të ardhmen, përfshi ju. + Ftojeni te %s + Kjo veçori është në fazë beta + Jepni Përshtypje + Dështoi dërgimi i përshtypjeve (%s) + Faleminderit, përshtypjet tuaja u dërguan me sukses + Mund të lidheni me mua, nëse keni ndonjë pyetje më tej + Po përdorni një version beta të hapësirave. Përshtypjet tuaja do të ndihmojnë në përmirësimin e versioneve të ardhshëm. Platforma dhe emri juaj i përdoruesit do të mbahen shënim, për të na ndihmuar të përdoren përshtypjet tuaja sa më shumë që të jetë e mundur. + Përshtypje + Përshtypje për hapësirat + Na ndjeni, ndodhi një gabim teksa provohej të hyhej te konferenca \ No newline at end of file From 0d9cba597df6e094a8dad156dc26271c748b0e92 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 26 May 2021 03:07:13 +0000 Subject: [PATCH 011/254] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2475 of 2475 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 | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index b495cea7c9..086563b441 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -2625,7 +2625,7 @@ 警告需要伺服器支援與實驗性聊天室版本 實驗性空間 - 受限制的聊天室。 您被邀請了 - 空間是將聊天室與夥伴依工作、娛樂或是您自己的喜好分組的方式。 + 空間是將聊天室與人們分組的新方式。 歡迎使用空間! 新增既有的聊天室與空間 您確定您想要離開空間嗎? @@ -2718,4 +2718,27 @@ 正在壓縮圖片…… 預設使用,不再詢問 總是詢問 + 有些聊天室可能是隱藏的,因為其為私人聊天室,您需要邀請。 + 有些聊天室可能是隱藏的,因為其為私人聊天室,您需要邀請。 +\n您沒有權限新增聊天室。 + 此空間沒有聊天室 + 請聯絡您的家伺服器管理員以取得進一步的資訊 + 看來您的家伺服器尚未支援空間 + 想要做點實驗嗎? +\n您可以將既有的空間新增至其他空間中。 + 實驗性空間,僅在首頁顯示無人看管的聊天室 + 新增聊天室 + 您是此空間的管理員,請確保在您離開前已將管理權轉交給另一個成員。 + 此空間並非公開。您將無法在無邀請的狀況下重新加入。 + 您是這裡唯一的人。如果您離開,包含您在內的所有人都將無法加入。 + 邀請至 %s + 此功能仍在測試版 + 給予回饋 + 回饋傳送失敗 (%s) + 謝謝,您的回饋已成功傳送 + 如果您有任何後續的問題,歡迎聯絡我 + 您正在使用空間的測試版本。您的回饋有助於改善未來的版本。我們將會紀錄您的平台與使用者名稱以協助我們使用您的回饋。 + 回饋 + 空間回饋 + 抱歉,嘗試加入會議時發生錯誤 \ No newline at end of file From 13198d09ed072aa63b31516820c93d2b685572a2 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 26 May 2021 06:37:06 +0000 Subject: [PATCH 012/254] Translated using Weblate (Ukrainian) Currently translated at 94.7% (18 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- fastlane/metadata/android/uk/changelogs/40101070.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/uk/changelogs/40101070.txt diff --git a/fastlane/metadata/android/uk/changelogs/40101070.txt b/fastlane/metadata/android/uk/changelogs/40101070.txt new file mode 100644 index 0000000000..4d60bb1704 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: бета-підтримка Spaces. Стиснення відео перед надсиланням. +Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.7 From a26fc407445b9c67be214bc7b0ac9655ed6e8227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 26 May 2021 06:31:34 +0000 Subject: [PATCH 013/254] Translated using Weblate (Estonian) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/et/ --- fastlane/metadata/android/et/changelogs/40101070.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/et/changelogs/40101070.txt diff --git a/fastlane/metadata/android/et/changelogs/40101070.txt b/fastlane/metadata/android/et/changelogs/40101070.txt new file mode 100644 index 0000000000..8ef65a7396 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Põhilised muudatused selles versioonis: beeta-versioon kogukonnakeskustest ja videofailide pakkimine enne üleslaadimist. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.7 From 54f26b43756dcce4238480934dca68230d082ea3 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 26 May 2021 02:43:33 +0000 Subject: [PATCH 014/254] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/ --- fastlane/metadata/android/zh-Hant/changelogs/40101070.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/40101070.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101070.txt b/fastlane/metadata/android/zh-Hant/changelogs/40101070.txt new file mode 100644 index 0000000000..c62c7d5224 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/40101070.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:對「空間」的測試版支援。傳送前壓縮影片。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.7 From a6362651049d5864b5fd10d74c02eeebe490872b Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 26 May 2021 09:57:26 +0000 Subject: [PATCH 015/254] Translated using Weblate (Czech) Currently translated at 94.7% (18 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/ --- .../metadata/android/cs/full_description.txt | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/fastlane/metadata/android/cs/full_description.txt b/fastlane/metadata/android/cs/full_description.txt index f9c1f2ad0c..7d84b1cf88 100644 --- a/fastlane/metadata/android/cs/full_description.txt +++ b/fastlane/metadata/android/cs/full_description.txt @@ -1,30 +1,39 @@ -Element je nový typ aplikace pro výměnu zpráv a spolupráci, která: +Element je zabezpečený komunikátor a zároveň aplikace pro týmovou spolupráci, která je ideální pro skupinové chaty při práci na dálku. Tato chatovací aplikace využívá end-to-end šifrování a poskytuje výkonné videokonference, sdílení souborů a hlasové hovory. -1. Vám dá kontrolu nad ochranou vašeho soukromí -2. Umožní vám komunikovat s kýmkoli v síti Matrix a dokonce i mimo ni pomocí integrací s aplikacemi, jako je Slack -3. Ochrání vás před inzercí, dataminingem a uzavřenými zahradami -4. Zabezpečí vás end-to-end šifrováním s křížovým podpisem pro ověření ostatních +Mezi funkce aplikace Element patří: +- Pokročilé nástroje pro online komunikaci +- Plně šifrované zprávy umožňující bezpečnější firemní komunikaci i pro pracovníky na dálku +- Decentralizovaný chat založený na open source frameworku Matrix +- Bezpečné sdílení souborů se šifrovanými daty při správě projektů +- Videochaty s funkcí Voice over IP a sdílením obrazovky +- Snadná integrace s oblíbenými nástroji pro online spolupráci, nástroji pro správu projektů, službami VoIP a dalšími aplikacemi pro týmovou komunikaci -Element je zcela odlišný od ostatních aplikací pro zasílání zpráv a spolupráci, protože je decentralizovaný a otevřený. +Element se zcela liší od ostatních aplikací pro zasílání zpráv a spolupráci. Funguje na platformě Matrix, otevřené síti pro bezpečné zasílání zpráv a decentralizovanou komunikaci. Umožňuje vlastní hostování, aby uživatelé měli maximální vlastnictví a kontrolu nad svými daty a zprávami. -Element vám umožňuje použít vlastní domovský server - nebo si vybrat hostitele - abyste měli soukromí, vlastnictví a kontrolu nad svými daty a konverzacemi. Poskytuje vám přístup k otevřené síti; takže nejste zaseknuti jen při konverzaci s ostatními uživateli Elementu. A je velmi bezpečný. +Soukromí a šifrované zprávy +Element vás chrání před nežádoucími reklamami, vytěžováním dat a tzv. walled gardens. Zabezpečuje také všechna vaše data, video a hlasovou komunikaci jeden na jednoho prostřednictvím šifrování end-to-end a křížového ověřování zařízení. -Element je toho všeho schopen, protože pracuje na Matrixu - standardu otevřené, decentralizované komunikace. +Element vám dává kontrolu nad vaším soukromím a zároveň vám umožňuje bezpečně komunikovat s kýmkoli v síti Matrix nebo s dalšími nástroji pro firemní spolupráci díky integraci s aplikacemi, jako je Slack. -Element vám dává kontrolu nad tím, že si můžete vybrat, kdo bude hostovat vaše konverzace. Z aplikace Element si můžete vybrat hostování různými způsoby: +Element lze hostovat samostatně +Abyste měli větší kontrolu nad svými citlivými daty a konverzacemi, může být Element hostován na vlastním hardwaru nebo si můžete vybrat libovolného hostitele založeného na systému Matrix - standardu pro decentralizovanou komunikaci s otevřeným zdrojovým kódem. Element vám poskytuje soukromí, soulad se zásadami bezpečnosti a flexibilitu integrace. -1. Získejte zdarma účet na veřejném serveru matrix.org hostovaném vývojáři Matrixu, nebo si vyberte z tisíců veřejných serverů hostovaných dobrovolníky -2. Hostujte svůj účet spuštěním serveru na svém vlastním hardwaru -3. Zaregistrujte si účet na vlastním serveru jednoduchým přihlášením k hostitelské platformě Element Matrix Services +Vlastněte svá data +Sami rozhodujete, kde budou vaše data a zprávy uloženy. Bez rizika vytěžování dat nebo přístupu třetích stran. -Proč zvolit Element? +Element vám dává kontrolu různými způsoby: +1. Získejte bezplatný účet na veřejném serveru matrix.org, který hostují vývojáři Matrixu, nebo si vyberte z tisíců veřejných serverů hostovaných dobrovolníky. +2. Vlastní hostování účtu spuštěním serveru na vlastní IT infrastruktuře. +3. Zaregistrujte si účet na vlastním serveru tak, že si jednoduše předplatíte hostingovou platformu Element Matrix Services. -VLASTNĚTE SVÁ DATA: Vy rozhodnete, kde svá data a zprávy ponecháte. Vlastníte je a jsou pod vaší kontrolou, ne nějaký MEGACORP, který těží vaše data nebo poskytuje přístup třetím stranám. +Otevřené zasílání zpráv a spolupráce +Můžete chatovat s kýmkoli v síti Matrix, ať už používá aplikaci Element, jinou aplikaci podporující protokol Matrix nebo dokonce i když používá jinou aplikaci pro zasílání zpráv. -ZPRÁVY A SPOLUPRÁCE: Můžete chatovat s kýmkoli v síti Matrix, ať už používá Element nebo jinou aplikaci, a to i v případě, že používají jiný systém zasílání zpráv, jako je Slack, IRC nebo XMPP. +Superbezpečné +Skutečné end-to-end šifrování (zprávy mohou dešifrovat pouze účastníci konverzace) a křížové ověřování zařízení. -MAXIMÁLNĚ BEZPEČNÉ: Skutečné šifrování typu end-to-end (pouze ti v konverzaci mohou dešifrovat zprávy) a křížové podepisování k ověření zařízení účastníků konverzace. +Kompletní komunikace a integrace +Zprávy, hlasové a videohovory, sdílení souborů, sdílení obrazovky a celá řada integrací, botů a widgetů. Vytvářejte místnosti, komunity, zůstaňte v kontaktu a spolupracujte. -KOMPLETNÍ KOMUNIKACE: Zprávy, hlasové hovory a videohovory, sdílení souborů, sdílení obrazovky a celá řada integrací, robotů a widgetů. Budujte místnosti, komunity, zůstaňte v kontaktu a spolupracujte. - -KDEKOLIV JSTE: Zůstaňte v kontaktu, ať jste kdekoli, s plně synchronizovanou historií zpráv na všech vašich zařízeních a na webu na adrese https://app.element.io. +Navažte tam, kde jste skončili +Zůstaňte v kontaktu, ať jste kdekoli, díky plně synchronizované historii zpráv ve všech zařízeních a na webu https://app.element.io. From 01aea6a260f6332d418bedcc2e30d28b47323251 Mon Sep 17 00:00:00 2001 From: Kaa Jii Date: Thu, 27 May 2021 18:56:31 +0000 Subject: [PATCH 016/254] Translated using Weblate (Italian) Currently translated at 99.7% (2469 of 2475 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 | 86 +++++++++++------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 2ea18d9ae2..0a37b8cff1 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -591,7 +591,7 @@ Utenti File Impostazioni - ID malformato. Dovrebbe essere un indirizzo email o un ID utente come \'@localpart:domain\' + ID malformato. Dovrebbe essere un indirizzo email o un ID utente Matrix come \'@localpart:domain\' INVITATI MEMBRI @@ -814,9 +814,9 @@ Esporta le chiavi delle stanze Esporta le chiavi in un file locale Esporta - Inserisci frase di sicurezza - Conferma frase di sicurezza - Le chiavi di crittografia E2E della stanza sono state salvate su \'%s\'. + Inserisci la Passphrase + Conferma la Passphrase + Le chiavi per la crittografia E2E della stanza sono state salvate su \'%s\'. \n \nAttenzione: se si disinstalla quest\'applicazione il file viene eliminato. Importa le chiavi di crittografia E2E della stanza @@ -1051,7 +1051,7 @@ Richiedi di nuovo le chiavi di crittografia dalle tue altre sessioni. La richiesta della chiave è stata inviata. Richiesta inviata - Avvia ${app_name} su un altro dispositivo capace di decifrare il messaggio in modo che poi possa inviarti le chiavi su questa sessione. + Avvia ${app_name} su un altro dispositivo capace di decrittare il messaggio in modo che poi possa inviarti le chiavi su questa sessione. Digita qui… Invia messaggio vocale prosegui con… @@ -1132,9 +1132,9 @@ Spiacente, si è verificato un errore Caricamento differito dei membri della stanza Versione %s - Crea una password per mettere al sicuro le chiavi esportate. La stessa password dovrà essere usata per poter importare le chiavi. - Crea una frase di sicurezza - La frase di sicurezza non corrisponde + Crea una Passphrase per mettere al sicuro le chiavi esportate. La stessa Passphrase dovrà essere usata anche per importare le chiavi. + Crea una Passphrase + La Passphrase non corrisponde espandi riduci Mostra l\'area informazioni @@ -1246,14 +1246,14 @@ Fatto Impostazioni di notifica avanzate Se ti disconnetti adesso perderai i tuoi messaggi cifrati - Il Backup delle chiavi è in corso. Se ti disconnetti adesso perderai i tuoi messaggi cifrati. + Il Backup delle chiavi è in corso. Se ti disconnetti adesso perderai i tuoi messaggi criptati. Il Backup delle chiavi deve essere attivo su tutte le tue sessioni per evitare di perdere l\'accesso ai tuoi messaggi cifrati. Non voglio i miei messaggi cifrati Backup delle chiavi… Usa il Backup delle chiavi Sei sicuro\? Backup - Perderai l\'accesso ai tuoi messaggi cifrati a meno che tu non faccia il Backup delle chiavi prima di disconnetterti. + Perderai l\'accesso ai tuoi messaggi criptati a meno che tu non faccia il Backup delle chiavi prima di disconnetterti. Rimani Interrompi Ignora @@ -1280,7 +1280,7 @@ Scegli il colore del LED, la vibrazione, il suono… Gestione chiavi crittografiche Invia il messaggio col tasto Invio - Il tasto Invio della tastiera, invece di andare a capo invierà il messaggio + Il tasto Invio della tastiera invece di andare a capo invierà il messaggio La modalità risparmio dati applica un filtro specifico che esclude gli aggiornamenti di presenza e le notifiche di scrittura. Aggiorna la password La password non è valida @@ -1289,9 +1289,9 @@ Gestisci il Backup delle chiavi Silenzioso Inserisci un nome utente. - Inserisci una password - La frase di sicurezza è troppo debole - Cancella la password se vuoi che ${app_name} generi un codice di recupero. + Inserisci una Passphrase + La Passphrase è troppo debole + Cancella la Passphrase se vuoi che ${app_name} generi un codice di recupero. Non c\'è alcuna sessione Matrix disponibile Non perdere mai i messaggi cifrati I messaggi nelle stanze cifrate sono protetti con crittografia E2E. Solo tu e i destinatarii avete le chiavi crittografiche per leggere questi messaggi. @@ -1300,18 +1300,18 @@ Inizia ad usare il Backup delle chiavi crittografiche (Avanzato) Esporta manualmente le chiavi crittografiche - Proteggi il tuo backup con una password. - Una copia cifrata delle tue chiavi crittografiche sarà salvata sul tuo Home Server. Proteggi il tuo Backup con una password per tenerlo al sicuro. -\n -\nPer una maggior sicurezza, è meglio che la password del Backup delle chiavi sia diversa da quella del tuo account. - Imposta frase di sicurezza + Proteggi il tuo backup con una Passphrase. + Una copia criptata delle tue chiavi crittografiche sarà salvata sul tuo Home Server. Proteggi il tuo Backup con una Passphrase per tenerla al sicuro. +\n +\nPer una maggior sicurezza, è meglio che la Passphrase del Backup delle chiavi sia diversa dalla password del tuo account. + Imposta la Passphrase Creazione backup Oppure, proteggi il tuo Backup con un codice di recupero, salvandolo in un luogo sicuro. (Avanzato) Imposta un codice di recupero Fatto! Il Backup delle tue chiavi crittografiche è in corso. - Il tuo codice di recupero è un\'ancora di salvezza - puoi usarlo per riaccedere ai tuoi messaggi cifrati se dimentichi la password. -\nSalva il tuo codice di recupero in un luogo sicuro, tipo un password manager (o una cassaforte) + Il tuo codice di recupero è un\'ancora di salvezza - puoi usarlo per riaccedere ai tuoi messaggi criptati qualora dimenticassi la Passphrase. +\nSalva il tuo codice di recupero in un luogo sicuro, come un password manager (o una cassaforte) Salva il tuo codice di recupero in un luogo sicuro, come un password manager (o una cassaforte) Fatto Ho fatto una copia @@ -1323,7 +1323,7 @@ \nAttenzione: se l\'applicazione su cui è salvato venisse disinstallata, il codice di recupero verrà perso. Si prega di farne una copia Condividi il codice di recupero con… - Generazione del codice di recupero usando la password. Questo processo può durare alcuni secondi. + Generazione del codice di recupero basato sulla Passphrase. Questo processo può durare alcuni secondi. Codice di recupero Errore inatteso Backup avviato @@ -1331,14 +1331,14 @@ Sei sicuro\? Se ti disconnetti o perdessi questo dispositivo potresti perdere l\'accesso ai tuoi messaggi. Verifica versione backup… - Usa la tua password di recupero per sbloccare i messaggi cifrati + Usa la tua Passphrase per sbloccare i messaggi criptati usa il tuo codice di recupero - Se non conosci la tua password di recupero, puoi %s. + Se non ricordi la tua Passphrase, puoi %s. Usa il tuo codice di recupero per sbloccare la Timeline dei messaggi cifrati Inserisci codice di recupero Ripristino messaggio Hai perso il codice di recupero\? Nelle Impostazioni puoi crearne uno nuovo. - Impossibile decifrare il backup con questa password: verifica che la password di recupero inserita sia corretta. + Impossibile decrittare il backup con questa Passphrase: verifica che sia corretta. Errore di rete: controlla la tua connessione e riprova. Ripristino Backup: Codice di recupero in elaborazione… @@ -1370,7 +1370,7 @@ Il backup ha una firma non valida dalla sessione verificata %s Il backup ha una firma non valida dalla sessione non verificata %s Impossibile ottenere info di fiducia per il backup (%s). - Per usare il backup delle chiavi crittografiche su questa sessione, devi accedervi con la password o con il codice di recupero. + Per usare il backup delle chiavi crittografiche su questa sessione, devi accedervi con la Passphrase o con il codice di recupero. Eliminazione Backup… Eliminazione backup fallita (%s) Elimina Backup @@ -1745,7 +1745,7 @@ %1$s ha reso la stanza pubblica. Ora è raggiungibile da chiunque ne conosca l\'indirizzo. %1$s ha reso la stanza accessibile solo su invito. Messaggi non letti - Detieni il controllo sulle -tue- conversazioni. + Le -tue- conversazioni appartengono solo a te. Scambia messaggi diretti o nei gruppi Rendi sicure le tue conversazioni grazie alla crittografia Estendi e personalizza la tua esperienza @@ -2033,11 +2033,11 @@ Opzione selezionata Crea un semplice sondaggio - Usa una frase o chiave di recupero + Usa una Passphrase o un codice di recupero Se non puoi accedere a una sessione esistente Nuovo accesso Impossibile trovare segreti nell\'archivio - Inserisci la frase di sicurezza dell\'archivio segreto + Inserisci la Passphrase dell\'archivio segreto Attenzione: Dovresti accedere all\'archivio segreto solo da un dispositivo fidato Rimuovi… @@ -2075,7 +2075,7 @@ \nTi consigliamo di cambiare immediatamente la password e le chiavi di recupero nelle impostazioni. Verifica i tuoi dispositivi nelle impostazioni. Verifica annullata - Frase di ripristino + Passphrase di ripristino Chiave dei messaggi Password dell\'account Imposta una %s @@ -2093,7 +2093,7 @@ Fine Usa questa %1$s come una rete di salvataggio in caso dimenticassi la tua %2$s. Pubblicazione delle chiavi di identità create - Generazione della chiave di sicurezza dalla password + Generazione di una chiave sicura basata sulla Passphrase Definizione della chiave predefinita SSSS Sincronizzazione della chiave principale Sincronizzazione della chiave utente @@ -2106,10 +2106,10 @@ Salvala in una penna USB o disco di backup Copiala sul Cloud Non puoi farlo dallo smartphone - Impostare una password dei messaggi ti consente di proteggere e sbloccare i messaggi criptati e verifiche. + Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche. \n -\nSe non vuoi impostare una password dei messaggi puoi generare una chiave dei messaggi. - Impostare una password di ripristino ti consente di proteggere e sbloccare i messaggi cifrati le verifiche. +\nSe non vuoi impostare una Password dei messaggi puoi generare una chiave dei messaggi. + Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche. Crittografia attiva I messaggi in questa stanza sono crittografati E2E. Maggiori info e verifica degli utenti nel loro profilo. Crittografia non attiva @@ -2134,20 +2134,20 @@ Inserisci la tua %s per continuare Usa file Inserisci %s - Frase di recupero + Passphrase di ripristino Non è una chiave di ripristino valida Inserisci una chiave di ripristino Controllo della chiave di backup Controllo della chiave di backup (%s) Rilevazione chiave di curva ellittica - Generazione chiave SSSS dalla password - Generazione chiave SSSS dalla password (%s) + Generazione chiave SSSS basata sulla Passphrase + Generazione chiave SSSS basata sulla Passphrase (%s) Generazione chiave SSSS dalla chiave di ripristino Memorizzazione segreto della chiave in SSSS %1$s (%2$s) - Inserisci la password del backup chiavi per continuare. + Per continuare inserisci la Passphrase del backup delle chiavi. usare la chiave di ripristino del backup chiavi - Non conosci la password del backup chiavi, puoi %s. + Non conosci la Passphrase del backup delle chiavi, puoi %s. Chiave di ripristino del backup chiavi Impedisci la cattura di schermate dell\'app Attivandolo verrà aggiunto FLAG_SECURE a tutte le attività. Riavvia l\'applicazione per applicare le modifiche. @@ -2282,9 +2282,9 @@ Imposta il Backup Sicuro Reimposta il Backup Sicuro Configura in questo dispositivo - Per evitare di non poter più accedere ai messaggi e dati cifrati fai un backup delle chiavi crittografiche sul tuo server. + Per evitare di non poter più accedere ai messaggi e dati criptati fai un backup delle chiavi crittografiche sul tuo server. Genera una nuova chiave di sicurezza o imposta una nuova frase di sicurezza per il backup esistente. - Ciò sostituirà la tua attuale chiave o frase. + Questo sostituirà la tua attuale chiave o frase. Le integrazioni sono disattivate Attiva \'Permetti integrazioni\' nelle impostazioni per continuare. @@ -2457,7 +2457,7 @@ Se reimposti tutto Fallo solo se non hai altri dispositivi con cui fare la verifica. Reimposta tutto - Dimenticato o perso tutte le opzioni di recupero\? Reimposta tutto + Hai dimenticato o perso tutte le opzioni di ripristino\? Reimposta tutto Sei entrato. I messaggi in questa stanza sono crittografati E2E. Esci @@ -2506,7 +2506,7 @@ Nome stanza Esporta revisione Messaggio diretto - Invia cronologia di richieste condivisione chiave + Invia cronologia delle richieste di condivisione chiave Nessun altro risultato Link Matrix Codice QR non scansionato! From c90717a2c8acecddcd8e8921287a6f44a2c67e29 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 28 May 2021 18:17:14 +0200 Subject: [PATCH 017/254] Asserted identity: introduce new content --- .../sdk/api/session/events/model/EventType.kt | 2 + .../model/call/CallAssertedIdentityContent.kt | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAssertedIdentityContent.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt index 229a53fa9d..9c3fdd57da 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt @@ -76,6 +76,8 @@ object EventType { const val CALL_NEGOTIATE = "m.call.negotiate" const val CALL_REJECT = "m.call.reject" const val CALL_HANGUP = "m.call.hangup" + const val CALL_ASSERTED_IDENTITY = "m.call.asserted_identity" + const val CALL_ASSERTED_IDENTITY_PREFIX = "org.matrix.call.asserted_identity" // This type is not processed by the client, just sent to the server const val CALL_REPLACES = "m.call.replaces" diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAssertedIdentityContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAssertedIdentityContent.kt new file mode 100644 index 0000000000..4c5413425f --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAssertedIdentityContent.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api.session.room.model.call + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * This event is sent by the callee when they wish to answer the call. + */ +@JsonClass(generateAdapter = true) +data class CallAssertedIdentityContent( + /** + * Required. The ID of the call this event relates to. + */ + @Json(name = "call_id") override val callId: String, + /** + * Required. ID to let user identify remote echo of their own events + */ + @Json(name = "party_id") override val partyId: String? = null, + /** + * Required. The version of the VoIP specification this messages adheres to. + */ + @Json(name = "version") override val version: String?, + + /** + * Optional. Used to inform the transferee who they're now speaking to. + */ + @Json(name = "asserted_identity") val assertedIdentity: AssertedIdentity? = null +) : CallSignalingContent { + + /** + * A user ID may be included if relevant, but unlike target_user, it is purely informational. + * The asserted identity may not represent a matrix user at all, + * in which case just a display_name may be given, or a perhaps a display_name and avatar_url. + */ + @JsonClass(generateAdapter = true) + data class AssertedIdentity( + @Json(name = "id") val id: String? = null, + @Json(name = "display_name") val displayName: String? = null, + @Json(name = "avatar_url") val avatarUrl: String? = null + ) +} From 0098d435b39d8d4e2109c3318fe1f542af8fb9d5 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 28 May 2021 18:42:29 +0200 Subject: [PATCH 018/254] Asserted identity: process event --- .../sdk/api/session/call/CallListener.kt | 8 +++++ .../session/call/CallEventProcessor.kt | 4 ++- .../session/call/CallListenersDispatcher.kt | 5 ++++ .../session/call/CallSignalingHandler.kt | 29 ++++++++++++++----- .../app/features/call/webrtc/WebRtcCall.kt | 12 ++++++++ .../features/call/webrtc/WebRtcCallManager.kt | 9 ++++++ 6 files changed, 59 insertions(+), 8 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt index 303add747f..4704a657df 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt @@ -17,6 +17,7 @@ package org.matrix.android.sdk.api.session.call import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -61,4 +62,11 @@ interface CallListener { * Called when the call has been managed by an other session */ fun onCallManagedByOtherSession(callId: String) + + /** + * Called when an asserted identity event is received + */ + fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) + + } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt index a190ff62ac..8bf2014639 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt @@ -37,7 +37,9 @@ internal class CallEventProcessor @Inject constructor(private val callSignalingH EventType.CALL_CANDIDATES, EventType.CALL_INVITE, EventType.CALL_HANGUP, - EventType.ENCRYPTED + EventType.ENCRYPTED, + EventType.CALL_ASSERTED_IDENTITY, + EventType.CALL_ASSERTED_IDENTITY_PREFIX ) private val eventsToPostProcess = mutableListOf() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt index 1de2d8a106..dad17f4ac9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallListenersDispatcher.kt @@ -20,6 +20,7 @@ import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.call.CallListener import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -64,6 +65,10 @@ internal class CallListenersDispatcher(private val listeners: Set) it.onCallNegotiateReceived(callNegotiateContent) } + override fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) = dispatch { + it.onCallAssertedIdentityReceived(callAssertedIdentityContent) + } + private fun dispatch(lambda: (CallListener) -> Unit) { listeners.toList().forEach { tryOrNull { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt index 61ea660b60..d18737d31b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallSignalingHandler.kt @@ -23,6 +23,7 @@ import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -53,30 +54,44 @@ internal class CallSignalingHandler @Inject constructor(private val activeCallHa fun onCallEvent(event: Event) { when (event.getClearType()) { - EventType.CALL_ANSWER -> { + EventType.CALL_ANSWER -> { handleCallAnswerEvent(event) } - EventType.CALL_INVITE -> { + EventType.CALL_INVITE -> { handleCallInviteEvent(event) } - EventType.CALL_HANGUP -> { + EventType.CALL_HANGUP -> { handleCallHangupEvent(event) } - EventType.CALL_REJECT -> { + EventType.CALL_REJECT -> { handleCallRejectEvent(event) } - EventType.CALL_CANDIDATES -> { + EventType.CALL_CANDIDATES -> { handleCallCandidatesEvent(event) } - EventType.CALL_SELECT_ANSWER -> { + EventType.CALL_SELECT_ANSWER -> { handleCallSelectAnswerEvent(event) } - EventType.CALL_NEGOTIATE -> { + EventType.CALL_NEGOTIATE -> { handleCallNegotiateEvent(event) } + EventType.CALL_ASSERTED_IDENTITY, + EventType.CALL_ASSERTED_IDENTITY_PREFIX -> { + handleCallAssertedIdentityEvent(event) + } } } + private fun handleCallAssertedIdentityEvent(event: Event) { + val content = event.getClearContent().toModel() ?: return + val call = content.getCall() ?: return + if (call.ourPartyId == content.partyId) { + // Ignore remote echo (not that we send asserted identity, but still...) + return + } + callListenersDispatcher.onCallAssertedIdentityReceived(content) + } + private fun handleCallNegotiateEvent(event: Event) { val content = event.getClearContent().toModel() ?: return val call = content.getCall() ?: return diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt index f2a008feb7..319fef87f9 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt @@ -51,6 +51,7 @@ import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.call.MxPeerConnectionState import org.matrix.android.sdk.api.session.call.TurnServerResponse import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -104,6 +105,7 @@ class WebRtcCall( fun onCaptureStateChanged() {} fun onCameraChanged() {} fun onHoldUnhold() {} + fun assertedIdentityChanged() {} fun onTick(formattedDuration: String) {} override fun onStateUpdate(call: MxCall) {} } @@ -168,6 +170,8 @@ class WebRtcCall( // This value is used to track localOnHold when changing remoteOnHold value private var wasLocalOnHold = false + var remoteAssertedIdentity: CallAssertedIdentityContent.AssertedIdentity? = null + private set var offerSdp: CallInviteContent.Offer? = null @@ -877,6 +881,14 @@ class WebRtcCall( } } + fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) { + if (callAssertedIdentityContent.assertedIdentity == null) return + remoteAssertedIdentity = callAssertedIdentityContent.assertedIdentity + listeners.forEach { + tryOrNull { it.assertedIdentityChanged() } + } + } + // MxCall.StateListener override fun onStateUpdate(call: MxCall) { diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt index 3c18d97937..a333d5e81b 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt @@ -37,6 +37,7 @@ import org.matrix.android.sdk.api.session.call.CallListener import org.matrix.android.sdk.api.session.call.CallState import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent +import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent @@ -420,4 +421,12 @@ class WebRtcCallManager @Inject constructor( Timber.v("## VOIP onCallManagedByOtherSession: $callId") onCallEnded(callId) } + + override fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) { + val call = callsByCallId[callAssertedIdentityContent.callId] + ?: return Unit.also { + Timber.w("onCallAssertedIdentityReceived for non active call? ${callAssertedIdentityContent.callId}") + } + call.onCallAssertedIdentityReceived(callAssertedIdentityContent) + } } From 5efcb93fb07357271b57b1fbcdeeb55436bb4046 Mon Sep 17 00:00:00 2001 From: libexus Date: Sat, 29 May 2021 12:13:52 +0000 Subject: [PATCH 019/254] Translated using Weblate (German) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/de/ --- .../android/de/changelogs/40101070.txt | 6 +++++ .../metadata/android/de/full_description.txt | 24 +++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 fastlane/metadata/android/de/changelogs/40101070.txt diff --git a/fastlane/metadata/android/de/changelogs/40101070.txt b/fastlane/metadata/android/de/changelogs/40101070.txt new file mode 100644 index 0000000000..cbb692b0ab --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/40101070.txt @@ -0,0 +1,6 @@ +Hauptänderungen in dieser Version: +- Mit Spaces kannst du deine Räume gruppieren (Beta) +- Optionale Videokomprimierung +- Verschiedene Verbesserungen und Bugfixes + +Die vollständige Änderungsliste gibt es hier: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt index 1334adf554..83759b0b4b 100644 --- a/fastlane/metadata/android/de/full_description.txt +++ b/fastlane/metadata/android/de/full_description.txt @@ -1,9 +1,9 @@ -Element ist einerseits ein sicherer Messenger, andererseits ideal geeignet für die produktive Zusammenarbeit mit dem Team im Homeoffice. Mit eingebauter Ende-zu-Ende-Verschlüsselung ermöglicht Element umfangreiche und sichere Videokonferenzen, das Teilen von Dateien sowie Sprachanrufe. +Element ist ein sicherer Messenger und ideal für die produktive Zusammenarbeit mit deinem Team im Homeoffice. Mit eingebauter Ende-zu-Ende-Verschlüsselung ermöglicht Element auch umfangreiche und sichere Videokonferenzen, das Teilen von Dateien, Sprachanrufe und vieles mehr. Element bietet folgende Funktionen: - Fortschrittliche Werkzeuge für die Online-Kommunikation - Vollständig verschlüsselte Nachrichten, um eine sichere Kommunikation innerhalb und außerhalb von Unternehmen zu ermöglichen -- Dezentralisierte Chats, basierend auf dem quelloffenen Matrix-Framework +- Dezentralisierte Chats, basierend auf dem quelloffenen Matrix-Protokoll - Sichere und kontrollierte Dateifreigabe durch verschlüsselte Daten beim Verwalten von Projekten - Videochats mit VoIP und Bildschirmübertragung - Einfache Einbindung in Ihre bevorzugten Online-Kollaborations- und Projektverwaltungswerkzeuge, VoIP-Dienste und andere Kommunikationsapps für Ihr Team @@ -11,29 +11,29 @@ Element ist einerseits ein sicherer Messenger, andererseits ideal geeignet für Element unterscheidet sich grundlegend von anderen Kommunikations- und Kollaborationsapps. Es läuft auf Matrix, einem offenen Netzwerk für sichere und dezentralisierte Kommunikation. Es erlaubt Nutzern ihre eigene Infrastruktur zu betreiben und gibt ihnen damit vollständige Kontrolle und Besitz über ihre eigenen Daten und Nachrichten. Privatsphäre/Datenschutz und verschlüsselte Kommunikation -Element schützt Sie vor unerwünschter Werbung, dem Datenschürfen und abgeschlossenen Plattformen. Auch schützt es all Ihre Daten, Ihre Video- und Sprachkommunikation unter vier Augen, durch Ende-zu-Ende-Verschlüsselung und durch das Quersignieren von Geräten zur Verifizierung. +Element schützt Sie vor unerwünschter Werbung, dem Datensammeln und geschlossenen Plattformen. Auch schützt es all Ihre Daten, Ihre Video- und Sprachkommunikation mittels Ende-zu-Ende-Verschlüsselung und durch das Quersignieren von Geräten zur Verifizierung. -Element gibt Ihnen die Kontrolle über Ihre Privatsphäre und ermöglicht es Ihnen zugleich, mit jedem im Matrix-Netzwerk sicher zu kommunizieren - oder auch auf anderen geschäftlichen Kollaborationswerkzeugen, zum Beispiel durch das Einbinden von Apps wie Slack. +Element gibt Ihnen volle Kontrolle über Ihre Privatsphäre und ermöglicht es Ihnen zugleich, mit jedem im Matrix-Netzwerk sicher zu kommunizieren - oder auch auf anderen geschäftlichen Kollaborationswerkzeugen, zum Beispiel durch das Einbinden von Apps wie Slack. Element kann man selber betreiben Um mehr Kontrolle über Ihre sensiblen Daten und Konversationen zu ermöglichen, kann man Element selbst betreiben, oder Sie wählen irgendeinen Matrix-basierten Dienst - der Standard für quelloffene, dezentralisierte Kommunikation. Element gibt Ihnen Privatsphäre, Sicherheitskonformität und Flexibilität für Integrationen. Besitzen Sie Ihre Daten -Sie entscheiden, wo Sie Ihre Daten und Nachrichten aufbewahren - ohne das Datenschürfen oder den Zugriff Dritter zu riskieren. +Sie entscheiden, wo Sie Ihre Daten und Nachrichten aufbewahren - ohne das Datensammeln oder den Zugriff Dritter zu riskieren. -Element gibt Ihnen auf verschiedene Arten die Kontrolle: -1. Kostenlos auf dem öffentlichen matrix.org-Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder wählen Sie aus Tausenden von öffentlichen Servern, die von Freiwilligen betrieben werden -2. Ein Konto auf einem eigenen Server in der eigenen IT-Infrastruktur betreiben -3. Einen Konto auf einem maßgeschneiderten Server erstellen, zum Beispiel durch ein Abonnement der Element Matrix Services (kurz EMS) +Element gibt Ihnen auf verschiedene Arten Kontrolle: +1. Sie können sich kostenlos auf dem öffentlichen matrix.org-Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder einen aus Tausenden von öffentlichen Servern, die von Freiwilligen betrieben werden, auswählen +2. Sie haben die Möglichkeit, ein Konto auf einem eigenen Server in der eigenen IT-Infrastruktur betreiben +3. Außerdem können Sie durch ein Abonnement der Element Matrix Services ein Konto auf einem für Sie maßgeschneiderten Server erstellen Offene Kommunikation und Zusammenarbeit Sie können mit jedem im Matrix-Netzwerk chatten, egal ob ihr Kontakt Element, eine andere Matrix-App oder sogar eine völlig andere Anwendung nutzt. Super sicher -Echte Ende-zu-Ende-Verschlüsselung (nur die Personen in der Unterhaltung können die Nachrichten entschüsseln), sowie die Quersignierung von Geräten zur Verifizierung. +Durch Ende-zu-Ende-Verschlüsselung können nur die Personen, die in der Unterhaltung sind, die Nachrichten lesen können. Außerdem stellt die Verifizierung mittels Quersignierung sicher, dass Sie wirklich mit dem Chatten, mit dem Sie glauben - und niemand anderen. Vollständige Kommunikation und Integration -Kurznachrichten, Sprach- und Videoanrufe, Dateifreigaben, Bildschirmübertragungen und eine ganze Reihe an Integrationen, Bots and Widgets. Schaffen Sie Räume, Communities, bleiben Sie auf dem Laufenden und erledigen Sie Sachen. +Kurznachrichten, Sprach- und Videoanrufe, Dateifreigaben, Bildschirmübertragungen und einer Menge an Integrationen, Bots und Widgets. Schaffen Sie Räume und Communities, bleiben Sie auf dem Laufenden und erledigen Sie Sachen. Da Weitermachen, wo Sie aufgehört haben -Bleiben Sie in Kontakt, egal wo Sie sind, mit vollständig synchronisiertem Nachrichtenverlauf quer über all Ihre Geräte und im Netz auf https://app.element.io +Bleiben Sie in Kontakt, egal wo Sie sind, mit vollständig synchronisiertem Nachrichtenverlauf quer über all Ihre Geräte und im Browser auf https://app.element.io From 809fcde275387b7583cdfa83ea0cfaaa7e78c419 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Sat, 29 May 2021 18:45:55 +0000 Subject: [PATCH 020/254] Translated using Weblate (Esperanto) Currently translated at 93.9% (2325 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/eo/ --- vector/src/main/res/values-eo/strings.xml | 179 ++++++++++++++++++++-- 1 file changed, 170 insertions(+), 9 deletions(-) diff --git a/vector/src/main/res/values-eo/strings.xml b/vector/src/main/res/values-eo/strings.xml index 4e506e1d59..0db950b2ed 100644 --- a/vector/src/main/res/values-eo/strings.xml +++ b/vector/src/main/res/values-eo/strings.xml @@ -586,7 +586,7 @@ La ligilo %1$s kondukas vin al alia retejo: %2$s. \n \nĈu vi certe volas daŭrigi\? - Ni ne povis krei vian rektan interparolon. Bonvolu kontroli la invitotajn uzantojn kaj reprovi. + Ni ne povis krei vian individuan ĉambron. Bonvolu kontroli la invitotajn uzantojn kaj reprovi. Por diagnozi problemojn, protokolo de ĉi tiu kliento sendiĝos kune kun ĉi tiu erar-raporto. Ĉi tiu erar-raporto, inkluzive la protokolon kaj la ekrankopion, ne estos publike videbla. Se vi preferus sendi nur la ĉi-supran tekston, bonvolu malmarki: Ŝajnas, ke vi kolere skuas la telefonon. Ĉu vi volas malfermi la erar-raportilon\? La aplikaĵo lastatempe fiaskis. Ĉu vi volas malfermi la fiasko-raportilon\? @@ -1030,7 +1030,7 @@ Montri pasvorton Fermi rubandon pri savkopiado de ŝlosiloj Krei novan ĉambron - Krei novan rektan interparolon + Krei novan individuan ĉambron Kunsendi Ŝajnas, ke la servilo longe ne respondas. Tion povus kaŭzi malbona retkonekto aŭ eraro ĉe la servilo. Bonvolu reprovi iom poste. Bonvolu reprovi leginte la uzokondiĉojn de via hejmservilo. @@ -1086,7 +1086,7 @@ Sendante bildeton (%1$s / %2$s) Ĉifrante bildeton… Atendante… - Rektaj interparoloj + Individuaj ĉambroj Montri plenan historion en ĉifritaj ĉambroj Montri kaŝitajn eventojn en historio Malsukcesis sendi la proponon (%s) @@ -1119,7 +1119,7 @@ Nomo KREI Nova ĉambro - Rektaj interparoloj + Individuaj ĉambroj Ĉambroj Antaŭrigardo al ĉambro legebla de ĉiuj ankoraŭ ne estas subtenata de ${app_name} Ne eblas antaŭrigardi ĉi tiun ĉambron @@ -1144,7 +1144,7 @@ Reagoj Viaj ĉambroj montriĝos ĉi tie Ĉambroj - Viaj rektaj interparoloj montriĝos ĉi tie + Viaj individuaj ĉambroj montriĝos ĉi tie. Tuŝetu la plus-signon sube dekstre por krei iun. Interparoloj Retrovu viajn nelegitajn mesaĝojn ĉi tie Bonvenu hejmen! @@ -1871,7 +1871,7 @@ Avizoj de eksteraj liverantoj Uzokondiĉoj Foriri de interparolo - Rekta ĉambro + Individua ĉambro Forigi prioritaton Ĉiuj mesaĝoj (laŭte) @@ -1923,7 +1923,7 @@ Ĉu malaltigi vian propran povnivelon\? Nuligi inviton SALUTAĴOJ - Rektaj ĉambroj + Individuaj ĉambroj VOKO ADMINISTRILOJ Por fari ĉi tion, aldonu identigan servilon en viaj agordoj. @@ -2000,7 +2000,7 @@ Pritraktota Neniu rezulto troviĝis, uzu «Aldoni per identigilo de Matrix» por serĉi servile. Ŝalti viŝon por respondo en historio - Sendi novan rektan mesaĝon + Sendi novan individuan mesaĝon Formato: Entajpu hejmservilon, kies publikaj ĉambroj listiĝos Hejmekrano @@ -2278,7 +2278,7 @@ Administri salutaĵojn Montri ĉiujn salutaĵojn Aktivaj salutaĵoj - La administranto de via servilo malŝaltis implicitan tutvojan ĉifradon en privataj ĉambroj kaj rektaj interparoloj. + La administranto de via servilo malŝaltis implicitan tutvojan ĉifradon en privataj kaj individuaj ĉambroj. Delegaj subskriboj ne estas ŝaltitaj Delegaj subskriboj estas ŝaltitaj. \nŜlosiloj ne estas fidataj @@ -2481,4 +2481,165 @@ • Serviloj akordaj kun %s estas forbaritaj. Vi agordis la alirpermesojn por serviloj por ĉi tiu ĉambro. %s agordis la alirpermesojn por serviloj por ĉi tiu ĉambro. + Uzantoj + Eraris transdonado de voko + Transdonu + Unue konsulti + + 1 aktiva voko (%1$s) · 1 paŭzigita voko + 1 aktiva voko (%1$s) · %2$d paŭzigitaj vokoj + + + Paŭzigita voko + %1$d paŭzigitaj vokoj + + Aktiva voko (%1$s) + Eraris serĉado de la telefonnumero + Ciferplato + Revoki + Ĉi tiu voko finiĝis + %1$s rifuzis ĉi tiun vokon + Vi rifuzis ĉi tiun vokon %1$s + Vi nun enas ĉi tiun vokon + %1$s komencis vokon + Vi komencis vokon + Ligilo al Matrix + Forĵeti ŝanĝojn + Ekzistas nekonservitaj ŝanĝoj. Ĉu ili forĵetiĝu\? + Rapidresponda kodo ne estas skanita! + Nevalida rapidresponda kodo (nevalida URI)! + Ne eblas kun vi mem! + Havigi per telefona mesaĝo + Ŝanĝi vian nunan personan identigan numeron + Ŝanĝi personan identigan numeron + + %d ero + %d eroj + + Serĉi kontaktojn en Matrix + Agordi profilbildon + Konsento de la uzanto ne estas donita. + Havigu ĉi tiun kodon al aliuloj, por ke ili povu ekbabili kun vi, skaninte ĝin. + Mia kodo + Havigi mian kodon + Skani rapidrespondan kodon (QR) + Tio ne estas valida rapidresponda kodo (QR) de Matrix + 🔐️ Aliĝu al mi per ${app_name} + Saluton, parolu kun mi per ${app_name}: %s + Inviti amikojn + Aldoni personojn + Malsukcesis agordi delegajn subskribojn + sendas neĝon ❄️ + sendas konfetojn 🎉 + Sendas la donitan mesaĝon kun neĝo + Sendas la donitan mesaĝon kun konfetoj + "Temo: " + Aldonu temon + %s por sciigi, pri kio temas la ĉambro. + Ĉi tio estas la komenco de via individua ĉambro kun %s. + Ĉi tio estas la komenco de interparolado. + Ĉi tio estas la komenco de %s. + Sendi vidaŭdaĵojn en originala grandeco + + Sendi filmon en originala grandeco + Sendi filmojn en originala grandeco + + La limo ne estas konata. + Via hejmservilo akceptas kunsendaĵojn (dosierojn, vidaŭdaĵojn, ktp.) kun grandeco ĝis %s. + Datumlimo por alŝutoj al servilo + Versio de servilo + Nomo de servilo + Vi ne havas permeson ŝalti ĉifradon en ĉi tiu ĉambro. + Individua ĉambro + Kreante ĉambron… + Iuj signoj ne estas permesitaj + Bonvolu doni adreson de ĉambro + Ĉi tiu adreso jam estas uzata + Adreso de ĉambro + Vi povus ŝalti ĉi tion, ekzemple se la ĉambro nur estus uzata por kunlaborado de internaj skipoj sur en hejmservilo. Ne eblas ŝanĝi ĉi tiun agordon poste. + Malebligi aliĝon la ĉambro al tiuj, kiuj ne venas de %s + Kaŝi altnivelajn + Montri altnivelajn + Vakigi historion + ununura saluto + Saluti per %s + Registriĝi per %s + Daŭrigi per %s + + Agordoj de ĉambro + %1$d el %2$d + Ne povis trakti havigitajn datumojn + Ĉi tiu dosiero estas tro granda por alŝuto. + Ĉi tiu funkcio ankoraŭ estas prova + Krei novan individuan ĉambron per skanado de rapidresponda kodo (QR) + Krei novan individuan ĉambron per identigilo de Matrix + Vi povas kontakti min okaze de pliaj demandoj + Vi uzas provan version de aroj. Viaj prikomentoj helpos formi la sekvajn versiojn. Via platformo kaj uzantonomo notiĝos, por ke ni povus uzi viajn prikomentojn kiel eble plej bone. + Prikomentoj + Prikomentoj pri aroj + Oni ne povas antaŭrigardi ĉi tiun ĉambron. Ĉu vi volas eniri\? + Ĉi tiu ĉambro nun ne estas disponebla. +\nReprovu poste, aŭ petu administranton de ĉambro kontroli, ĉu vi rajtas aliri. + Por trovi kontaktojn, kiujn vi jam konas, ĉu vi akceptas sendi informojn pri viaj kontaktoj (telefonnumerojn kaj/aŭ retpoŝtadresojn) al la agordita identiga servilo (%1$s)\? +\n +\nPor pli bona privateco, la datumoj haketiĝos antaŭ sendo. + Sendi retpoŝtadresojn kaj telefonnumerojn + Konsenti + Nuligi mian konsenton + Vi ne konsentis sendi retpoŝtadresojn kaj telefonnumerojn al ĉi tiu identiga servilo por trovi aliajn uzantojn el viaj kontaktoj. + Vi konsentis sendi retpoŝtadresojn kaj telefonnumerojn al ĉi tiu identiga servilo por trovi aliajn uzantojn el viaj kontaktoj. + Sendi retpoŝtadresojn kaj telefonnumerojn + Rekomendoj + Kontaktoj + Konataj uzantoj + Freŝaj + Rapidresponda kodo (QR) + Aldoni per rapidresponda kodo (QR) + Serĉi per nomo + Serĉi per nomo aŭ identigilo + Densigante filmon %d%% + Densigante bildon… + Prikomenti + Malsukcesis sendi la prikomentojn (%s) + Dankon, viaj prikomentoj sendiĝis sukcese + Ĉiu ajn en aro kun ĉi tiu ĉambro povas ĝin trovi kaj aliĝi. Nur administrantoj de ĉi tiu ĉambro povas ĝin arigi. + Aroj + Ĉiu ajn povas trovi kaj aliĝi la ĉambron + Publika + Nur invititoj povas trovi kaj aliĝi + Privata + Nekonata agordo de aliro (%s) + Ĉiu ajn povas frapi al la ĉambro, aliaj ĉambranoj poste povas akcepti au rifuzi + Lokaj adresoj + Nova publikigita adreso (ekz. #kromnomo:servilo) + Neniuj aliaj adresoj ankoraŭ publikiĝis. + Neniuj aliaj adresoj ankoraŭ publikiĝis, aldonu iun ĉi-sube. + Ĉu publikigi ĉi tiun ĉambron al la katalogo de ĉambroj de %1$s\? + Ĉu forigi la adreson «%1$s»\? + Ĉu malpublikigi la adreson «%1$s»\? + Publikigi + Publikigi novan adreson permane + Aliaj publikigitaj adresoj: + Ĉefa adreso + Ĉi tio estas la ĉefa adreso + Publikigitaj adresoj povas esti uzataj de iu ajn por aliĝi al via ĉambro. Por publikiĝi, adreso devas unue esti loka. + Publikigitaj adresoj + Adresoj de ĉambro + Vidi kaj administri adresojn de ĉi tiu ĉambro, kaj ĝian videblecon en la katalogo de ĉambroj. + Adresoj de ĉambro + Permesi al gastoj aliĝi + Aliro al ĉambro + Ŝanĝoj al legebleco de historio aplikiĝos nur al mesaĝoj venontaj al la ĉambro. Videbleco de jama historio restos senŝanĝa. + Aldoni butonon por malfermi bildosignan klavaron al la redaktilo de mesaĝoj + Montri bildosignan klavaron + Uzu la ordonon «/confetti» aŭ sendu mesaĝon enhavantan la signojn ❄️ aŭ 🎉 + Montri efektojn en babilujo + Vi ne rajtas ĝisdatigi la rolojn bezonatajn por ŝanĝi diversajn partojn de la ĉambro + Uzi implicite kaj ne plu demandi + Ĉiam demandi + Aroj + Invitoj + Rekomendataj ĉambroj + Baskuli + Mesaĝo sendiĝis \ No newline at end of file From 9da459a503a0c3ad1ab30eb40190d4e302d59b14 Mon Sep 17 00:00:00 2001 From: Thibault Martin Date: Fri, 28 May 2021 05:38:17 +0000 Subject: [PATCH 021/254] Translated using Weblate (French) Currently translated at 100.0% (2475 of 2475 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 760b0aa159..78d7507088 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -2779,13 +2779,13 @@ Envoyer les vidéos en taille originale Espace expérimental – afficher seulement les orphelins dans Accueil - Vous êtes admin de cet espace, assurez-vous d’avoir transféré les droits d’admin à un autre membre avant de partir. + Vous êtes administrateur de cet espace, assurez-vous d’avoir transféré les droits d’administration à un autre membre avant de partir. Vous utilisez une version bêta des espaces. Vos remarques aideront à concevoir les prochaines versions. Votre plateforme et votre nom d’utilisateur seront marqués pour nous aider à utiliser vos remarques autant que possible. Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. Il se peut que certains salons soient masqués parce qu’ils sont privés et vous avez besoin d’une invitation. \nVous n’avez pas l’autorisation d’ajouter des salons. Cet espace n’a pas de salons - Veuillez contacter votre admin de serveur pour plus d’informations + Veuillez contacter l’administrateur de votre serveur d’accueil pour plus d’informations Il semble que votre serveur d’accueil ne prend pas encore en charge les espaces Envie d’expérimenter \? \nVous pouvez ajouter des espaces existants à un espace. From a74bd69c25d70e4d64a91e80109e64d27e52b299 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 27 May 2021 19:50:45 +0000 Subject: [PATCH 022/254] Translated using Weblate (Hungarian) Currently translated at 86.9% (2151 of 2475 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 | 68 +++++++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 04360bd63e..a20a2b20d5 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -847,11 +847,11 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.%d tag - 1 új üzenet + %d új üzenet %d új üzenet - 1 szoba + %d szoba %d szoba @@ -963,11 +963,11 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés %dp - + %dó %dó - 1n + %dn %dn Most: %1$s @@ -976,7 +976,7 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés %1$s és %2$s %2$s %1$s - 1 kiválasztva + %d kiválasztva %d kiválasztva @@ -2407,4 +2407,62 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Videó konferenciát befejezte: %1$s Videó konferenciát indítottál Videó konferenciát elindította: %1$s + %s felfüggesztetted a hívást + Értesítés megjelenítése + Az értesítést látod. Kattints ide! + A push-t nem sikerült megkapni. Megoldás lehet az alkalmazás újratelepítése. + Az alkalmazás megkapta a PUSH-t + Az alkalmazás a PUSH-ra vár + Push tesztelése + Ellenőrizd, hogy rákattintottál arra a hivatkozásra amit e-mailben küldtünk neked. + %s törlése\? + Titkosított szobákban való keresés egyenlőre nem támogatott. + Kitiltott felhasználók szűrése + Téma megváltoztatása + Szoba fejlesztése + m.room.server_acl esemény küldése + Jogosultságok megváltoztatása + Szoba nevének megváltoztatása + Régi üzenetek láthatóságának megváltoztatása + Szoba titkosításának bekapcsolása + A szoba elsődleges címének megváltoztatása + Szoba profilkép megváltoztatása + Kisalkalmazások megváltoztatása + Mindenki értesítése + Mások által küldött üzenetek törlése + Felhasználók kitiltása + Felhasználók kirúgása + Beállítások megváltoztatása + Felhasználók meghívása + Üzenet küldése + Alapértelmezett szerep + Nincs jogosultságod a szerepek megváltoztatásához, amik szükségesek a szoba bizonyos részeinek megváltoztatásához + A szoba bizonyos beállításainak megváltoztatásához szükséges szerep kiválasztása + Jogosultságok + Szerepek megjelenítése és megváltoztatása, amik szükségesek a szoba bizonyos részeinek megváltoztatásához. + Szoba jogosultságok + Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába. + Felfüggesztetted a hívást + Várakoztat + Folytatás + Jogosulatlan, érvényes azonosítási adatok hiányoznak + Használd alapértelmezettként és ne kérdezze újra + Mindig kérdez + Terek + Meghívók + Minden szoba megjelenítése ebben a könyvárban, beleértve a szókimondó tartalmú szobákat is. + Szókimondó tartalmas szobák megjelenítése + Szobák listája + Javasolt szobák + Új érték + Visszatérés + Cserél + A végpontok közötti titkosítást bekapcsoltad (ismeretlen algoritmus: %1$s). + A végpontok közötti titkosítást bekapcsoltad. + A vendégeknek megtiltottad, hogy belépjenek a szobába. + %1$s megtiltotta a vendégeknek, hogy belépjenek ebbe a szobába. + A vendégeknek megtiltottad, hogy belépjenek a szobába. + A vendégeknek megengedted, hogy belépjenek ide. + %1$s megengedte a vendégeknek, hogy belépjenek ide. + A vendégeknek megengedted, hogy belépjenek a szobába. \ No newline at end of file From cf32164bedec1f69c512b80b02ca12f617dc082b Mon Sep 17 00:00:00 2001 From: user08777 Date: Sun, 30 May 2021 11:31:25 +0000 Subject: [PATCH 023/254] Translated using Weblate (Japanese) Currently translated at 58.5% (1450 of 2475 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 | 64 +++++++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index 69aaecc085..6f543b3e85 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -332,11 +332,11 @@ \'%s\' は正しくない形式の住所表記です この部屋の本住所表記が設定されていません. 本住所表記の警告 - 本住所表記を設定 - 本住所表記を設定解除 + メインアドレスとして設定 + メインアドレスとして設定を解除 部屋固有IDをコピー 部屋の住所表記をコピー - 装置固有ID + セッションID 文字の大きさ とても小さい 小さい @@ -487,8 +487,7 @@ この部屋へのリンクを作成するには、部屋の住所表記が必要です。 この部屋は暗号化されています。 この部屋は暗号化されていません。 - 暗号化を開始 -(警告: 部屋の暗号を中止することはできません!) + 暗号化を有効化 (警告: 部屋の暗号を再度無効することはできません!) 部屋一覧 外観 エンドツーエンド暗号化についての情報 @@ -1556,4 +1555,59 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ %1$sや %2$sそれに%3$sが読みました メッセージをマークダウンとして解釈せずにプレーンテキストとして送信する + ファイルとして保存 + 共有 + 完了 + 成功! + バックアップを作成中 + パスフレーズを設定 + 手動でキーをエクスポート + キーバックアップを使って開始する + パスフレーズが弱すぎます + パスフレーズを入力してください + Google PlayサービスのAPKが見つかりませんでした。通知がうまく機能しない場合があります。 + ユーザー名を入力してください。 + 無視 + 共有 + 続けるには利用規約に同意する必要があります。 + 全てブロック + 許可 + 部屋ID + ウィジェットID + あなたのテーマ + あなたのユーザーID + あなたのアバターURL + ブラウザで開く + ウィジェットをロードする + ウィジェット + アクティブなウィジェット + 自分 + 新しいメッセージ + 部屋 + 新しいイベント + 不明なIP + + キー %1$dと%2$dのインポートに成功。 + + キーバックアップを管理 + キーのエクスポートに成功しました + 選択 + 選択 + 詳細情報: %s + ローカルアドレスを追加する + この部屋はローカルアドレスがありません + アドレス \"%1$s\" を削除しますか? + メインアドレス + これがメインアドレスです + 電話番号の認証中にエラーが発生しました。 + リンクを共有 + %s に招待する + Eメールで招待 + 説明 + 人を招待する + とにかく参加する + 部屋を追加する + %s はあなたを招待しています + この部屋で電話会議をする権利がありません + オーディオミーティングを開始する \ No newline at end of file From d98a91f8df7ec64ee1a8f5aa007de14e074b3bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viorel-C=C4=83t=C4=83lin=20R=C4=83pi=C8=9Beanu?= Date: Sat, 29 May 2021 13:17:44 +0000 Subject: [PATCH 024/254] Translated using Weblate (Romanian) Currently translated at 10.3% (256 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ro/ --- vector/src/main/res/values-ro/strings.xml | 44 +++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/vector/src/main/res/values-ro/strings.xml b/vector/src/main/res/values-ro/strings.xml index 43fc70ba2b..c5bae614bb 100644 --- a/vector/src/main/res/values-ro/strings.xml +++ b/vector/src/main/res/values-ro/strings.xml @@ -246,4 +246,48 @@ Doar mențiunile Toate mesajele Schimbă setările + Explorează camerele + Invită persoane + Adaugă spațiu + Bine ai venit acasă! + Acasă + Acasă + E-mailuri și numere de telefon + Generale + Generale + Voce și video + Avansat + Ajutor și despre + Utilizați camera dispozitivului + Criptarea end-to-end este activă + Experimental + Securitate și confidențialitate + Setări + Setările camerei + Setări avansate + Modul dezvoltator + Setări + Setările camerei + Setări + Sesiuni active + Afișează toate sesiunile + Numele serverului + Versiunea serverului + + %d sesiune activă + %d sesiuni active + %d de sesiuni active + + Instrumente de dezvoltare + Depanare + Subiect + Numele camerei + Afișează conținutul în notificări + Șterge toate datele + Șterge datele personale + Parolă + Conectare + Conectare + Deconectare + Deconectare \ No newline at end of file From 07372d46b626d0d9fee243999e10fb657bd2a081 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 28 May 2021 20:20:02 +0000 Subject: [PATCH 025/254] Translated using Weblate (Swedish) Currently translated at 100.0% (2475 of 2475 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 | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 0cd51a3f0d..3341657c1a 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -2734,7 +2734,7 @@ Varning kräver serverstöd och experimentell rumsversion Experimentellt utrymme - Begränsat rum. Du är inbjuden - Utrymmen är nya sätt att gruppera rum och personer för arbete, skoj eller bara för dig själv. + Utrymmen är ett nytt sätt att gruppera rum och personer. Välkommen till utrymmen! Lägg till existerande rum och utrymme Är du säker på att du vill lämna utrymmet\? @@ -2771,4 +2771,27 @@ Komprimerar bild… Använd som förval och fråga inte igen Fråga alltid + Vissa rum kan vara dolda för att de är privata och du behöver en inbjudan. + Vissa rum kan vara dolda för att de är privata och du behöver en inbjudan. +\nDu har inte behörighet att lägga till rum. + Det här utrymmet har inga rum + Vänligen kontakta din hemserveradmin för vidare information + Det verkar som att din hemserver inte stöder utrymmen än + Känner du dig äventyrlig\? +\nDu kan lägga till existerande utrymmen till ett utrymme. + Experimentellt utrymme - Visa bara övergivna i Hem + Lägg till rum + Du är administratör för det här utrymmet, se till att du har överfört administratörsrättigheter till en annan medlem innan du lämnar. + Det här utrymmet är inte offentligt. Du kommer inte att kunna gå med igen utan en inbjudan. + Du är den enda personen här. Om du lämnar så kommer ingen kunna gå med i framtiden, inklusive du. + Bjud in till %s + Den här funktionen är i beta + Ge återkoppling + Din återkoppling misslyckades att skickas (%s) + Tack, din återkoppling har skickats framgångsrikt + Ni kan kontakta mig om ni har några fler frågor + Du använder en betaversion av utrymmen. Din återkoppling kommer att hjälpa till att utveckla nästa version. Din plattform och ditt användarnamn kommer att noteras för att hjälpa oss att få så mycket användning för din återkoppling som vi kan. + Återkoppling + Utrymmesåterkoppling + Tyvärr så inträffade ett fel vid försök att gå med i gruppsamtalet \ No newline at end of file From 89e7d9bdbc55eb040ce6fb676c11042a65ade654 Mon Sep 17 00:00:00 2001 From: Percy Date: Fri, 28 May 2021 13:25:47 +0000 Subject: [PATCH 026/254] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (2475 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- vector/src/main/res/values-zh-rCN/strings.xml | 1102 ++++++++++------- 1 file changed, 639 insertions(+), 463 deletions(-) diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index 82ec8fc36d..18eb1da7aa 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -3,7 +3,7 @@ %1$s 发送了一张图片。 %s 的邀请 %1$s 邀请了 %2$s - %1$s 邀请了您 + %1$s 邀请了你 %1$s 加入了聊天室 %1$s 离开了聊天室 %1$s 拒绝了邀请 @@ -73,7 +73,7 @@ 初始化同步: \n正在导入已离开的聊天室 初始化同步: -\n正在导入社区 +\n正在导入社群 初始化同步: \n正在导入账号数据 %s 升级了此聊天室。 @@ -82,7 +82,7 @@ %1$s 撤回了对 %2$s 加入聊天室的邀请 %1$s 的邀请。理由:%2$s %1$s 邀请了 %2$s。理由:%3$s - %1$s 邀请了您。理由:%2$s + %1$s 邀请了你。理由:%2$s %1$s 加入了聊天室。理由:%2$s %1$s 离开了聊天室。理由:%2$s %1$s 已拒绝邀请。理由:%2$s @@ -100,107 +100,107 @@ %1$s 移除了 %2$s 作为此聊天室额地址。 %1$s 为此聊天室新增了 %2$s 并移除 %3$s 地址。 - %1$s 将此聊天室的主地址设为了 %2$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 - 您解封了 %1$s - 您封禁了 %1$s - 您撤回了对 %1$s 的邀请 - 您更换了您的头像 - 您将您的昵称设置为 %1$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 改为 %2$s + 你移除了你的昵称 (%1$s) + 你把主题改为:%1$s + %1$s 更改了聊天室头像 + 你更改了聊天室头像 + 你把聊天室名称改为:%1$s + 你发起了一次视频通话。 + 你发起了一次语音通话。 %s 发送了数据以建立通话。 - 您发送了数据以建立通话。 - 您接听了通话。 - 您结束了通话。 - 您已让未来的聊天室记录对 %1$s 可见 - 您开启了端对端加密(%1$s) - 您升级了此聊天室。 - 您请求了 VoIP 会议 - 您移除了聊天室名称 - 您移除了聊天室主题 + 你发送了数据以建立通话。 + 你接听了通话。 + 你结束了通话。 + 你已让未来的聊天室记录对 %1$s 可见 + 你开启了端对端加密(%1$s) + 你升级了此聊天室。 + 你请求了 VoIP 会议 + 你移除了聊天室名称 + 你移除了聊天室主题 %1$s 移除了聊天室头像 - 您移除了聊天室头像 - 您更新了您的资料 %1$s - 您向 %1$s 发送了加入聊天室的邀请 - 您已撤回了对 %1$s 加入聊天室的邀请 - 您接受了 %1$s 的邀请 + 你移除了聊天室头像 + 你更新了你的资料 %1$s + 你向 %1$s 发送了加入聊天室的邀请 + 你已撤回了对 %1$s 加入聊天室的邀请 + 你接受了 %1$s 的邀请 %1$s 添加了 %2$s 挂件 - 您添加了 %1$s 挂件 + 你添加了 %1$s 挂件 %1$s 移除了 %2$s 挂件 - 您移除了 %1$s 挂件 + 你移除了 %1$s 挂件 %1$s 修改了 %2$s 挂件 - 您修改了 %1$s 挂件 + 你修改了 %1$s 挂件 管理员 审核员 默认 自定义(%1$d) 自定义 - 您更改了%1$s 的权力等级。 + 你更改了%1$s 的权力等级。 %1$s 更改了 %2$s 的权力等级。 %1$s 从 %2$s 到 %3$s - 您的邀请。理由:%1$s - 您邀请了 %1$s。理由:%2$s - 您加入了聊天室。理由:%1$s - 您离开了聊天室。理由:%1$s - 您拒绝了邀请。理由:%1$s - 您踢走了 %1$s。理由:%2$s - 您解封了 %1$s。理由:%2$s - 您封禁了 %1$s。理由:%2$s - 您已发送邀请给 %1$s 来加入聊天室。理由:%2$s - 您撤销了 %1$s 加入聊天室的邀请。理由:%2$s - 您接受了 %1$s 的邀请。理由:%2$s - 您撤回了 %1$s 的邀请。理由:%2$s + 你的邀请。理由:%1$s + 你邀请了 %1$s。理由:%2$s + 你加入了聊天室。理由:%1$s + 你离开了聊天室。理由:%1$s + 你拒绝了邀请。理由:%1$s + 你踢走了 %1$s。理由:%2$s + 你解封了 %1$s。理由:%2$s + 你封禁了 %1$s。理由:%2$s + 你已发送邀请给 %1$s 来加入聊天室。理由:%2$s + 你撤销了 %1$s 加入聊天室的邀请。理由:%2$s + 你接受了 %1$s 的邀请。理由:%2$s + 你撤回了 %1$s 的邀请。理由:%2$s - 您新增了 %1$s 为此聊天室的地址。 + 你新增了 %1$s 为此聊天室的地址。 - 您移除了此聊天室的 %1$s 地址。 + 你移除了此聊天室的 %1$s 地址。 - 您为此聊天室新增了 %1$s 并移除了 %2$s 地址。 - 您将此聊天室的主地址设为了 %1$s。 - 您移除了此聊天室的主地址。 - 您已允许访客加入聊天室。 - 您已禁止访客加入聊天室。 - 您已开启端对端加密。 - 您已开启端对端加密(无法识别的算法 %1$s)。 - 您已离开。理由:%1$s + 你为此聊天室新增了 %1$s 并移除了 %2$s 地址。 + 你将此聊天室的主要地址设为了 %1$s。 + 你移除了此聊天室的主要地址。 + 你已允许访客加入聊天室。 + 你已禁止访客加入聊天室。 + 你已开启端对端加密。 + 你已开启端对端加密(无法识别的算法 %1$s)。 + 你已离开。理由:%1$s %1$s 已离开。理由:%2$s - 您已加入。理由:%1$s + 你已加入。理由:%1$s %1$s 已加入。理由:%2$s - 您撤回了对 %1$s 的邀请 + 你撤回了对 %1$s 的邀请 %1$s 撤回了对 %2$s 的邀请 - 您邀请了 %1$s + 你邀请了 %1$s %1$s 邀请了 %2$s - 您在此处升级。 + 你在此处升级。 %s 在此处升级。 - 您使未来的消息对 %1$s 可见 + 你使未来的消息对 %1$s 可见 %1$s 使未来的消息对 %2$s 可见 - 您离开了聊天室 + 你离开了聊天室 %1$s 离开了聊天室 - 您已加入 + 你已加入 %1$s 已加入 - 您创建了讨论 + 你创建了讨论 %1$s 创建了讨论 你已阻止客人加入房间。 %1$s已阻止客人加入房间。 @@ -240,12 +240,12 @@ 加入 查看 拒绝 - %s 邀请您加入这个聊天室 + %s 邀请你加入这个聊天室 新的聊天 添加成员 退出聊天室 - 您确定要退出聊天室吗? - 您确定要把 %s 从这个聊天中移除吗? + 你确定要退出聊天室吗? + 你确定要把 %s 从这个聊天中移除吗? 在线 离线 搜索 @@ -263,8 +263,8 @@ 登出 禁用 警告 - 请描述您遇到的问题。您做了什么?您期望发生什么?实际上发生了什么? - 在这里描述您的问题 + 请描述你遇到的问题。你做了什么?你期望发生什么?实际上发生了什么? + 在这里描述你的问题 进度(%s%%) 主服务器 URL 身份服务器 URL @@ -282,7 +282,7 @@ 电子邮箱地址(可选) 手机号码 手机号码(可选) - 确认您的新密码 + 确认你的新密码 用户名和/或密码错误 用户名仅可由字母、数字、点、连字符与下划线组成 密码太短(至少 6 位) @@ -298,8 +298,8 @@ 主服务器: 身份服务器: 我已验证了我的电子邮箱地址 - 要重置您的密码,请输入与您的账号关联的电子邮箱地址: - 必须输入与您账号关联的电子邮箱地址。 + 要重置你的密码,请输入与你的账号关联的电子邮箱地址: + 必须输入与你账号关联的电子邮箱地址。 必须输入新密码。 URL 必须以 http[s]:// 开头 无法登录:网络错误 @@ -353,7 +353,7 @@ 新密码 确认新密码 密码更新失败 - 您的密码已更新 + 你的密码已更新 手机号码 Curve25519 认证密钥 算法 @@ -384,23 +384,23 @@ 拍摄照片或视频 重复密码 使用自定义服务器选项(高级) - 请检查您的电子邮箱以继续注册 - 此主服务器想确认您不是机器人 + 请检查你的电子邮箱以继续注册 + 此主服务器想确认你不是机器人 一封电子邮件已发送至 %s。点击了其中的链接后,请点击下面。 - 电子邮箱地址验证失败:请确保您已点击邮件中的链接 - 密码已重置。 + 电子邮箱地址验证失败:请确保你已点击邮件中的链接 + 密码已重置。 \n -\n您已经退出所有会话,将不再收到推送通知。要重新启用通知,请在每台设备上重新登录。 +\n你已经退出所有会话,将不再收到推送通知。要重新启用通知,请在每台设备上重新登录。 原始 %d 秒 通话已连接 通话正在连接… - 为发送或保存附件,${app_name} 需要权限以访问您的图片和视频库。 + 为发送或保存附件,${app_name} 需要权限以访问你的图片和视频库。 \n \n请在接下来的弹出窗口中授权允许访问,以便从此设备中发送文件。 - ${app_name} 需要权限来访问您的相机,以拍摄照片或进行视频通话。 - ${app_name} 需要权限以访问您的麦克风来进行语音通话。 - 您试图访问聊天室 %s。您是否愿意加入这个聊天室? + ${app_name} 需要权限来访问你的相机,以拍摄照片或进行视频通话。 + ${app_name} 需要权限以访问你的麦克风来进行语音通话。 + 你试图访问聊天室 %s。你是否愿意加入这个聊天室? 管理工具 私聊 设备列表 @@ -417,7 +417,7 @@ 用户 ID,姓名或电子邮箱 提及 显示设备列表 - 您确定要邀请 %s 到这个聊天吗? + 你确定要邀请 %s 到这个聊天吗? 本地联系人(%d 个) %1$s 和 %2$s 正在输入… %1$s 和 %2$s 及其他人正在输入… @@ -431,7 +431,7 @@ 重新发送未发送的消息 删除未发送的消息 文件未找到 - 您没有发送到这个聊天室的权限 + 你没有发送到这个聊天室的权限 信任 不信任 注销 @@ -442,7 +442,7 @@ 设置 已邀请 已加入 - 您要隐藏所有来自这个用户的消息吗? + 你要隐藏所有来自这个用户的消息吗? \n \n注意,此操作会重启应用并将花费一些时间。 取消上传 @@ -472,8 +472,8 @@ 通知 已忽略的用户 通讯录权限 - 这个操作需要额外的身份认证。 -\n请输入您的密码以继续。 + 这个操作需要额外的身份认证。 +\n请输入你的密码以继续。 身份认证 当前密码 是否重新显示所有来自 %s 的消息? @@ -485,7 +485,7 @@ 手机验证 我们已经发送了一条含有一个激活码的短信。请在下面输入这个激活码。 输入激活码 - 在验证您的手机号码的时候发生了错误 + 在验证你的手机号码的时候发生了错误 聊天室名称 主题 把这个聊天室列在聊天室目录中 @@ -505,7 +505,7 @@ 地址 这些是实验性功能,可能会出现不可预料的错误。请谨慎使用。 端对端加密 - 您需要注销以启用加密。 + 你需要注销以启用加密。 对于当前会话,从在不此聊天室中向未验证的设备发送加密消息。 这个聊天室没有本地地址 新地址(例如 #foo:matrix.org) @@ -549,22 +549,22 @@ \n请以 %1$s 或 %2$s 的形式加入 语音 视频 - 您需要在此聊天室中发起会议的权限 + 你需要在此聊天室中发起会议的权限 仍然发送 问题反馈 - 为分析此问题,本客户端的日志将会随此问题反馈发送。本问题反馈,包括日志与截图,将不会被公开显示。若您希望仅发送上面的文字,请取消选择: + 为分析此问题,本客户端的日志将会随此问题反馈发送。本问题反馈,包括日志与截图,将不会被公开显示。若你希望仅发送上面的文字,请取消选择: 问题反馈发送成功 问题反馈发送失败(%s) 阅读 无效令牌 在新的 API 出现之前,尚不支持同时使用电子邮件和电话号码注册,所以只有电话号码会被记录。 \n -\n在设置中,您可以在个人资料里添加您的电子邮件。 +\n在设置中,你可以在个人资料里添加你的电子邮件。 用户名已被使用 无法注册:电子邮箱所有权验证失败 无法识别指定的访问令牌 异常的 JSON - 您还未点击电子邮件链接 + 你还未点击电子邮件链接 %1$d 分钟 %2$d 秒 正在呼叫… 呼入的通话 @@ -582,19 +582,19 @@ " \n \n请在接下来弹出的窗口中授权允许访问。" - ${app_name} 需要权限以访问您的摄像机和麦克风来进行视频通话。 + ${app_name} 需要权限以访问你的摄像机和麦克风来进行视频通话。 \n \n请在接下来的弹出窗口中授权允许访问,以便进行通话。 对不起。因为权限不足,操作已取消 保存至下载? 移除 此邀请已发送至未与此账号关联的 %s。 -\n您可能希望用一个不同的账号登录,或者把这个电子邮箱加入到你的账号。 +\n你可能希望用一个不同的账号登录,或者把这个电子邮箱加入到你的账号。 这是此聊天室的预览。与聊天室的交互已禁用。 通话 - 您将不能撤销这个修改,因为您正在让这个用户和您拥有相同的特权级别。 -\n您确定吗? - 这可能意味着有人正在恶意劫持您的流量,或者您的手机不信任远程服务器提供的数字证书。 + 你将不能撤销这个修改,因为你正在让这个用户和你拥有相同的特权级别。 +\n你确定吗? + 这可能意味着有人正在恶意劫持你的流量,或者你的手机不信任远程服务器提供的数字证书。 如果服务器管理员说这是预期的情况,请确保下面的指纹与管理员提供的指纹相匹配。 报告这个内容的原因 目录 @@ -611,13 +611,13 @@ 其他 通知目标 登录为 - 请检查您的电子邮箱并点击里面包含的链接。完成时请点击继续。 - 无法验证电子邮箱地址。请检查您的邮件并点击其中的链接。完成后,请点击“继续”。 + 请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。 + 无法验证电子邮箱地址。请检查你的邮件并点击其中的链接。完成后,请点击“继续”。 此电子邮箱地址已被使用。 找不到此电子邮箱地址。 此手机号码已被使用。 - 您确认要移除此通知目标吗? - 您确认要移除 %1$s %2$s 吗? + 你确认要移除此通知目标吗? + 你确认要移除 %1$s %2$s 吗\? 无效的已选国家的手机号码 聊天室图片 聊天室标签 @@ -627,10 +627,10 @@ 要链接一个聊天室,必须有一个地址。 仅向已验证的设备发送加密消息 - 您没有指定此聊天室的主地址。 - 主地址警告 - 设置为主地址 - 取消设置为主地址 + 你没有指定此聊天室的主要地址。 + 主要地址警告 + 设置为主要地址 + 取消设置为主要地址 复制聊天室 ID 复制聊天室地址 声称的 Ed25519 指纹密钥 @@ -640,17 +640,17 @@ 移出黑名单 确认 移除 - 您似乎沮丧地摇了摇手机。您想打开问题反馈界面吗? + 你似乎沮丧地摇了摇手机。你想打开问题反馈界面吗? 发送至 已读标签清单 发送为 - ${app_name} 可以检查您的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。若您同意本应用以此目的访问您的通讯录,请在接下来的弹出窗口中授权允许访问。 - ${app_name} 可以检查您的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。 + ${app_name} 可以检查你的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。若你同意本应用以此目的访问你的通讯录,请在接下来的弹出窗口中授权允许访问。 + ${app_name} 可以检查你的通讯录,并基于他们的邮箱地址和电话号码,来查找其他 Matrix 用户。 \n -\n您是否同意本应用以此目的访问您的通讯录\? +\n你是否同意本应用以此目的访问你的通讯录\? 空闲 仅 Matrix 用户 - 证书已从一个先前受您的设备信任的证书更改为另一个。这非常反常!建议您不要接受此新证书。 + 证书已从一个先前受你的设备信任的证书更改为另一个。这非常反常!建议你不要接受此新证书。 证书已从曾受信任的证书更改为不受信任的证书。服务器可能已更新其证书,请联系管理员并核对服务器的指纹。 请仅在服务器管理员发布了与上述指纹匹配的指纹的情况下接受该证书。 成员 @@ -675,10 +675,10 @@ %s 已尝试在这个聊天室的时间线上加载一个特定的时间点,但无法找到它。 公开名称 为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配: - 如果它们不匹配,您通讯的安全性可能会受到影响。 + 如果它们不匹配,你通讯的安全性可能会受到影响。 这个聊天室包含未经验证的未知设备。 \n这意味着无法保证该设备属于其声称的用户。 -\n我们建议您在继续操作之前,先验证每个设备,但如果您愿意也可以不验证而重新发送消息。 +\n我们建议你在继续操作之前,先验证每个设备,但如果你愿意也可以不验证而重新发送消息。 \n \n未知设备: 历史消息 @@ -701,7 +701,7 @@ 只显示 Matrix 联系人 没有对话 没有结果 - 您没有授予 ${app_name} 访问本地通讯录的权限 + 你没有授予 ${app_name} 访问本地通讯录的权限 聊天室 聊天室目录 @@ -758,16 +758,16 @@ 黑色主题 通知声音 使用12小时制显示时间戳 - 您需要权限来管理这个聊天室的挂件 + 你需要权限来管理这个聊天室的挂件 创建挂件失败 用 jitsi 创建会议通话 - 您确定要删除这个挂件吗? + 你确定要删除这个挂件吗? 无法创建挂件。 发送请求失败。 特权级别必须是正整数。 - 您不在这个聊天室。 - 您没有在当前聊天室中执行此操作的权限。 + 你不在这个聊天室。 + 你没有在当前聊天室中执行此操作的权限。 请求中缺失 room_id。 请求中缺失 user_id。 聊天室 %s 不可见。 @@ -777,8 +777,8 @@ 通话 包含我昵称的消息 包含我用户名的消息 - 您添加了一个新设备 “%s”,它正在请求加密密钥。 - 您有一台未验证设备 “%s” 正在请求加密密钥。 + 你添加了一个新设备 “%s”,它正在请求加密密钥。 + 你有一台未验证设备 “%s” 正在请求加密密钥。 开始验证 不验证而分享 忽略请求 @@ -802,9 +802,9 @@ 正在加载… 退出 邀请 - 您确定要与 %s 发起新的聊天吗? - 您确定要发起语音通话吗? - 您确定要发起视频通话吗? + 你确定要与 %s 发起新的聊天吗? + 你确定要发起语音通话吗? + 你确定要发起视频通话吗? 封禁踢掉将从聊天室中踢掉他们并阻止他们再次加入。 全部消息 只限提及 @@ -821,11 +821,11 @@ 重新加入 忘记聊天室 所有消息(响铃) - 社区信息 + 社群信息 操作 - 社区 - 按社区名称过滤 - 社区 + 社群 + 按社群名称过滤 + 社群 没有群组 摇一摇快捷反馈问题 群组列表 @@ -839,12 +839,12 @@ %d 位成员 - 社区 ID 无效 - “%s” 不是有效的社区 ID + 社群 ID 无效 + “%s” 不是有效的社群 ID %d 条未读消息 - 创建社区 + 创建社群 显示成员 显示顶栏 @@ -860,8 +860,8 @@ 已启用 %d 个挂件 - 社区名称 - 社区 ID + 社群名称 + 社群 ID 主页 用户 聊天室 @@ -869,10 +869,10 @@ 没有用户 已加入 已邀请 - 过滤社区成员 - 过滤社区聊天室 - 您已被 %2$s 从 %1$s 中移除 - 您已被 %2$s 从 %1$s 中封禁 + 过滤社群成员 + 过滤社群聊天室 + 你已被 %2$s 从 %1$s 中移除 + 你已被 %2$s 从 %1$s 中封禁 理由:%1$s 头像 已读提示头像 @@ -885,14 +885,14 @@ %d 条未读消息 通知隐私 - ${app_name} 可以在后台运行以安全隐密地管理您的通知(这可能会影响电池消耗)。 + ${app_name} 可以在后台运行以安全隐密地管理你的通知(这可能会影响电池消耗)。 获取权限 选择其他选项 • 通知通过 Firebase Cloud Messaging 发送 • 通知只含有元数据 • 通知不会显示消息内容 - 新的社区 ID(如 +foo:matrix.org) - 社区管理员没有提供这个社区的具体描述。 + 新的社群 ID(如 +foo:matrix.org) + 社群管理员没有提供这个社群的具体描述。 标准 低隐私模式 停用账号 @@ -902,26 +902,26 @@ 请允许资料分析以帮助我们改进 ${app_name}。 是的,我愿意帮助! 停用账号 - 这将使您的账号永远不再可用。您将无法登录,也不能使用相同的用户 ID 重新注册。您的账号将退出所有已加入的聊天室,您在身份服务器上的账号信息也会被删除。此操作是不可逆的。 + 这将使你的账号永远不再可用。你将无法登录,也不能使用相同的用户 ID 重新注册。你的账号将退出所有已加入的聊天室,你在身份服务器上的账号信息也会被删除。此操作是不可逆的。 \n -\n停用您的账号不会默认忘记您已发送的消息。如果您希望我们忘记您发送的消息,请勾选下面的选择框。 +\n停用你的账号不会默认忘记你已发送的消息。如果你希望我们忘记你发送的消息,请勾选下面的选择框。 \n -\nMatrix 中的消息可见性类似于电子邮件。我们忘记您的消息意味着您发送的消息不会被发给新注册或未注册的用户,但是已收到您的消息的注册用户依旧可以看到这些消息的副本。 +\nMatrix 中的消息可见性类似于电子邮件。我们忘记你的消息意味着你发送的消息不会被发给新注册或未注册的用户,但是已收到你的消息的注册用户依旧可以看到这些消息的副本。 请在我停用账号的同时忘记我发送的所有消息(警告:这将导致未来的用户看到残缺的对话) - 请输入您的密码以继续: + 请输入你的密码以继续: 停用账号 发送贴纸 发送贴纸 - 您目前没有启用任何贴纸包。 + 你目前没有启用任何贴纸包。 \n \n要添加一些吗? • 通知中的消息内容直接从 Matrix 主服务器安全地获取 • 通知含有消息与元数据 - 此聊天室不会显示任何社区徽章 + 此聊天室不会显示任何社群徽章 缺少所需的参数。 无效参数。 样例 ID - 要想继续使用主服务器 %1$s 您必须阅读并同意其服务条款。 + 要想继续使用主服务器 %1$s 你必须阅读并同意其服务条款。 现在阅读 第三方开源协议 下载 @@ -935,7 +935,7 @@ 请在其他可解密此消息的设备上启动 ${app_name},以便其将密钥发送至当前设备。 在此输入… 发送语音消息 - 请输入您的密码。 + 请输入你的密码。 发言 如果可能的话,请使用英文撰写问题描述。 发送加密回复… @@ -952,14 +952,14 @@ 离开聊天室 设置聊天室主题 按照 ID 踢出用户 - 更改您显示的昵称 + 更改你显示的昵称 打开/关闭 markdown 修复 Matrix Apps 管理 这个聊天室已经被替换并且不再活跃 对话在此继续 这个聊天室是另一个对话的延续 点击此处查看更早的消息 - 您目前不是任何社区的成员。 + 你目前不是任何社群的成员。 由于缺少权限,此操作无法完成。 %d 个用户 @@ -993,7 +993,7 @@ 系统警告 超出资源限制 联系管理员 - 联系您的服务管理员 + 联系你的服务管理员 本服务器其中一项资源已超出限制,部分用户将无法登录 本服务器其中一项资源已超出限制。 本服务器已达到每月活跃用户限制,部分用户将无法登录 @@ -1015,7 +1015,7 @@ 故障排除诊断 运行测试 正在测试…(%2$d 中的 %1$d) - 基本诊断结果正常。若您还是沒有收到通知,请提交错误报告以协助我们调查此问题。 + 基本诊断结果正常。若你还是沒有收到通知,请提交错误报告以协助我们调查此问题。 一个或多个测试没有通过,请尝试建议的修复方法。 一个或多个测试没有通过,请提交错误反馈以协助我们调查此问题。 系统设置。 @@ -1024,8 +1024,8 @@ \n请检查系统设置。 打开设置 账号设置。 - 您的账号已启用通知。 - 您的账号已禁用通知。 + 你的账号已启用通知。 + 你的账号已禁用通知。 \n请检查账号设置。 启用 设备设置。 @@ -1060,9 +1060,9 @@ 电池优化 若主服务器支持此功能,在聊天中预览链接内容。 发送正在输入通知 - 让聊天室中的其他用户知道您正在输入。 + 让聊天室中的其他用户知道你正在输入。 Markdown 格式化 - 在消息发出之前使用 Markdown 语法格式化消息。这允许您使用高级的文字格式,例如使用星号显示斜体文字。 + 在消息发出之前使用 Markdown 语法格式化消息。这允许你使用高级的文字格式,例如使用星号显示斜体文字。 显示已阅回执 点击已阅回执以显示所有已经阅读过某条消息的用户。 显示加入与离开事件 @@ -1071,11 +1071,11 @@ 包括头像与显示名称的变动。 后台连接 ${app_name} 需要保持低影响的后台连接,以便获得可靠的通知。 -\n下一个屏幕中,系统将提示您允许 ${app_name} 始终在后台运行,请点击“允许“。 +\n下一个屏幕中,系统将提示你允许 ${app_name} 始终在后台运行,请点击“允许“。 授予权限 - 在验证您的电子邮件地址时发生了一个错误。 + 在验证你的电子邮件地址时发生了一个错误。 密码 - 在验证您的手机号码时发生了一个错误。 + 在验证你的手机号码时发生了一个错误。 额外信息:%s %d+ +%d @@ -1088,7 +1088,7 @@ 收起 展开 抱歉,发生了一个错误 - 您的主服务器尚未支持延迟加载聊天室成员,请稍候再试。 + 你的主服务器尚未支持延迟加载聊天室成员,请稍候再试。 通过仅载入最近聊天中出现的聊天室成员来提升性能。 延迟加载聊天室成员 Markdown 已禁用。 @@ -1098,7 +1098,7 @@ 服务被停止,并已自动重启。 服务重启失败 服务将在设备重启后启动。 - 服务不会在设备重启后启动,在您打开 ${app_name} 一次之前您将不会收到消息通知。 + 服务不会在设备重启后启动,在你打开 ${app_name} 一次之前你将不会收到消息通知。 已禁用对 ${app_name} 的后台限制。此测试应使用移动数据(非Wi-Fi)进行。 \n%1$s 已启用对 ${app_name} 的后台限制。 @@ -1116,31 +1116,31 @@ 密钥备份 使用备份密钥 密钥备份尚未完成,请等待… - 如果您此时登出账号,您将会失去您的已加密消息 - 密钥备份进行中。如果您此时登出账号将无法再访问您的已加密消息。 - 您的所有设备都应当启用安全密钥备份以确保您不会失去您的已加密消息的访问权。 + 如果你此时登出账号,你将会失去你的已加密消息 + 密钥备份进行中。如果你此时登出账号将无法再访问你的已加密消息。 + 你的所有设备都应当启用安全密钥备份以确保你不会失去你的已加密消息的访问权。 我不想要我的已加密消息 正在备份密钥… 使用备份密钥 确定吗? 备份 - 如果您在登出账号之前不备份密钥,您将失去您的已加密消息的访问权。 + 如果你在登出账号之前不备份密钥,你将失去你的已加密消息的访问权。 留下 跳过 完成 中止 - 您确定要登出账号吗? + 你确定要登出账号吗? 高级通知设置 事件的通知重要程度 自定义设置。 请注意一些消息类型已设置为静音(将会生成一条没有铃声的通知)。 - 有些通知已在您的自定义设置中被禁用。 + 有些通知已在你的自定义设置中被禁用。 自定义规则加载失败,请重试。 检查设置 [%1$s] \n此错误不受 ${app_name} 控制,根据 Google 的说法,此错误表示该设备在 FCM 中注册了太多应用。该错误仅在应用程序数量极多的情况下发生,因此不应影响普通用户。 [%1$s] -\n此错误不受 ${app_name} 控制。它的发生可能有几个原因。也许您稍后重试就有效了,您也可以检查一下 Google Play 服务是否被系统设置限制了数据使用,或者您的设备时钟是否正确,或者可能发生在自定义的 ROM 中。 +\n此错误不受 ${app_name} 控制。它的发生可能有几个原因。也许你稍后重试就有效了,你也可以检查一下 Google Play 服务是否被系统设置限制了数据使用,或者你的设备时钟是否正确,或者可能发生在自定义的 ROM 中。 [%1$s] \n此错误不受 ${app_name} 控制。此设备上没有登录 Google 账号。请打开账号管理器并添加一个 Google 账号。 添加账号 @@ -1156,28 +1156,28 @@ 请输入一个用户名。 请输入密语 密语太弱了 - 如果您想要 ${app_name} 生成一个恢复密钥,请删除密语。 + 如果你想要 ${app_name} 生成一个恢复密钥,请删除密语。 没有可用的 Matrix 会话 永不丢失已加密消息 - 加密聊天室中的信息会被端对端加密以确保安全。只有您和拥有密钥的接收方可以读取这些信息。 + 加密聊天室中的信息会被端对端加密以确保安全。只有你和拥有密钥的接收方可以读取这些信息。 \n -\n安全地备份您的密钥以免丢失信息。 +\n安全地备份你的密钥以免丢失信息。 开始使用备份密钥 (高级) 手动导出密钥 - 使用密语保护您的备份。 - 我们将会在主服务器上为您的密钥保存一份加密拷贝。设置一个密语来保护您的备份的安全。 + 使用密语保护你的备份。 + 我们将会在主服务器上为你的密钥保存一份加密拷贝。设置一个密语来保护你的备份的安全。 \n -\n为了最大的安全性,此密语应当与您的账号密码不同。 +\n为了最大的安全性,此密语应当与你的账号密码不同。 设置密语 正在创建备份 - 或者用一个恢复密钥来保护您的备份,将其保存到另一个安全的地方。 + 或者用一个恢复密钥来保护你的备份,将其保存到另一个安全的地方。 (高级)设置一个恢复密钥 成功! - 正在备份您的密钥。 - 您的恢复密钥是一张安全网——如果您忘记了密语,您可以利用它重获您的已加密消息的访问权。 -\n请将您的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里) - 将您的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里) + 正在备份你的密钥。 + 你的恢复密钥是一张安全网——如果你忘记了密语,你可以利用它重获你的已加密消息的访问权。 +\n请将你的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里) + 将你的恢复密钥保存在一个非常安全的地方,比如密码管理器中(或保险箱里) 完成 我已经制作了一份拷贝 保存恢复密钥 @@ -1192,26 +1192,26 @@ 恢复密钥 意外错误 备份开始 - 您的加密密钥正在后台被备份到您的主服务器上。初始备份可能花费几分钟。 - 您确定吗? - 如果您登出账号或者丢失此设备,您可能再也无法访问您的信息。 + 你的加密密钥正在后台被备份到你的主服务器上。初始备份可能花费几分钟。 + 你确定吗? + 如果你登出账号或者丢失此设备,你可能再也无法访问你的信息。 正在获取备份的版本 … - 使用恢复密语解锁您的已加密历史消息 - 使用您的恢复密钥 - 如果不知道您的恢复密语,您可以 %s。 - 使用恢复密钥解锁您的已加密历史消息 + 使用恢复密语解锁你的已加密历史消息 + 使用你的恢复密钥 + 如果不知道你的恢复密语,你可以 %s。 + 使用恢复密钥解锁你的已加密历史消息 输入恢复密钥 消息恢复 - 丢失了恢复密钥?您可以在设置中新建一个。 - 无法使用此密语解密备份:请检查您输入的恢复密语是否正确。 - 网络错误:请检查您的网络连接并重试。 + 丢失了恢复密钥?你可以在设置中新建一个。 + 无法使用此密语解密备份:请检查你输入的恢复密语是否正确。 + 网络错误:请检查你的网络连接并重试。 正在恢复备份: 正在计算恢复密钥… 正在下载密钥… 正在导入密钥… 解锁历史 请输入恢复密钥 - 无法使用此恢复密钥解密备份:请检查您输入的恢复密钥是否正确。 + 无法使用此恢复密钥解密备份:请检查你输入的恢复密钥是否正确。 备份已恢复 %s ! 恢复了一个包含 %d 个密钥的备份。 @@ -1225,7 +1225,7 @@ 删除备份 已为此设备正确设置密钥备份。 密钥备份在此设备上未激活。 - 您的密钥未从此设备备份。 + 你的密钥未从此设备备份。 备份含有一个来自 ID 为 %s 的未知设备的签名。 备份具有此设备的有效签名。 备份具有已验证设备 %s 的有效签名。 @@ -1237,11 +1237,11 @@ 正在删除备份… 备份(%s)删除失败 删除备份 - 要从此服务器中删除您备份的加密密钥吗?您将无法再使用恢复密钥来读取加密的历史消息。 + 要从此服务器中删除你备份的加密密钥吗?你将无法再使用恢复密钥来读取加密的历史消息。 备份新密钥 已检测到新的安全消息密钥备份。 \n -\n如果您并未设置新的恢复方法,可能是有攻击者试图侵入您的账号。请立即更改您的账号密码并在设置中设定一个新的恢复方法。 +\n如果你并未设置新的恢复方法,可能是有攻击者试图侵入你的账号。请立即更改你的账号密码并在设置中设定一个新的恢复方法。 那是我 永不丢失已加密消息 开始使用备份密钥 @@ -1260,7 +1260,7 @@ 忽略 以单点登录方式登录 无法连接到此 URL,请检查 - 您的设备使用了过时的 TLS 安全协议,容易受到攻击,为保证安全,您将无法进行连接 + 你的设备使用了过时的 TLS 安全协议,容易受到攻击,为保证安全,你将无法进行连接 按回车发送消息 软键盘的 Enter 按钮将发送消息而不是添加换行符 密码更新 @@ -1268,7 +1268,7 @@ 密码不匹配 无效的主服务器探测响应 自动完成服务器选项 - ${app_name} 侦测到您的 userId 域名 \"%1$s\" 有自定义的服务器设置: + ${app_name} 侦测到你的 userId 域名 \"%1$s\" 有自定义的服务器设置: \n%2$s 使用设置 正在初始化服务 @@ -1298,11 +1298,11 @@ 一个新设备正在请求加密密钥。 \n设备名称:%1$s \n最近上线于:%2$s -\n若您未曾在另一个设备上登录,请忽略此请求。 +\n若你未曾在另一个设备上登录,请忽略此请求。 一个未验证的设备正在请求加密密钥。 \n设备名称:%1$s \n最近上线于:%2$s -\n若您未曾在另一个设备上登录,请忽略此请求。 +\n若你未曾在另一个设备上登录,请忽略此请求。 验证 分享 密钥分享请求 @@ -1311,13 +1311,13 @@ 终止 正在检查备份状态 通过对比一段简短的文本字符串来验证设备。 - 为保证尽可能高的安全性,我们建议您与对方当面交换,或使用另一种可信任的通讯方式。 + 为保证尽可能高的安全性,我们建议你与对方当面交换,或使用另一种可信任的通讯方式。 开始验证 传入的验证请求 查看请求 正在等待对方确认… 已验证! - 您已成功验证此设备。 + 你已成功验证此设备。 了解了 什么都没有出现?并非所有的客户端都已支持交互式验证。使用旧版验证吧。 使用旧版验证。 @@ -1325,12 +1325,12 @@ 请求已取消 交互式设备验证 验证请求 - %s 想验证您的装置 + %s 想验证你的装置 未知错误 编辑 回复 重试 - 向您发送邀请 + 向你发送邀请 由 %s 邀请 欢迎回家! 对话 @@ -1345,7 +1345,7 @@ 创建新聊天室 修改 请稍候… - 所有社区 + 所有社群 无法预览此聊天室 聊天室 创建 @@ -1376,15 +1376,15 @@ 拒绝 没有设置身份服务器。 服务器的错误配置导致通话失败 - 请要求您的主服务器 (%1$s) 的管理员配置 TURN 服务器,以使通话可靠地工作。 + 请要求你的主服务器 (%1$s) 的管理员配置 TURN 服务器,以使通话可靠地工作。 \n -\n或者,您可以尝试使用 %2$s 的公共服务器,但这将不那么可靠,并且它将与该服务器共享您的 IP 地址。您也可以在“设置”中进行管理。 +\n或者,你可以尝试使用 %2$s 的公共服务器,但这将不那么可靠,并且它将与该服务器共享你的 IP 地址。你也可以在“设置”中进行管理。 尝试使用 %s 不要再问我 - 设置用于恢复账号的电子邮件,然后就可以让认识您的人选择性探索到您。 - 设定电话,然后就可以让认识您的人选择性探索到您。 - 设定电子邮件以供恢复账号。然后就可以让认识您的人用电子邮件或电话选择性探索到您。 - 设定电子邮件以供恢复账号。然后就可以让认识您的人用电子邮件或电话选择性探索到您。 + 设置用于恢复账号的电子邮件,然后就可以让认识你的人选择性探索到你。 + 设定电话,然后就可以让认识你的人选择性探索到你。 + 设定电子邮件以供恢复账号。然后就可以让认识你的人用电子邮件或电话选择性探索到你。 + 设定电子邮件以供恢复账号。然后就可以让认识你的人用电子邮件或电话选择性探索到你。 這不是有效的 Matrix 服务器位置 无法在此 URL 找到主服务器,请检查 允许后备呼叫协助服务器 @@ -1396,7 +1396,7 @@ 通知 ${app_name} 呼叫失败 无法建立实时连接。 -\n请要求您的主服务器管理员配置 TURN 服务器以使通话可靠工作。 +\n请要求你的主服务器管理员配置 TURN 服务器以使通话可靠工作。 选择声音设备 电话 扬声器 @@ -1409,60 +1409,60 @@ 打开 HD SSL 错误:尚未验证对等端身份。 SSL 错误。 - 当您的主服务器未提供时将使用 %s 作为辅助(在通话时将分享您的 IP 地址) + 当你的主服务器未提供时将使用 %s 作为辅助(在通话时将分享你的 IP 地址) 活动通话 (%s) 返回通话 - 在您的设置中添加身份服务器以执行此操作。 + 在你的设置中添加身份服务器以执行此操作。 取消邀请 - 降低您自己的级别? - 您家无法撤销此操作因为您正在降低您的级别,如果您是聊天室中最后一个特权用户将无法恢复特权。 + 降低你自己的级别? + 你家无法撤销此操作因为你正在降低你的级别,如果你是聊天室中最后一个特权用户将无法恢复特权。 降级 忽略用户 - 忽略此用户将从您共享的聊天室移除他们的消息。 + 忽略此用户将从你共享的聊天室移除他们的消息。 \n -\n您随时可以在通用设置中反转此操作。 +\n你随时可以在通用设置中反转此操作。 取消忽略用户 取消忽略此用户将重新显示来自他们的全部消息。 取消邀请 - 您确定想要取消邀请此用户吗? + 你确定想要取消邀请此用户吗? 踢掉用户 踢掉理由 踢掉用户将从此聊天室移除他们。 \n -\n为防止他们再次加入,您应当封禁他们。 +\n为防止他们再次加入,你应当封禁他们。 封禁用户 封禁理由 取消封禁用户 取消封禁用户将允许他们再次加入聊天室。 - 确认您的密码 - 您无法在 ${app_name} 移动版中这么做 + 确认你的密码 + 你无法在 ${app_name} 移动版中这么做 需要身份认证 后台同步模式 电池优化 ${app_name} 将在后台以保留设备有限资源(电池)的方式同步。 -\n取决于您的设备资源状态,同步可能被操作系统推迟。 +\n取决于你的设备资源状态,同步可能被操作系统推迟。 实时优化 ${app_name} 将在后台定期准时同步(可配置)。 \n这将影响网络和电池的使用,将显示一个永久通知表明 ${app_name} 正在监听事件。 无后台同步 - 应用在后台时您不会收到消息通知。 + 应用在后台时你不会收到消息通知。 更新设置失败。 偏好同步间隔 %s \n取决于资源(电量)或设备状态(睡眠)同步可能会延迟。 集成 使用集成管理器管理机器人,桥接,部件和贴纸包。 -\n集成管理器接收配置数据,可以代表您修改部件,发送聊天室邀请及设置特权等级。 +\n集成管理器接收配置数据,可以代表你修改部件,发送聊天室邀请及设置特权等级。 安全备份 管理 设置安全备份 重置安全备份 在此设备上设置 - 通过在您的服务器上备份加密密钥,防止失去对加密信息和数据的访问。 - 为您已有的备份生成新的安全密钥或设置新的安全口令。 - 这将替换您的当前密钥或短语。 + 通过在你的服务器上备份加密密钥,防止失去对加密信息和数据的访问。 + 为你已有的备份生成新的安全密钥或设置新的安全口令。 + 这将替换你的当前密钥或短语。 发现 - 管理您的发现设置。 + 管理你的发现设置。 允许集成 集成管理器 集成已禁用 @@ -1470,8 +1470,8 @@ %d 个封禁用户 - 公开名称(对与您通讯的人可见) - 会话的公开名称对与您通讯的人可见 + 公开名称(对与你通讯的人可见) + 会话的公开名称对与你通讯的人可见 成功导出密钥 %1$s: %2$s %1$s: %2$s %3$s @@ -1487,10 +1487,10 @@ 重载挂件 在浏览器中打开 撤消我的访问权限 - 您的昵称 - 您的头像 URL - 您的用户 ID - 您的主题 + 你的昵称 + 你的头像 URL + 你的用户 ID + 你的主题 挂件 ID 聊天室 ID 挂件想使用以下资源: @@ -1502,17 +1502,17 @@ 未配置集成管理器。 若要继续请接受服务条款。 恢复密钥已保存。 - 您的主服务器上已存在备份 - 您似乎已在另一个会话中设置密钥备份。您想要将其替换为正在创建的吗? + 你的主服务器上已存在备份 + 你似乎已在另一个会话中设置密钥备份。你想要将其替换为正在创建的吗? 安全备份 保护加密信息及数据的访问权 设置安全备份 - 由于无效或过期的凭据您已登出。 - 验证此会话以将其标记为可信任。当使用端对端加密消息时,信任参与者的会话可以使您更加安心。 - 验证会话将标记其为可信任,同时将您的会话对对方标记为可信任。 + 由于无效或过期的凭据你已登出。 + 验证此会话以将其标记为可信任。当使用端对端加密消息时,信任参与者的会话可以使你更加安心。 + 验证会话将标记其为可信任,同时将你的会话对对方标记为可信任。 通过确认以下表情符号出现在对方的屏幕上来验证此会话 通过确认屏幕上对方显示以下数字来验证此会话 - 您收到传入验证请求。 + 你收到传入验证请求。 与此用户的安全消息端对端加密,无法被第三方读取。 对方取消了验证。 \n%s @@ -1528,22 +1528,22 @@ 收到一条无效消息 密钥不匹配 用户不匹配 - 您未使用身份服务器 - 未配置身份服务器,需要重置您的密码。 - 您似乎正在试图连接到另一个主服务器。您想要登出吗? + 你未使用身份服务器 + 未配置身份服务器,需要重置你的密码。 + 你似乎正在试图连接到另一个主服务器。你想要登出吗? 加入一个聊天室开始使用应用。 - 您已经跟上了! - 您没有未读消息 + 你已经跟上了! + 你没有未读消息 从这里跟上未读消息 - 您的私聊消息将显示在此处。点击右下角的 + 开始一些对话。 - 您的聊天室将显示在此处。点击右下角的 + 来找到现有的聊天室或者创建你自己的聊天室。 + 你的私聊消息将显示在此处。点击右下角的 + 开始一些对话。 + 你的聊天室将显示在此处。点击右下角的 + 来找到现有的聊天室或者创建你自己的聊天室。 消息已删除 显示已移除消息 对已移除消息显示占位符 聊天室管理员主持的事件 最后由 %1$s 编辑于 %2$s 格式错误事件,无法显示 - 无网络。请检查您的网络连接。 + 无网络。请检查你的网络连接。 更改网络 ${app_name} 尚不支持公开聊天室预览 私聊消息 @@ -1555,11 +1555,11 @@ 获取密钥备份数据时发生错误 从文件 \"%1$s\" 导入端对端密钥。 其他第三方通知 - 您已经在查看此聊天室! + 你已经在查看此聊天室! 注册令牌 提出建议 - 请在下方写下您的建议。 - 请在此描述您的建议 + 请在下方写下你的建议。 + 请在此描述你的建议 谢谢,建议已成功发送 建议发送失败 (%s) 在时间线上显示隐藏事件 @@ -1574,7 +1574,7 @@ 消息编辑 未找到编辑 过滤对话… - 找不到您要找的? + 找不到你要找的? 创建新聊天室 发送新私聊消息 查看聊天室目录 @@ -1598,28 +1598,28 @@ 断开身份服务器 配置身份服务器 更改身份服务器 - 您正在使用 %1$s 与您知道的现有联系人相互发现。 - 您当前未使用身份服务器。若要与您知道的现有联系人相互发现,请在下方配置。 + 你正在使用 %1$s 与你知道的现有联系人相互发现。 + 你当前未使用身份服务器。若要与你知道的现有联系人相互发现,请在下方配置。 可发现电子邮件地址 - 发现选项将在您添加电子邮件后出现。 - 发现选项将在您添加电话号码后出现。 - 与您的身份服务器断开意味着您将无法被其它用户发现并且无法通过电子邮件和电话邀请他人。 + 发现选项将在你添加电子邮件后出现。 + 发现选项将在你添加电话号码后出现。 + 与你的身份服务器断开意味着你将无法被其它用户发现并且无法通过电子邮件和电话邀请他人。 可发现电话号码 - 我们向 %s 给您发送了确认电子邮件,检查您的电子邮件并点击确认链接 - 我们向 %s 给您发送了确认电子邮件,请先检查您的电子邮件并点击确认链接 + 我们向 %s 给你发送了确认电子邮件,检查你的电子邮件并点击确认链接 + 我们向 %s 给你发送了确认电子邮件,请先检查你的电子邮件并点击确认链接 正在等待 输入身份服务器 URL 无法连接到身份服务器 请输入身份服务器 url 身份服务器无服务条款 - 您选择的身份服务器无任何服务条款。仅在您信任服务所有者时继续 + 你选择的身份服务器无任何服务条款。仅在你信任服务所有者时继续 已向 %s 发送文字消息。请输入它包含的验证码。 验证码不正确。 - 您当前在身份服务器 %1$s 上分享电子邮件地址或电话号码。您需要重连接 %2$s 已停止分享。 - 同意身份服务器 (%s) 服务条款使您可以通过电子邮件地址或电话号码被发现。 + 你当前在身份服务器 %1$s 上分享电子邮件地址或电话号码。你需要重连接 %2$s 已停止分享。 + 同意身份服务器 (%s) 服务条款使你可以通过电子邮件地址或电话号码被发现。 启用详细日志。 - 当您发送 RageShake 时详细日志将帮助开发者提供更多日志。即使启用,应用也不会记录消息内容或任何其他私有数据。 - 接收您的主服务器条款和条件后请重试。 + 当你发送 RageShake 时详细日志将帮助开发者提供更多日志。即使启用,应用也不会记录消息内容或任何其他私有数据。 + 接收你的主服务器条款和条件后请重试。 服务器似乎响应时间太长,这可能是由于连接不良或服务器错误引起的。 请稍后再试。 发送附件 打开导航菜单 @@ -1659,20 +1659,20 @@ 报告 忽略用户 内容已报告 - 此内容已报告。 -\n -\n如果您不希望再看到此用户的更多内容,您可以忽略他们以隐藏他们的信息。 - 报告为垃圾信息 - 此内容已报告为垃圾信息。 -\n -\n如果您不希望再看到此用户的更多内容,您可以忽略他们以隐藏他们的信息。 - 报告为不合适的内容 - 此内容已报告为不合适。 -\n -\n如果您不希望再看到此用户的更多内容,您可以忽略他们以隐藏他们的消息。 - ${app_name} 需要权限以在磁盘上保存您的端对端密钥。 + 此内容已报告。 \n -\n请在接下来的弹出窗口中授权允许访问,以便您手动导出密钥。 +\n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的信息。 + 报告为垃圾信息 + 此内容已报告为垃圾信息。 +\n +\n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的信息。 + 报告为不合适的内容 + 此内容已报告为不合适。 +\n +\n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的消息。 + ${app_name} 需要权限以在磁盘上保存你的端对端密钥。 +\n +\n请在接下来的弹出窗口中授权允许访问,以便你手动导出密钥。 目前没有网络连接 忽略用户 全部消息(嘈杂) @@ -1684,21 +1684,21 @@ 从收藏中移除 离开聊天室 %1$s 未做更改 - 您未做更改 - 您未忽略任何用户 + 你未做更改 + 你未忽略任何用户 长按聊天室查看更多选项 %1$s 将聊天室设为对任何知道链接的用户公开。 - 您将聊天室设为对任何知道链接的用户公开。 + 你将聊天室设为对任何知道链接的用户公开。 %1$s 将聊天室设为仅限邀请。 - 您将聊天室设为仅限邀请。 + 你将聊天室设为仅限邀请。 未读消息 这是你的对话。拥有它。 与人们私聊或群聊 通过加密保证对话私密 - 扩展 & 自定义您的体验 + 扩展 & 自定义你的体验 开始吧 选择服务器 - 就像电子邮件,账号有一个家,尽管您可以与任何人聊天 + 就像电子邮件,账号有一个家,尽管你可以与任何人聊天 在最大的公共服务器上免费加入数百万用户 面向组织的高级托管 了解更多 @@ -1715,51 +1715,51 @@ Element Matrix 服务地址 地址 面向组织的高级托管 - 输入 Modular Element 或您想使用的服务器地址 - 输入您想使用的服务器的地址 + 输入 Modular Element 或你想使用的服务器地址 + 输入你想使用的服务器的地址 载入页面时出错:%1$s (%2$d) 应用无法登录到此主服务器。主服务器支持以下登录类型:%1$s。 \n -\n您想要通过网页客户端登录吗? +\n你想要通过网页客户端登录吗? 抱歉,此服务器不接受新账号。 应用无法在此服务器上创建账号。 \n -\n您想要通过网页客户端注册吗? +\n你想要通过网页客户端注册吗? 电子邮件未关联到任何账号。 在 %1$s 上重置密码 - 验证邮件将发送到您的收件箱以确认设置您的新密码。 + 验证邮件将发送到你的收件箱以确认设置你的新密码。 下一个 电子邮件 新密码 注意! - 更改您的密码将重置所有会话上的端对端加密密钥,从而使加密聊天记录无法读取。在重设密码之前,请设置“密钥备份”或从另一个会话中导出聊天室密钥。 + 更改你的密码将重置所有会话上的端对端加密密钥,从而使加密聊天记录无法读取。在重设密码之前,请设置“密钥备份”或从另一个会话中导出聊天室密钥。 继续 电子邮件未链接到任何账号 - 检查您的收件箱 + 检查你的收件箱 验证电子邮件已发送到 %1$s。 - 点击链接以确认您的新密码。跟随包含的链接验证后,请点击下方。 + 点击链接以确认你的新密码。跟随包含的链接验证后,请点击下方。 我已验证我的电子邮件地址 成功! - 您的密码已重置。 - 您已登出全部会话,不会再接收到推送通知。若要重新启用通知,请在每个设备上再次登录。 + 你的密码已重置。 + 你已登出全部会话,不会再接收到推送通知。若要重新启用通知,请在每个设备上再次登录。 返回登录 注意 - 您的密码尚未更改。 + 你的密码尚未更改。 \n \n是否中止密码更改过程? 设置电子邮件地址 - 设置电子邮件用于恢复您的账号。之后,您可以选择允许您认识的人通过电子邮件发现您。 + 设置电子邮件用于恢复你的账号。之后,你可以选择允许你认识的人通过电子邮件发现你。 电子邮件 电子邮件(可选) 下一个 设置电话号码 - 设置电话号码,以选择允许您认识的人发现您。 + 设置电话号码,以选择允许你认识的人发现你。 请使用国际格式。 电话号码 电话号码(可选) 下一个 确认电话号码 - 我们向 %1$s 发送了验证码。在下方输入它以验证您的身份。 + 我们向 %1$s 发送了验证码。在下方输入它以验证你的身份。 输入验证码 重新发送 下一个 @@ -1772,7 +1772,7 @@ 下一个 用户名已占用 注意 - 您的账号尚未创建。 + 你的账号尚未创建。 \n \n是否中止注册过程? 选择 matrix.org @@ -1780,51 +1780,51 @@ 选择自定义主服务器 请进行人机验证 接受条款以继续 - 请检查您的电子邮件 + 请检查你的电子邮件 我们向 %1$s 发送了电子邮件。 \n请点击其中包含的链接继续账号创建。 输入的验证码不正确。请检查。 过时的主服务器 - 此主服务器运行的版本过旧以至于无法连接。要求您的主服务器管理员升级。 + 此主服务器运行的版本过旧以至于无法连接。要求你的主服务器管理员升级。 - 发送了太多请求。您可以在 %1$d 秒后重试… + 发送了太多请求。你可以在 %1$d 秒后重试… - 或者,如果您已经拥有账号并知道您的 Matrix 标识符和密码,您可以使用这种方式: + 或者,如果你已经拥有账号并知道你的 Matrix 标识符和密码,你可以使用这种方式: 使用 Matrix ID 登录 使用 Matrix ID 登录 - 如果您在主服务器上设置了账号,在下方使用您的 Matrix ID(例 @user:domain.com)和密码。 + 如果你在主服务器上设置了账号,在下方使用你的 Matrix ID(例 @user:domain.com)和密码。 Matrix ID - 如果您不知道您的密码,返回并重置。 + 如果你不知道你的密码,返回并重置。 这不是一个有效的用户标识符。期望的格式:\'@user:homeserver.org\' - 无法找到有效的主服务器。请检查您的标识符 - 您已登出 + 无法找到有效的主服务器。请检查你的标识符 + 你已登出 这可能由于多种原因: \n -\n• 您已在其他会话中更改了您的密码。 +\n• 你已在其他会话中更改了你的密码。 \n -\n• 您已从其他会话删除了此会话。 +\n• 你已从其他会话删除了此会话。 \n -\n• 您的服务器管理员出于安全原因已取消您的访问权限。 +\n• 你的服务器管理员出于安全原因已取消你的访问权限。 重新登录 - 您已登出 + 你已登出 登录 - 您的主服务器 (%1$s) 管理员将您从您的账号 %2$s (%3$s) 登出。 - 登录以恢复仅存储在此设备上的加密密钥。 您需要使用它们在任何设备上阅读所有安全消息。 + 你的主服务器 (%1$s) 管理员将你从你的账号 %2$s (%3$s) 登出。 + 登录以恢复仅存储在此设备上的加密密钥。 你需要使用它们在任何设备上阅读所有安全消息。 登录 密码 清除个人数据 - 注意:您的个人数据(包括加密密钥)仍存储在此设备上。 + 注意:你的个人数据(包括加密密钥)仍存储在此设备上。 \n -\n如果您不再使用此设备,或想登录另一个账号,请清除它。 +\n如果你不再使用此设备,或想登录另一个账号,请清除它。 清除全部数据 清除数据 是否清除当前存储在此设备上的全部数据? -\n再次登录以访问您的账号数据和消息。 - 除非您登录以恢复加密密钥,否则您将无法访问安全消息。 +\n再次登录以访问你的账号数据和消息。 + 除非你登录以恢复加密密钥,否则你将无法访问安全消息。 清除数据 - 当前会话用于用户 %1$s 而您提供了用户 %2$s 的凭证。${app_name} 不支持此功能。 + 当前会话用于用户 %1$s 而你提供了用户 %2$s 的凭证。${app_name} 不支持此功能。 \n请先清除数据,然后重新登录另一个账号。 - 您的 matrix.to 链接更是不正确 + 你的 matrix.to 链接更是不正确 描述太短 初始同步… 查看我的全部会话 @@ -1844,7 +1844,7 @@ 在明文消息前添加 ¯\\_(ツ)_/¯ 启用加密 加密一经启用,便无法禁用。 - 您的电子邮件域无权注册此服务器 + 你的电子邮件域无权注册此服务器 未信任的登录 匹配 不匹配 @@ -1854,10 +1854,10 @@ 不安全 以下其中一项可能会受到威胁: \n -\n - 您的主服务器 -\n - 您验证的用户连接到的主服务器 -\n - 您或其它用户的网络连接 -\n - 您或其他用户的设备 +\n - 你的主服务器 +\n - 你验证的用户连接到的主服务器 +\n - 你或其它用户的网络连接 +\n - 你或其他用户的设备 视频。 图片。 音频 @@ -1865,21 +1865,21 @@ 贴纸 正在等待… %s 已取消 - 您已取消 + 你已取消 %s 已接受 - 您已接受 + 你已接受 验证已发送 验证请求 验证此会话 手动验证 - + 使用其他用户的设备扫描此码以安全地相互验证 扫描他们的码 无法扫描 - 如果您不在现场,请比较表情符号 + 如果你不在现场,请比较表情符号 通过比较表情符号验证 通过表情验证 - 如果您无法扫描上方的码,通过比较简短独特的表情序列验证。 + 如果你无法扫描上方的码,通过比较简短独特的表情序列验证。 二维码图片 验证 %s 已验证 %s @@ -1890,7 +1890,7 @@ 此聊天室的消息未经端对端加密。 该聊天室的消息已被端对端加密。 \n -\n您的消息受加密保护,并且只有您和消息接收者拥有唯一解密密钥。 +\n你的消息受加密保护,并且只有你和消息接收者拥有唯一解密密钥。 安全 了解更多 更多 @@ -1916,7 +1916,7 @@ ${app_name} 无法处理类型为 \'%1$s\' 的消息 ${app_name} 在渲染 id 为 \'%1$s\' 的事件内容时遇到了一个问题 取消忽略 - 该会话无法与您的其他会话共享此验证。 + 该会话无法与你的其他会话共享此验证。 \n验证将保存在本地,并在此应用的未来版本中共享。 最近使用的聊天室 其他聊天室 @@ -1934,7 +1934,7 @@ 比较独特表情,确保它们以相同顺序出现。 与其他用户设备上显示的代码比较。 与此用户的消息端对端加密,无法被第三方读取。 - 您的新会话已验证。它可以访问您的加密消息,其他用户会将其视为可信任。 + 你的新会话已验证。它可以访问你的加密消息,其他用户会将其视为可信任。 交叉签名 交叉签名已启用 \n设备上的私钥。 @@ -1944,14 +1944,14 @@ 交叉签名已启用。 \n密钥未信任 交叉签名未启用 - 您的服务器管理员已默认禁用私有聊天室和私聊消息端对端加密。 + 你的服务器管理员已默认禁用私有聊天室和私聊消息端对端加密。 激活会话 显示全部会话 管理会话 登出此会话 加密信息不可用 - 此会话对安全消息可信因为您已验证它: - 验证此会话以将其标记为可信,并授予其访问加密消息的权限。如果您未登录此会话,则您的账号可能已被盗: + 此会话对安全消息可信因为你已验证它: + 验证此会话以将其标记为可信,并授予其访问加密消息的权限。如果你未登录此会话,则你的账号可能已被盗: %d 个活动会话 @@ -1968,7 +1968,7 @@ 未信任 此会话可信任,可以用于收发加密消息,因为 %1$s(%2$s)已验证了它: %1$s (%2$s) 使用新会话登录: - 在此用户信任此会话之前,发送到该会话和从该会话发送的消息均标有警告。或者,您可以手动进行验证。 + 在此用户信任此会话之前,发送到该会话和从该会话发送的消息均标有警告。或者,你可以手动进行验证。 初始化交叉签名 重置密钥 二维码 @@ -1988,19 +1988,19 @@ 已选选项 创建简单调查 使用恢复密语或密钥 - 如果您无法访问已有会话 + 如果你无法访问已有会话 新登录 无法在存储中找到秘密 输入秘密存储密语 警告: - 您应仅在可信任的设备上访问秘密存储 + 你应仅在可信任的设备上访问秘密存储 移除… - 您想要发送此附件到 %1$s 吗? + 你想要发送此附件到 %1$s 吗? 发送原始尺寸图片 确认移除 - 您确实想要移除(删除)此事件吗?注意如果您删除聊天室名或话题更改,可以撤销更改。 + 你确实想要移除(删除)此事件吗?注意如果你删除聊天室名或话题更改,可以撤销更改。 附加理由 编辑理由 事件被用户删除,理由:%1$s @@ -2008,23 +2008,23 @@ 密钥请求 解锁加密消息历史 刷新 - 新登录。是您吗? + 新登录。是你吗? 轻按以审核和验证 使用此会话验证新的会话,授权访问加密消息。 这不是我 - 您的账号可能已被盗用 - 如果您取消,您将无法在此设备上读取加密消息,其他用户不会信任它 - 如果您取消,您将无法在新设备上读取加密消息,其他用户不会信任它 - 如果您现在取消将不会验证 %1$s (%2$s)。在他们的用户个人档案中重新开始。 + 你的账号可能已被盗用 + 如果你取消,你将无法在此设备上读取加密消息,其他用户不会信任它 + 如果你取消,你将无法在新设备上读取加密消息,其他用户不会信任它 + 如果你现在取消将不会验证 %1$s (%2$s)。在他们的用户个人档案中重新开始。 以下其中一项可能有风险: \n -\n- 您的密码 -\n- 您的主服务器 +\n- 你的密码 +\n- 你的主服务器 \n- 此设备或其它设备 \n- 设备使用的网络连接 \n -\n我们推荐您在设置中立即更换您的密码和恢复密钥。 - 通过设置验证您的设备。 +\n我们推荐你在设置中立即更换你的密码和恢复密钥。 + 通过设置验证你的设备。 验证已取消 恢复密语 消息密钥 @@ -2032,17 +2032,17 @@ 设置 %s 生成消息密钥 确认 %s - 输入您的 %s 以继续。 - 再次输入您的 %s 确认。 - 不要使用您的账号密码。 + 输入你的 %s 以继续。 + 再次输入你的 %s 确认。 + 不要使用你的账号密码。 输入只有你知道的安全口令,用于保护服务器上的秘密。 这可能会花费数秒,请耐心等待。 设置恢复。 - 您的恢复密钥 + 你的恢复密钥 完成了! 保持安全 完成 - 使用此 %1$s 作为安全网以防您忘记您的 %2$s。 + 使用此 %1$s 作为安全网以防你忘记你的 %2$s。 发布创建的身份密钥 从密语生成安全密钥 正在定义 SSSS 默认密钥 @@ -2050,9 +2050,9 @@ 正在同步用户密钥 正在同步自签名密钥 正在设置密钥备份 - 您的 %2$s 和 %1$s 已设置。 + 你的 %2$s 和 %1$s 已设置。 \n -\n请安全地保管它。如果您丢失了全部活动会话您将需要使用它们解锁加密消息和安全信息。 +\n请安全地保管它。如果你丢失了全部活动会话你将需要使用它们解锁加密消息和安全信息。 将它打印出来并存放在安全的地方 发送爆雷信息 爆雷 @@ -2063,21 +2063,21 @@ 密钥已是最新! 保护与解锁已加密消息并信任 %s。 保存到优盘或者备份盘 - 复制到您的个人云存储 - 您无法在移动设备上执行此操作 - 设置恢复密语让您能够保护和解锁加密信息并信任设备。 + 复制到你的个人云存储 + 你无法在移动设备上执行此操作 + 设置恢复密语让你能够保护和解锁加密信息并信任设备。 \n -\n如果您不希望设置文本密码,那么生成密钥亦可。 - 设置恢复密语让您能够保护和解锁加密信息并信任设备。 - 如果您现在取消,那么当您失去登录权限时也会丢失加密的信息和数据。 +\n如果你不希望设置文本密码,那么生成密钥亦可。 + 设置恢复密语让你能够保护和解锁加密信息并信任设备。 + 如果你现在取消,那么当你失去登录权限时也会丢失加密的信息和数据。 \n -\n您也可以通过设置菜单来建立保护备份以及管理您的密钥。 +\n你也可以通过设置菜单来建立保护备份以及管理你的密钥。 加密开启 本聊天室信息已经端对端加密。验证成员时,请查看其个人档案以了解更多信息。 加密未开启 不支持本聊天室使用的加密方式 %s 创建并配置了聊天室。 - 您创建并配置了聊天室。 + 你创建并配置了聊天室。 接近完成!另外的设备是否正显示相同的盾牌图标? 接近完成!等候确认…… 正在等候 %s… @@ -2095,8 +2095,8 @@ 消息… 加密升级可用 启用交叉签名 - 验证您自己和其他人以保证您的聊天安全 - 输入您的 %s 以继续 + 验证你自己和其他人以保证你的聊天安全 + 输入你的 %s 以继续 使用文件 输入 %s 恢复密语 @@ -2110,9 +2110,9 @@ 从恢复密钥生成 SSSS 密钥 正在在 SSSS 中保存密钥备份秘密 %1$s (%2$s) - 输入您的密钥备份密语以继续。 - 使用您的密钥备份恢复密钥 - 不知道您的密钥备份密语,您可以 %s。 + 输入你的密钥备份密语以继续。 + 使用你的密钥备份恢复密钥 + 不知道你的密钥备份密语,你可以 %s。 密钥备份恢复密钥 阻止应用内屏幕截图 启用此设置添加 FLAG_SECURE 到所有活动。重启应用使更改生效。 @@ -2126,31 +2126,31 @@ ${app_name} iOS \n${app_name} Android 或其他能够交叉签名的 Matrix 客户端 - 在您的其他设备上使用最新的 ${app_name}: + 在你的其他设备上使用最新的 ${app_name}: 强制丢弃加密聊天室中的当前出站群组会话 仅在加密聊天室中支持 - 使用您的 %1$s 或使用您的 %2$s 继续。 + 使用你的 %1$s 或使用你的 %2$s 继续。 使用恢复密钥 - 选择您的恢复密钥,或手动输入或从剪贴板粘贴 - 无法使用此恢复密钥解密备份:请确认您输入了正确的恢复密钥。 + 选择你的恢复密钥,或手动输入或从剪贴板粘贴 + 无法使用此恢复密钥解密备份:请确认你输入了正确的恢复密钥。 访问安全存储失败 未加密 由未验证设备加密 - 查看您的登录位置 - 验证您的全部会话确保您的账号和消息安全 - 验证访问您的账号的新登录:%1$s + 查看你的登录位置 + 验证你的全部会话确保你的账号和消息安全 + 验证访问你的账号的新登录:%1$s 使用文本手动验证 验证登录 使用表情交互式验证 - 通过从您的其他会话验证此登录确认您的身份,授权它访问您的加密消息。 + 通过从你的其他会话验证此登录确认你的身份,授权它访问你的加密消息。 标记为信任 请选择用户名。 请选择密码。 仔细检查此链接 - 链接 %1$s 正在将您带到另一个站点:%2$s。 + 链接 %1$s 正在将你带到另一个站点:%2$s。 \n -\n您确定想要继续吗? - 我们无法创建您的私聊消息。请检查您要邀请的用户并重试。 +\n你确定想要继续吗? + 我们无法创建你的私聊消息。请检查你要邀请的用户并重试。 添加成员 邀请 正在邀请用户… @@ -2160,7 +2160,7 @@ 邀请已发送到 %1$s 和 %2$d等 - 我们无法邀请用户,请检查您想要邀请的用户并重试。 + 我们无法邀请用户,请检查你想要邀请的用户并重试。 当前语言 其他可用语言 正在载入可用语言… @@ -2170,12 +2170,12 @@ 无法执行此操作。主服务器已过期。 请先配置身份服务器。 请先在设置中接受身份服务器的条款。 - 为了您的隐私,${app_name} 仅支持发送用户电子邮件和电话号码的哈希值。 + 为了你的隐私,${app_name} 仅支持发送用户电子邮件和电话号码的哈希值。 关联失败。 目前与此标识符没有关联。 - 您的主服务器(%1$s)建议使用 %2$s 作为您的身份服务器 + 你的主服务器(%1$s)建议使用 %2$s 作为你的身份服务器 使用 %1$s - 或者,您可以输入任何其他身份服务器 URL + 或者,你可以输入任何其他身份服务器 URL 输入身份服务器 URL 提交 设置角色 @@ -2187,69 +2187,69 @@ 启动相机 设置安全备份 安全备份 - 通过在您的服务器上备份加密密钥,防止失去对加密信息和数据的访问。 + 通过在你的服务器上备份加密密钥,防止失去对加密信息和数据的访问。 设置 使用安全密钥 生成安全密钥存储在安全的地方如密码管理器或保险箱。 使用安全口令 - 输入仅有您知道的安全口令,生成备份用的密钥。 - 保存您的安全密钥 - 将您的安全密钥存储在安全的地方,例如密码管理器或保险箱。 + 输入仅有你知道的安全口令,生成备份用的密钥。 + 保存你的安全密钥 + 将你的安全密钥存储在安全的地方,例如密码管理器或保险箱。 设置安全口令 - 输入只有您知道的安全口令,用于保护您的服务器上的秘密。 + 输入只有你知道的安全口令,用于保护你的服务器上的秘密。 安全口令 - 再次输入您的安全口令以确认。 - 保存您的安全密钥 - 将您的安全密钥存储在安全的地方如密码管理器或保险箱。 + 再次输入你的安全口令以确认。 + 保存你的安全密钥 + 将你的安全密钥存储在安全的地方如密码管理器或保险箱。 聊天室名称 主题 - 您已成功更改聊天室设置 - 您无法访问此消息 + 你已成功更改聊天室设置 + 你无法访问此消息 正在等待此消息,可能会花费一些时间 无法解密 - 由于端对端加密,您可能需要等待某人的消息到达因为加密密钥未正确发送给您。 - 您无法访问此消息因为您已屏蔽此发送者 - 您无法访问此消息,因为您的会话不被发送者信任 - 您无法访问此消息因为发送者有意不发送密钥 + 由于端对端加密,你可能需要等待某人的消息到达因为加密密钥未正确发送给你。 + 你无法访问此消息因为你已屏蔽此发送者 + 你无法访问此消息,因为你的会话不被发送者信任 + 你无法访问此消息因为发送者有意不发送密钥 正在等待加密历史 Riot 现已成为 Element! - 我们很高兴地宣布我们改名了!您的应用已经更新到最新版本,并且您已登录您的账号。 + 我们很高兴地宣布我们改名了!你的应用已经更新到最新版本,并且你已登录你的账号。 明白了 了解更多 将恢复密钥保存到 从我的通讯录添加 - 您的通讯录是空的 + 你的通讯录是空的 通讯录 搜索我的联系人 - 正在获取您的联系人… - 您的通讯录是空的 + 正在获取你的联系人… + 你的通讯录是空的 通讯录 撤销邀请 是否撤销对 %1$s 的邀请? 被 %1$s 封禁 解封用户失败 推送通知已禁用 - 查看您的设置以启用推送通知 + 查看你的设置以启用推送通知 选择 PIN 以确保安全 确认 PIN 验证 PIN 失败,请输入新的。 - 输入您的 PIN + 输入你的 PIN 忘记 PIN? 重置 PIN 新 PIN - 为重置您的 PIN,您将需要重新登录并创建新的。 + 为重置你的 PIN,你将需要重新登录并创建新的。 启用 PIN - 如果您想要重置您的 PIN,点按忘记 PIN 登出并重置。 + 如果你想要重置你的 PIN,点按忘记 PIN 登出并重置。 确认 PIN 并禁用 PIN 防止意外通话 发起通话之前要求确认 - 您没有权限在此聊天室发起会议通话 + 你没有权限在此聊天室发起会议通话 会议正在进行! 发起视频会议 发起音频会议 - 会议使用 Jitsi 安全与许可政策。您的会议进行期间当前聊天室内的所有人将看到加入邀请。 - 您无法呼叫您自己 - 您无法与自己通话,请等待参与者接受邀请 + 会议使用 Jitsi 安全与许可政策。你的会议进行期间当前聊天室内的所有人将看到加入邀请。 + 你无法呼叫你自己 + 你无法与自己通话,请等待参与者接受邀请 添加挂件失败 移除挂件失败 @@ -2267,27 +2267,27 @@ 错误代码,剩余 %d 次尝试 注意!登出前最后一次尝试! - 错误次数过多,您已被登出 + 错误次数过多,你已被登出 此电话号码已定义。 - 您的账号尚未添加电话号码 + 你的账号尚未添加电话号码 电子邮件地址 - 您的账号尚未添加电子邮件 + 你的账号尚未添加电子邮件 电话号码 移除 %s? - 请确认您已点击我们向您发送的电子邮件中的链接。 + 请确认你已点击我们向你发送的电子邮件中的链接。 电子邮件和电话号码 - 管理链接到您的 Matrix 账号的电子邮件和电话号码 + 管理链接到你的 Matrix 账号的电子邮件和电话号码 代码 请使用国际格式(电话号码必须以 ‘+’ 开始) - 通过验证此登录确认您的身份,授权它访问加密信息。 - 无法打开您被封禁的聊天室。 + 通过验证此登录确认你的身份,授权它访问加密信息。 + 无法打开你被封禁的聊天室。 无法找到此聊天室。请确认它存在。 - 您没有权限在此聊天室发起通话 + 你没有权限在此聊天室发起通话 %d 秒 显示聊天室成员状态事件 - 包括邀请/加入/离开/踢掉/封禁事件和头像/昵称变更。 + 包括邀请/加入/离开/踢掉/封禁事件和头像/昵称更改。 轮询 机器人按钮 回应:%s @@ -2311,22 +2311,22 @@ 显示 %d 部设备,这些设备是你现在可以验证的 - 您将重新启动,没有历史记录,消息,受信任的设备或受信任的用户 - 如果您重置一切 + 你将重新启动,没有历史记录,消息,受信任的设备或受信任的用户 + 如果你重置一切 仅当没有其他设备可用来验证此设备时,才执行此操作。 - 重置一切 + 全部重置 忘记或丢失了所有的恢复选项?重置一切 - 您已加入。 + 你已加入。 %s 已加入。 此聊天室的消息是端对端加密的。 离开 设置 此处的消息已被端对端加密。 \n -\n您的消息受加密保护,并且只有您和消息接收者拥有唯一解密密钥。 +\n你的消息受加密保护,并且只有你和消息接收者拥有唯一解密密钥。 此处的消息未经端对端加密。 - 此主服务器正在运行较旧版本。要求您的主服务器管理员升级。您可以继续,但一些功能可能无法正确工作。 - 您仅发出此邀请。 + 此主服务器正在运行较旧版本。要求你的主服务器管理员升级。你可以继续,但一些功能可能无法正确工作。 + 你仅发出此邀请。 %1$s 仅发出此邀请。 在加密聊天室显示完整历史 %1$s 和 %2$s @@ -2335,20 +2335,20 @@ %d 个邀请 通知已点击! - 请点击通知。如果您未看到通知,请检查系统设置。 + 请点击通知。如果你未看到通知,请检查系统设置。 通知显示 - 您正在查看通知!点我! + 你正在查看通知!点我! 接受推送失败。重装应用或可解决。 应用正在接受推送 应用正在等待推送 测试推送 尚不支持在加密聊天室中搜索。 过滤被封禁的用户 - 您没有权限发起通话 - 您没有权限发起会议通话 + 你没有权限发起通话 + 你没有权限发起会议通话 重置 - 允许访问您的联系人。 - 如需扫描二维码,您须允许相机访问权限。 + 允许访问你的联系人。 + 如需扫描二维码,你须允许相机访问权限。 没有更多结果 开始畅聊 删除地址 \"%1$s\"? @@ -2356,9 +2356,9 @@ 发布 手动发布新地址 其它发布的地址: - 主地址 - 这是主地址 - 发布的地址可以被任何服务器上的任何人用来加入您的聊天室。要发布一个地址,它必须先被设为一个本地地址。 + 主要地址 + 这是主要地址 + 发布的地址可以被任何服务器上的任何人用来加入你的聊天室。要发布一个地址,它必须先被设为一个本地地址。 发布的地址 聊天室地址 查看和管理此聊天室的地址,以及它在聊天室目录中的可见性。 @@ -2376,18 +2376,18 @@ "话题: " 添加一个话题 %s 使人们知道此聊天室关于什么。 - 这是您和 %s 的私聊消息历史记录的开始。 + 这是你和 %s 的私聊消息历史记录的开始。 这是此对话的开始。 这是 %s 的开始。 导出审计 - 您没有权限在此聊天室启用加密。 + 你没有权限在此聊天室启用加密。 私聊消息 正在创建聊天室… 一些字符不被允许 请提供一个聊天室地址 此地址已被使用 聊天室地址 - 您可以启用此选项如果此聊天室将仅用于您的主服务器上的内部团队协作。此选项之后无法更改。 + 你可以启用此选项如果此聊天室将仅用于你的主服务器上的内部团队协作。此选项之后无法更改。 屏蔽不是 %s 一部分的任何人加入此聊天室 隐藏高级 显示高级 @@ -2404,14 +2404,14 @@ 添加图像自 通过扫描二维码创建新的私聊对话 通过 Matrix ID 创建新的私聊对话 - 为发现您已知的现存联系人,您是否接受发送您的联系人数据(电话号码和/或电子邮件)到已配置的身份服务器(%1$s)? + 为发现你已知的现存联系人,你是否接受发送你的联系人数据(电话号码和/或电子邮件)到已配置的身份服务器(%1$s)? \n \n为加强隐私,发送的数据将在发送前计算散列值。 发送电子邮件和电话号码 授予许可 撤销我的许可 - 您尚未同意发送电子邮件和电话号码到身份服务器以从您的联系人发现其他用户。 - 您已同意发送电子邮件和电话号码到身份服务器以从您的联系人发现其他用户。 + 你尚未同意发送电子邮件和电话号码到身份服务器以从你的联系人发现其他用户。 + 你已同意发送电子邮件和电话号码到身份服务器以从你的联系人发现其他用户。 发送电子邮件和电话号码 建议 联系人 @@ -2424,16 +2424,16 @@ 主题 聊天室话题(可选) 聊天室名称 - 此聊天室无法预览。您想加入吗? + 此聊天室无法预览。你想加入吗? 目前无法访问此聊天室。 -\n请稍候重试,或询问聊天室管理员以确认您是否拥有访问权限。 +\n请稍候重试,或询问聊天室管理员以确认你是否拥有访问权限。 无法获取当前聊天室目录可见性(%1$s)。 是否将此聊天室发布至 %1$s 的聊天室目录中? 取消发布此地址 发布此地址 添加本地地址 此聊天室没有本地地址 - 为此聊天室设置地址以便用户通过您的主服务器(%1$s)找到此聊天室 + 为此聊天室设置地址以便用户通过你的主服务器(%1$s)找到此聊天室 本地地址 新的发布的地址(例如 #alias:server) 尚无其他已发布地址。 @@ -2450,7 +2450,7 @@ 更改聊天室名称 更改历史记录可见性 启用聊天室加密 - 更改聊天室主地址 + 更改聊天室主要地址 更改聊天室头像 修改挂件 通知每个人 @@ -2461,13 +2461,13 @@ 邀请用户 发送消息 默认角色 - 您没有权限更新更改聊天室多个部分所需角色 + 你没有权限更新更改聊天室多个部分所需角色 选择更改聊天室各个部分所需的角色 权限 需要查看和更新角色以更改聊天室多个部分。 聊天室权限 - 此聊天室不公开。您没有邀请将无法重新加入。 - 您保持通话 + 此聊天室不公开。你没有邀请将无法重新加入。 + 你保持通话 %s 保持通话 保持 继续 @@ -2487,10 +2487,10 @@ 需要重新验证 删除失败的消息 - 您确定要取消发送消息吗? + 你确定要取消发送消息吗? 消息发送失败 删除未发送的消息 - 您确定要删除此聊天室中所有未发送的消息吗? + 你确定要删除此聊天室中所有未发送的消息吗? 失败 状态事件已发送! 事件已发送! @@ -2512,7 +2512,7 @@ 用户 回拨 %1$s 发起了通话 - 您发起了通话 + 你发起了通话 %d 个条目 @@ -2534,11 +2534,11 @@ %1$s,%2$s,%3$s 和 %4$s %1$s,%2$s 和 %3$s %1$s 发起了视频会议 - 您发起了视频会议 + 你发起了视频会议 %1$s 启用了视频会议 - 您启用了视频会议 + 你启用了视频会议 %1$s 修改了视频会议 - 您修改了视频会议 + 你修改了视频会议 设置头像 聊天室设置 聊天室版本 @@ -2558,10 +2558,10 @@ 你修改了此聊天室的服务器访问控制列表。 %s 修改了此聊天室的服务器访问控制列表。 %s 为此聊天室设置了服务器访问控制列表。 - 您为此聊天室设置了服务器访问控制列表。 + 你为此聊天室设置了服务器访问控制列表。 在 Matrix 上查找联系人 用户尚未同意条款。 - 分享此二维码,其他人扫描后即可添加您,并开始聊天。 + 分享此二维码,其他人扫描后即可添加你,并开始聊天。 我的二维码 分享我的二维码 消息类型缺失 @@ -2575,4 +2575,180 @@ 从文件中导入密钥 发生错误,消息未能发送 状态键 + 有些聊天室可能被隐藏,因为其为私有聊天室,你需要得到邀请。 + 有些聊天室可能被隐藏,因为其为私有聊天室,你需要得到邀请。 +\n你没有权限添加聊天室。 + 此空间没有聊天室 + 请联系你的主服务器管理员以取得进一步资讯 + 看来你的主服务器尚未支持空间 + 想要做点实验? +\n你可以将现有的空间添加到其他空间中。 + 实验性空间 - 仅在首页显示无人看管的聊天室 + 管理聊天室和空间 + 标记为不建议 + 标记为建议 + 建议 + 使此空间公开 + 管理聊天室 + 正在寻找不在 %s 中的人? + %s 邀请了你 + 警告!需要服务支持实验性聊天室版本 + 实验性空间 - 受限的聊天室。 + 你被邀请 + 空间是一种将聊天室和人们进行分组的新方式 + 空间是一种将聊天室和人们进行重新分组的新方式。 + 欢迎来到空间! + 添加聊天室 + 添加现有聊天室和空间 + 你是此空间的管理员,请确保你在离开前已将管理权限转让给另一位成员。 + 此空间并非公开空间。你将无法在没有邀请的情况下重新加入。 + 你是这唯一的人。如果你离开,包括你在内的所有人都将无法加入此空间。 + 你确定你想要离开此空间吗? + 离开空间 + 添加聊天室 + 探索聊天室 + + 你认识的 %d 个人已加入 + + 欢迎来到 %1$s,%2$s。 + 你还没有任何聊天室。下面是一些推荐的聊天室,你也可以通过右下方的按钮查看更多。 + 此别名当前无法被访问。 +\n请稍后再试,或询问聊天室管理员你身份有权访问。 + 无论以何种方式加入 + 加入空间 + 创建空间 + 暂且略过 + 加入我的空间 %1$s %2$s + 他们不会成为 %s 的一部分 + 刚到此房间 + 他们将可以探索 %s + 邀请至 %s + 分享链接 + 通过用户名进行邀请 + 通过电子邮件进行邀请 + 此刻仅有你自己。%s 与他人一道会更好。 + 邀请至 %s + 邀请人们 + 邀请人们加入你的空间 + 描述 + 正在创建空间…… + 随机 + 一般性 + 让我们为每个主题创建一个聊天室。你也可以稍后再进行增加,包括现有聊天室。 + 你在做些什么? + 我们将会为此创建聊天室。你也可以在稍后增加更多。 + 你希望在 %s 中进行哪些讨论? + 为它取名以继续。 + 增加一些详细信息以帮助人们识别。你可以随时更改这些信息。 + 增加一些详细信息以帮助其脱颖而出。你可以随时更改这些详细信息。 + 创建空间 + 仅邀请,最适合你自己或团队 + 私有 + 对任何人开放,最适合社群 + 公开 + 供你和你的伙伴使用的私有空间 + 我和伙伴 + 用于整理你聊天室的私有空间 + 仅我 + 确保对的人可以访问 %s。你可以稍后进行更改。 + 你与谁一同工作? + 要加入现有空间,你需要获得邀请。 + 你可以稍后更改 + 你想要创建哪种类型的空间? + 你的私有空间 + 你的公开空间 + 添加空间 + 离开指定 id 的聊天室(如果为空值则为当前所处的聊天室) + 使用指定的 id 加入空间 + 创建空间 + 此聊天室为公开聊天室 + 未检查 + 开启挂件 + 屏幕截图 + ${app_name} 要求你输入凭据才能执行此操作。 + 呼叫转移时发生错误 + 先询问 + + 1 个通话中(%1$s) · %2$d 暂停通话 + + 查找电话号码时发生了错误 + 此通话已结束 + %1$s 拒绝了此通话 + 你拒绝了此通话 %1$s + 你当前正处于此通话中 + 有未保存的更改。要放弃更改吗? + 聊天室尚未创建。取消创建聊天室? + 未扫描二维码! + 无效的二维码(无效的 URI)! + 无法向你自己发送私聊消息! + 通过文字分享 + 更改你当前的 PIN + 更改 PIN + 🔐️ 在 ${app_name} 上加入我的行列 + 嗨,和我在 ${app_name} 上聊天吧:%s + 发送原始大小的媒体 + + 发送原始大小的视频 + + 限制未知。 + 你的主服务器能接受大小最大为 %s 的附件(文件、媒体等)。 + 服务器文件上传限制 + 此文件过大,无法上传。 + 此功能仍处于测试中 + 搜索名称 + 正在压缩视频 %d%% + 正在压缩图片…… + 意见反馈 + 反馈发送失败(%s) + 感谢,你的反馈已成功送达 + 如果你后续有任何问题,欢迎联系我 + 你正在使用空间的测试版。你的反馈将有助于改善下一版本。我们将会记录你的平台和用户名以帮助我们尽我们所能多发挥你的反馈的作用。 + 反馈 + 空间反馈 + 离开当前的回忆并切换至其他会议? + 抱歉,在尝试加入会议时发生了错误 + 所有在此空间中的人都可以找到并加入它。仅有此聊天室的管理员可以将其添加到空间中。 + 空间 + 任何人都能找到聊天室并加入 + 公开 + 仅有被邀请的人才能找到并加入 + 私有 + 未知的访问设置(%s) + 任何人都可以要求加入聊天室,成员可以接受或拒绝 + 允许访客加入 + 设置为默认值,并不再询问 + 总是询问 + 空间 + 邀请 + 显示聊天室目录中的所有聊天室,包括带有脏标的聊天室。 + 显示带有脏标的聊天室 + 聊天室目录 + 推荐的聊天室 + 新值 + 你更改了此聊天室的地址。 + %1$s 更改了此聊天室的地址。 + 你为此聊天室更改了主要和备用地址。 + %1$s 已为此聊天室更改了主要和备用地址。 + %1$s 更改了此聊天室的备用地址。 + 你已为此聊天室更改了备用地址。 + + 你已为此聊天室移除了备用地址 %1$s。 + + + %1$s 已为此聊天室移除了备用地址 %2$s。 + + + 你已为此聊天室添加了备用地址 %1$s。 + + + %1$s 已为此聊天室添加了备用地址 %2$s。 + + 消息已发送 + 🎉 所有服务器都被禁止参与!此聊天室已无法再使用。 + 无更改。 + • 服务器匹配 IP 常量,现已被封禁。 + • 服务器匹配 IP 常量,现已被允许。 + • 服务器符合 %s 已从允许列表中移除。 + • 服务器符合 %s 现已被允许。 + • 服务器符合 %s 已从封禁列表中移除。 \ No newline at end of file From 767c1a9dee39dbb2df6fc06f7b66357b0342612d Mon Sep 17 00:00:00 2001 From: Julian Heinzel Date: Sat, 29 May 2021 12:21:21 +0000 Subject: [PATCH 027/254] Translated using Weblate (German) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/de/ --- fastlane/metadata/android/de/changelogs/40101070.txt | 6 +----- fastlane/metadata/android/de/full_description.txt | 8 ++++---- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/fastlane/metadata/android/de/changelogs/40101070.txt b/fastlane/metadata/android/de/changelogs/40101070.txt index cbb692b0ab..757475a44d 100644 --- a/fastlane/metadata/android/de/changelogs/40101070.txt +++ b/fastlane/metadata/android/de/changelogs/40101070.txt @@ -1,6 +1,2 @@ -Hauptänderungen in dieser Version: -- Mit Spaces kannst du deine Räume gruppieren (Beta) -- Optionale Videokomprimierung -- Verschiedene Verbesserungen und Bugfixes - +Hauptänderungen in dieser Version: Mit Spaces kannst du deine Räume gruppieren (Beta). Videos können vor dem Senden komprimiert werden. Die vollständige Änderungsliste gibt es hier: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt index 83759b0b4b..30eb153ee9 100644 --- a/fastlane/metadata/android/de/full_description.txt +++ b/fastlane/metadata/android/de/full_description.txt @@ -1,4 +1,4 @@ -Element ist ein sicherer Messenger und ideal für die produktive Zusammenarbeit mit deinem Team im Homeoffice. Mit eingebauter Ende-zu-Ende-Verschlüsselung ermöglicht Element auch umfangreiche und sichere Videokonferenzen, das Teilen von Dateien, Sprachanrufe und vieles mehr. +Element ist ein sicherer Messenger und ideal für die produktive Zusammenarbeit mit Ihrem Team im Homeoffice. Mit eingebauter Ende-zu-Ende-Verschlüsselung ermöglicht Element auch umfangreiche und sichere Videokonferenzen, das Teilen von Dateien, Sprachanrufe und vieles mehr. Element bietet folgende Funktionen: - Fortschrittliche Werkzeuge für die Online-Kommunikation @@ -22,7 +22,7 @@ Um mehr Kontrolle über Ihre sensiblen Daten und Konversationen zu ermöglichen, Sie entscheiden, wo Sie Ihre Daten und Nachrichten aufbewahren - ohne das Datensammeln oder den Zugriff Dritter zu riskieren. Element gibt Ihnen auf verschiedene Arten Kontrolle: -1. Sie können sich kostenlos auf dem öffentlichen matrix.org-Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder einen aus Tausenden von öffentlichen Servern, die von Freiwilligen betrieben werden, auswählen +1. Sie können sich kostenlos auf dem öffentlichen matrix.org-Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder einen von Tausenden öffentlichen Servern, die von Freiwilligen betrieben werden, auswählen 2. Sie haben die Möglichkeit, ein Konto auf einem eigenen Server in der eigenen IT-Infrastruktur betreiben 3. Außerdem können Sie durch ein Abonnement der Element Matrix Services ein Konto auf einem für Sie maßgeschneiderten Server erstellen @@ -30,10 +30,10 @@ Element gibt Ihnen auf verschiedene Arten Kontrolle: Sie können mit jedem im Matrix-Netzwerk chatten, egal ob ihr Kontakt Element, eine andere Matrix-App oder sogar eine völlig andere Anwendung nutzt. Super sicher -Durch Ende-zu-Ende-Verschlüsselung können nur die Personen, die in der Unterhaltung sind, die Nachrichten lesen können. Außerdem stellt die Verifizierung mittels Quersignierung sicher, dass Sie wirklich mit dem Chatten, mit dem Sie glauben - und niemand anderen. +Durch Ende-zu-Ende-Verschlüsselung können nur die Personen, die in der Unterhaltung sind, die Nachrichten lesen. Außerdem stellt die Verifizierung mittels Quersignierung sicher, dass Sie wirklich mit dem Chatten, mit dem Sie glauben - und niemand Anderem. Vollständige Kommunikation und Integration Kurznachrichten, Sprach- und Videoanrufe, Dateifreigaben, Bildschirmübertragungen und einer Menge an Integrationen, Bots und Widgets. Schaffen Sie Räume und Communities, bleiben Sie auf dem Laufenden und erledigen Sie Sachen. Da Weitermachen, wo Sie aufgehört haben -Bleiben Sie in Kontakt, egal wo Sie sind, mit vollständig synchronisiertem Nachrichtenverlauf quer über all Ihre Geräte und im Browser auf https://app.element.io +Bleiben Sie in Kontakt, egal wo Sie sind, mit vollständig synchronisiertem Nachrichtenverlauf quer über all Ihre Geräte und im Netz auf https://app.element.io From ba3ae35b62f744f8ff8779f89e6e364491f0fe81 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 28 May 2021 09:36:24 +0000 Subject: [PATCH 028/254] Translated using Weblate (Hungarian) Currently translated at 26.3% (5 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/ --- fastlane/metadata/android/hu/short_description.txt | 2 +- fastlane/metadata/android/hu/title.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/hu/short_description.txt b/fastlane/metadata/android/hu/short_description.txt index 89f7c13f54..2dfe14c516 100644 --- a/fastlane/metadata/android/hu/short_description.txt +++ b/fastlane/metadata/android/hu/short_description.txt @@ -1 +1 @@ -Biztonságos, decentralizált chat és VoIP. Tartsd az adataid biztonságban. +Csoportos üzenetküldő - titkosított üzenetek, videó hívások diff --git a/fastlane/metadata/android/hu/title.txt b/fastlane/metadata/android/hu/title.txt index 8e493d2d08..c463dea393 100644 --- a/fastlane/metadata/android/hu/title.txt +++ b/fastlane/metadata/android/hu/title.txt @@ -1 +1 @@ -Element (régebben Riot.im) +Element - Biztonságos üzenetküldő From 852bd21e9af19de24e46b301b4860f0cb9108625 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 28 May 2021 20:08:51 +0000 Subject: [PATCH 029/254] Translated using Weblate (Swedish) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/ --- fastlane/metadata/android/sv/changelogs/40101070.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/sv/changelogs/40101070.txt diff --git a/fastlane/metadata/android/sv/changelogs/40101070.txt b/fastlane/metadata/android/sv/changelogs/40101070.txt new file mode 100644 index 0000000000..4756a2d028 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: betastöd för utrymmen. Komprimera video innan den skickas. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.7 From 252eec5c2fa49376ee9ea0c7f108c6bc2f648961 Mon Sep 17 00:00:00 2001 From: Percy Date: Fri, 28 May 2021 11:16:31 +0000 Subject: [PATCH 030/254] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hans/ --- .../android/zh-Hans/changelogs/40101020.txt | 2 + .../android/zh-Hans/changelogs/40101030.txt | 2 + .../android/zh-Hans/changelogs/40101040.txt | 2 + .../android/zh-Hans/changelogs/40101050.txt | 2 + .../android/zh-Hans/changelogs/40101060.txt | 2 + .../android/zh-Hans/changelogs/40101070.txt | 2 + .../android/zh-Hans/full_description.txt | 47 +++++++++++-------- 7 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/40101020.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/40101030.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/40101040.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/40101050.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/40101060.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/40101070.txt diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40101020.txt b/fastlane/metadata/android/zh-Hans/changelogs/40101020.txt new file mode 100644 index 0000000000..0de3f2aed0 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/40101020.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:改进性能和错误修复! +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.2 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40101030.txt b/fastlane/metadata/android/zh-Hans/changelogs/40101030.txt new file mode 100644 index 0000000000..5a7fae92d5 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/40101030.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:改进性能和修复错误! +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.3 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40101040.txt b/fastlane/metadata/android/zh-Hans/changelogs/40101040.txt new file mode 100644 index 0000000000..44a3547b3e --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/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/zh-Hans/changelogs/40101050.txt b/fastlane/metadata/android/zh-Hans/changelogs/40101050.txt new file mode 100644 index 0000000000..c320815a00 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/40101050.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:1.1.4 的热修复 +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.5 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40101060.txt b/fastlane/metadata/android/zh-Hans/changelogs/40101060.txt new file mode 100644 index 0000000000..193ef8f48e --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/40101060.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:1.1.5 的热修复 +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.6 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/40101070.txt b/fastlane/metadata/android/zh-Hans/changelogs/40101070.txt new file mode 100644 index 0000000000..ba8e92be9b --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/40101070.txt @@ -0,0 +1,2 @@ +此版本中的主要更新:对「空间」的测试版支持。发送前压缩视频。 +完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/zh-Hans/full_description.txt b/fastlane/metadata/android/zh-Hans/full_description.txt index 4791c9652b..fa6b00f1e4 100644 --- a/fastlane/metadata/android/zh-Hans/full_description.txt +++ b/fastlane/metadata/android/zh-Hans/full_description.txt @@ -1,30 +1,39 @@ -Element 是一种新型的通讯与协作应用: +Element 不仅是安全的通讯软件,同时也是生产力团队协作应用,非常适合在远端工作时进行群组聊天。此聊天应用使用了端到端加密来提供强大的视频会议、文件分享与语音通话功能。 -1. 使您可以掌控您的隐私 -2. 使您与 Matrix 网络中的任何人交流,甚至可以通过集成功能与如 Slack 之类的其他应用通讯 -3. 保护您免受广告,大数据挖掘和封闭服务的侵害 -4. 通过端到端加密保证安全,通过交叉签名验证其他人 +Element 的功能包含了: +- 进阶的线上通讯工具 +- 完全加密的信息,即使对于远端工作者来说,也可以有更安全的公司通讯 +- 以 Matrix 开放源码框架为基础的去中心化的聊天 +- 在管理项目时通过加密资料安全地分享文件 +- 包含了 VoIP 与画面分享的视频聊天 +- 与你最喜欢的协作工具、项目管理工具、VoIP 服务与其他团队信息应用轻松整合 -Element 与其他通讯与协作应用完全不同,因为它是去中心化且开源的。 +Element 与其他信息传递与协作应用完全不同。它在 Matrix(一个用于安全传递讯息与去中心化通讯的开放网络)上运行。其可以自建,让使用者对他们的资料和信息拥有最大的所有权与控制权。 -Element 允许您自托管——或者选择托管商——因此,您能拥有数据和会话的隐私权,所有权和控制权。它允许您访问开放网络;因此,您可以与 Element 用户以外的人交流。并且它非常安全。 +隐私与加密信息传递 +Element 保护你不受不想要的广告、信息泄露与围城侵扰。其也通过端到端加密与交叉签章装置验证保护了你所有的资料,并提供一对一视频以及语音通讯。 -Element 之所以可以做到这些,是因为它在 Matrix 上运行——开放,去中心化通讯的标准。 +Element 通过与其他商业协作工具,如 Slack 等应用整合,让你可以在控制你的隐私的同时,也可以与 Matrix 网络上的任何人安全地通讯。 -通过让您选择由谁来托管您的会话,Element 让您掌控一切。在 Element 应用中,您可以选择不同的托管方式: +Element 可以自建 +为了可以完整控制你的敏感资料与对话,Element 可以自建,你也可以选择任何以 Matrix 为基础的服务提供商,开放源码、去中心化的通讯标准。Element 为你提供隐私、安全合规与整合灵活性。 -1. 在由 Matrix 开发者托管的 matrix.org 公共服务器上获取免费帐户,或从志愿者托管的上千个公共服务器中选择 -2. 在您自己的硬件上运行服务器,自托管您的会话 -3. 通过订阅 Element Matrix Services 托管平台,简单地在自定义服务器上注册账户 +拥有你的资料 +你可以决定将你的资料与信息储存在何处。没有信息泄露或被第三方爬取的风险。 -为什么选择 Element? +Element 透过不同的方式让你掌控一切: +1. 在 Matrix 开发者架设的 matrix.org 公开服务器上取得免费帐号,或是从数千个由志愿者架设的公开服务器中选择 +2. 在你自己的 IT 基础架构上的服务器自行托管你的帐号 +3. 只要订阅 Element Matrix Services 托管平台就可以在自定义的服务器上注册帐号 -掌控您的数据:您来决定存放您的数据和消息的位置。拥有并控制它的是您,而不是挖掘您的数据或与第三方分享的巨型企业。 +开放信息传递与协作 +你可以与 Matrix 网络上的任何人聊天,不论他们是使用 Element、其他 Matrix 应用或其他通讯应用。 -开放通讯与协作:您可以与 Matrix 网络中的任何人聊天,不论他们使用 Element 还是其他 Matrix 应用,甚至/即使他们在使用不同的通讯系统,例如 Slack,IRC 或 XMPP。 +超级安全 +真正的端到端加密(仅有那些在对话中的可以解密讯息)以及交叉签章装置验证。 -超级安全:支持真正的端到端加密(仅有会话中的人可以解密消息),还有能够验证会话参与方的设备的交叉签名。 +完整的通讯与整合 +信息传递、语音与视频通话、文件分享、画面分享与超多的整合、机器人与挂件。建构聊天室、社群、保持联络并完成工作。 -完善的通讯方式:消息,语音和视频通话,文件共享,屏幕共享和大量集成功能,机器人和小挂件。建立房间与社区,保持联系并完成工作。 - -随时随地:消息历史可在您的全部设备和 https://app.element.io 网页端之间完全同步,无论您在哪里,都可以保持联系。 +从上次离开的地方开始 +无论你身在何处,都可以透过在你所有设备与网页 https://app.element.io 间完全同步的信息历史保持联络 From 62d94a4d4f1fe4927e4119972902675598f07854 Mon Sep 17 00:00:00 2001 From: random Date: Fri, 28 May 2021 13:47:47 +0000 Subject: [PATCH 031/254] Translated using Weblate (Italian) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/it/ --- fastlane/metadata/android/it/changelogs/40101070.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/it/changelogs/40101070.txt diff --git a/fastlane/metadata/android/it/changelogs/40101070.txt b/fastlane/metadata/android/it/changelogs/40101070.txt new file mode 100644 index 0000000000..6f7ffcd958 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: supporto beta per gli Spazi. Compressione video prima dell'invio. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.7 From 0eca809b83fc3bf9def1a48bcdae7f4a65cc28b6 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 1 Jun 2021 18:12:10 +0200 Subject: [PATCH 032/254] Asserted identity: handle if needed and use the data --- vector/build.gradle | 4 +++ .../app/features/call/VectorCallActivity.kt | 8 ++--- .../app/features/call/VectorCallViewModel.kt | 30 ++++++++++++++--- .../app/features/call/VectorCallViewState.kt | 5 +-- .../app/features/call/webrtc/WebRtcCall.kt | 33 ++++++++++++++++--- .../features/call/webrtc/WebRtcCallManager.kt | 4 +++ 6 files changed, 70 insertions(+), 14 deletions(-) diff --git a/vector/build.gradle b/vector/build.gradle index 8af6e80479..c8399b2fb9 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -144,6 +144,10 @@ android { buildConfigField "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy", "outboundSessionKeySharingStrategy", "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy.WhenTyping" + // If set, MSC3086 asserted identity messages sent on VoIP calls will cause the call to appear in the room corresponding to the asserted identity. + // This *must* only be set in trusted environments. + buildConfigField "Boolean", "handleCallAssertedIdentityEvents", "false" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // Keep abiFilter for the universalApk diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt index ad04e33414..a18f5bb918 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt @@ -221,7 +221,7 @@ class VectorCallActivity : VectorBaseActivity(), CallContro views.callStatusText.setText(R.string.call_held_by_you) } else { views.callActionText.isInvisible = true - state.callInfo.otherUserItem?.let { + state.callInfo?.opponentUserItem?.let { views.callStatusText.text = getString(R.string.call_held_by_user, it.getBestName()) } } @@ -255,7 +255,7 @@ class VectorCallActivity : VectorBaseActivity(), CallContro } private fun configureCallInfo(state: VectorCallViewState, blurAvatar: Boolean = false) { - state.callInfo.otherUserItem?.let { + state.callInfo?.opponentUserItem?.let { val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen) avatarRenderer.renderBlur(it, views.bgCallView, sampling = 20, rounded = false, colorFilter = colorFilter) if (state.transferee is VectorCallViewState.TransfereeState.NoTransferee) { @@ -269,13 +269,13 @@ class VectorCallActivity : VectorBaseActivity(), CallContro avatarRenderer.render(it, views.otherMemberAvatar) } } - if (state.otherKnownCallInfo?.otherUserItem == null) { + if (state.otherKnownCallInfo?.opponentUserItem == null) { views.otherKnownCallLayout.isVisible = false } else { val otherCall = callManager.getCallById(state.otherKnownCallInfo.callId) val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen) avatarRenderer.renderBlur( - matrixItem = state.otherKnownCallInfo.otherUserItem, + matrixItem = state.otherKnownCallInfo.opponentUserItem, imageView = views.otherKnownCallAvatarView, sampling = 20, rounded = false, diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt index 18eda0fd6f..68905b6c49 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt @@ -34,11 +34,13 @@ import im.vector.app.features.call.webrtc.getOpponentAsMatrixItem import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.call.CallState import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.api.session.call.MxPeerConnectionState import org.matrix.android.sdk.api.session.room.model.call.supportCallTransfer +import org.matrix.android.sdk.api.util.MatrixItem class VectorCallViewModel @AssistedInject constructor( @Assisted initialState: VectorCallViewState, @@ -87,6 +89,12 @@ class VectorCallViewModel @AssistedInject constructor( } } + override fun assertedIdentityChanged(){ + setState { + copy(callInfo = call?.extractCallInfo()) + } + } + override fun onStateUpdate(call: MxCall) { val callState = call.state if (callState is CallState.Connected && callState.iceConnectionState == MxPeerConnectionState.CONNECTED) { @@ -160,8 +168,7 @@ class VectorCallViewModel @AssistedInject constructor( if (otherCall == null) { copy(otherKnownCallInfo = null) } else { - val otherUserItem = otherCall.getOpponentAsMatrixItem(session) - copy(otherKnownCallInfo = VectorCallViewState.CallInfo(otherCall.callId, otherUserItem)) + copy(otherKnownCallInfo = otherCall.extractCallInfo()) } } } @@ -175,7 +182,6 @@ class VectorCallViewModel @AssistedInject constructor( } else { call = webRtcCall callManager.addCurrentCallListener(currentCallListener) - val item = webRtcCall.getOpponentAsMatrixItem(session) webRtcCall.addListener(callListener) val currentSoundDevice = callManager.audioManager.selectedDevice if (currentSoundDevice == CallAudioManager.Device.PHONE) { @@ -185,7 +191,7 @@ class VectorCallViewModel @AssistedInject constructor( copy( isVideoCall = webRtcCall.mxCall.isVideoCall, callState = Success(webRtcCall.mxCall.state), - callInfo = VectorCallViewState.CallInfo(callId, item), + callInfo = webRtcCall.extractCallInfo(), device = currentSoundDevice ?: CallAudioManager.Device.PHONE, isLocalOnHold = webRtcCall.isLocalOnHold, isRemoteOnHold = webRtcCall.remoteOnHold, @@ -202,6 +208,22 @@ class VectorCallViewModel @AssistedInject constructor( } } + private fun WebRtcCall.extractCallInfo(): VectorCallViewState.CallInfo{ + val assertedIdentity = this.remoteAssertedIdentity + val matrixItem = if(assertedIdentity != null){ + val userId = if (MatrixPatterns.isUserId(assertedIdentity.id)) { + assertedIdentity.id!! + } else { + // Need an id starting with @ + "@${assertedIdentity.displayName}" + } + MatrixItem.UserItem(userId,assertedIdentity.displayName, assertedIdentity.avatarUrl) + }else { + getOpponentAsMatrixItem(session) + } + return VectorCallViewState.CallInfo(callId, matrixItem) + } + override fun onCleared() { callManager.removeCurrentCallListener(currentCallListener) call?.removeListener(callListener) diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt index c5ae61cf60..b6c226564e 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt @@ -20,6 +20,7 @@ import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized import im.vector.app.features.call.audio.CallAudioManager +import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.session.call.CallState import org.matrix.android.sdk.api.util.MatrixItem @@ -39,7 +40,7 @@ data class VectorCallViewState( val availableDevices: Set = emptySet(), val callState: Async = Uninitialized, val otherKnownCallInfo: CallInfo? = null, - val callInfo: CallInfo = CallInfo(callId), + val callInfo: CallInfo? = null, val formattedDuration: String = "", val canOpponentBeTransferred: Boolean = false, val transferee: TransfereeState = TransfereeState.NoTransferee @@ -53,7 +54,7 @@ data class VectorCallViewState( data class CallInfo( val callId: String, - val otherUserItem: MatrixItem? = null + val opponentUserItem: MatrixItem? = null, ) constructor(callArgs: CallArgs) : this( diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt index 319fef87f9..4212a4e789 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt @@ -27,6 +27,7 @@ import im.vector.app.features.call.CameraProxy import im.vector.app.features.call.CameraType import im.vector.app.features.call.CaptureFormat import im.vector.app.features.call.VectorCallActivity +import im.vector.app.features.call.lookup.sipNativeLookup import im.vector.app.features.call.utils.asWebRTC import im.vector.app.features.call.utils.awaitCreateAnswer import im.vector.app.features.call.utils.awaitCreateOffer @@ -882,10 +883,34 @@ class WebRtcCall( } fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) { - if (callAssertedIdentityContent.assertedIdentity == null) return - remoteAssertedIdentity = callAssertedIdentityContent.assertedIdentity - listeners.forEach { - tryOrNull { it.assertedIdentityChanged() } + sessionScope?.launch(dispatcher) { + val session = sessionProvider.get() ?: return@launch + val newAssertedIdentity = callAssertedIdentityContent.assertedIdentity ?: return@launch + if (newAssertedIdentity.id == null && newAssertedIdentity.displayName == null) { + Timber.v("Asserted identity received with no relevant information, skip") + return@launch + } + remoteAssertedIdentity = newAssertedIdentity + if (newAssertedIdentity.id != null) { + val nativeUserId = session.sipNativeLookup(newAssertedIdentity.id!!).firstOrNull()?.userId + if (nativeUserId != null) { + val resolvedUser = tryOrNull { + session.resolveUser(nativeUserId) + } + if (resolvedUser != null) { + remoteAssertedIdentity = newAssertedIdentity.copy( + id = nativeUserId, + avatarUrl = resolvedUser.avatarUrl, + displayName = resolvedUser.displayName + ) + } else { + remoteAssertedIdentity = newAssertedIdentity.copy(id = nativeUserId) + } + } + } + listeners.forEach { + tryOrNull { it.assertedIdentityChanged() } + } } } diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt index a333d5e81b..d56f1aa015 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent import im.vector.app.ActiveSessionDataSource +import im.vector.app.BuildConfig import im.vector.app.core.services.CallService import im.vector.app.features.call.VectorCallActivity import im.vector.app.features.call.audio.CallAudioManager @@ -423,6 +424,9 @@ class WebRtcCallManager @Inject constructor( } override fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) { + if(!BuildConfig.handleCallAssertedIdentityEvents){ + return + } val call = callsByCallId[callAssertedIdentityContent.callId] ?: return Unit.also { Timber.w("onCallAssertedIdentityReceived for non active call? ${callAssertedIdentityContent.callId}") From 74497dadd2d4dc599ad9b5f06819745cdd379cd5 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 2 Jun 2021 17:06:10 +0200 Subject: [PATCH 033/254] Dial pad tab: first step, remove current way --- .../features/call/DialerChoiceBottomSheet.kt | 46 --------------- .../home/room/detail/RoomDetailAction.kt | 1 - .../home/room/detail/RoomDetailFragment.kt | 2 +- .../home/room/detail/RoomDetailViewModel.kt | 23 -------- .../home/room/detail/RoomDetailViewState.kt | 1 - .../room/detail/StartCallActionsHandler.kt | 56 ++----------------- 6 files changed, 6 insertions(+), 123 deletions(-) delete mode 100644 vector/src/main/java/im/vector/app/features/call/DialerChoiceBottomSheet.kt diff --git a/vector/src/main/java/im/vector/app/features/call/DialerChoiceBottomSheet.kt b/vector/src/main/java/im/vector/app/features/call/DialerChoiceBottomSheet.kt deleted file mode 100644 index 401b3e23d7..0000000000 --- a/vector/src/main/java/im/vector/app/features/call/DialerChoiceBottomSheet.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2021 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.call - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment -import im.vector.app.databinding.BottomSheetCallDialerChoiceBinding - -class DialerChoiceBottomSheet : VectorBaseBottomSheetDialogFragment() { - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetCallDialerChoiceBinding { - return BottomSheetCallDialerChoiceBinding.inflate(inflater, container, false) - } - - var onDialPadClicked: (() -> Unit)? = null - var onVoiceCallClicked: (() -> Unit)? = null - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - views.dialerChoiceDialPad.views.bottomSheetActionClickableZone.debouncedClicks { - onDialPadClicked?.invoke() - dismiss() - } - - views.dialerChoiceVoiceCall.views.bottomSheetActionClickableZone.debouncedClicks { - onVoiceCallClicked?.invoke() - dismiss() - } - } -} diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt index 72e614c18c..c0e73823e4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt @@ -73,7 +73,6 @@ sealed class RoomDetailAction : VectorViewModelAction { object ResendAll : RoomDetailAction() - data class StartCallWithPhoneNumber(val phoneNumber: String, val videoCall: Boolean): RoomDetailAction() data class StartCall(val isVideo: Boolean) : RoomDetailAction() data class AcceptCall(val callId: String): RoomDetailAction() object EndCall : RoomDetailAction() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index 7fa36a39d7..b42ec38a3a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -320,7 +320,7 @@ class RoomDetailFragment @Inject constructor( startCallActivityResultLauncher = startCallActivityResultLauncher, showDialogWithMessage = ::showDialogWithMessage, onTapToReturnToCall = ::onTapToReturnToCall - ).register() + ) keyboardStateUtils = KeyboardStateUtils(requireActivity()) setupToolbar(views.roomToolbar) setupRecyclerView() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index a2041c0a80..2be96e07e9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -176,7 +176,6 @@ class RoomDetailViewModel @AssistedInject constructor( observeMyRoomMember() observeActiveRoomWidgets() observePowerLevel() - updateShowDialerOptionState() room.getRoomSummaryLive() viewModelScope.launch(Dispatchers.IO) { tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.READ_RECEIPT) } @@ -301,7 +300,6 @@ class RoomDetailViewModel @AssistedInject constructor( is RoomDetailAction.TapOnFailedToDecrypt -> handleTapOnFailedToDecrypt(action) is RoomDetailAction.SelectStickerAttachment -> handleSelectStickerAttachment() is RoomDetailAction.OpenIntegrationManager -> handleOpenIntegrationManager() - is RoomDetailAction.StartCallWithPhoneNumber -> handleStartCallWithPhoneNumber(action) is RoomDetailAction.StartCall -> handleStartCall(action) is RoomDetailAction.AcceptCall -> handleAcceptCall(action) is RoomDetailAction.EndCall -> handleEndCall() @@ -327,17 +325,6 @@ class RoomDetailViewModel @AssistedInject constructor( }.exhaustive } - private fun handleStartCallWithPhoneNumber(action: RoomDetailAction.StartCallWithPhoneNumber) { - viewModelScope.launch { - try { - val result = DialPadLookup(session, callManager, directRoomHelper).lookupPhoneNumber(action.phoneNumber) - callManager.startOutgoingCall(result.roomId, result.userId, action.videoCall) - } catch (failure: Throwable) { - _viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure)) - } - } - } - private fun handleAcceptCall(action: RoomDetailAction.AcceptCall) { callManager.getCallById(action.callId)?.also { _viewEvents.post(RoomDetailViewEvents.DisplayAndAcceptCall(it)) @@ -1491,16 +1478,6 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.OnNewTimelineEvents(eventIds)) } - override fun onPSTNSupportUpdated() { - updateShowDialerOptionState() - } - - private fun updateShowDialerOptionState() { - setState { - copy(showDialerOption = callManager.supportsPSTNProtocol) - } - } - override fun onCleared() { roomSummariesHolder.remove(room.roomId) timeline.dispose() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt index 965733c424..1ead34fadd 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt @@ -75,7 +75,6 @@ data class RoomDetailViewState( val canInvite: Boolean = true, val isAllowedToManageWidgets: Boolean = false, val isAllowedToStartWebRTCCall: Boolean = true, - val showDialerOption: Boolean = false, val hasFailedSending: Boolean = false ) : MvRxState { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt index cf508a2dab..e777f6d628 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt @@ -22,19 +22,13 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import com.airbnb.mvrx.withState import im.vector.app.R -import im.vector.app.core.platform.Restorable import im.vector.app.core.utils.PERMISSIONS_FOR_AUDIO_IP_CALL import im.vector.app.core.utils.PERMISSIONS_FOR_VIDEO_IP_CALL import im.vector.app.core.utils.checkPermissions -import im.vector.app.features.call.DialerChoiceBottomSheet -import im.vector.app.features.call.dialpad.CallDialPadBottomSheet -import im.vector.app.features.call.dialpad.DialPadFragment import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.session.widgets.model.WidgetType -private const val DIALER_OPTION_TAG = "DIALER_OPTION_TAG" -private const val DIAL_PAD_TAG = "DIAL_PAD_TAG" class StartCallActionsHandler( private val roomId: String, @@ -44,52 +38,20 @@ class StartCallActionsHandler( private val roomDetailViewModel: RoomDetailViewModel, private val startCallActivityResultLauncher: ActivityResultLauncher>, private val showDialogWithMessage: (String) -> Unit, - private val onTapToReturnToCall: () -> Unit): Restorable { + private val onTapToReturnToCall: () -> Unit) { fun onVideoCallClicked() { handleCallRequest(true) } - fun onVoiceCallClicked() = withState(roomDetailViewModel) { - if (it.showDialerOption) { - displayDialerChoiceBottomSheet() - } else { - handleCallRequest(false) - } - } - - private fun DialerChoiceBottomSheet.applyListeners(): DialerChoiceBottomSheet { - onDialPadClicked = ::displayDialPadBottomSheet - onVoiceCallClicked = { handleCallRequest(false) } - return this - } - - private fun CallDialPadBottomSheet.applyCallback(): CallDialPadBottomSheet { - callback = object : DialPadFragment.Callback { - override fun onOkClicked(formatted: String?, raw: String?) { - if (raw.isNullOrEmpty()) return - roomDetailViewModel.handle(RoomDetailAction.StartCallWithPhoneNumber(raw, false)) - } - } - return this - } - - private fun displayDialerChoiceBottomSheet() { - DialerChoiceBottomSheet() - .applyListeners() - .show(fragment.parentFragmentManager, DIALER_OPTION_TAG) - } - - private fun displayDialPadBottomSheet() { - CallDialPadBottomSheet.newInstance(true) - .applyCallback() - .show(fragment.parentFragmentManager, DIAL_PAD_TAG) + fun onVoiceCallClicked() { + handleCallRequest(false) } private fun handleCallRequest(isVideoCall: Boolean) = withState(roomDetailViewModel) { state -> val roomSummary = state.asyncRoomSummary.invoke() ?: return@withState when (roomSummary.joinedMembersCount) { - 1 -> { + 1 -> { val pendingInvite = roomSummary.invitedMembersCount ?: 0 > 0 if (pendingInvite) { // wait for other to join @@ -99,7 +61,7 @@ class StartCallActionsHandler( showDialogWithMessage(fragment.getString(R.string.cannot_call_yourself)) } } - 2 -> { + 2 -> { val currentCall = callManager.getCurrentCall() if (currentCall != null) { // resume existing if same room, if not prompt to kill and then restart new call? @@ -191,12 +153,4 @@ class StartCallActionsHandler( } } - override fun onSaveInstanceState(outState: Bundle) = Unit - - override fun onRestoreInstanceState(savedInstanceState: Bundle?) { - if (savedInstanceState != null) { - (fragment.parentFragmentManager.findFragmentByTag(DIALER_OPTION_TAG) as? DialerChoiceBottomSheet)?.applyListeners() - (fragment.parentFragmentManager.findFragmentByTag(DIAL_PAD_TAG) as? CallDialPadBottomSheet)?.applyCallback() - } - } } From 771b9b8d78d2b2693eed62baed10fcc71b07b6f1 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 2 Jun 2021 19:43:39 +0200 Subject: [PATCH 034/254] Dial pad tab: second step, add to home --- .../android/sdk/internal/SessionManager.kt | 2 +- .../app/features/home/HomeDetailAction.kt | 3 +- .../app/features/home/HomeDetailFragment.kt | 120 ++++++++++++------ .../app/features/home/HomeDetailViewModel.kt | 58 +++++++-- .../app/features/home/HomeDetailViewState.kt | 13 +- .../main/res/menu/home_bottom_navigation.xml | 7 + 6 files changed, 153 insertions(+), 50 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt index 441232f57f..c746ad863a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/SessionManager.kt @@ -51,7 +51,7 @@ internal class SessionManager @Inject constructor(private val matrixComponent: M } } - private fun getOrCreateSessionComponent(sessionParams: SessionParams): SessionComponent { + fun getOrCreateSessionComponent(sessionParams: SessionParams): SessionComponent { return sessionComponents.getOrPut(sessionParams.credentials.sessionId()) { DaggerSessionComponent .factory() diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt index c64f9d453d..b466f204ec 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailAction.kt @@ -19,6 +19,7 @@ package im.vector.app.features.home import im.vector.app.core.platform.VectorViewModelAction sealed class HomeDetailAction : VectorViewModelAction { - data class SwitchDisplayMode(val displayMode: RoomListDisplayMode) : HomeDetailAction() + data class SwitchTab(val tab: HomeTab) : HomeDetailAction() object MarkAllRoomsRead : HomeDetailAction() + data class StartCallWithPhoneNumber(val phoneNumber: String): HomeDetailAction() } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt index 291a4218b9..28a0ef6d7d 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt @@ -24,6 +24,8 @@ import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.core.view.isVisible +import androidx.core.view.iterator +import androidx.fragment.app.Fragment import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState @@ -41,12 +43,14 @@ import im.vector.app.core.ui.views.KnownCallsViewHolder import im.vector.app.databinding.FragmentHomeDetailBinding import im.vector.app.features.call.SharedKnownCallsViewModel import im.vector.app.features.call.VectorCallActivity +import im.vector.app.features.call.dialpad.DialPadFragment import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.home.room.list.RoomListFragment import im.vector.app.features.home.room.list.RoomListParams import im.vector.app.features.home.room.list.UnreadCounterBadgeView import im.vector.app.features.popup.PopupAlertManager import im.vector.app.features.popup.VerificationVectorAlert +import im.vector.app.features.settings.VectorLocale import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS import im.vector.app.features.themes.ThemeUtils @@ -100,6 +104,9 @@ class HomeDetailFragment @Inject constructor( } override fun onPrepareOptionsMenu(menu: Menu) { + withState(viewModel) { state -> + menu.iterator().forEach { it.isVisible = state.currentTab is HomeTab.RoomList } + } menu.findItem(R.id.menu_home_mark_all_as_read).isVisible = hasUnreadRooms super.onPrepareOptionsMenu(menu) } @@ -122,7 +129,7 @@ class HomeDetailFragment @Inject constructor( withState(viewModel) { // Update the navigation view if needed (for when we restore the tabs) - views.bottomNavigationView.selectedItemId = it.displayMode.toMenuId() + views.bottomNavigationView.selectedItemId = it.currentTab.toMenuId() } viewModel.selectSubscribe(this, HomeDetailViewState::roomGroupingMethod) { roomGroupingMethod -> @@ -130,14 +137,18 @@ class HomeDetailFragment @Inject constructor( is RoomGroupingMethod.ByLegacyGroup -> { onGroupChange(roomGroupingMethod.groupSummary) } - is RoomGroupingMethod.BySpace -> { + is RoomGroupingMethod.BySpace -> { onSpaceChange(roomGroupingMethod.spaceSummary) } } } - viewModel.selectSubscribe(this, HomeDetailViewState::displayMode) { displayMode -> - switchDisplayMode(displayMode) + viewModel.selectSubscribe(this, HomeDetailViewState::currentTab) { currentTab -> + updateUIForTab(currentTab) + } + + viewModel.selectSubscribe(this, HomeDetailViewState::showDialPadTab) { showDialPadTab -> + updateTabVisibilitySafely(R.id.bottom_action_dial_pad, showDialPadTab) } unknownDeviceDetectorSharedViewModel.subscribe { state -> @@ -178,21 +189,11 @@ class HomeDetailFragment @Inject constructor( override fun onResume() { super.onResume() // update notification tab if needed - checkNotificationTabStatus() + updateTabVisibilitySafely(R.id.bottom_action_notification, vectorPreferences.labAddNotificationTab()) + callManager.checkForProtocolsSupportIfNeeded() } - private fun checkNotificationTabStatus() { - val wasVisible = views.bottomNavigationView.menu.findItem(R.id.bottom_action_notification).isVisible - views.bottomNavigationView.menu.findItem(R.id.bottom_action_notification).isVisible = vectorPreferences.labAddNotificationTab() - if (wasVisible && !vectorPreferences.labAddNotificationTab()) { - // As we hide it check if it's not the current item! - withState(viewModel) { - if (it.displayMode.toMenuId() == R.id.bottom_action_notification) { - viewModel.handle(HomeDetailAction.SwitchDisplayMode(RoomListDisplayMode.PEOPLE)) - } - } - } - } + private fun promptForNewUnknownDevices(uid: String, state: UnknownDevicesState, newest: DeviceInfo) { val user = state.myMatrixItem @@ -273,10 +274,10 @@ class HomeDetailFragment @Inject constructor( serverBackupStatusViewModel .subscribe(this) { when (val banState = it.bannerState.invoke()) { - is BannerState.Setup -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Setup(banState.numberOfKeys), false) + is BannerState.Setup -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Setup(banState.numberOfKeys), false) BannerState.BackingUp -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.BackingUp, false) null, - BannerState.Hidden -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Hidden, false) + BannerState.Hidden -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Hidden, false) } } views.homeKeysBackupBanner.delegate = this @@ -307,7 +308,7 @@ class HomeDetailFragment @Inject constructor( is RoomGroupingMethod.ByLegacyGroup -> { // nothing do far } - is RoomGroupingMethod.BySpace -> { + is RoomGroupingMethod.BySpace -> { it.roomGroupingMethod.spaceSummary?.let { sharedActionViewModel.post(HomeActivitySharedAction.ShowSpaceSettings(it.roomId)) } @@ -320,12 +321,13 @@ class HomeDetailFragment @Inject constructor( private fun setupBottomNavigationView() { views.bottomNavigationView.menu.findItem(R.id.bottom_action_notification).isVisible = vectorPreferences.labAddNotificationTab() views.bottomNavigationView.setOnNavigationItemSelectedListener { - val displayMode = when (it.itemId) { - R.id.bottom_action_people -> RoomListDisplayMode.PEOPLE - R.id.bottom_action_rooms -> RoomListDisplayMode.ROOMS - else -> RoomListDisplayMode.NOTIFICATIONS + val tab = when (it.itemId) { + R.id.bottom_action_people -> HomeTab.RoomList(RoomListDisplayMode.PEOPLE) + R.id.bottom_action_rooms -> HomeTab.RoomList(RoomListDisplayMode.ROOMS) + R.id.bottom_action_notification -> HomeTab.RoomList(RoomListDisplayMode.NOTIFICATIONS) + else -> HomeTab.DialPad } - viewModel.handle(HomeDetailAction.SwitchDisplayMode(displayMode)) + viewModel.handle(HomeDetailAction.SwitchTab(tab)) true } @@ -341,13 +343,14 @@ class HomeDetailFragment @Inject constructor( // } } - private fun switchDisplayMode(displayMode: RoomListDisplayMode) { - views.groupToolbarTitleView.setText(displayMode.titleRes) - updateSelectedFragment(displayMode) + private fun updateUIForTab(tab: HomeTab) { + views.groupToolbarTitleView.setText(tab.titleRes) + updateSelectedFragment(tab) + invalidateOptionsMenu() } - private fun updateSelectedFragment(displayMode: RoomListDisplayMode) { - val fragmentTag = "FRAGMENT_TAG_${displayMode.name}" + private fun updateSelectedFragment(tab: HomeTab) { + val fragmentTag = "FRAGMENT_TAG_$tab" val fragmentToShow = childFragmentManager.findFragmentByTag(fragmentTag) childFragmentManager.commitTransaction { childFragmentManager.fragments @@ -356,14 +359,46 @@ class HomeDetailFragment @Inject constructor( detach(it) } if (fragmentToShow == null) { - val params = RoomListParams(displayMode) - add(R.id.roomListContainer, RoomListFragment::class.java, params.toMvRxBundle(), fragmentTag) + if (tab is HomeTab.RoomList) { + val params = RoomListParams(tab.displayMode) + add(R.id.roomListContainer, RoomListFragment::class.java, params.toMvRxBundle(), fragmentTag) + } else { + add(R.id.roomListContainer, createDialPadFragment()) + } } else { + if (tab is HomeTab.DialPad) { + (fragmentToShow as? DialPadFragment)?.applyCallback() + } attach(fragmentToShow) } } } + private fun createDialPadFragment(): Fragment { + val fragment = childFragmentManager.fragmentFactory.instantiate(vectorBaseActivity.classLoader, DialPadFragment::class.java.name) + return (fragment as DialPadFragment).apply { + arguments = Bundle().apply { + putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, true) + putBoolean(DialPadFragment.EXTRA_ENABLE_OK, true) + putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) + } + applyCallback() + } + } + + private fun updateTabVisibilitySafely(tabId: Int, isVisible: Boolean) { + val wasVisible = views.bottomNavigationView.menu.findItem(tabId).isVisible + views.bottomNavigationView.menu.findItem(tabId).isVisible = isVisible + if (wasVisible && !isVisible) { + // As we hide it check if it's not the current item! + withState(viewModel) { + if (it.currentTab.toMenuId() == tabId) { + viewModel.handle(HomeDetailAction.SwitchTab(HomeTab.RoomList(RoomListDisplayMode.PEOPLE))) + } + } + } + } + /* ========================================================================================== * KeysBackupBanner Listener * ========================================================================================== */ @@ -398,10 +433,13 @@ class HomeDetailFragment @Inject constructor( } } - private fun RoomListDisplayMode.toMenuId() = when (this) { - RoomListDisplayMode.PEOPLE -> R.id.bottom_action_people - RoomListDisplayMode.ROOMS -> R.id.bottom_action_rooms - else -> R.id.bottom_action_notification + private fun HomeTab.toMenuId() = when (this) { + is HomeTab.DialPad -> R.id.bottom_action_dial_pad + is HomeTab.RoomList -> when (displayMode) { + RoomListDisplayMode.PEOPLE -> R.id.bottom_action_people + RoomListDisplayMode.ROOMS -> R.id.bottom_action_rooms + else -> R.id.bottom_action_notification + } } override fun onTapToReturnToCall() { @@ -420,6 +458,16 @@ class HomeDetailFragment @Inject constructor( } } + private fun DialPadFragment.applyCallback(): DialPadFragment { + callback = object : DialPadFragment.Callback { + override fun onOkClicked(formatted: String?, raw: String?) { + if (raw.isNullOrEmpty()) return + viewModel.handle(HomeDetailAction.StartCallWithPhoneNumber(raw)) + } + } + return this + } + override fun create(initialState: ServerBackupStatusViewState): ServerBackupStatusViewModel { return serverBackupStatusViewModelFactory.create(initialState) } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index 836c63e85b..004f0909f4 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -28,6 +28,11 @@ import im.vector.app.RoomGroupingMethod import im.vector.app.core.di.HasScreenInjector import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.call.dialpad.DialPadLookup +import im.vector.app.features.call.lookup.CallProtocolsChecker +import im.vector.app.features.call.webrtc.WebRtcCallManager +import im.vector.app.features.createdirect.DirectRoomHelper +import im.vector.app.features.home.room.detail.RoomDetailViewEvents import im.vector.app.features.ui.UiStateRepository import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.Dispatchers @@ -51,8 +56,11 @@ import java.util.concurrent.TimeUnit class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: HomeDetailViewState, private val session: Session, private val uiStateRepository: UiStateRepository, + private val callManager: WebRtcCallManager, + private val directRoomHelper: DirectRoomHelper, private val appStateHandler: AppStateHandler) - : VectorViewModel(initialState) { + : VectorViewModel(initialState), + CallProtocolsChecker.Listener { @AssistedFactory interface Factory { @@ -64,7 +72,7 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho override fun initialState(viewModelContext: ViewModelContext): HomeDetailViewState? { val uiStateRepository = (viewModelContext.activity as HasScreenInjector).injector().uiStateRepository() return HomeDetailViewState( - displayMode = uiStateRepository.getDisplayMode() + currentTab = HomeTab.RoomList(uiStateRepository.getDisplayMode()) ) } @@ -79,7 +87,8 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho observeSyncState() observeRoomGroupingMethod() observeRoomSummaries() - + updateShowDialPadTab() + callManager.addProtocolsCheckerListener(this) session.rx().liveUser(session.myUserId).execute { copy( myMatrixItem = it.invoke()?.getOrNull()?.toMatrixItem() @@ -89,21 +98,50 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho override fun handle(action: HomeDetailAction) { when (action) { - is HomeDetailAction.SwitchDisplayMode -> handleSwitchDisplayMode(action) + is HomeDetailAction.SwitchTab -> handleSwitchTab(action) HomeDetailAction.MarkAllRoomsRead -> handleMarkAllRoomsRead() + is HomeDetailAction.StartCallWithPhoneNumber -> handleStartCallWithPhoneNumber(action) } } - private fun handleSwitchDisplayMode(action: HomeDetailAction.SwitchDisplayMode) = withState { state -> - if (state.displayMode != action.displayMode) { - setState { - copy(displayMode = action.displayMode) + private fun handleStartCallWithPhoneNumber(action: HomeDetailAction.StartCallWithPhoneNumber) { + viewModelScope.launch { + try { + val result = DialPadLookup(session, callManager, directRoomHelper).lookupPhoneNumber(action.phoneNumber) + callManager.startOutgoingCall(result.roomId, result.userId, isVideoCall = false) + } catch (failure: Throwable) { + Timber.v(failure) } - - uiStateRepository.storeDisplayMode(action.displayMode) } } + private fun handleSwitchTab(action: HomeDetailAction.SwitchTab) = withState { state -> + if (state.currentTab != action.tab) { + setState { + copy(currentTab = action.tab) + } + if(action.tab is HomeTab.RoomList) { + uiStateRepository.storeDisplayMode(action.tab.displayMode) + } + } + } + + override fun onCleared() { + super.onCleared() + callManager.removeProtocolsCheckerListener(this) + } + + override fun onPSTNSupportUpdated() { + updateShowDialPadTab() + } + + private fun updateShowDialPadTab() { + setState { + copy(showDialPadTab = callManager.supportsPSTNProtocol) + } + } + + // PRIVATE METHODS ***************************************************************************** private fun handleMarkAllRoomsRead() = withState { _ -> diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt index 5aa9612a7a..4bf1be4b36 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt @@ -16,9 +16,11 @@ package im.vector.app.features.home +import androidx.annotation.StringRes import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized +import im.vector.app.R import im.vector.app.RoomGroupingMethod import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.sync.SyncState @@ -28,7 +30,7 @@ data class HomeDetailViewState( val roomGroupingMethod: RoomGroupingMethod = RoomGroupingMethod.BySpace(null), val myMatrixItem: MatrixItem? = null, val asyncRooms: Async> = Uninitialized, - val displayMode: RoomListDisplayMode = RoomListDisplayMode.PEOPLE, + val currentTab: HomeTab = HomeTab.RoomList(RoomListDisplayMode.PEOPLE), val notificationCountCatchup: Int = 0, val notificationHighlightCatchup: Boolean = false, val notificationCountPeople: Int = 0, @@ -36,5 +38,12 @@ data class HomeDetailViewState( val notificationCountRooms: Int = 0, val notificationHighlightRooms: Boolean = false, val hasUnreadMessages: Boolean = false, - val syncState: SyncState = SyncState.Idle + val syncState: SyncState = SyncState.Idle, + val showDialPadTab: Boolean = false ) : MvRxState + +sealed class HomeTab(@StringRes val titleRes: Int) { + data class RoomList(val displayMode: RoomListDisplayMode) : HomeTab(displayMode.titleRes) + object DialPad : HomeTab(R.string.call_dial_pad_title) +} + diff --git a/vector/src/main/res/menu/home_bottom_navigation.xml b/vector/src/main/res/menu/home_bottom_navigation.xml index d52c8afab3..f9f966003a 100644 --- a/vector/src/main/res/menu/home_bottom_navigation.xml +++ b/vector/src/main/res/menu/home_bottom_navigation.xml @@ -20,4 +20,11 @@ android:title="@string/bottom_action_notification" android:visible="false" /> + + From b268d23e5879c324c41d89daf5f37a2e30724ff6 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 2 Jun 2021 20:36:58 +0200 Subject: [PATCH 035/254] Dial pad: fix dial pad lookup when result is virtual user --- .../app/features/call/dialpad/DialPadLookup.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt index 4ed1e4a0db..d8421ee0c7 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt @@ -17,10 +17,11 @@ package im.vector.app.features.call.dialpad import im.vector.app.features.call.lookup.pstnLookup +import im.vector.app.features.call.lookup.sipNativeLookup +import im.vector.app.features.call.vectorCallService import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.createdirect.DirectRoomHelper import org.matrix.android.sdk.api.session.Session -import java.lang.IllegalStateException import javax.inject.Inject class DialPadLookup @Inject constructor( @@ -33,8 +34,16 @@ class DialPadLookup @Inject constructor( data class Result(val userId: String, val roomId: String) suspend fun lookupPhoneNumber(phoneNumber: String): Result { + session.vectorCallService.protocolChecker.awaitCheckProtocols() val thirdPartyUser = session.pstnLookup(phoneNumber, webRtcCallManager.supportedPSTNProtocol).firstOrNull() ?: throw IllegalStateException() - val roomId = directRoomHelper.ensureDMExists(thirdPartyUser.userId) - return Result(userId = thirdPartyUser.userId, roomId = roomId) + // check to see if this is a virtual user, in which case we should find the native user + val nativeUserId = if (webRtcCallManager.supportsVirtualRooms) { + val nativeLookupResults = session.sipNativeLookup(thirdPartyUser.userId) + nativeLookupResults.firstOrNull()?.userId ?: thirdPartyUser.userId + } else { + thirdPartyUser.userId + } + val roomId = directRoomHelper.ensureDMExists(nativeUserId) + return Result(userId = nativeUserId, roomId = roomId) } } From c9e5bd33152a2284d23a30cc3218429a1c6c79dc Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 2 Jun 2021 13:28:18 +0000 Subject: [PATCH 036/254] Translated using Weblate (Hungarian) Currently translated at 100.0% (2475 of 2475 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 | 368 +++++++++++++++++++++- 1 file changed, 351 insertions(+), 17 deletions(-) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index a20a2b20d5..a2ac2c93aa 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -859,20 +859,20 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.%1$s szoba található ehhez: %2$s - 1 olvasatlan üzenet + %d olvasatlan üzenet %d olvasatlan üzenet - 1 olvasatlan üzenet értesítéssel + %d olvasatlan üzenet értesítéssel %d olvasatlan üzenet értesítéssel - 1 szoba + %d szoba %d szoba %1$s itt: %2$s - 1 aktív kisalkalmazás + %d aktív kisalkalmazás %d aktív kisalkalmazás @@ -980,11 +980,11 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés %d kiválasztva - 1 tag + %d tag %d tag - 1 szoba + %d szoba %d szoba Rendszerriasztások @@ -1279,7 +1279,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Olvasottnak jelölés Az alkalmazásnak nem kell a háttérben folyamatosan a Matrix szerverrel tartani a kapcsolatot, ez csökkentheti az akkumulátor használatot - %1$s: 1 üzenet + %1$s: %2$d üzenet %1$s: %2$d üzenet @@ -1361,9 +1361,9 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Üdvözöllek itthon! Olvasd el az olvasatlan üzeneteket itt Beszélgetések - A közvetlen beszélgetéseidet itt láthatod + A közvetlen beszélgetéseidet itt láthatod. Koppints a + -ra jobbra lent, hogy indíts egyet. Szobák - A szobáidat itt láthatod + A szobáidat itt láthatod. Koppints a + -ra jobbra lent a meglévők kereséséhez vagy egy saját indításához. Reakciók Egyetértek Kedvelem @@ -1386,7 +1386,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Közvetlen üzenetek Új szoba KÉSZÍT - Szoba neve + Név Nyilvános Bárki csatlakozhat ehhez a szobához Szobák listája @@ -1474,7 +1474,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Tartalék hívássegítő kiszolgáló engedélyezése Segítőként a(z) %s lesz használatban ha a Matrix-kiszolgálója nem biztosít egyet (a hívás ideje alatt az IP-címed megosztásra kerül) A beállításokban adj hozzá egy azonosítási szervert ehhez a művelethez. - Háttér Szinkronizálási Mód (Kísérleti) + Háttér Szinkronizálási Mód Optimalizált akkumulátor használat ${app_name} a háttérben úgy szinkronizál, hogy a leginkább kímélje az eszköz korlátozott erőforrásait (akkumulátor). \nAz eszköz erőforrásainak állapotától függően a szinkronizációt az operációs rendszer elhalaszthatja. @@ -1533,7 +1533,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró %1$s és %2$s olvasták %s olvasta - 1 felhasználó olvasta + %d felhasználó olvasta %d felhasználó olvasta \'%1$s\' (%2$s) fájl túl nagy a feltöltéshez. A korlát: %3$s. @@ -1555,15 +1555,15 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Tartalom bejelentve Ez a tartalom bejelentve. \n -\nHa nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra +\nHa nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra. Bejelentve nem kívántként (spam) Ez a tartalom nem kívántnak (spam) 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 +\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. Nem idevalónak bejelentve 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 +\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. ${app_name}nak engedélyre van szüksége ahhoz, hogy a végponttól végpontig titkosító kulcsokat a lemezre menthesse. \n \nKérlek a következő felugró ablakban engedélyezd a hozzáférést, hogy a kulcsokat kézzel kimenthesd. @@ -1622,7 +1622,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Kezdj neki Válassz szervert Hasonlóan az e-mailhez, egy fiókod van, de bárkivel tudsz beszélgetni - Csatlakozz a milliónyi felhasználóhoz a legnagyobb nyilvános szerveren + Csatlakozz a milliónyi felhasználóhoz ingyen a legnagyobb nyilvános szerveren Prémium szerver üzemeltetés szervezetek részére Tudj meg többet Egyéni @@ -1838,7 +1838,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró A megadott hangulatjelet szivárvány színben küldi el Idővonal Üzenet szerkesztő - Végpontok közötti titkosítás engedélyezése + Végpontok közötti titkosítás engedélyezése… Ha egyszer bekapcsolod, már nem lehet kikapcsolni. Titkosítás engedélyezése\? Ha egyszer engedélyezve lett, a szoba titkosítását nem lehet kikapcsolni. A titkosított szobákban küldött üzenetek a szerver számára nem, csak a szoba tagjai számára láthatók. A titkosítás bekapcsolása megakadályoz sok botot és hidat a megfelelő működésben. @@ -2465,4 +2465,338 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró A vendégeknek megengedted, hogy belépjenek ide. %1$s megengedte a vendégeknek, hogy belépjenek ide. A vendégeknek megengedted, hogy belépjenek a szobába. + Néhány szoba rejtett lehet, mert privátok és meghívó kell hozzá. +\nNincs jogosultságod szobák hozzáadásához. + Ezen a Téren nincsenek szobák + További információért vedd fel a kapcsolatot a matrix szerver adminisztrátorával + Úgy látszik a matrix szervered nem támogatja egyenlőre a Tereket + Szeretsz kísérletezni\? +\nTereket adhatsz terekhez. + Kísérleti tér - Csak árvák mutatása a Kezdőlapon + Szobák és terek kezelése + Nem javasoltnak jelölés + Javasoltnak jelölés + Javaslat + A tér legyen nyilvános + Szobák kezelése + Olyant keresel aki még nincs itt: %s\? + %s meghívott + Figyelmeztetés szerver oldali támogatás és kísérleti szoba verzió szükséges + Kísérleti Tér - Korlátozott szobák. + Meghívtak + Szobák és emberek csoportosításának új lehetősége a Terek használata. + Üdv a Terekben! + Szobák hozzáadása + Létező szobák és tér hozzáadása + Most te vagy a tér adminisztrátora, bizonyosodj meg arról, hogy kineveztél mást adminisztrátornak mielőtt elhagyod. + Ez a tér nem nyilvános. Kilépés után csak újabb meghívóval lehet újra belépni. + Csak te van itt. Ha kilépsz, akkor a jövőben senki nem tud majd ide belépni, beleértve téged is. + Biztos el akarod hagyni a teret\? + Tér elhagyása + Szobák hozzáadása + Szobák felderítése + + %d ember már csatlakozott + %d ember már csatlakozott + + Üdv itt: %1$s, %2$s. + Még egyik szobába sem vagy belépve. Alul van pár javasolt szoba, de többet is láthatsz a zöld gombbal jobb alsó sarokban. + Ez az álnév jelenleg nem elérhető. +\nPróbáld meg később vagy kérdezd meg a szoba adminisztrátorát, hogy van-e hozzáférésed. + Belépés mindenképpen + Belépés a Térbe + Tér készítése + Kihagy egyenlőre + Csatlakozz a Teremhez %1$s %2$s + Nem lesznek a részesei ennek: %s + Csak ehhez a szobához + Felfedezhetik ezt: %s + Meghívó ide: %s + Megosztás hivatkozás + Meghívás felhasználónévvel + Meghívás e-maillel + Egyenlőre csak te vagy itt, %s még jobb lehet másokkal együtt. + Meghívó ide: %s + Emberek meghívása a teredbe + Személyek meghívása + Leírás + Tér készítése… + Véletlen + Általános + Készítsünk mindegyik szobához egyet. Később is hozzáadhatsz újakat vagy akár meglévőket. + Milyen projekteken dolgozol\? + Készítünk szobákat számukra. Később még adhatsz hozzájuk. + Milyen beszélgetéseket szeretnél itt: %s\? + A folytatáshoz adj neki nevet. + Adj hozzá információkat amik segítenek az embereknek beazonosítani. Bármikor megváltoztathatod. + Adj hozzá pár információt, hogy tűnjön ki. Bármikor megváltoztathatod. + Tér készítése + Csak meghívóval, saját célra és csoportoknak ideális + Privát + Nyílt tér mindenkinek, a legjobb a közösségeknek + Nyilvános + Privát tér neked és a csoporttársaidnak + É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. Később ezt megváltoztathatod. + 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. + Ezt később meg lehet változtatni + Milyen típusú teret szeretnél készíteni\? + Szobák és emberek csoportosításának új lehetősége a Terek használata + Privát tér + Nyilvános tér + Tér hozzáadása + Biztos, hogy törlöd az összes el nem küldött üzenetet a szobában\? + El nem küldött üzenetek törlése + Üzeneteket nem lehetett elküldeni + Megszakítod az üzenetek küldését\? + Minden hibás üzenet törlése + Hiba + Elküldve + Küldés + Megadott azonosítójú térbe belépés + A megadott azonosítójú szoba elhagyása (vagy az aktuális szoba, ha üres) + Tér készítése + Esemény tartalma + Állapot esemény elküldve! + Az esemény elküldve! + Hibás esemény + Üzenet típus hiányzik + Nincs tartalom + Esemény tartalma + Állapotkulcs + Típus + Egyedi állapot esemény küldése + Állapot esemény küldése + Állapot események + Tartalom szerkesztése + Egyéni esemény elküldése + Szoba állapot felderítése + Fejlesztői Eszközök + Ez egy nyilvános szoba + Olvasás visszajelzés megjelenítése + Nincs értesítés + Értesítés hang nélkül + Értesítés hanggal + Üzenet hiba miatt nincs elküldve + Nem megjelölve + Megjelölve + Emodzsi választó bezárás + Emodzsi választó megnyitás + Megbízható megbízhatósági szint + Megbízhatóság figyelmeztetési szint + Alapértelmezett megbízhatósági szint + Kiválasztott + Videó + Ebben a szobába küldetlen piszkozat van + Néhány üzenet nem lett elküldve + Profilkép törlése + Profilkép megváltoztatása + Kép + Kulcs betöltése fájlból + Kisalkalmazások megnyitása + Képernyőkép + Azonosítás sikertelen + A művelet elvégzéséhez ${app_name} kéri, hogy adja meg az azonosításhoz az adatokat. + Újra-Azonosítás szükséges + Felhasználók + A hívás átadásánál hiba történt + Eszközök közötti aláírást nem sikerült beállítani + Audit kiexportálása + %1$s fiók adatait törlöd\? +\n +\nÓvatosan használd, váratlan következményei lehetnek. + Ez egy régi verziójú mátrix szerver. Kérd meg a matrix szerver adminisztrátorát, hogy frissítse. Folytathatod, de néhány funkció nem fog megfelelően működni. + Mindenki aki ezzel a szobával egy Térben van megtalálhatja és beléphet. Csak a szoba adminisztrátorok tudják Térhez adni. + Néhány szoba lehet rejtett, mert privát és meghívóra van szükséged. + Átadás + Kapcsolódás + Először tájékozódj + + 1 aktív hívás (%1$s) · 1 hívás tartásban + 1 aktív hívás (%1$s) · %2$d hívás tartásban + + + Hívás tartásban + %1$d hívás tartásban + + Aktív hívás (%1$s) + A telefonszám megkeresésekor hiba történt + Tárcsázó számlap + Visszahívás + Hívás befejeződött + %1$s elutasította a hívást + Elutasítottad ezt a hívást: %1$s + Jelenleg ebben a hívásban van + %1$s hívást kezdeményezett + Hívást kezdeményeztél + Matrix hivatkozás + Változtatások elvetése + Mentetlen változások vannak. Elveted a változásokat\? + A szoba még nem készült el. Megszakítod a szoba készítést\? + A hivatkozás hibás volt + Saját magadnak nem küldhetsz közvetlen üzenetet! + Szöveggel megosztás + A szoba nem található. Biztos, hogy létezik\? + A szoba nem nyitható meg ahonnan kitiltottak. + Jelenlegi PIN kód megváltoztatása + PIN megváltoztatása + ${app_name} megnyitásához mindig PIN kód szükséges. + Ha nem használsz ilyent: ${app_name} akkor 2 perc elteltével PIN kód megadása szükséges. + 2 perc elteltével PIN szükséges + Eszköz specifikus biometrikus azonosítás engedélyezése, mint ujjlenyomat vagy arcfelismerés. + + %d bejegyzés + %d bejegyzés + + Kapcsolatok keresése a Matrixban + Profilkép beállítása + Nincs felhasználói hozzájárulás. + Erősítsd meg a személyazonosságod ebben a belépésben, hogy hozzáférj a titkosított üzenetekhez. + hóesést küld ❄️ + konfettit küld 🎉 + Az üzenet elküldése hóeséssel + Az üzenet elküldése konfettivel + + Eszköz megjelenítése amivel most ellenőrizni lehet + %d eszköz megjelenítése amivel most ellenőrizni lehet + + Tiszta lappal indulsz, üzenetek, megbízható eszközök és felhasználók nélkül + Ha mindent visszaállítasz + Csak akkor csináld, ha nincs másik eszközöd amivel ellenőrizni tudnád ezt. + Minden visszaállítása + Elfelejtetted vagy elvesztetted az összes visszaállítási lehetőséget\? Minden visszaállítása + A matrix szervered elfogad csatolmányokat (fájlt, médiát, stb.) egészen eddig a méretig: %s. + A titkosítás bekapcsolásához nincs jogosultságod. + A szobába soha ne léphessenek be azok, akik nem ezen a szerveren vannak:%s + Használd a nemzetközi formátumot (a telefonszámnak „+” jellel kell kezdődnie) + Bejelentkezés ezzel: %s + Fiókkészítés ezzel: %s + "Téma: " + Beléptél. + %s csatlakozott. + Média fájl küldése eredeti méretben + + Videó küldése eredeti méretben + Videók küldése eredeti méretben + + Ismeretlen határérték. + Szerver fájl feltöltési határérték + Szerver verziószám + Szerver neve + Közvetlen beszélgetés + Elhagy + A szobában az üzenetek végponttól végpontig titkosítva vannak. +\n +\nAz üzeneteidet zárolással vannak biztosítva és csak neked és a címzetteknek van meg a kulcs hozzá. + Itt az üzenetek nincsenek végponttól végpontig titkosítva. + Azonosítás eredménye + Bot Gomb + Szavazás + Szoba létrehozása… + Néhány karakter nem engedélyezett + Kérlek add meg a szoba címét + Ez a cím már használatban van + Szoba címe + Beállíthatod, ha a szobát csak egy belső csoport használja majd a matrix szervereden. Ezt később nem lehet megváltoztatni. + Haladó elrejtése + Speciális megjelenítése + Régi üzenetek törlése + Egyszeri bejelentkezés + Folytatás ezzel: %s + Vagy + Állíts be címet ehhez a szobához, hogy a felhasználók a matrix szervereden megtalálhassák (%1$s) + Meghívásossá tetted. + %1$s meghívásossá tette. + Szoba beállításai + Alacsony prioritásúak közül kivesz + Alacsony prioritásúakhoz ad + %1$d / %2$d + Forgatás és vágás + A fájl túl nagy a feltöltéshez. + Ez egy béta funkció + Közvetlen beszélgetés indítása Matrix azonosítóval + Email címek és telefonszámok küldése + Beleegyezés adása + Beleegyezés visszavonása + Nem egyeztél bele abba, hogy e-mail címeket és telefonszámokat küldjél ennek az azonosítási szervernek más felhasználók felderítéséhez a névjegyzékedből. + Beleegyeztél abba, hogy e-mail címeket és telefonszámokat küldjél ennek az azonosítási szervernek más felhasználók felderítéséhez a névjegyzékedből. + Email címek és telefonszámok küldése + Javaslatok + Névjegyek + Legutóbbi + Név keresése + Videó tömörítése (%d%%) + Kép tömörítése… + Teljes tartalom megmutatása titkosított szobákban + Visszajelzés adása + A visszajelzésed nem sikerült elküldeni (%s) + Köszönjük, a visszajelzésed sikeresen elküldésre került + Ha további kérdés merülne fel, kapcsolatba léphetnek velem + A Terek béta verzióját használod. A visszajelzésed segít a következő verzió elkészítésében. A platform és felhasználói neved feljegyzésre kerül, hogy minél jobban felhasználhassuk a visszajelzésed. + Visszajelzés + Visszajelzés a Terekről + Téma + Szoba témája (nem kötelező) + Szoba neve + Ennek a szobának nincs előnézete. Szeretnél csatlakozni\? + Ez a szoba jelenleg nem elérhető. +\nPróbáld meg később vagy kérdezd meg a szoba adminisztrátorát, hogy van-e hozzáférésed. + Elhagyod ezt a konferenciát és átváltasz egy másikba\? + Bocsánat, a konferenciába való belépésnél hiba történt + %1$s és %2$s + %1$s, %2$s és %3$s + + %d meghívó + %d meghívó + + Szoba verzió + Terek + Bárki rátalálhat és beléphet a szobába + Nyilvános + Csak a meghívott személyek találják meg és tudnak belépni + Privát + Ismeretlen hozzáférési beállítás (%s) + Bárki bekopoghat a szobába, a szoba tagok be tudják engedni vagy el tudják küldeni + A jelenlegi szoba láthatóságát a listában nem lehet lekérdezni (%1$s). + Publikálod a szobát ennek a domainnek a szoba listájában: %1$s\? + A cím nyilvánosságának visszavonása + A cím nyilvánossá tétele + Helyi cím hozzáadása + Ennek a szobának nincs helyi címe + Helyi címek + Új nyilvános cím (pl.: #becenév:szerver) + Nincs másik nyilvánosságra hozott cím. + Nincs másik nyilvánosságra hozott cím, alább adj hozzá egyet. + Publikálod a szobát ennek a domainnek a szoba listájában: %1$s\? + „%1$s” címet törlöd\? + „%1$s” cím nyilvánosságát visszavonod\? + Nyilvánosságra hoz + Új cím nyilvánosságra hozatala manuálisan + Más nyilvánosságra hozott címek: + Fő cím + Ez az elsődleges cím + A nyilvánosságra hozott címeket bárki bármelyik szerveren használhatja a szobádba való belépéshez. A cím közzétételéhez először helyi címnek kell beállítani. + Nyilvánosságra hozott címek + Szoba címek + Szoba cím megjelenítése, kezelése és láthatóságának beállítása a szobák listájában. + Szoba címek + Vendégek csatlakozásának engedélyezése + Szoba hozzáfárés + A üzenetek olvashatóságának változtatása csak az új üzenetekre lesz érvényes. A régi üzenetek láthatósága nem fog változni. + Az üzenet szerkesztőhöz emodzsi billentyűzet gomb hozzáadása + Emodzsi billentyűzet megjelenítése + Magába foglalja a meghívás/belépés/kilépés/kirúgás/kitiltás eseményt és profilkép/megjelenítési név változtatást. + Használd a /confetti parancsot vagy küldj üzenetet ami ❄️-t vagy 🎉-t tartalmaz + Beszélgetés effektek megjelenítése + Szoba tagok státusz eseményeinek megjelenítése + + %d másodperc + %d másodperc + + Az értesítésre kattintottak! + Kattints az értesítésre. Ha nem látsz értesítést, ellenőrizd a rendszerbeállításokat. \ No newline at end of file From 153663c349a83b91cf0ab6454347935103934463 Mon Sep 17 00:00:00 2001 From: germe-fur Date: Wed, 2 Jun 2021 18:49:58 +0000 Subject: [PATCH 037/254] Translated using Weblate (Spanish) Currently translated at 96.6% (2393 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/es/ --- vector/src/main/res/values-es/strings.xml | 180 +++++++++++++++++++++- 1 file changed, 176 insertions(+), 4 deletions(-) diff --git a/vector/src/main/res/values-es/strings.xml b/vector/src/main/res/values-es/strings.xml index 076ca3ffed..4dc18d5b86 100644 --- a/vector/src/main/res/values-es/strings.xml +++ b/vector/src/main/res/values-es/strings.xml @@ -384,7 +384,7 @@ Crear cuenta Enviar Omitir - Enviar Correo Electrónico de Restauración + Enviar un Correo Electrónico de Restauración Regresar a la pantalla de inicio de sesión Correo electrónico o nombre de usuario Contraseña @@ -1012,7 +1012,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Enviar una pegatina - Actualmente no tienes ningún paquete de pegatinas habilitado. + Actualmente no tienes ningún paquete de stickers habilitado. \n \n¿Añadir algunos ahora\? Desactivar Cuenta @@ -1173,7 +1173,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Cancelar Ignorar Marcar como leído - Iniciar sesión con single-sign-on + Iniciar sesión con un solo registro Tu dispositivo usa una versión anticuada e insegura del protocolo de seguridad TLS. Por tu seguridad no puedes conectarte Ajustes avanzados de notificaciones Importancia de notificación por evento @@ -2589,7 +2589,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Esperar Continuar Volver - Los espacios son una manera de agrupar salas y personas por trabajo, diversión o lo que quieras. + Los espacios son una nueva manera para agrupar salas y personas. ¡Bienvenido a los Espacios! Únete a un Espacio Crea un Espacio @@ -2599,4 +2599,176 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Los Espacios son una nueva forma de agrupar salas y personas Sincronización inicial: \nEsperando respuesta del servidor… + El mensaje no se pudo enviar por un error + Ver confirmaciones de recibido + Esta sala es publica + Herramientas de Desarrollador + Enviar Evento Personalizado + Enviar Estado del Evento + Enviar Estado del Evento Personalizado + Estado de los Eventos + Algunas salas pueden estar ocultas debido a que son privadas y necesitas una invitación. +\nTu no tenes permiso para añadir salas. + Algunas salas pueden estar ocultas debido a que son privadas y necesitas una invitación para verlas. + Este espacio no tiene salas + Marcar como no sugerido + Marcar como sugerido + Sugerido + Hacer este espacio publico + %s te invita + Espacio Experimental - Sala Restringida. + Estas invitado + Añadir salas + Estas seguro de que quieres salir de este espacio\? + Salir de este espacio + Añadir salas + Explorar salas + Unirte igualmente + Saltar por ahora + Solo esta sala + Invitar a %s + Compartir enlace + Invitar por nombre de usuario + Invitar por correo + Invitar a %s + Invitar gente a tu espacio + Invitar gente + Descripción + Creando espacio… + Aleatorio + General + En que cosas estas trabajando\? + Dale un nombre para continuar. + Solo por invitación, lo mejor para tu mismo o para equipos + Privado + Abierto a cualquiera, lo mejor para comunidades + Publico + Yo y mis compañeros + Solo yo + Tu espacio privado + Tu espacio publico + Borrar todos los mensajes fallidos + Falló + Enviado + Enviando + Evento enviado! + Contenido del evento + Evento malformado + Sin contenido + Tipo + Editar Contenido + No notificar + Notificar sin sonido + Notificar con sonido + Sin revisar + Revisado + Cerrar selector de Emojis + Abrir selector de Emojis + Seleccionada + Video + Borrar avatar + Cambiar avatar + Imagen + Importar clave desde un archivo + Abrir widgets + Captura de pantalla + Usuarios + Transferir + Conectar + Preguntar primero + + Llamada pausada + %1$d llamadas pausadas + + Llamada activa (%1$s) + Pad de marcado + Esta llamada ha terminado + %1$s ha cortado esta llamada + Has cortado esta llamada %1$s + Ahora estas en esta llamada + %1$s empezó una llamada + Has empezado una llamada + + %d entrada + %d entradas + + Configurar avatar + enviar confeti 🎉 + enviar nieve ❄️ + + Enviar el video con el tamaño original + Enviar los videos con el tamaño original + + El limite es desconocido. + Versión del servidor + Nombre del servidor + Creando sala… + Esta dirección ya está en uso + Dirección de la sala + Esconder avanzado + Mostrar avanzado + Iniciar sesión con %s + Registrarse con %s + Continuar con %s + O + Ajustes de la sala + %1$d de %2$d + El archivo es muy grande como para subirlo. + Esta característica esta en fase beta + Enviar correos electrónicos y números de teléfono + Ha ocurrido un error al enviar reacción (%s) + Gracias, tu reacción ha sido enviada satisfactoriamente + Dar una reacción + Esta sala no tiene una vista previa. Quieres unirte a ella\? + Esta sala no es accesible en este momento. +\nIntentalo de nuevo luego, o pídele al administrador de la sala que se fije si tienes acceso. + Salir de la conferencia actual y cambiar a otra\? + Lo siento, un error ha ocurrido cuando se intentaba unir a la conferencia + Configuración de acceso desconocido (%s) + Publicar esta sala publicamente en el directorio de salas %1$s\? + Permitir que invitados se unan + Quitar publicación de esta dirección + No se puede recibir la visibilidad actual de esta sala (%1$s). + Borrar la dirección \"%1$s\"\? + Quitar publicación de dirección \"%1$s\"\? + Publicar + Publicar una nueva dirección manualmente + Otras direcciones publicadas: + Mirar y controlar las direcciones de esta sala, y su visibilidad en la carpeta de salas. + Usar como predeterminado y no volver a preguntar + Invita + Enviar emails y números de teléfono + Buscar Nombre + Comprimiendo video %d%% + Comprimiendo imagen… + Feedback de espacios + Versión de sala + Espacios + Cualquiera puede encontrar y unirse a esta sala + Publico + Privada + Publicar esta dirección + Añadir una dirección local + Esta sala no tiene direcciones locales + Direcciones locales + Nueva dirección publicada (ej. #alias:servidor) + No hay otras direcciones publicadas. + Dirección principal + Esta es la dirección principal + Direcciones publicadas + Direcciones de la Sala + Direcciones de la sala + Acceso a la sala + No puedes hacer eso desde ${app_name} movil + Siempre preguntar + Espacios + mostrar todas las salas en el directorio de salas, incluyendo salas con contenido explícito. + Mostrar salas con contenido explícito + Directorio de la sala + Salas sugeridas + Nuevo valor + Cambiar + Mensaje enviado + Sincronización inicial: +\nDescargando datos… \ No newline at end of file From 98cdc8e05c0bce2ea9368638e649a37780ec35fa Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 1 Jun 2021 23:13:43 +0000 Subject: [PATCH 038/254] Translated using Weblate (Ukrainian) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- .../metadata/android/uk/full_description.txt | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt index 026ae4162a..df06315754 100644 --- a/fastlane/metadata/android/uk/full_description.txt +++ b/fastlane/metadata/android/uk/full_description.txt @@ -1,30 +1,39 @@ -Element — це застосунок для спілкування та співпраці нового типу, який: +Element — це і безпечний месенджер, і застосунок для співпраці команди, який ідеально підходить для групових бесід під час віддаленої роботи. Цей застосунок для спілкування застосовує наскрізне шифрування для забезпечення відеоконференцій, обміну файлами та голосових викликів. -1. Надає вам повний контроль за своєю конфіденційністю -2. Дозволяє спілкування з будь-ким у мережі Matrix та поза нею, інтегруючись із такими застосунками, як Slack -3. Убезпечує вас від реклами, збору даних та штучних обмежень -4. Захищає ваше спілкування наскрізним шифруванням із перехресним підписуванням для звірення інших осіб +Можливості Element включають: +- Розширені засоби спілкування в Інтернеті +- Повністю зашифровані повідомлення для надання можливості безпечнішого корпоративного спілкування, навіть для віддалених працівників +- Децентралізований чат на основі відкритого коду Matrix +- Безпечний обмін файлами із зашифрованими даними для керування проєктами +- Відеочати з передачею голосу через IP та показом екрану іншим +- Проста інтеграція з вашими улюбленими інструментами для онлайн-співпраці, інструментами керування проєктами, послугами VoIP та іншими застосунками обміну повідомленнями для команд -Element ґрунтовно відрізняється від інших застосунків для спілкування та співпраці тому що він є децентралізованим та відкритоджерельним. +Element цілковито відрізняється від інших застосунків обміну повідомленнями та спільної роботи. Він працює на Matrix, відкритій мережі для безпечного обміну повідомленнями та децентралізованого зв'язку. Це дозволяє самостійне розгортання, щоб надати користувачам якнайбільше володіння та контролю над їх даними та повідомленнями. -Element дозволяє вам розміщувати сервер в себе або обирати будь-якого з надавачів послуг, таким чином забезпечуючи вам конфіденційність і можливість володіти власними даними й бесідами та контролювати їх. Він надає вам доступ до відкритої мережі, тож ви не є обмеженими спілкуванням виключно з користувачами Element. І він є дуже надійним та безпечним. +Приватність та обмін зашифрованими повідомленнями +Element захищає вас від небажаної реклами, збору даних та обмежень. Він також захищає всі ваші дані, відео та голосовий зв'язок віч-на-віч за допомогою наскрізного шифрування та взаємного підписування пристроїв. -Element здатен забезпечити усе це завдяки тому, що він заснований на протоколі Matrix — стандарті для відкритого та децентралізованого спілкування. +Element дає вам можливість контролювати вашу приватність, одночасно дозволяючи вам безпечно спілкуватися з будь-ким у мережі Matrix або через інші інструменти ділової співпраці, інтегрувавшись із такими програмами, як Slack. -Element надає вам повний контроль, дозволяючи обирати з-поміж надавачів послуг, що обслуговують сервери з вашими бесідами. Ви вільні обрати будь-який спосіб розміщення прямо з застосунку Element: +Element можна розгортати самостійно +Щоб забезпечити більше контролю над вашими приватними даними та розмовами, Element можна самостійно розміщувати або ви можете вибрати будь-який вузол на основі Matrix — стандарт для децентралізованого спілкування з відкритим кодом. Element надає вам приватність, відповідність безпеці та гнучкість інтеграції. -1. Отримати безкоштовний обліковий запис на загальнодоступному сервері matrix.org, який обслуговують розробники Matrix, чи на одному з тисяч публічних серверів, які обслуговують волонтери -2. Розмістити свій обліковий запис на власному сервері -3. Зареєструватись на індивідуальному сервері, просто підписавшись на послуги платформи Element Matrix Services +Ваші дані +Ви вирішуєте, де зберігати свої дані та повідомлення. Без ризику видобутку даних або стороннього доступу. -Чому я маю обрати Element? +Element надає такі можливості на вибір: +1. Отримайте безплатний обліковий запис на загальнодоступному сервері matrix.org, розміщеному розробниками Matrix, або виберіть серед тисяч загальнодоступних серверів, розміщених волонтерами +2. Самостійно розмістіть свій обліковий запис, запустивши сервер на власній ІТ-інфраструктурі +3. Зареєструйте обліковий запис на власному сервері, просто підписавшись на хостинг-платформу Element Matrix Services -ВОЛОДІЙТЕ ВАШИМИ ДАНИМИ: Ви вирішуєте де тримати ваші дані та повідомлення. Саме ви володієте ними та контролюєте їх, а не якась Мегакорпорація, що збирає ваші дані та надає стороннім особам доступ до них. +Відкриті обмін повідомленнями та співпраця +Ви можете спілкуватися з усіма у мережі Matrix, незалежно від того, чи користуються вони Element, іншим застосунком Matrix або навіть якщо іншим застосунком для обміну повідомленнями. -ВІДКРИТІ ОБМІН ПОВІДОМЛЕННЯМИ ТА СПІВПРАЦЯ: Ви можете балакати з будь-ким у мережі Matrix, хоч вони користуються Element, хоч іншим застосунком для Matrix, і навіть якщо вони користуються іншою системою обміну повідомленнями на кшталт Slack, IRC чи XMPP. +Надбезпечний +Справжнє наскрізне шифрування (лише учасники бесіди можуть розшифровувати повідомлення) та взаємне підписування пристроїв. -НАДБЕЗПЕЧНІСТЬ: Справжнє наскрізне шифрування (лише ваші співрозмовники здатні дешифровувати повідомлення) та перехресне підписування для звірення пристроїв інших учасників бесіди. +Повноцінні спілкування та інтеграція +Обмін повідомленнями, голосові та відеовиклики, обмін файлами, спільний доступ до екрана та ціла купа інтеграцій, ботів та віджетів. Створюйте кімнати, спільноти, залишайтеся на зв’язку та виконуйте завдання. -ДОВЕРШЕНИЙ ЗВʼЯЗОК: Повідомлення, голосові та відеодзвінки, обмін файлами, розподіл екрану та ціла купа інтеграцій, ботів та знадобів. Створюйте кімнати й спільноти, залишайтесь на зв'язку та завершуйте свої справи. - -ДЕ Б ВИ НЕ БУЛИ: Залишайтесь на зв'язку де б ви не були, разом з синхронізовною історією листувань на усіх ваших пристроях та в Інтернеті на https://app.element.io. +Продовжуйте, де зупинилися +Залишайтеся на зв'язку, де б ви не знаходились, з повністю синхронізованою історією повідомлень на всіх своїх пристроях та в Інтернеті за адресою https://app.element.io From d69a6e3c8edec10fd52153e3eb2ef41e5570ccb9 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Sun, 30 May 2021 22:00:44 +0000 Subject: [PATCH 039/254] Translated using Weblate (Esperanto) Currently translated at 99.3% (2459 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/eo/ --- vector/src/main/res/values-eo/strings.xml | 179 +++++++++++++++++++--- 1 file changed, 158 insertions(+), 21 deletions(-) diff --git a/vector/src/main/res/values-eo/strings.xml b/vector/src/main/res/values-eo/strings.xml index 0db950b2ed..36ba941734 100644 --- a/vector/src/main/res/values-eo/strings.xml +++ b/vector/src/main/res/values-eo/strings.xml @@ -215,7 +215,7 @@ Malhela haŭto Nigra haŭto Spegulante… - Atentante eventojn + Atentante okazojn Laŭtaj sciigoj Silentaj sciigoj Mesaĝoj @@ -741,9 +741,9 @@ Tiu ĉi salutaĵo ne povas konigi ĉi tiun kontrolon al aliaj viaj salutaĵoj. \nLa kontrolo konserviĝos loke kaj estos konigota de venonta versio de la aplikaĵo. Reatenti - ${app_name} renkontis problemon bildigante enhavon de evento kun la identigilo «%1$s» + ${app_name} renkontis problemon bildigante enhavon de okazo kun la identigilo «%1$s» ${app_name} ne traktas mesaĝojn de speco «%1$s» - ${app_name} ne traktas eventojn de speco «%1$s» + ${app_name} ne traktas okazojn de speco «%1$s» Salti al legokonfirmo Propra (%1$d) en %2$s Ordinara en %1$s @@ -1088,7 +1088,7 @@ Atendante… Individuaj ĉambroj Montri plenan historion en ĉifritaj ĉambroj - Montri kaŝitajn eventojn en historio + Montri kaŝitajn okazojn en historio Malsukcesis sendi la proponon (%s) Dankon, la propono sukcese sendiĝis Priskribu vian proponon ĉi tie @@ -1129,10 +1129,10 @@ Ŝanĝi Neniu reto. Bonvolu kontroli vian retkonekton. Krei novan ĉambron - Misformita evento, ne povas montri + Misformita okazo, ne povas montri Lastafoje redaktiĝis de %1$s je %2$s - Evento reguliĝis de administranto de la ĉambro - Evento foriĝis de uzanto + Okazo reguliĝis de administranto de la ĉambro + Okazo foriĝis de uzanto Montri anstataŭaĵon je forigitaj mesaĝoj Montri forigitajn mesaĝojn Mesaĝo foriĝis @@ -1142,7 +1142,7 @@ Ŝati Konsenti Reagoj - Viaj ĉambroj montriĝos ĉi tie + Viaj ĉambroj montriĝos ĉi tie. Tuŝetu al la «+» dekstre sube por trovi jam ekzistantajn, aŭ fari viajn proprajn. Ĉambroj Viaj individuaj ĉambroj montriĝos ĉi tie. Tuŝetu la plus-signon sube dekstre por krei iun. Interparoloj @@ -1464,7 +1464,7 @@ Nova invito Novaj mesaĝoj Ĉambro - Nova evento + Nova okazo %1$s kaj %2$s %1$s en %2$s kaj %3$s %1$s en %2$s @@ -1549,7 +1549,7 @@ Pretendita ŝlosilo kun fingrospuro je Ed25519 Identiga ŝlosilo je Curve25519 Identigilo de uzanto - Informoj pri evento + Informoj pri okazo Informoj pri tutvoja ĉifrado %s provis enlegi precizan momenton en la historio de ĉambro, sed ne povis ĝin trovi. Haŭto @@ -1713,11 +1713,11 @@ Antaŭrigardi vidaŭdaĵojn antaŭ sendi Vibri je mencio de uzanto Inkluzivas ŝanĝojn de profilbildo kaj prezenta nomo. - Montri eventojn de konto + Montri okazojn de konto Invitoj, forpeloj kaj forbaroj ne estos influitaj. - Montri eventojn de aliĝo kaj foriro - Inkluzivas eventojn de invitoj, aliĝoj, foriroj, forpeloj, forbaroj, kaj ŝanĝoj de profilbildo aŭ prezenta nomo. - Montri stateventojn de ĉambranoj + Montri okazojn de aliĝo kaj foriro + Inkluzivas okazojn de invitoj, aliĝoj, foriroj, forpeloj, forbaroj, kaj ŝanĝoj de profilbildo aŭ prezenta nomo. + Montri statokazojn de ĉambranoj Klaku la kvitancojn por detala listo. Montri kvitancojn Montri tempindikojn en 12-hora formo @@ -1847,7 +1847,7 @@ Solvi problemojn pri diagnozo Solvi problemojn pri sciigoj Privateco de sciigoj - Graveco de sciigo laŭ evento + Graveco de sciigo laŭ okazo Altnivelaj agordoj pri sciigoj Certigu, ke vi klakis la ligilon en la reltereo, kiun ni sendis al vi. Ĉu forigi %s\? @@ -2212,11 +2212,11 @@ Ŝlosilpetoj ${app_name} por Android Ŝlosiloj jam estas ĝisdataj! - Evento foriĝis de administranto de la ĉambro, kialo: %1$s - Evento foriĝis de uzanto, kialo: %1$s + Okazo foriĝis de administranto de la ĉambro, kialo: %1$s + Okazo foriĝis de uzanto, kialo: %1$s Kialo de redakto Kialigi - Ĉu vi certe volas forigi ĉi tiun eventon\? Sciu, ke se vi forigos nomon de ĉambro aŭ ŝanĝon de temo, ĝi povus malfari la ŝanĝon. + Ĉu vi certe volas forigi ĉi tiun okazon\? Sciu, ke se vi forigos nomon de ĉambro aŭ ŝanĝon de temo, ĝi povus malfari la ŝanĝon. Konfirmi forigon Sendi bildon je la originala grando @@ -2298,14 +2298,14 @@ Post ŝalto, ne eblas malŝalti ĉifradon de ĉambro. Mesaĝoj en ĉifrita ĉambro ne estas videblaj al la servilo, nur al la partoprenantoj de la ĉambro. Ŝalto de ĉifrado povus malhelpi ĝustan funkciadon de multaj pontoj kaj robotoj. Ĉu ŝalti ĉifradon\? Post ŝalto, ne eblas ĉifradon malŝalti. - Ŝalti tutvojan ĉifradon + Ŝalti tutvojan ĉifradon… Redaktilo de mesaĝoj Historio Sendas la donitan faron en ĉielarkaj koloroj Ĉi tiu konto malaktiviĝis. Neĝusta uzantonomo kaj/aŭ pasvorto. La enigita pasvorto komenciĝas aŭ finiĝas per spaco, bonvolu ĝin kontroli. Sendas mesaĝon kiel platan tekston, sen interpretado de Markdown - Agordi gravecon de sciigoj laŭ evento + Agordi gravecon de sciigoj laŭ okazo Solvi problemojn Gradaltigoj de ĉambroj Ĉifritaj mesaĝoj en grupaj interparoloj @@ -2404,7 +2404,7 @@ Agordu adresojn por ĉi tiu ĉambro, por ke uzantoj ĝin facile trovu per via hejmservilo (%1$s) Ŝanĝi la temon Gradaltigi la ĉambron - Sendi eventojn de la speco «m.room.server_acl» + Sendi okazojn de la speco «m.room.server_acl» Ŝanĝi permesojn Ŝanĝi nomon de ĉambro Ŝanĝi videblecon de historio @@ -2642,4 +2642,141 @@ Rekomendataj ĉambroj Baskuli Mesaĝo sendiĝis + Enporti ŝlosilon el dosiero + Malfermi fenestraĵojn + Ekrankopio + Malsukcesis aŭtentikigi + ${app_name} postulas enigon de viaj salutiloj por tiu ĉi ago. + Pardonu, eraris via aliĝo al la grupa voko + Iuj ĉambroj povas esti kaŝitaj ĉar ili estas privataj kaj vi bezonas inviton. + Iuj ĉambroj povas esti kaŝitaj, ĉar ili estas privataj kaj vi bezonas inviton. +\nVi ne havas permeson aldoni ĉambrojn. + Ĉi tiu aro ne havas ĉambrojn + Bonvolu kontakti administranton de via hejmservilo por pliaj informoj + Ŝajnas, ke via hejmservilo ankoraŭ ne subtenas arojn + Ĉu vi eksperimentemas\? +\nVi povas arigi jamajn arojn. + Eksperimenta aro – montri nur orfojn en la Hejmo + Administri ĉambrojn kaj arojn + Marki nerekomendita + Marki rekomendita + Rekomenditaj + Publikigi ĉi tiun aron + Administri ĉambrojn + Ĉu vi serĉas iun, kiu ne estas en %s\? + %s invitas vin + Averto: bezonas subtenon de servilo kaj eksperimentan version de ĉambro + Eksperimenta aro – limigita ĉambro. + Vi estas invitita + Aroj prezentas novan manieron grupigi ĉambrojn kaj personojn. + Bonvenu al aroj! + Aldoni ĉambrojn + Aldoni jamajn ĉambrojn kaj arojn + Vi estas administranto de ĉi tiu aro. Certigu, ke vi transdonis administrajn rajtojn al alia ano, antaŭ ol vi vere foriros. + Ĉi tiu aro ne estas publika. Vi ne povos ree aliĝi sen invito. + Vi estas la sola persono ĉi tie. Se vi foriros, neniu plu povos aliĝi, inkluzive vin mem. + Ĉu vi certe volas foriri de la aro\? + Foriri de aro + Aldoni ĉambrojn + Esplori ĉambrojn + + %d persono, kiun vi konas, jam aliĝis + %d personoj, kiujn vi konas, jam aliĝis + + Bonvenu al %1$s, %2$s. + Vi ne jam enas iun ĉambron. Ĉi-sube estas kelkaj proponitaj ĉambroj, sed vi povas vidi pliajn per la verda butono sube-dekstre. + Ĉi tiu kromnomo ne estas nun atingebla. +\nReprovu poste, aŭ petu al administranto de ĉambro kontroli, ĉu vi rajtas aliri. + Tamen aliĝi + Aliĝi al aro + Krei aron + Provizore preterpasi + Aliĝu al mia aro %1$s %2$s + Oni ne apartenos al %s + Nur al ĉi tiu ĉambro + Oni povos esplori en %s + Inviti al %s + Havigi ligilon + Inviti per uzantonomo + Inviti per retpoŝto + Nun ĉeestas nur vi. %s eĉ pli bonos kun aliuloj. + Inviti al %s + Inviti personojn + Invitu personojn al via aro + Priskribo + Kreante aron… + Hazarda + Ĝenerala + Ni kreu por ĉio apartan ĉambron. Vi povos aldoni pliajn poste, inkluzive jam ekzistantajn. + Kion vi prilaboras\? + Ni kreos ĉambrojn por ili. Vi povos aldoni pliajn poste. + Kiajn diskutojn vi volus havi en %s\? + Donu al ĝi nomon kaj pluiĝu. + Aldonu kelkajn detalojn por helpi identigi la aron. Vi povos ilin ŝanĝi iam ajn. + Aldonu kelkajn detalojn por elstarigi ĝin. Vi povos ilin ŝanĝi iam ajn. + Krei aron + Nur por invititoj, plej bona por vi mem aŭ skipoj + Privata + Malfermita al ĉiuj, plej bona por komunumoj + Publika + Privata spaco por vi kaj viaj kolegoj + Mi kaj kolegoj + Privata aro por organizi viajn ĉambrojn + Nur mi + Certigu, ke la ĝustaj personoj povas aliri al %s. Vi povas ŝanĝi ĉi tion pli poste. + Kun kiu laboras vi\? + Por aliĝi al jam ekzistanta aro, vi bezonos inviton. + Vi povos ŝanĝi ĉi tion poste + Kian aron volas vi krei\? + Aroj estas nova maniero grupigi ĉambrojn kaj personojn + Via privata aro + Via publika aro + Aldoni aron + Ĉu vi certe volas forigi ĉiujn nesenditajn mesaĝojn en ĉi tiu ĉambro\? + Forigi nesenditajn mesaĝojn + Malsukcesis sendi mesaĝojn + Ĉu vi certe volas nuligi sendon de mesaĝo\? + Forigi ĉiujn malsukcesitajn mesaĝoj + Malsukcesis + Sendite + Sendante + Foriri de ĉambro kun la donita identigilo (aŭ de la nuna ĉambro, kun nenio) + Aliĝi al aro kun la donita identigilo + Krei aron + Enhavo de okazo + Sendiĝis statokazo! + Sendiĝis okazo! + Misformita okzao + Mankas speco de mesaĝo + Neniu enhavo + Enhavo de okzao + Statŝlosilo + Speco + Sendi propran statokazon + Redakti enhavon + Statokazoj + Sendi statokazon + Sendi propran okazon + Esplori staton de ĉambro + Programistaj iloj + Ĉi tiu ĉambro estas publika + Vidi legokonfirmojn + Ne sciigi + Sciigi sen sono + Sciigi per sono + Mesaĝo ne sendiĝis pro eraro + Nekontrolite + Kontrolite + Fermi elektilon de bildosignoj + Malfermi elektilon de bildosignoj + Fidata fidnivelo + Averta fidnivelo + Implicita fidnivelo + Elektitaj + Filmo + Ĉi tiu ĉambro havas nesenditan malneton + Iuj mesaĝoj ne sendiĝis + Forigi profilbildon + Ŝanĝi profilbildon + Bildo \ No newline at end of file From 45b54db59a5fce5be9eec5c317bd7bab29eb8ea7 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 2 Jun 2021 19:33:25 +0000 Subject: [PATCH 040/254] Translated using Weblate (Czech) Currently translated at 100.0% (2475 of 2475 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 | 78 +++++++++++------------ 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index a7848a1db1..36a6f520d1 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -384,7 +384,7 @@ Založit účet Přihlásit se Odhlásit se - Adresa URL domácího serveru + Adresa domovského serveru Adresa URL serveru identit Hledat Začít novou konverzaci @@ -430,7 +430,7 @@ Prosím, zkontrolujte své e-maily, abyste mohli pokračovat v registraci Tento domovský server by se rád přesvědčil, že nejste robot Uživatelské jméno již použito - Domácí server: + Domovský server: Server identity: Ověřil/a jsem svoji e-mailovou adresu K resetování hesla zadejte e-mailovou adresu spojenou s vaším účtem: @@ -775,7 +775,7 @@ Přehled Není konfigurován žádný ověřovací server. Volání se nezdařilo kvůli chybné konfiguraci serveru - Prosím, požádejte administrátora homeserveru (%1$s) o konfiguraci TURN serveru, aby hovory fungovaly spolehlivě. + Prosím, požádejte administrátora domovského serveru (%1$s) o konfiguraci TURN serveru, aby hovory fungovaly spolehlivě. \n \nPřípadně můžete zkusit použít veřejný server %2$s, ale nebude tak spolehlivý a budu sdílet Vaši IP adresu s tímto serverem. V nastavení lze toto změnit. Zkuste použít %s @@ -787,7 +787,7 @@ Nastavte e-mail pro obnovení účtu. Použijte e-mail nebo telefonní číslo volitelně později, aby je našli lidé, kteří vás znají. Toto URL není dostupné, prosím, prověřte To není platná adresa Matrix serveru - Homeserver není dostupný na tomto URL, prosím, prověřte + Domovský server není dostupný na této adrese, zkontrolujte ji prosím Vaše zařízení používá zastaralý bezpečnostní protokol TLS, zranitelný útokem, pro Vaše bezpečí se nebudete moci spojit Povolit server fallback call assist Použiiji %s jako nápomoc, pokud Váš homeserver žádnou nenabízí (Vaše IP adresa bude sdělena během hovoru) @@ -841,8 +841,8 @@ \nTato chyba je mimo kontrolu ${app_name}u. V telefonu není žádný účet Google. Prosím, spusťte správce účtů a doplňte účet Google. Přidat účet Registrace tokenu - FCM token se podařilo úspěšné registrovat na homeserveru. - Registrace FCM tokenu na homeserveru se nezdařila: + FCM token se podařilo úspěšné registrovat na domovském serveru. + Registrace FCM tokenu na domovském serveru se nezdařila: \n%1$s Služba oznámení Služba oznámení je v chodu. @@ -870,10 +870,10 @@ Normální Snížené soukromí Aplikaci potřebuje svolení k chodu na pozadí - Aplikace na pozadí opravdu nepotřebuje spojení k homeserveru, to by mělo snížit spotřebu + Aplikace na pozadí opravdu nepotřebuje spojení k domovskému serveru, to by mělo snížit spotřebu • Oznámení se posílají pomocí Firebase Cloud Messaging • Oznámení pouze obsahují metadata - • Obsah oznámení je bezpečně uložen přímo na homeserveru Matrixu + • Obsah oznámení je bezpečně uložen přímo na domovském serveru Matrixu • Oznámení obsahují metadata a data zprávy • Oznámení neukážou obsah zprávy Zvuk oznámení @@ -937,7 +937,7 @@ Připnout místnosti s nepřečtenými zprávami Relace Interní náhled URL - Náhled odkazů v chatu, pokud Váš homeserver podporuje tuto funkci. + Náhled odkazů v chatu, pokud Váš domovský server podporuje tuto funkci. Poslat oznámení o psaní Dejte ostatním vědět, že právě píšete. Formát markdown @@ -956,8 +956,8 @@ Tlačítko enter na dotykové klávesnici odešle zprávu místo nového řádku Deaktivace účtu Deaktivovat můj účet - Odhalení - Správa Vašich nastaveni pro odhalení. + Objevování + Správa Vašich nastavení pro objevování. Soukromí ohledně oznámení ${app_name} může běžet na pozadí, aby spravoval Vaše oznámení bezpečně a v soukromí. To může mít vliv na baterii. Udělit oprávnění @@ -985,7 +985,7 @@ Heslo: Odeslat Přihlášen jako - Home server + Domovský server Server identit Povolit integrace Správce integrací @@ -1183,8 +1183,8 @@ \nNeznámé relace: Vybrat adresář místností Server je partně nedostupný nebo přetížený - Zadejte homeserver, z něhož si žádáte seznam veřejných místností - URL homeserveru + Zadejte domovský server, z něhož si žádáte seznam veřejných místností + Adresa domovského serveru Všechny místnosti na serveru %s Všech %s vlastních místností Zadat zde… @@ -1343,7 +1343,7 @@ Avatar přijetí Avatar vypovězení Avatar - Abyste mohli dále používat homeserver %1$s, musíte prohlédnout všeobecné podmínky a souhlasit s nimi. + Abyste mohli dále používat domovský server %1$s, musíte prohlédnout všeobecné podmínky a souhlasit s nimi. Prohlédnout nyní Deaktivovat účet To učiní Váš účet trvale nepoužitelným. Nebudete se moci přihlásit a nikdo nebude moci registrovat stejné uživatelské ID. Způsobí odchod Vašeho účtu ze všech místností, jichž se účastní a odstraní podrobnosti Vašeho účtu z ověřovacího serveru. Tato akce je nevratná. @@ -1363,15 +1363,15 @@ Mez zdrojů překročena Kontaktovat správce kontaktovat Vašeho správce služby - Tento homeserver překročil jednu ze svých mezí zdrojů, a tak se někteří uživatelé nebudou moci přihlásit. - Tento homeserver překročil jednu ze svých mezí zdrojů. - Tent homeserver narazil na svoji měsíční mez aktivních uživatelů, a tak se někteří uživatelé nebudou moci přihlásit. - Tento homeserver narazil na svoji měsíční mez aktivních uživatelů. + Tento domovský server překročil jednu ze svých mezí zdrojů, a tak se někteří uživatelé nebudou moci přihlásit. + Tento domovský server překročil jednu ze svých mezí zdrojů. + Tent domovský server narazil na svoji měsíční mez aktivních uživatelů, a tak se někteří uživatelé nebudou moci přihlásit. + Tento domovský server narazil na svoji měsíční mez aktivních uživatelů. Prosím, %s, aby zvýšili mez. Prosím, %s, abyste mohli službu dále používate. Pomalé načítání členů místností Zvýší výkon tím, že načte členy místnosti při prvním náhledu. - Váš homeserver dosud nepodporuje pomalé načtení členů místností. Zkuste později. + Váš domovský server dosud nepodporuje pomalé načtení členů místností. Zkuste později. Omlouváme se, došlo k chybě rozbalit sbalit @@ -1399,7 +1399,7 @@ Začít používat zálohu klíčů (Pokročilé) Zabezpečit zálohu přístupovou frází. - Uložíme zašifrovanou kopii Vašich klíčů na Vašem homeserveru. Chraňte svoji zálohu přístupovou frází, abyste ji udrželi v bezpečí. + Uložíme zašifrovanou kopii Vašich klíčů na Vašem domovském serveru. Chraňte svoji zálohu přístupovou frází, abyste ji udrželi v bezpečí. \n \nZ důvodu nejvyšší bezpečnosti by se měla lišit od hesla účtu. Nastavit přístupovou frází @@ -1418,7 +1418,7 @@ Klíč obnovy byl uložen do %s\'. \n \nVarování: může dojít ke smazání tohoto souboru, pokud odstraníte aplikaci. - Záloha již existuje na Vašem homeserveru + 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 Zastavit @@ -1480,7 +1480,7 @@ Verze Algoritmus Podpis - Neplatná odpověď z hledání homeserverů + Neplatná odpověď z hledání domovských serverů Volby serveru automaticky ${app_name} nalezl vlastní konfiguraci serveru pro doménu Vašeho uživatelského Id \"%1$s\": \n%2$s @@ -1525,7 +1525,7 @@ Neznámá chyba Nepoužíváte žádný server pro identity Není konfigurován žádný server pro identity, musíte přenastavit heslo. - Vypadá to, že se chcete připojit k jinému homeserveru. Chcete se odhlásit\? + Vypadá to, že se chcete připojit k jinému domovskému serveru. Chcete se odhlásit\? Upravit Odpovědět Opakovat @@ -1606,7 +1606,7 @@ (upraveno) Úpravy zpráv Úpravy nenalezeny - Vytřídit konverzace… + Filtrovat konverzace… Nemůžete najít, co hledáte\? Založit novou místnost Poslat novou přímou zprávu @@ -1649,7 +1649,7 @@ Souhlaste se všeobecnými podmínkami serveru identit (%s), abyste byli k nalezení podle emailové adresy nebo telefonního čísla. Zapnout podrobné záznamy. Podrobné záznamy pomohou vývojářům mnoha podrobnostmi, odešlete-li RageShake. I když jsou zapnuty, aplikace nezaznamenává obsah zpráv nebo jakákoli soukromá data. - Prosím, opakujte, jakmile jste přijali všeobecné podmínky svého homeserveru. + Prosím, opakujte, jakmile jste přijali všeobecné podmínky svého domovského serveru. Vypadá to, že serveru dlouho trvá odpovědět, to může být způsobeno buď slabým spojením nebo chybou na serveru. Prosím, opakujte za chvíli. Poslat přílohu Otevřít navigační zásuvku @@ -1746,7 +1746,7 @@ \n \nChcete se přihlásit webovým klientem\? Omlouváme se, tento server již nepřijímá nové účty. - Aplikace nemůže založit účet na tomto homeserveru. + Aplikace nemůže založit účet na tomto domovském serveru. \n \nChcete se přihlásit webovým klientem\? Tato emailová adresa se nevztahuje k žádnému účtu. @@ -1799,15 +1799,15 @@ \nZastavit registrační proces\? Vybrat matrix.org Vybrat Element Matrix Services - Vybrat upravený homeserver + Vybrat vlastní domovský server Prosím, proveďte vybídnutí captcha Přijmout všeobecné podmínky a pokračovat Prosím, nahlédněte do svého emailu Právě jsme odeslali email na %1$s. \nNež budete pokračovat se založením účtu, prosím, klikněte na odkaz v něm obsažený. Zadaný kód není správný. Prosím, zkontrolujte. - Zastaralý homeserver - Tento homeserver používá za účelem spojení příliš starou verzi. Požádejte správce, aby provedl aktualizaci. + Zastaralý domovský server + Tento domovský server používá za účelem spojení příliš starou verzi. Požádejte správce, aby provedl aktualizaci. Bylo odesláno příliš mnoho požadavků. Můžete opakovat za %1$d vteřinu… Bylo odesláno příliš mnoho požadavků. Můžete opakovat za %1$d vteřiny… @@ -1825,7 +1825,7 @@ Znovu se přihlásit Právě jste se odhlásili Přihlásit se - Správce Vašeho homeserveru (%1$s) Vás odhlásil z Vašeho účtu %2$s (%3$s). + Správce Vašeho domovského serveru (%1$s) Vás odhlásil z Vašeho účtu %2$s (%3$s). Přihlašte se, abyste získali přístup k šifrovacím klíčům uloženým výlučně v tomto zařízení. Potřebujete je ke čtení všech svých zpráv na jakémkoli zařízení. Přihlásit Vyčistit osobní údaje @@ -1870,8 +1870,8 @@ Nezabezpečené Něco z následujích je patrně narušeno: \n -\n- Váš homeserver -\n- Homeserver uživatele, jejž právě ověřujete +\n- Váš domovský server +\n- Domovský server uživatele, jejž právě ověřujete \n- Spojení do internetu Vaše či dalších uživatelů \n- Zařízení Vaše či dalších uživatelů Video. @@ -2043,7 +2043,7 @@ Jedno z následujících může být ohroženo: \n \n- Vaše heslo -\n- Váš homeserver +\n- Váš domovský server \n- Toto zařízení nebo to druhé \n- Spojení do internetu obou zařízení \n @@ -2144,7 +2144,7 @@ Jinak, máte-li již účet a znáte-li svůj identifikátor a heslo, můžete použít tuto metodu: Přihlásit se s mým identifikátorem Matrixu Přihlásit se - Pokud založíte účet na homeserveru, použijte své Matrix ID (např. @user:domain.com) a heslo níže. + Pokud založíte účet na domovském serveru, použijte své Matrix ID (např. @user:domain.com) a heslo níže. Identifikátor uživatele To není platný identifikátor uživatele. Platný formát: \'@uživatel:homeserver.org\' Nemohu najít platný domovský server. Prosím, zkontrolujte svůj identifikátor @@ -2229,7 +2229,7 @@ Oznámení Volání ${app_name}u se nezdařilo Založit spojení v reálném čase se nezdařilo. -\nProsím, požádejte správce svého homeserveru o konfiguraci TURN serveru, aby volání fungovala spolehlivě. +\nProsím, požádejte správce svého domovského serveru o konfiguraci TURN serveru, aby volání fungovala spolehlivě. Vybrat zvukové zařízení Telefon Reproduktor @@ -2458,7 +2458,7 @@ \n \nVaše zprávy jsou zabezpečeny zámky a pouze Vy a příjemce máte jedinečné klíče k jejich odemknutí. Zprávy zde nejsou e2e šifrovány. - Tento homeserver používá starou verzi. Požádejte správce svého homeserveru o aktualizaci. Můžete pokračovat, ale některé funkce možná nebudou správně pracovat. + Tento domovský server používá starou verzi. Požádejte správce svého domovského serveru o aktualizaci. Můžete pokračovat, ale některé funkce možná nebudou správně pracovat. Omezili jste na pouze pro pozvané. %1$s omezili na pouze pro pozvané. Odebrat z nízké priority @@ -2521,7 +2521,7 @@ Prosím, zadejte adresu místnosti Tato adresa je již obsazena Adresa místnosti - Můžete zapnout, pokud bude tato místnost využita pro spolupráci interních týmů na Vašem homeserveru. Později nelze změnit. + Můžete zapnout, pokud bude tato místnost využita pro spolupráci interních týmů na Vašem domovském serveru. Později nelze změnit. Trvale blokovat vstup do této místnosti všem, kdo nejsou členy %s Skrýt pokročilé Ukázat pokročilé @@ -2571,7 +2571,7 @@ Zveřejnit tuto adresu Přidat lokální adresu Tato místnost nemá žádné lokální adresy - Nastavte adresy pro tuto místnost, aby uživatelé mohli tuto místnost nalézt přes Váš homeserver (%1$s) + Nastavte adresy pro tuto místnost, aby uživatelé mohli tuto místnost nalézt přes Váš domovský server (%1$s) Lokální adresa Nová zveřejněná adresa (např. #alias:server) Zatím žádné zveřejněné adresy. From 827a52280362b1db7828a9263beaa54dfedcf5a7 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 1 Jun 2021 23:48:31 +0000 Subject: [PATCH 041/254] Translated using Weblate (Ukrainian) Currently translated at 71.5% (1772 of 2475 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 | 42 +++++++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 4d8cd05f6e..66ff7003fc 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -91,7 +91,7 @@ %1$s, %2$s, %3$s та %4$s %1$s, %2$s та %3$s - Типово + Типовий Модератор Адміністратор Ви вилучили %1$s знадіб @@ -156,8 +156,8 @@ Початкова синхронізація: \nІмпортування даних облікового запису… Порожня кімната (була %s) - Власний - Власний (%1$d) + Не типовий + Не типовий (%1$d) Ви змінили знадіб %1$s %1$s змінює знадіб %2$s Ви оновили кімнату. @@ -1005,7 +1005,7 @@ Приклад ID Спільноти приклад - Початок + Домівка Люди Кімнати Немає користувачів @@ -1111,7 +1111,7 @@ Відправити нове пряме повідомлення Додає ¯\\_(ツ)_/¯ перед текстовим повідомленням ${app_name} не підтримує повідомлення типу \'%1$s\' - Відправляє повідомлення розмальоване веселково + Надсилає повідомлення розмальоване веселково Редактор повідомлень Відправляє повідомлення як текст без інтерпретації його як Markdown Повідомлення… @@ -1387,7 +1387,7 @@ Немає активних знадобів Керувати інтеграціями Менеджер інтеграції не налаштовано. - Читати захищені DRM засоби масової інформації + Читати медіа захищені DRM Використовувати мікрофон Використовувати камеру Заблокувати все @@ -1642,7 +1642,7 @@ Всі повідомлення Всі повідомлення (гучно) Нехтувати користувача - Рознехтувати + Не нехтувати Підпис Алгоритм Версія @@ -2058,4 +2058,32 @@ Увійти Увійти до %1$s Увійти через %s + Після увімкнення, шифрування не може бути вимкнено. + Увімкнути шифрування + Увімкнути шифрування + Увімкнути шифрування\? + Після увімкнення, шифрування не може бути вимкнено. + Надсилає емоджі розмальоване веселково + Недавні кімнати + Безпосереднє повідомлення + Не типовий (%1$d) у %2$s + Не типовий + %1$s з %2$s до %3$s + %1$s змінює рівень доступу %2$s. + Ви змінили відеоконференцію + %1$s змінює відеоконференцію + Ви завершили відеоконфернцію + %1$s розпочинає відеоконференцію + %1$s завершує відеоконференцію + Ви розпочали відеоконференцію + Дії адміністратора + Запрошення + Модератори + Адміністратори + Залишення кімнати… + Типово у %1$s + Модератор у %1$s + Адміністратор у %1$s + Користувачі + Запрошення \ No newline at end of file From 37176b9770c63c929d97f9a35b4d1730ba2bcd34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 06:50:02 +0000 Subject: [PATCH 042/254] Bump recyclerview from 1.2.0 to 1.2.1 Bumps recyclerview from 1.2.0 to 1.2.1. --- updated-dependencies: - dependency-name: androidx.recyclerview:recyclerview dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- attachment-viewer/build.gradle | 2 +- vector/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/attachment-viewer/build.gradle b/attachment-viewer/build.gradle index 0f3817d983..c9814171d9 100644 --- a/attachment-viewer/build.gradle +++ b/attachment-viewer/build.gradle @@ -55,7 +55,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.5.0' implementation 'androidx.appcompat:appcompat:1.3.0' - implementation "androidx.recyclerview:recyclerview:1.2.0" + implementation "androidx.recyclerview:recyclerview:1.2.1" implementation 'com.google.android.material:material:1.3.0' } \ No newline at end of file diff --git a/vector/build.gradle b/vector/build.gradle index 9270185b8e..c34f6db3ee 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -326,7 +326,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" - implementation "androidx.recyclerview:recyclerview:1.2.0" + implementation "androidx.recyclerview:recyclerview:1.2.1" implementation 'androidx.appcompat:appcompat:1.3.0' implementation "androidx.fragment:fragment-ktx:$fragment_version" implementation 'androidx.constraintlayout:constraintlayout:2.0.4' From ed56d12b72d0c272e92f900e9cf4eb456f47f881 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 3 Jun 2021 12:58:21 +0200 Subject: [PATCH 043/254] Dialpad: fix some UI --- .../features/call/dialpad/DialPadFragment.kt | 4 ++-- .../main/res/values-land/styles_dial_pad.xml | 22 +++++++++++++++++++ .../src/main/res/values/styles_dial_pad.xml | 12 +++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 vector/src/main/res/values-land/styles_dial_pad.xml diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt index 11c3af9394..9c5b1f5d46 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadFragment.kt @@ -26,9 +26,9 @@ import androidx.core.widget.ImageViewCompat import androidx.fragment.app.Fragment import com.android.dialer.dialpadview.DialpadView import com.android.dialer.dialpadview.DigitsEditText -import com.android.dialer.dialpadview.R import com.google.i18n.phonenumbers.AsYouTypeFormatter import com.google.i18n.phonenumbers.PhoneNumberUtil +import im.vector.app.R import im.vector.app.features.themes.ThemeUtils class DialPadFragment : Fragment() { @@ -57,7 +57,7 @@ class DialPadFragment : Fragment() { dialpadView.findViewById(R.id.dialpad_key_voicemail).isVisible = false digits = dialpadView.digits as? DigitsEditText digits?.isCursorVisible = cursorVisible - digits?.setTextColor(ThemeUtils.getColor(requireContext(), im.vector.app.R.attr.riotx_text_primary)) + digits?.setTextColor(ThemeUtils.getColor(requireContext(), R.attr.riotx_text_primary)) dialpadView.findViewById(R.id.zero).setOnClickListener { append('0') } if (enablePlus) { dialpadView.findViewById(R.id.zero).setOnLongClickListener { diff --git a/vector/src/main/res/values-land/styles_dial_pad.xml b/vector/src/main/res/values-land/styles_dial_pad.xml new file mode 100644 index 0000000000..81841b3f11 --- /dev/null +++ b/vector/src/main/res/values-land/styles_dial_pad.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/values/styles_dial_pad.xml b/vector/src/main/res/values/styles_dial_pad.xml index 614923caad..81841b3f11 100644 --- a/vector/src/main/res/values/styles_dial_pad.xml +++ b/vector/src/main/res/values/styles_dial_pad.xml @@ -3,10 +3,20 @@ + + + \ No newline at end of file From a95eed716313a8f8e3c32e75d9c83f5fbe640b1b Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 3 Jun 2021 15:21:57 +0200 Subject: [PATCH 044/254] Dial pad: add more loading/error --- .../vector/app/core/error/ErrorFormatter.kt | 4 ++- .../features/call/dialpad/DialPadLookup.kt | 8 ++++-- .../features/call/lookup/ThirdPartyLookup.kt | 15 +++++++++-- .../app/features/home/HomeDetailFragment.kt | 10 ++++++-- .../app/features/home/HomeDetailViewEvents.kt | 25 +++++++++++++++++++ .../app/features/home/HomeDetailViewModel.kt | 25 ++++++++++--------- 6 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/home/HomeDetailViewEvents.kt diff --git a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt index b5f45e6586..c0219b26e2 100644 --- a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt +++ b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt @@ -116,7 +116,9 @@ class DefaultErrorFormatter @Inject constructor( throwable.localizedMessage } } - is DialPadLookup.Failure -> + is DialPadLookup.Failure.NumberIsYours -> + stringProvider.getString(R.string.cannot_call_yourself) + is DialPadLookup.Failure.NoResult -> stringProvider.getString(R.string.call_dial_pad_lookup_error) else -> throwable.localizedMessage } diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt index d8421ee0c7..fd1dfba2a4 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt @@ -29,13 +29,16 @@ class DialPadLookup @Inject constructor( private val webRtcCallManager: WebRtcCallManager, private val directRoomHelper: DirectRoomHelper ) { - class Failure : Throwable() + sealed class Failure : Throwable(){ + object NoResult: Failure() + object NumberIsYours: Failure() + } data class Result(val userId: String, val roomId: String) suspend fun lookupPhoneNumber(phoneNumber: String): Result { session.vectorCallService.protocolChecker.awaitCheckProtocols() - val thirdPartyUser = session.pstnLookup(phoneNumber, webRtcCallManager.supportedPSTNProtocol).firstOrNull() ?: throw IllegalStateException() + val thirdPartyUser = session.pstnLookup(phoneNumber, webRtcCallManager.supportedPSTNProtocol).firstOrNull() ?: throw Failure.NoResult // check to see if this is a virtual user, in which case we should find the native user val nativeUserId = if (webRtcCallManager.supportsVirtualRooms) { val nativeLookupResults = session.sipNativeLookup(thirdPartyUser.userId) @@ -43,6 +46,7 @@ class DialPadLookup @Inject constructor( } else { thirdPartyUser.userId } + if(nativeUserId == session.myUserId) throw Failure.NumberIsYours val roomId = directRoomHelper.ensureDMExists(nativeUserId) return Result(userId = nativeUserId, roomId = roomId) } diff --git a/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt b/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt index 1e9834059f..dfdc58f78f 100644 --- a/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt +++ b/vector/src/main/java/im/vector/app/features/call/lookup/ThirdPartyLookup.kt @@ -16,10 +16,13 @@ package im.vector.app.features.call.lookup +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.thirdparty.model.ThirdPartyUser +private const val LOOKUP_SUCCESS_FIELD = "lookup_success" + suspend fun Session.pstnLookup(phoneNumber: String, protocol: String?): List { if (protocol == null) return emptyList() return tryOrNull { @@ -36,7 +39,11 @@ suspend fun Session.sipVirtualLookup(nativeMxid: String): List { protocol = PROTOCOL_SIP_VIRTUAL, fields = mapOf("native_mxid" to nativeMxid) ) - }.orEmpty() + } + .orEmpty() + .filter { + (it.fields[LOOKUP_SUCCESS_FIELD] as? Boolean).orFalse() + } } suspend fun Session.sipNativeLookup(virtualMxid: String): List { @@ -45,5 +52,9 @@ suspend fun Session.sipNativeLookup(virtualMxid: String): List { protocol = PROTOCOL_SIP_NATIVE, fields = mapOf("virtual_mxid" to virtualMxid) ) - }.orEmpty() + } + .orEmpty() + .filter { + (it.fields[LOOKUP_SUCCESS_FIELD] as? Boolean).orFalse() + } } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt index 28a0ef6d7d..5cdaf12889 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt @@ -151,6 +151,14 @@ class HomeDetailFragment @Inject constructor( updateTabVisibilitySafely(R.id.bottom_action_dial_pad, showDialPadTab) } + viewModel.observeViewEvents { viewEvent -> + when (viewEvent) { + HomeDetailViewEvents.CallStarted -> dismissLoadingDialog() + is HomeDetailViewEvents.FailToCall -> showFailure(viewEvent.failure) + HomeDetailViewEvents.Loading -> showLoadingDialog() + } + } + unknownDeviceDetectorSharedViewModel.subscribe { state -> state.unknownSessions.invoke()?.let { unknownDevices -> // Timber.v("## Detector Triggerred in fragment - ${unknownDevices.firstOrNull()}") @@ -193,8 +201,6 @@ class HomeDetailFragment @Inject constructor( callManager.checkForProtocolsSupportIfNeeded() } - - private fun promptForNewUnknownDevices(uid: String, state: UnknownDevicesState, newest: DeviceInfo) { val user = state.myMatrixItem alertManager.postVectorAlert( diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewEvents.kt new file mode 100644 index 0000000000..a0ff67dc0a --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewEvents.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home + +import im.vector.app.core.platform.VectorViewEvents + +sealed class HomeDetailViewEvents : VectorViewEvents { + object Loading : HomeDetailViewEvents() + object CallStarted : HomeDetailViewEvents() + data class FailToCall(val failure: Throwable) : HomeDetailViewEvents() +} diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index 004f0909f4..c367ca936a 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -59,7 +59,7 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho private val callManager: WebRtcCallManager, private val directRoomHelper: DirectRoomHelper, private val appStateHandler: AppStateHandler) - : VectorViewModel(initialState), + : VectorViewModel(initialState), CallProtocolsChecker.Listener { @AssistedFactory @@ -98,8 +98,8 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho override fun handle(action: HomeDetailAction) { when (action) { - is HomeDetailAction.SwitchTab -> handleSwitchTab(action) - HomeDetailAction.MarkAllRoomsRead -> handleMarkAllRoomsRead() + is HomeDetailAction.SwitchTab -> handleSwitchTab(action) + HomeDetailAction.MarkAllRoomsRead -> handleMarkAllRoomsRead() is HomeDetailAction.StartCallWithPhoneNumber -> handleStartCallWithPhoneNumber(action) } } @@ -107,10 +107,12 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho private fun handleStartCallWithPhoneNumber(action: HomeDetailAction.StartCallWithPhoneNumber) { viewModelScope.launch { try { + _viewEvents.post(HomeDetailViewEvents.Loading) val result = DialPadLookup(session, callManager, directRoomHelper).lookupPhoneNumber(action.phoneNumber) callManager.startOutgoingCall(result.roomId, result.userId, isVideoCall = false) + _viewEvents.post(HomeDetailViewEvents.CallStarted) } catch (failure: Throwable) { - Timber.v(failure) + _viewEvents.post(HomeDetailViewEvents.FailToCall(failure)) } } } @@ -120,7 +122,7 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho setState { copy(currentTab = action.tab) } - if(action.tab is HomeTab.RoomList) { + if (action.tab is HomeTab.RoomList) { uiStateRepository.storeDisplayMode(action.tab.displayMode) } } @@ -141,7 +143,6 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho } } - // PRIVATE METHODS ***************************************************************************** private fun handleMarkAllRoomsRead() = withState { _ -> @@ -176,11 +177,11 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho private fun observeRoomGroupingMethod() { appStateHandler.selectedRoomGroupingObservable .subscribe { - setState { - copy( - roomGroupingMethod = it.orNull() ?: RoomGroupingMethod.BySpace(null) - ) - } + setState { + copy( + roomGroupingMethod = it.orNull() ?: RoomGroupingMethod.BySpace(null) + ) + } } .disposeOnClear() } @@ -203,7 +204,7 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho is RoomGroupingMethod.ByLegacyGroup -> { // TODO!! } - is RoomGroupingMethod.BySpace -> { + is RoomGroupingMethod.BySpace -> { val activeSpaceRoomId = groupingMethod.spaceSummary?.roomId val dmInvites = session.getRoomSummaries( roomSummaryQueryParams { From d520dfe10869472de7697773dbd55c79b13fd3b8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 3 Jun 2021 15:57:02 +0200 Subject: [PATCH 045/254] DialPad: clean code --- .../java/im/vector/app/features/call/dialpad/DialPadLookup.kt | 4 ++-- .../java/im/vector/app/features/home/HomeDetailViewModel.kt | 2 -- .../java/im/vector/app/features/home/HomeDetailViewState.kt | 1 - .../app/features/home/room/detail/RoomDetailViewModel.kt | 1 - .../app/features/home/room/detail/StartCallActionsHandler.kt | 3 --- 5 files changed, 2 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt index fd1dfba2a4..4f025dc239 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt @@ -29,7 +29,7 @@ class DialPadLookup @Inject constructor( private val webRtcCallManager: WebRtcCallManager, private val directRoomHelper: DirectRoomHelper ) { - sealed class Failure : Throwable(){ + sealed class Failure : Throwable() { object NoResult: Failure() object NumberIsYours: Failure() } @@ -46,7 +46,7 @@ class DialPadLookup @Inject constructor( } else { thirdPartyUser.userId } - if(nativeUserId == session.myUserId) throw Failure.NumberIsYours + if (nativeUserId == session.myUserId) throw Failure.NumberIsYours val roomId = directRoomHelper.ensureDMExists(nativeUserId) return Result(userId = nativeUserId, roomId = roomId) } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index c367ca936a..b6210ae019 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -26,13 +26,11 @@ import dagger.assisted.AssistedInject import im.vector.app.AppStateHandler import im.vector.app.RoomGroupingMethod import im.vector.app.core.di.HasScreenInjector -import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.call.dialpad.DialPadLookup import im.vector.app.features.call.lookup.CallProtocolsChecker import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.createdirect.DirectRoomHelper -import im.vector.app.features.home.room.detail.RoomDetailViewEvents import im.vector.app.features.ui.UiStateRepository import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.Dispatchers diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt index 4bf1be4b36..304444abdd 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewState.kt @@ -46,4 +46,3 @@ sealed class HomeTab(@StringRes val titleRes: Int) { data class RoomList(val displayMode: RoomListDisplayMode) : HomeTab(displayMode.titleRes) object DialPad : HomeTab(R.string.call_dial_pad_title) } - diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 2be96e07e9..751114c2d9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -39,7 +39,6 @@ import im.vector.app.core.mvrx.runCatchingToAsync import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider import im.vector.app.features.call.conference.JitsiService -import im.vector.app.features.call.dialpad.DialPadLookup import im.vector.app.features.call.lookup.CallProtocolsChecker import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.command.CommandParser diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt index e777f6d628..64544855bd 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/StartCallActionsHandler.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.detail -import android.os.Bundle import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment @@ -29,7 +28,6 @@ import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.session.widgets.model.WidgetType - class StartCallActionsHandler( private val roomId: String, private val fragment: Fragment, @@ -152,5 +150,4 @@ class StartCallActionsHandler( } } } - } From 1b8b59076c84f8f8011ffb13c27cbc8c77730e6c Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 3 Jun 2021 19:33:28 +0200 Subject: [PATCH 046/254] Should fix issue with DM creation where we can ends up with DM in rooms --- .../internal/session/user/accountdata/DirectChatsHelper.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt index e297f59b96..a9e5089774 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DirectChatsHelper.kt @@ -31,9 +31,11 @@ internal class DirectChatsHelper @Inject constructor(@SessionDatabase */ fun getLocalUserAccount(filterRoomId: String? = null): MutableMap> { return Realm.getInstance(realmConfiguration).use { realm -> + // Makes sure we have the latest realm updates, this is important as we sent this information to the server. + realm.refresh() RoomSummaryEntity.getDirectRooms(realm) .asSequence() - .filter { it.roomId != filterRoomId && it.directUserId != null } + .filter { it.roomId != filterRoomId && it.directUserId != null && it.membership.isActive() } .groupByTo(mutableMapOf(), { it.directUserId!! }, { it.roomId }) } } From 2c767e734544a5f4dfa9591b7839e2d1e0364d28 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 3 Jun 2021 19:48:53 +0200 Subject: [PATCH 047/254] Add towncrier files --- newsfragment/3333.bugfix | 1 + newsfragment/3457.misc | 1 + 2 files changed, 2 insertions(+) create mode 100644 newsfragment/3333.bugfix create mode 100644 newsfragment/3457.misc diff --git a/newsfragment/3333.bugfix b/newsfragment/3333.bugfix new file mode 100644 index 0000000000..d60f725498 --- /dev/null +++ b/newsfragment/3333.bugfix @@ -0,0 +1 @@ +Fix new DMs not always marked as such \ No newline at end of file diff --git a/newsfragment/3457.misc b/newsfragment/3457.misc new file mode 100644 index 0000000000..6a70641cfd --- /dev/null +++ b/newsfragment/3457.misc @@ -0,0 +1 @@ +Move the ability to start a call from dialpad directly to a dedicated tab in the home screen. \ No newline at end of file From a421f37e70804930dfaae51036bd368b679cb9e3 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 2 Jun 2021 11:07:05 +0200 Subject: [PATCH 048/254] VoIP : clean and add changelog --- .../sdk/api/session/call/CallListener.kt | 2 - newsfragment/3451.feature | 1 + .../app/core/glide/AvatarPlaceholder.kt | 82 +++++++++++++++++++ .../vector/app/core/glide/MyAppGlideModule.kt | 6 ++ .../app/features/call/VectorCallActivity.kt | 39 ++++----- .../app/features/call/VectorCallViewModel.kt | 10 +-- .../app/features/call/VectorCallViewState.kt | 3 +- .../features/call/webrtc/WebRtcCallManager.kt | 2 +- .../app/features/home/AvatarRenderer.kt | 32 ++++++-- vector/src/main/res/layout/activity_call.xml | 17 ++-- vector/src/main/res/values/colors.xml | 3 +- 11 files changed, 153 insertions(+), 44 deletions(-) create mode 100644 newsfragment/3451.feature create mode 100644 vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt index 4704a657df..d17be59cd4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt @@ -67,6 +67,4 @@ interface CallListener { * Called when an asserted identity event is received */ fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) - - } diff --git a/newsfragment/3451.feature b/newsfragment/3451.feature new file mode 100644 index 0000000000..dbf1a9b02c --- /dev/null +++ b/newsfragment/3451.feature @@ -0,0 +1 @@ +Adds support for receiving MSC3086 Asserted Identity events. \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt b/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt new file mode 100644 index 0000000000..32968c4f80 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2021 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.core.glide + +import android.content.Context +import android.graphics.drawable.Drawable +import com.bumptech.glide.Priority +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.Options +import com.bumptech.glide.load.data.DataFetcher +import com.bumptech.glide.load.model.ModelLoader +import com.bumptech.glide.load.model.ModelLoaderFactory +import com.bumptech.glide.load.model.MultiModelLoaderFactory +import com.bumptech.glide.signature.ObjectKey +import im.vector.app.core.extensions.vectorComponent +import org.matrix.android.sdk.api.util.MatrixItem + +data class AvatarPlaceholder(val matrixItem: MatrixItem) + +class AvatarPlaceholderModelLoaderFactory(private val context: Context) : ModelLoaderFactory { + + override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader { + return AvatarPlaceholderModelLoader(context) + } + + override fun teardown() { + // Is there something to do here? + } +} + +class AvatarPlaceholderModelLoader(private val context: Context) + : ModelLoader { + + override fun buildLoadData(model: AvatarPlaceholder, width: Int, height: Int, options: Options): ModelLoader.LoadData? { + return ModelLoader.LoadData(ObjectKey(model), AvatarPlaceholderDataFetcher(context, model)) + } + + override fun handles(model: AvatarPlaceholder): Boolean { + return true + } +} + +class AvatarPlaceholderDataFetcher(context: Context, private val data: AvatarPlaceholder) + : DataFetcher { + + private val avatarRenderer = context.vectorComponent().avatarRenderer() + + override fun loadData(priority: Priority, callback: DataFetcher.DataCallback) { + val avatarPlaceholder = avatarRenderer.getPlaceholderDrawable(data.matrixItem) + callback.onDataReady(avatarPlaceholder) + } + + override fun cleanup() { + // NOOP + } + + override fun cancel() { + // NOOP + } + + override fun getDataClass(): Class { + return Drawable::class.java + } + + override fun getDataSource(): DataSource { + return DataSource.LOCAL + } +} diff --git a/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt b/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt index 6ded33f823..74c9d4f0f6 100644 --- a/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt +++ b/vector/src/main/java/im/vector/app/core/glide/MyAppGlideModule.kt @@ -17,6 +17,7 @@ package im.vector.app.core.glide import android.content.Context +import android.graphics.drawable.Drawable import android.util.Log import com.bumptech.glide.Glide @@ -40,5 +41,10 @@ class MyAppGlideModule : AppGlideModule() { InputStream::class.java, VectorGlideModelLoaderFactory(context) ) + registry.append( + AvatarPlaceholder::class.java, + Drawable::class.java, + AvatarPlaceholderModelLoaderFactory(context) + ) } } diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt index a18f5bb918..c76bf615ff 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt @@ -198,18 +198,7 @@ class VectorCallActivity : VectorBaseActivity(), CallContro } is CallState.Connected -> { if (callState.iceConnectionState == MxPeerConnectionState.CONNECTED) { - if (state.transferee !is VectorCallViewState.TransfereeState.NoTransferee) { - val transfereeName = if (state.transferee is VectorCallViewState.TransfereeState.KnownTransferee) { - state.transferee.name - } else { - getString(R.string.call_transfer_unknown_person) - } - views.callActionText.text = getString(R.string.call_transfer_transfer_to_title, transfereeName) - views.callActionText.isVisible = true - views.callActionText.setOnClickListener { callViewModel.handle(VectorCallViewActions.TransferCall) } - views.callStatusText.text = state.formattedDuration - configureCallInfo(state) - } else if (state.isLocalOnHold || state.isRemoteOnHold) { + if (state.isLocalOnHold || state.isRemoteOnHold) { views.smallIsHeldIcon.isVisible = true views.callVideoGroup.isInvisible = true views.callInfoGroup.isVisible = true @@ -225,6 +214,17 @@ class VectorCallActivity : VectorBaseActivity(), CallContro views.callStatusText.text = getString(R.string.call_held_by_user, it.getBestName()) } } + } else if (state.transferee !is VectorCallViewState.TransfereeState.NoTransferee) { + val transfereeName = if (state.transferee is VectorCallViewState.TransfereeState.KnownTransferee) { + state.transferee.name + } else { + getString(R.string.call_transfer_unknown_person) + } + views.callActionText.text = getString(R.string.call_transfer_transfer_to_title, transfereeName) + views.callActionText.isVisible = true + views.callActionText.setOnClickListener { callViewModel.handle(VectorCallViewActions.TransferCall) } + views.callStatusText.text = state.formattedDuration + configureCallInfo(state) } else { views.callStatusText.text = state.formattedDuration configureCallInfo(state) @@ -256,15 +256,15 @@ class VectorCallActivity : VectorBaseActivity(), CallContro private fun configureCallInfo(state: VectorCallViewState, blurAvatar: Boolean = false) { state.callInfo?.opponentUserItem?.let { - val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen) - avatarRenderer.renderBlur(it, views.bgCallView, sampling = 20, rounded = false, colorFilter = colorFilter) + val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen_blur) + avatarRenderer.renderBlur(it, views.bgCallView, sampling = 20, rounded = false, colorFilter = colorFilter, addPlaceholder = false) if (state.transferee is VectorCallViewState.TransfereeState.NoTransferee) { views.participantNameText.text = it.getBestName() } else { views.participantNameText.text = getString(R.string.call_transfer_consulting_with, it.getBestName()) } if (blurAvatar) { - avatarRenderer.renderBlur(it, views.otherMemberAvatar, sampling = 2, rounded = true, colorFilter = colorFilter) + avatarRenderer.renderBlur(it, views.otherMemberAvatar, sampling = 2, rounded = true, colorFilter = colorFilter, addPlaceholder = true) } else { avatarRenderer.render(it, views.otherMemberAvatar) } @@ -273,13 +273,14 @@ class VectorCallActivity : VectorBaseActivity(), CallContro views.otherKnownCallLayout.isVisible = false } else { val otherCall = callManager.getCallById(state.otherKnownCallInfo.callId) - val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen) + val colorFilter = ContextCompat.getColor(this, R.color.bg_call_screen_blur) avatarRenderer.renderBlur( matrixItem = state.otherKnownCallInfo.opponentUserItem, imageView = views.otherKnownCallAvatarView, sampling = 20, - rounded = false, - colorFilter = colorFilter + rounded = true, + colorFilter = colorFilter, + addPlaceholder = true ) views.otherKnownCallLayout.isVisible = true views.otherSmallIsHeldIcon.isVisible = otherCall?.let { it.isLocalOnHold || it.remoteOnHold }.orFalse() @@ -288,7 +289,7 @@ class VectorCallActivity : VectorBaseActivity(), CallContro private fun configureCallViews() { views.callControlsView.interactionListener = this - views.otherKnownCallAvatarView.setOnClickListener { + views.otherKnownCallLayout.setOnClickListener { withState(callViewModel) { val otherCall = callManager.getCallById(it.otherKnownCallInfo?.callId ?: "") ?: return@withState startActivity(newIntent(this, otherCall, null)) diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt index 68905b6c49..e7b2b629e1 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt @@ -89,7 +89,7 @@ class VectorCallViewModel @AssistedInject constructor( } } - override fun assertedIdentityChanged(){ + override fun assertedIdentityChanged() { setState { copy(callInfo = call?.extractCallInfo()) } @@ -208,17 +208,17 @@ class VectorCallViewModel @AssistedInject constructor( } } - private fun WebRtcCall.extractCallInfo(): VectorCallViewState.CallInfo{ + private fun WebRtcCall.extractCallInfo(): VectorCallViewState.CallInfo { val assertedIdentity = this.remoteAssertedIdentity - val matrixItem = if(assertedIdentity != null){ + val matrixItem = if (assertedIdentity != null) { val userId = if (MatrixPatterns.isUserId(assertedIdentity.id)) { assertedIdentity.id!! } else { // Need an id starting with @ "@${assertedIdentity.displayName}" } - MatrixItem.UserItem(userId,assertedIdentity.displayName, assertedIdentity.avatarUrl) - }else { + MatrixItem.UserItem(userId, assertedIdentity.displayName, assertedIdentity.avatarUrl) + } else { getOpponentAsMatrixItem(session) } return VectorCallViewState.CallInfo(callId, matrixItem) diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt index b6c226564e..3e7791cc08 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt @@ -20,7 +20,6 @@ import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized import im.vector.app.features.call.audio.CallAudioManager -import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.session.call.CallState import org.matrix.android.sdk.api.util.MatrixItem @@ -54,7 +53,7 @@ data class VectorCallViewState( data class CallInfo( val callId: String, - val opponentUserItem: MatrixItem? = null, + val opponentUserItem: MatrixItem? = null ) constructor(callArgs: CallArgs) : this( diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt index d56f1aa015..25463428e9 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCallManager.kt @@ -424,7 +424,7 @@ class WebRtcCallManager @Inject constructor( } override fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent) { - if(!BuildConfig.handleCallAssertedIdentityEvents){ + if (!BuildConfig.handleCallAssertedIdentityEvents) { return } val call = callsByCallId[callAssertedIdentityContent.callId] diff --git a/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt b/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt index c6cceee3b9..787027e0e2 100644 --- a/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt +++ b/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt @@ -34,6 +34,7 @@ import com.bumptech.glide.request.target.DrawableImageViewTarget import com.bumptech.glide.request.target.Target import im.vector.app.core.contacts.MappedContact import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.core.glide.AvatarPlaceholder import im.vector.app.core.glide.GlideApp import im.vector.app.core.glide.GlideRequest import im.vector.app.core.glide.GlideRequests @@ -136,7 +137,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active matrixItem: MatrixItem, target: Target) { val placeholder = getPlaceholderDrawable(matrixItem) - buildGlideRequest(glideRequests, matrixItem.avatarUrl) + glideRequests.loadResolvedUrl(matrixItem.avatarUrl) .apply { when (matrixItem) { is MatrixItem.SpaceItem -> { @@ -175,7 +176,12 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active } @UiThread - fun renderBlur(matrixItem: MatrixItem, imageView: ImageView, sampling: Int, rounded: Boolean, @ColorInt colorFilter: Int? = null) { + fun renderBlur(matrixItem: MatrixItem, + imageView: ImageView, + sampling: Int, + rounded: Boolean, + @ColorInt colorFilter: Int? = null, + addPlaceholder: Boolean) { val transformations = mutableListOf>( BlurTransformation(20, sampling) ) @@ -185,14 +191,26 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active if (rounded) { transformations.add(CircleCrop()) } - buildGlideRequest(GlideApp.with(imageView), matrixItem.avatarUrl) - .apply(RequestOptions.bitmapTransform(MultiTransformation(transformations))) + val bitmapTransform = RequestOptions.bitmapTransform(MultiTransformation(transformations)) + val glideRequests = GlideApp.with(imageView) + val placeholderRequest = if (addPlaceholder) { + glideRequests + .load(AvatarPlaceholder(matrixItem)) + .apply(bitmapTransform) + } else { + null + } + glideRequests.loadResolvedUrl(matrixItem.avatarUrl) + .apply(bitmapTransform) + // We are using thumbnail and error API so we can have blur transformation on it... + .thumbnail(placeholderRequest) + .error(placeholderRequest) .into(imageView) } @AnyThread fun getCachedDrawable(glideRequests: GlideRequests, matrixItem: MatrixItem): Drawable { - return buildGlideRequest(glideRequests, matrixItem.avatarUrl) + return glideRequests.loadResolvedUrl(matrixItem.avatarUrl) .onlyRetrieveFromCache(true) .apply(RequestOptions.circleCropTransform()) .submit() @@ -220,9 +238,9 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active // PRIVATE API ********************************************************************************* - private fun buildGlideRequest(glideRequests: GlideRequests, avatarUrl: String?): GlideRequest { + private fun GlideRequests.loadResolvedUrl(avatarUrl: String?): GlideRequest { val resolvedUrl = resolvedUrl(avatarUrl) - return glideRequests.load(resolvedUrl) + return load(resolvedUrl) } private fun resolvedUrl(avatarUrl: String?): String? { diff --git a/vector/src/main/res/layout/activity_call.xml b/vector/src/main/res/layout/activity_call.xml index c4bba45ebf..1c9401b5ab 100644 --- a/vector/src/main/res/layout/activity_call.xml +++ b/vector/src/main/res/layout/activity_call.xml @@ -9,7 +9,7 @@ android:id="@+id/constraintLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/bg_call_screen" + android:background="@color/bg_call_screen_blur" tools:ignore="MergeRootFrame"> - @@ -66,7 +69,7 @@ android:importantForAccessibility="no" android:src="@drawable/ic_call_small_pause" /> - + #1E0DBD8B #1E61708B - #99000000 + #99000000 + #27303A #FFFF4B55 #FF61708B From 78d02210dd0498b610eb922f84d2d1d8e2ec8e30 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 3 Jun 2021 20:30:18 +0000 Subject: [PATCH 049/254] Translated using Weblate (Hungarian) Currently translated at 100.0% (19 of 19 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/ --- .../android/hu/changelogs/40100130.txt | 2 +- .../android/hu/changelogs/40100140.txt | 2 + .../android/hu/changelogs/40100150.txt | 2 + .../android/hu/changelogs/40100160.txt | 2 + .../android/hu/changelogs/40100170.txt | 2 + .../android/hu/changelogs/40101000.txt | 2 + .../android/hu/changelogs/40101010.txt | 2 + .../android/hu/changelogs/40101020.txt | 2 + .../android/hu/changelogs/40101030.txt | 2 + .../android/hu/changelogs/40101040.txt | 2 + .../android/hu/changelogs/40101050.txt | 2 + .../android/hu/changelogs/40101060.txt | 2 + .../android/hu/changelogs/40101070.txt | 2 + .../metadata/android/hu/full_description.txt | 46 +++++++++++-------- 14 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 fastlane/metadata/android/hu/changelogs/40100140.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40100150.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40100160.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40100170.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101000.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101010.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101020.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101030.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101040.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101050.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101060.txt create mode 100644 fastlane/metadata/android/hu/changelogs/40101070.txt diff --git a/fastlane/metadata/android/hu/changelogs/40100130.txt b/fastlane/metadata/android/hu/changelogs/40100130.txt index e1b044f4e5..47ce2690f4 100644 --- a/fastlane/metadata/android/hu/changelogs/40100130.txt +++ b/fastlane/metadata/android/hu/changelogs/40100130.txt @@ -1,2 +1,2 @@ Főbb változtatások ebben a verzióban: URL előnézet, új emoji billentyűzet, új szoba beállitási lehetőségek, és hó karácsonyra! -Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.12 +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.13 diff --git a/fastlane/metadata/android/hu/changelogs/40100140.txt b/fastlane/metadata/android/hu/changelogs/40100140.txt new file mode 100644 index 0000000000..1b86da9ab1 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40100140.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Szoba jogosultságok szerkesztése, automatikus sötét/világos téma és sok hibajavítás. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.14 diff --git a/fastlane/metadata/android/hu/changelogs/40100150.txt b/fastlane/metadata/android/hu/changelogs/40100150.txt new file mode 100644 index 0000000000..b48fd6a0d7 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40100150.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Közösségi hálózatos bejelentkezés támogatása +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.15 diff --git a/fastlane/metadata/android/hu/changelogs/40100160.txt b/fastlane/metadata/android/hu/changelogs/40100160.txt new file mode 100644 index 0000000000..bb983ed5e8 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40100160.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Közösségi hálózatos bejelentkezés +Teljes változásnapló: 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/hu/changelogs/40100170.txt b/fastlane/metadata/android/hu/changelogs/40100170.txt new file mode 100644 index 0000000000..806470d74e --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40100170.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Hibajavítás! +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/hu/changelogs/40101000.txt b/fastlane/metadata/android/hu/changelogs/40101000.txt new file mode 100644 index 0000000000..0bc4f5d49f --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: VoIP (hang és videóhívás közvetlen beszélgetésekben) fejlesztés és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/hu/changelogs/40101010.txt b/fastlane/metadata/android/hu/changelogs/40101010.txt new file mode 100644 index 0000000000..503fc0ab2f --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101010.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.1 diff --git a/fastlane/metadata/android/hu/changelogs/40101020.txt b/fastlane/metadata/android/hu/changelogs/40101020.txt new file mode 100644 index 0000000000..04d67ac5ae --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101020.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.2 diff --git a/fastlane/metadata/android/hu/changelogs/40101030.txt b/fastlane/metadata/android/hu/changelogs/40101030.txt new file mode 100644 index 0000000000..4d0e46739e --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101030.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.3 diff --git a/fastlane/metadata/android/hu/changelogs/40101040.txt b/fastlane/metadata/android/hu/changelogs/40101040.txt new file mode 100644 index 0000000000..1c6921f0d5 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101040.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: sebesség javítás és hibajavítás +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.4 diff --git a/fastlane/metadata/android/hu/changelogs/40101050.txt b/fastlane/metadata/android/hu/changelogs/40101050.txt new file mode 100644 index 0000000000..c937bb9215 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101050.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: javítás az 1.1.4 verzióhoz +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.5 diff --git a/fastlane/metadata/android/hu/changelogs/40101060.txt b/fastlane/metadata/android/hu/changelogs/40101060.txt new file mode 100644 index 0000000000..a9b37e66a9 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101060.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: javítás az 1.1.5 verzióhoz +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.6 diff --git a/fastlane/metadata/android/hu/changelogs/40101070.txt b/fastlane/metadata/android/hu/changelogs/40101070.txt new file mode 100644 index 0000000000..4acfbea1ea --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: béta állapotú Tér támogatás. Videó tömörítés küldés előtt. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt index b75f259d02..032346ccb8 100644 --- a/fastlane/metadata/android/hu/full_description.txt +++ b/fastlane/metadata/android/hu/full_description.txt @@ -1,30 +1,40 @@ -Az Element egy új üzenetküldő, és csapatmunka alkalmazás, amivel +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. -1. A te kezedben van az irányítás a saját adataid fölött, hogy megőrizhesd a magánszférádat -2. Akárkivel beszélgethetsz a Matrix hálózatban, sőt még azon kívül is, például olyan alkalmazások integrálásával, mint a Slack -3. Megvédheted magad a hirdetésektől, adatbányászattól, és a nagy cégek megoldásaiba való bezártságtól -4. Biztonságosan beszélgethetsz, a végpontok közötti titkosításnak köszönhetően, az eszközök megbízhatóságát az eszköz-közti hitelesítéssel garantálva +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 teljesen más, mint a többi üzenetküldő és csapatmunka alkalmazás, mert nyílt forráskódú, és decentralizált (nem központilag irányított). +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. -Az Element lehetővé teszi, hogy saját szervert futtass - vagy válassz egy szolgáltatót - így te birtoklod az adataidat, ezáltal megőrizve a magánszférád és a biztonságod. Egy nyitott hálózathoz ad hozzáférést, így nem csak a többi Element felhasználóval tudsz beszélgetni, hanem másokkal is. Ráadásul nagyon biztonságos. +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. -Az Element-tel azért válik mindez lehetővé, mert a Matrix hálózatra épül - egy nyílt, decentralizált kommunikációs szabványra. +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. -Az Element a te kezedbe adja az irányítást azáltal, hogy eldöntheted, ki tárolja a beszélgetéseidet. Az Element alkalmazásból több féle szolgáltatót is választhatsz: +Element futtatható saját szerveren -1. Regisztrálhatsz ingyen egy fiókot a matrix.org nyilvános szerveren, amit a Matrix fejlesztői üzemeltetnek, vagy választhatsz a több ezer, ingyenes szerver közül, amit önkéntesek üzemeltetnek -2. A saját számítógépeden is futtathatsz szervert -3. Előfizethetsz egy saját szerverre az Element Matrix Szolgáltatások platformon +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. -Miért jó az Element-et választani? +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. -ADATAID MEGVÉDÉSE: Eldöntheted, hol tárold az adataid és üzeneteid. A te tulajdonodban van, nem valami megacégnél, ami bányássza az adataid, vagy továbbadja másoknak. +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 -NYÍLT BESZÉLGETÉS, ÉS CSAPATMUNKA: Akárkivel cseveghetsz a Matrix hálózatban, akár az Element-et használják, akár valamilyen másik Matrix alkalmazást, de még akkor is, ha egy másik csevegő hálózatot használnak, olyat, mint például a Slack, IRC, vagy az XMPP. +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. -SZUPER-BIZTONSÁGOS: Valódi, végpontok közötti titkosítás (csak a beszélgetés résztvevői tudják elolvasni az üzeneteket), és eszköz-közti hitelesítés, hogy ellenőrizhesd a résztvevők eszközeit. +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. -TELJES KOMMUNIKÁCIÓ: Üzenetküldés, hang- és videóhívások, fájlmegosztás, képernyőmegosztás, és egy rakás integráció, bot, és widget. Hozz létre szobákat, közösségeket, maradj elérhető, és végezzétek el a feladatokat. +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. -AKÁRHOL, AHOL CSAK SZÜKSÉG VAN RÁ: Akárhol is vagy, maradj elérhető, a teljes mértékben szinkronizált beszélgetésekkel az összes eszközödön, és a weben a https://app.element.io oldalon. +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 From bc2233866bd3540020290381ee0da81869bc3ffe Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 7 Jun 2021 14:46:12 +0200 Subject: [PATCH 050/254] VoIP: Change hold direction to send-only --- newsfragment/3467.misc | 1 + .../main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 newsfragment/3467.misc diff --git a/newsfragment/3467.misc b/newsfragment/3467.misc new file mode 100644 index 0000000000..b726da2353 --- /dev/null +++ b/newsfragment/3467.misc @@ -0,0 +1 @@ +VoIP: Change hold direction to send-only. \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt index f2a008feb7..c688c48429 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt @@ -618,7 +618,7 @@ class WebRtcCall( wasLocalOnHold = isLocalOnHold remoteOnHold = true isLocalOnHold = true - direction = RtpTransceiver.RtpTransceiverDirection.INACTIVE + direction = RtpTransceiver.RtpTransceiverDirection.SEND_ONLY timer.pause() } else { remoteOnHold = false From 89119722dff4b98b81601dc36d98edbe1dbf064f Mon Sep 17 00:00:00 2001 From: vachan-maker Date: Sun, 6 Jun 2021 05:04:00 +0000 Subject: [PATCH 051/254] Translated using Weblate (Malayalam) Currently translated at 37.0% (917 of 2475 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ml/ --- vector/src/main/res/values-ml/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vector/src/main/res/values-ml/strings.xml b/vector/src/main/res/values-ml/strings.xml index b41bdae287..db959072d7 100644 --- a/vector/src/main/res/values-ml/strings.xml +++ b/vector/src/main/res/values-ml/strings.xml @@ -985,4 +985,6 @@ കരിമ്പട്ടികയിൽ നിന്നും നീക്കുക ഇമ്പോർട്ട് എക്സ്പോർട്ട് + ക്ഷണങ്ങൾ + ഫ്ലെയർ \ No newline at end of file From a1603145e39974c6efa21bbf73a57941904b6abd Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Sat, 5 Jun 2021 22:06:57 +0000 Subject: [PATCH 052/254] Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.5% (2389 of 2475 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 | 978 +++++++++--------- 1 file changed, 495 insertions(+), 483 deletions(-) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index f55453707f..7b4a6a60ff 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -141,7 +141,7 @@ Sinc Inicial: \nImportando Dados de Conta Enviando mensagem… - Limpar a fila de envio + Limpar fila de envio Convite de %1$s. Razão: %2$s Seu convite. Razão: %1$s %1$s convidou %2$s. Razão: %3$s @@ -1410,7 +1410,7 @@ O nome público de uma sessão é visível para pessoas com quem você se comunica Chaves exportadas com sucesso Recuperação de Mensagens Encriptadas - Gerenciar Backup de Chaves + Gerenciar Backup de Chave ip desconhecido %1$s: %2$d mensagem @@ -1477,7 +1477,7 @@ Mensagens em salas encriptadas são asseguradas com a encriptação ponta-a-ponta. Somente você e a/o(s) recipiente(s) têm as chaves para ler estas mensagens. \n \nFaça seguramente backup de suas chaves para evitar perdê-las. - Começar a usar Backup de Chaves + Começar a usar Backup de Chave (Avançado) Exportar chaves manualmente Assegure seu backup com uma Frasepasse. @@ -1498,12 +1498,12 @@ Salvar Chave de Recuperação Compartilhar Salvar como Arquivo - A chave de recuperação tem sido salva em \"%s\". + A chave de recuperação tem sido salva em \'%s\'. \n \nAviso: este arquivo pode ser deletado se o aplicativo for desinstalado. A chave de recuperação tem sido salva. Um backup já existe em seu ServidorCasa - Parece que você já tem configurado um backup de chaves numa outra sessão. Você quer substituí-lo pelo que está criando\? + Parece que você já tem configurado backup de chave de uma outra sessão. Você quer substituí-lo pelo que você está criando\? Substituir Parar Por favor faça uma cópia @@ -1512,7 +1512,7 @@ Chave de Recuperação Erro inesperado Backup Começado - Backup de suas chaves está sendo feito. O backup inicial poderia levar muitos minutos. + Backup de suas chaves de encriptação está agora sendo feito no background para seu servidorcasa. O backup inicial poderia levar muitos minutos. Você tem certeza\? Você pode perder acesso a suas mensagens se você fizer logout ou perder este dispositivo. Obtendo versão de backup… @@ -1541,565 +1541,565 @@ %d nova chave tem sido adicionada a esta sessão. %d novas chaves têm sido adicionadas a esta sessão. - Não foi possível obter a versão mais recente das chaves de recuperação (%s). - A sessão criptografada não está activa - Restaurar do backup - Remover backup - O backup da chave foi configurado corretamente para esta sessão. - O backup da chave não está configurado nesta sessão. - O backup das suas chaves não está sendo feito nesta sessão. - O backup tem uma assinatura de uma sessão desconhecida com ID %s. - O backup tem uma assinatura válida desta sessão. - O backup tem uma assinatura válida da sessão confirmada %s. - O backup tem uma assinatura válida da sessão não confirmada %s - O backup tem uma assinatura inválida da sessão confirmada %s - O backup tem uma assinatura inválida da sessão não confirmada %s - Não foi possível saber se o backup é confiável (%s). - Para usar o Backup de Chaves nesta sessão, restaure com a sua frase secreta ou chave de recuperação agora. - Removendo o backup… - Não foi possível remover o backup (%s) - Verificando a situação do backup - Remover backup - Excluir as chaves de criptografia do servidor\? Você não será mais capaz de usar a sua chave de recuperação para ler o histórico de mensagens criptografadas. - Novo backup de chave - Foi detectado um novo backup de chave. -\n -\nSe você não definiu o novo método de recuperação, um invasor pode estar tentando acessar sua conta. Altere a senha da sua conta e defina um novo método de recuperação imediatamente nas Configurações. + Falha para obter versão mais recente de chaves de recuperação (%s). + A cripto de sessão não está ativada + Restaurar de Backup + Deletar Backup + Backup de Chave tem sido corretamente configurado para esta sessão. + Backup de Chave não está ativo nesta sessão. + Backup de suas chaves não está sendo feito desta sessão. + Backup tem uma assinatura de sessão desconhecida com ID %s. + Backup tem uma assinatura válida desta sessão. + Backup tem uma assinatura válida de sessão verificada %s. + Backup tem uma assinatura válida de sessão não-verificada %s + Backup tem uma assinatura inválida de sessão verificada %s + Backup tem uma assinatura inválida de sessão não-verificada %s + Falha para obter info de confiança para backup (%s). + Para usar Backup de Chave nesta sessão, restaure com sua frasepasse ou chave de recuperação agora. + Deletando backup… + Falha para deletar backup (%s) + 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. + Novo Backup de Chave + Um novo backup de chave de mensagem segura tem sido detectado. +\n +\nSe você não definiu o novo método de recuperação, um atacante poderia estar tentando acessar sua conta. Mude a senha de sua conta e defina um novo método de recuperação imediatamente em Configurações. Foi eu - Nunca perca mensagens criptografadas - Comece a fazer o backup da chave - Backup online - Proteja-se contra a perda de acesso a mensagens e dados criptografados - Nunca perca mensagens criptografadas - Fazer o backup da chave + Nunca perca mensagens encriptadas + Começar a usar Backup de Chave + Backup Seguro + Salvaguarde-se contra perder acesso a mensagens & dados encriptados + Nunca perca mensagens encriptadas + Usar Backup de Chave Novas chaves de mensagens seguras - Configurar o backup das chaves - Fazendo backup das chaves. Isso pode demorar vários minutos… - Configurar o backup online - O backup de todas as chaves foi concluído + Gerenciar em Backup de Chave + Fazendo backup de suas chaves. Isto pode levar muitos minutos… + Configurar Backup Seguro + Backup de todas as chaves foi feito - Fazendo o backup de %d chave… - Fazendo o backup de %d chaves… + Fazendo backup de %d chave… + Fazendo backup de %d chaves… Versão Algoritmo - Resposta de descoberta inválida no servidor local - Completar Automaticamente as Opções do Servidor - ${app_name} detectou uma configuração personalizada do servidor para a sua ID de usuário \"%1$s\": + Resposta de descoberta de servidorcasa inválida + Autocompletar Opções de Servidor + ${app_name} detectou uma configuração de servidor personalizada para seu domínio de userId \"%1$s\": \n%2$s - Usar a Configuração - Você foi desligado devido as credenciais inválidas ou caducadas. - Confirmar comparando um texto curto. - Para máxima segurança, recomendamos que você faça isso pessoalmente ou use outro meio de comunicação confiável. - Iniciar a confirmação - Recebendo solicitação de confirmação - Confirme se esta sessão é sua. Confirmar sessões fornece segurança adicional, ao usar mensagens criptografadas de ponta a ponta. - Ao confirmar se esta sessão é sua, você também a tornará confirmada para o seu contato. - Confirme esta sessão, comparando os emojis a seguir que serão exibidos para você e seu contato - Confirme esta sessão, comparando os números a seguir que serão exibidos para você e seu contato - Você recebeu uma solicitação de confirmação. - Ver pedido - Aguardando seu contato confirmar… - Confirmado! - Você confirmou essa sessão com êxito. - As mensagens com este usuário estão criptografadas de ponta a ponta e não podem ser lidas por terceiros. - Ok, entendi - Não aparece nada\? Nem todos os clientes suportam a confirmação interativa. Use a confirmação tradicional. - Use a confirmação tradicional. - Verificação da chave - Pedido Cancelado - Seu contato cancelou a confirmação. + Usar Config + Foi feito logout de sua conta devido a credenciais inválidas ou expiradas. + Verificar ao comparar um string de texto curto. + Para máxima segurança, nós recomendamos que você faça isto em pessoa ou use um outro meio de comunicação confiado. + Começar a Verificar + Requisição de Verificação Chegando + Verifique esta sessão para marcá-la como confiada. Confiar em sessões de parceiras(os) te dá paz de mente extra quando usando mensagens encriptadas ponta-a-ponta. + Verificar esta sessão vai marcá-la como confiada, e também marcar sua sessão como confiada para sua/seu parceira(o). + Verifique esta sessão ao confirmar que os seguintes emoji aparecem na tela de sua/seu parceira(o) + Verifique esta sessão ao confirmar que os seguintes números aparecem na dela de sua/seu parceira(o) + Você recebeu uma requisição de verificação entrante. + Ver requisição + Esperando por parceira(o) para confirmar… + Verificada! + Você tem confirmado esta sessão com sucesso. + Mensagens seguras com esta(e) usuária(o) estão encriptadas ponta-a-ponta e não são capazes de ser lidas por terceiros. + Entendido + Nada aparecendo\? Não todos os clientes suportam verificação interativa ainda. Use verificação legado. + Usar verificação legado. + Verificação de Chave + Requisição Cancelada + A outra parte cancelou a verificação. \n%s - A confirmação foi cancelada. -\nMotivo: %s - Confirmação interativa da sessão - Solicitação de confirmação - %s quer confirmar a sua sessão - O contato cancelou a confirmação - O tempo de confirmação expirou + A verificação foi cancelada. +\nRazão: %s + Verificação de Sessão Interativa + Requisição de Verificação + %s quer verificar sua sessão + A(o) usuária(o) cancelou a verificação + O tempo para processo de verificação expirou A sessão não sabe sobre essa transação - A sessão não concorda com a chave, método hash, MAC, ou SAS - O compromisso de hash não coincidiu - O SAS não corresponde + A sessão não concorda com um metódo de acordo de chave, hash, MAC, ou SAS + O cometimento de hash não correspondeu + O SAS não correspondeu A sessão recebeu uma mensagem inesperada Uma mensagem inválida foi recebida - Chave incorreta - Contato não corresponde + Disparidade de chave + Disparidade de usuária(o) Erro Desconhecido - Você não está usando algum servidor de identidade - Nenhum servidor de identidade está configurado. É necessário usar um para redefinir sua senha. - Parece que você está tentando se conectar com outro servidor local. Deseja sair\? + Você não está usando nenhum Servidor de Identidade + Nenhum servidor de identidade está configurado, ele é requerido para resettar sua senha. + Parece que você está tentando se conectar a um outro servidorcasa. Você quer fazer signout\? Editar Responder - Tentar novamente - Conecta-se a uma sala para começar a usar o aplicativo. - Enviou um convite - Convidado por %s - Tudo em dia! - Você não tem mais mensagens não lidas + Retentar + Junte-se a uma sala para começar a usar o app. + Te enviou um convite + Convidada(o) por %s + Você está em dia! + Você não tem mais nenhuma mensagem não-lida Boas-vindas! - Leia mensagens não lidas aqui + Fique em dia com suas mensagens não-lidas aqui Conversas - Suas conversas serão exibidas aqui. Toque no botão + abaixo para conversar com alguém. + Suas conversas de mensagem direta vai ser exibidas aqui. Toque no + à direita fundo para começar algumas. Salas - Seus salas serão exibidas aqui. Toque no botão + abaixo para pesquisar as salas existentes ou criar novas. + Suas salas vão ser exibidas aqui. Toque no + à direita fundo para achar algumas existentes ou começar algumas propriamente suas. Reações Concordo Curtir - Adicionar reação - Veja as reações + Adicionar Reação + Ver Reações Reações - Mensagem apagada - Mostrar mensagens apagadas - Mostrar um espaço reservado para mensagens apagadas - Evento apagado pelo usuário - Evento moderado pelo administrador da sala - Última edição por %1$s em %2$s - Evento malformado, não pode ser exibido + Mensagem deletada + Mostrar mensagens removidas + Mostrar um placeholder para mensagens removidas + Evento deletado por usuária(o) + Evento moderado por admin da sala + Último editado por %1$s a %2$s + Evento malformado, não dá para exibir Criar Nova Sala - Sem rede. Por favor, verifique sua conexão de internet. - Alterar - Alterar a rede - Por favor, aguarde… - Todas as comunidades - Esta sala não pode ser visualizada - A visualização da sala global ainda não é suportada por ${app_name} + Sem rede. Por favor cheque sua conexão de Internet. + Mudar + Mudar rede + Por favor espere… + Todas as Comunidades + Esta sala não pode ser previsualizada + A previsualização de sala legível pelo mundo não é suportada ainda em ${app_name} Salas - Conversas + Mensagens Diretas Nova Sala CRIAR Nome Público - Qualquer pessoa poderá entrar nesta sala - Lista de Salas - Publicar esta sala na lista de salas - Ocorreu um erro ao receber informações de confiança - Ocorreu um erro ao obter dados de backup de chaves - Importar as chaves de arquivo \"%1$s\". - Versão do SDK da Matrix - Outras licenças de terceiros + Qualquer pessoa vai ser capaz de se juntar a esta sala + Diretório de Salas + Publicar esta sala no diretório de salas + Um erro ocorreu ao obter info de confiança + Um erro ocorreu ao obter dados de backup de chaves + Importar as chaves e2e de arquivo \"%1$s\". + Versão de SDK de Matrix + Outras notas de terceiros Você já está vendo esta sala! - Reações rápidas + Reações Rápidas Geral Preferências - Segurança e Privacidade - Experiente - Regras do Push - Nenhuma regra Push definida - Nenhuma entrada Push registrada + Segurança & Privacidade + Expert + Regras de Push + Nenhuma regra de push definida + Nenhum gateway de push registrado app_id: - chave_push: - nome_da_ tela_ do_app: - nome_da_sessão: - Link: + push_key: + app_display_name: + session_name: + Url: Formato: - Voz e vídeo - Ajuda e Sobre + Voz & Vídeo + Ajuda & Sobre Registrar token - Faça uma sugestão - Por favor, escreva sua sugestão abaixo. - Descreva aqui sua sugestão - Obrigado, a sugestão foi enviada com êxito - A sugestão não foi enviada (%s) - Mostrar eventos ocultos nas conversas - Conversas - Aguardando… - Criptografando imagem miniatura… - Enviando imagem miniatura (%1$s / %2$s) - Criptografando arquivo… + Fazer uma sugestão + Por favor escreva sua sugestão abaixo. + Descreva sua sugestão aqui + Obrigado, a sugestão tem sido enviada com sucesso + A sugestão falhou para ser enviada (%s) + Mostrar eventos escondidos em timeline + Mensagens Diretas + Esperando… + Encriptando thumbnail… + Enviando thumbnail (%1$s / %2$s) + Encriptando arquivo… Enviando arquivo (%1$s / %2$s) - Baixando arquivo %1$s… - O arquivo %1$s foi baixado! + Fazendo download de arquivo %1$s… + Download de arquivo %1$s foi feito! (editado) - Edições na mensagem + Edições de Mensagem Nenhuma edição encontrada Filtrar conversas… Não consegue encontrar o que você está procurando\? - Criar uma sala nova - Enviar nova mensagem - Veja lista de salas - Nome ou ID (#example:matrix.org) - Ativar o recurso de deslizar para responder nas conversas - Adicione uma aba dedicada para notificações não lidas na tela principal. - Link copiado para a memória - Adicionar por ID do Matrix - Criando a sala… - Nenhum resultado encontrado, use adicionar por ID do Matrix para pesquisar no servidor. + Criar uma nova sala + Enviar uma nova mensagem direta + Ver o diretório de salas + Nome ou ID (#exemplo:matrix.org) + Ativar deslize para responder em timeline + Adicionar uma aba dedicada para notificações não-lidas em tela principal. + Link copiado para clipboard + Adicionar por ID matrix + Criando sala… + Nenhum resultado encontrado, use Adicionar por ID matrix para pesquisar em servidor. Comece a digitar para obter resultados - Filtrar por nome do usuário ou ID… - Entrando na sala… - Veja Histórico das Edições - Termos de serviço - Revisar termos - Seja descoberto por outros - Use bots, integrações, widgets e pacotes de figurinhas - Leia em + Filtrar por nome de usuário ou ID… + Juntando-se a sala… + Ver Histórico de Edição + Termos de Serviço + Revisar Termos + Seja descobertável por outras(os) + Use Bots, bridges, widgets e pacotes de stickers + Lido a Servidor de identidade Desconectar servidor de identidade Configurar servidor de identidade - Alterar servidor de identidade - Atualmente você está usando %1$s para descobrir e ser descoberto pelos contatos existentes. - No momento, você não está usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um abaixo. - Endereços de e-mail detectáveis - As opções de descoberta aparecerão uma vez que você tenha adicionado um e-mail. - As opções de descoberta aparecerão uma vez que você tenha adicionado um número de telefone. - Desconectar-se de seu servidor de identidade resultará em que você não poderá ser descoberto por outros usuários e não poderá convidar outros por e-mail ou número de telefone. - Números de telefone detectáveis - Enviamos um e-mail de confirmação para %s, verifique seu e-mail e clique no link de confirmação - Enviamos um e-mail de confirmação para %s. Por favor, verifique seu e-mail e clique no link de confirmação - Aguardando - Digite o endereço de um servidor de identidade - Não foi possível conectar-se ao servidor de identidade - Digite o endereço do servidor de identidade - O servidor de identidade não tem termos de serviço - O servidor de identidade que você escolheu não possui termos de serviço. Continue apenas se você confiar no proprietário do servidor - Uma mensagem de texto foi enviada para %s. Por favor, digite o código de confirmação que ela contém. - O código de confirmação não está correto. - Atualmente, você está compartilhando endereços de e-mail ou números de telefone no servidor de identidade %1$s. Você precisará reconectar-se a %2$s para parar de compartilhá-los. - Concorde com os Termos de Serviço do servidor de identidade (%s), para que você possa ser descoberto por endereço de e-mail ou por número de telefone. - Ativar registros detalhados - Os registros detalhados ajudarão os desenvolvedores, ao fornecerem mais registros quando você usar sacudir o aparelho. Mesmo quando ativado, o aplicativo não registra o conteúdo da mensagem ou qualquer outro dado privado. - Por favor, tente novamente quando tiver aceitado os termos e condições de seu servidor. - Parece que o servidor está demorando muito para responder, isto pode ser causado ou por má conectividade ou por um erro com o servidor. Por favor, tente novamente daqui a pouco. + Mudar servidor de identidade + Você está atualmente usando %1$s para descobrir e ser descobertável por contatos que você conhece. + Você não está atualmente usando um servidor de identidade. Para descobrir e ser descobertável por contatos que você conhece, configure um abaixo. + Endereços de email descobertáveis + Opções de descoberta vão aparecer uma vez que você tenha adicionado um email. + Opções de descoberta vão aparecer uma vez que você tenha adicionado um número de telefone. + Desconectar-se de seu servidor de identidade vai significar que você não vai ser descobertável por outras(os) usuárias(os) e você não vai ser capaz de convidar outras(os) por email ou telefone. + Números de telefone descobertáveis + Nós te enviamos um email de confirmar para %s, cheque seu email e clique no link de confirmação + Nós te enviamos um email de confirmar para %s, por favor primeiro cheque seu email e clique no link de confirmação + Pendente + Entre um URL de servidor de identidade + Não foi possível conectar-se a servidor de identidade + Por favor entre o url de servidor de identidade + Servidor de identidade não tem termos de serviço + O servidor de identidade que você tem escolhido não tem nenhuns termos de serviço. Somente continue se você confia na(o) dona(o) do serviço + Uma mensagem de texto tem sido enviada para %s. Por favor entre o código de verificação que ela contém. + O código de verificação não está correto. + Você está atualmente compartilhando endereços de email ou números de telefone no servidor de identidade %1$s. Você vai precisar reconectar-se a %2$s para parar de os compartilhar. + Concorde com os Termos de Serviço do servidor de identidade (%s) para permitir que você mesma(o) seja descobertável por endereço de email ou número de telefone. + Ativar verbose logs. + Verbose logs vão ajudar desenvolvedores(as) ao prover mais logs quando você enviar uma RageShake. Mesmo quando ativado, o aplicativo não registra conteúdos de mensagem ou quaisquer outros dados privados. + Por favor retente uma vez que você tenha aceitado os termos e condições de seu servidorcasa. + Parece que o servidor está demorando muito para responder, isto pode ser causado por ou má conectividade ou um erro com o servidor. Por favor tente de novo daqui a pouco. Enviar anexo - Abra a gaveta de navegação - Abra o menu de criar a sala - Fecha o menu de criar a sala… + Abrir a gaveta de navegação + Abrir o menu de criar sala + Fechar menu de criar sala… Criar uma nova conversa direta - Criar uma sala nova - Fechar o aviso de backup das chaves + Criar uma nova sala + Fechar banner de backup de chaves Mostrar senha Esconder senha - Saltar para parte inferior - %1$s, %2$s e %3$s leu - %1$s e %2$s lê - %s lê + Pular para fundo + %1$s, %2$s e %3$s leram + %1$s e %2$s leram + %s leu - %d usuário leu - %d usuários leram + %d usuária(o) leu + %d usuárias(os) leram - O arquivo \'%1$s\' (%2$s) é muito grande para ser carregado. O limite é de %3$s. - Ocorreu um erro durante a recuperação do anexo. + O arquivo \'%1$s\' (%2$s) é grande demais para fazer upload. O limite é %3$s. + Um erro ocorreu enquando recuperando o anexo. Arquivo Contato Câmera Áudio Galeria - Figurinha - Não conseguia lidar com dados compartilhados + Sticker + Não deu para lidar com compartilhar dados MÍDIA - Nenhuma mídia nesta sala + Não tem nenhuma mídia nesta sala ARQUIVOS - %1$s em %2$s - Nenhum arquivo nesta sala + %1$s a %2$s + Não tem nenhum arquivo nesta sala É spam É inapropriado - Relatório personalizado… - Denunciar conteúdo - Motivo para denúnciar este conteúdo - RELATÓRIO - BLOQUEAR USUÁRIO - Conteúdo relatado + Reporte personalizado… + Reportar este conteúdo + Razão para reportar este conteúdo + REPORTAR + IGNORAR USUÁRIA(O) + Conteúdo reportado Este conteúdo foi reportado. \n -\nSe você não quiser ver mais mensagens deste usuário, você pode bloqueá-lo para esconder suas mensagens. - Denunciado como spam +\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). + Reportado como spam Este conteúdo foi reportado como spam. \n -\nSe você não quiser ver mais mensagens deste usuário, você pode bloqueá-lo para esconder suas mensagens. - Denunciado como inadequado - Este conteúdo foi relatado como inadequado. +\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). + Reportado como inapropriado + Este conteúdo foi reportado como inapropriado. \n -\nSe você não quiser ver mais mensagens deste usuário, você pode bloqueá-lo para esconder suas mensagens. - ${app_name} precisa de permissão para salvar suas chaves E2E no aparelho. +\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). + ${app_name} precisa de permissão para salvar suas chaves E2E em disco. \n -\nPermita o acesso na próxima janela para poder exportar suas chaves manualmente. - Não há conexão de rede no momento - Bloquear usuário - Todas as mensagens novas (com som) - Todas as mensagens novas - Apenas @menções - Silenciar +\nPor favor permita acesso no próximo pop-up para ser capaz de exportar suas chaves manualmente. + Não há nenhuma conexão de rede no momento + Ignorar usuária(o) + Todas as mensagens (barulhendo) + Todas as mensagens + Menções somente + Mutar Configurações - Adicionar aos favoritos - Remover dos favoritos + Adicionar a favoritos + Remover de favoritos Sair da sala - %1$s não fez nenhuma alteração - Você não fez nenhuma alteração - Envia esta mensagem como um spoiler - Estraga-Surpresa - Digite palavras-chave para encontrar uma reação. - Nenhum usuário bloqueado - Clique longo sobre uma sala para ver mais opções - %1$s tornou a sala pública para quem conhece o link. - Você tornou a sala pública para quem conhece o link. - %1$s tornou a sala acessível somente com convite. - Você tornou a sala acessível somente com convite. - Mensagens não lidas - É a sua conversa. Vira um admin. - Converse com as pessoas diretamente ou em comunidades - Manter conversas privadas com criptografia - Amplie e personalize sua experiência + %1$s não fez nenhuma mudança + Você não fez nenhuma mudança + Envia a dada mensagem como um spoiler + Spoiler + Digite palavrachaves para encontrar uma reação. + Você não está ignorando nenhum(a) usuário(a) + Clique longo numa sala para ver mais opções + %1$s fez a sala pública para quem quer que saiba o link. + Você fez a sala pública para quem quer que saiba o link. + %1$s fez a sala somente convite. + Você fez a sala somente convite. + Mensagens não-lidas + É sua conversa. Tome-a como sua. + Faça chat com pessoas diretamente ou em grupos + Mantenha conversas privadas com encriptação + Extenda & personalize sua experiência Comece agora Selecione um servidor - Assim como o e-mail, as contas têm uma casa, embora você possa falar com qualquer pessoa - Junte-se gratuitamente aos milhões no maior servidor público - Hospedagem Premium para organizações + Assim como email, contas têm uma casa, embora você pode falar com qualquer pessoa + Junte-se a milhões de graça no maior servidor público + Hospedagem premium para organizações Saiba mais Outros - Configurações avançadas e preferências + Configurações personalizadas & avançadas Continuar - Conecte-se a %1$s - Conecte-se aos serviços de Element no Matrix + Conectar-se a %1$s + Conectar-se Element Matrix Services Conectar-se a um servidor personalizado - Entrar com %1$s - Cadastre-se - Entrar - Continuar com ID único - Endereço de serviço Element no Matrix + Fazer signin a %1$s + Fazer Signup + Fazer Signin + Continuar com SOU + Endereço de Element Matrix Services Endereço - Hospedagem Premium para organizações - Digite o endereço de Element Modular ou Servidor que você deseja usar - Digite o endereço do servidor que você deseja usar - Ocorreu um erro ao carregar a página: %1$s (%2$d) - O aplicativo não pode entrar neste servidor. O servidor suporta os seguintes tipos de login: %1$s. + Hospedagem premium para organizações + Entre o endereço do Modular Element ou Servidor que você quer usar + Entre o endereço do servidor que você quer usar + Um erro ocorreu quando carregando a página: %1$s (%2$d) + O aplicativo não é capaz de fazer signin a este servidorcasa. O servidorcasa suporta o(s) seguinte(s) tipo(s) de signin: %1$s. \n -\nDeseja entrar no servidor usando o Element Web\? +\nVocê quer fazer signing usando um cliente web\? Desculpe, este servidor não está aceitando novas contas. - O aplicativo não pode criar uma conta neste servidor. + O aplicativo não é capaz de criar uma conta neste servidorcasa. \n -\nDeseja criar uma conta no servidor usando o Element Web\? - Este e-mail não está associado a nenhuma conta. - Redefinir senha em %1$s - Um e-mail de confirmação será enviado para sua caixa de entrada, para você confirmar a definição de sua nova senha. +\nVocê quer fazer signup usando um cliente web\? + Este email não está associado a nenhuma conta. + Resettar senha em %1$s + Um email de verificação vai ser enviado para sua inbox para confirmar definição de sua nova senha. Próximo - E-mail + Email Nova senha - Atenção! - Alterar a sua senha redefinirá todas as chaves de criptografia de ponta a ponta existentes em todas as suas sessões, tornando o histórico de mensagens criptografadas ilegível. Faça um backup das suas chaves, ou exporte as chaves de outra sessão antes de alterar a sua senha. + Aviso! + Mudar sua senha vai resettar quaisquer chaves de encriptação ponta-a-ponta em todas as suas sessões, fazendo histórico de chat encriptado ilegível. Configure Backup de Chave ou exporte suas chaves de sala de uma outra sessão antes de resettar sua senha. Continuar - Este e-mail não está associado a nenhuma conta - Verifique sua caixa de entrada no e-mail - Um e-mail de confirmação foi enviado para %1$s. - Toque no link para confirmar sua nova senha. Uma vez que você tenha clicado o link que ele contém, clique abaixo. - Verifiquei meu endereço de e-mail - Parabéns! - Sua senha foi alterada. - Você foi desconectado de todas as sessões e não receberá mais notificações pop-up. Para reativar as notificações, faça o login novamente em cada aparelho. - Voltar para Entrar - Atenção - Sua senha ainda não foi alterada. + Este email não está linkado a nenhuma conta + Cheque sua inbox + Um email de verificação foi enviado para %1$s. + Toque no link para confirmar sua nova senha. Uma vez que você tenha seguido o link que ele contém, clique abaixo. + Eu tenho verificado meu endereço de email + Sucesso! + Sua senha tem sido resettada. + Foi feito logout de todas suas sessões e você não vai mais receber notificações push. Para reativar notificações, faça signin de novo em cada dispositivo. + Voltar para Fazer Signin + Aviso + Sua senha ainda não tem sido mudada. \n -\nInterromper a alteração de senha\? - Defina um endereço de e-mail - Defina um e-mail para recuperar sua conta. Mais tarde, você pode, opcionalmente, permitir que as pessoas que você conhece o descubram por seu e-mail. - E-mail - E-mail (opcional) +\nPara o processo de mudança de senha\? + Definir endereço de email + Defina um email para recuperar sua conta. Mais tarde, você pode opcionalmente permitir que pessoas que você conhece descubram você por seu email. + Email + Email (opcional) Próximo - Defina número de telefone - Defina um número de telefone para, opcionalmente, permitir que as pessoas que você conhece o encontram. - Por favor, use o formato internacional. + Definir número de telefone + Defina um número de telefone para opcionalmente permitir que pessoas que você conhece descubram você. + Por favor use o formato internacional. Número de telefone Número de telefone (opcional) Próximo - Confirme o número de telefone - Acabamos de enviar um código para %1$s. Digite-o abaixo para confirmar se é você. - Digite o código - Enviar novamente + Confirmar número de telefone + Nós acabamos de enviar um código para %1$s. Entre-o abaixo para verificar que é você. + Entrar código + Enviar de novo Próximo - Os números de telefone internacionais devem começar com \'+\' - O número de telefone parece inválido. Favor verificá-lo - Registar em %1$s - Nome de usuário ou e-mail + Números de telefone internacionais devem começar com \'+\' + Número de telefone parece inválido. Por favor cheque-o + Fazer signup a %1$s + Nome de usuário ou email Nome de usuário Senha Próximo - Esse nome de usuário está indisponível - Atenção - Sua conta ainda não foi criada. + Esse nome de usuário está tomado + Aviso + Sua conta não foi criada ainda. \n -\nCancelar o processo de registro\? - Selecione matrix.org - Selecione Element nos Serviços de Matrix - Selecione um servidor personalizado - Por favor, realize o desafio de Captcha - Aceitar termos para continuar - Por favor, verifique seu e-mail - Acabamos de enviar um e-mail para %1$s. -\nPor favor, clique no link que ele contém para continuar a criação da conta. - O código digitado não está correto. Por favor, verifique-o. - Servidor desatualizado - Este servidor tem uma versão muito antiga que não é compatível com nosso servidor. Peça ao administrador para fazer atualização. +\nParar o processo de registro\? + Selecionar matrix.org + Selecionar Element Matrix Services + Selecionar um servidorcasa personalizado + Por favor performe o desafio de captcha + Aceite termos para continuar + Por favor cheque seu email + Nós acabamos de enviar um email para %1$s. +\nPor favor clique no link que ele contém para continuar a criação de conta. + O código entrado não está correto. Por favor cheque. + Servidorcasa desatualizado + Este servidorcasa está rodando uma versão antiga demais para se conectar a ele. Peça à/ao admin de seu servidorcasa para fazer upgrade. - Recebemos demasiado pedidos. Você pode tentar novamente em %1$d segundo… - Recebemos demasiado pedidos. Você pode tentar novamente em %1$d segundos… + Requisições demais têm sido enviadas. Você pode retentar em %1$d segundo… + Requisições demais têm sido enviadas. Você pode retentar em %1$d segundos… - Alternativamente, se você já tem uma conta e conhece a sua ID de usuário na Matrix e a senha, você pode usar este método: - Entre com ID do Matrix - Entre com ID do Matrix - Se você criar uma conta no servidor local, use ID do Matrix (e.g. @user:domain.com) e a senha abaixo. - ID do Matrix - Se você não souber sua senha, volte para redefinir-a. - Este não é um identificador de usuário válido. Formato esperado: \'@user:homeserver.org\' - Incapaz de encontrar um servidor válido. Por favor, verifique seu identificador - Lida por - Você está desconectada/o - Isso pode ser devido à vários motivos: + Alternativamente, se você já tem uma conta e sabe seu identificador Matrix e sua senha, você pode usar este método: + Fazer signin com ID Matrix + Fazer signin com ID Matrix + Se você configurar uma conta em um servidorcasa, use seu ID Matrix (e.g. @usuarix:dominio.com) e senha abaixo. + ID Matrix + Se você não sabe sua senha, volte para resettá-la. + Este não é um identificador de usuária(o) válido. Formato esperado: \'@usuarix:servidorcasa.org\' + Incapaz de encontrar um servidorcasa válido. Por favor cheque seu identificador + Vista por + Você fez signout + Pode ser devido a várias razões: \n -\n• Você alterou sua senha em outra sessão. +\n• Você tem mudado sua senha numa outra sessão. \n -\n• Você excluiu esta sessão de outra sessão. +\n• Você tem deletado esta sessão de uma outra sessão. \n -\n• O administrador do seu servidor invalidou seu acesso por motivos de segurança. - Entrar novamente - Você está desconectada/o - Entrar - Administrador do seu servidor (%1$s) invalidou seu acesso %2$s (%3$s). - Faça login para recuperar as chaves de criptografia armazenadas exclusivamente neste aparelho. Você precisa delas para ler todas as suas mensagens seguras em qualquer aparelho. - Entrar +\n• O(a) administrador(a) de seu servidor tem invalidado seu acesso por razão de segurança. + Fazer signin de novo + Você fez signout + Fazer signin + O(a) administrador(a) de seu servidorcasa (%1$s) fez seu signin de sua conta %2$s (%3$s). + Faça signin para recuperar chaves de encriptação armazenadas exclusivamente neste dispositivo. Você precisa delas para ler todas suas mensagens seguras em qualquer dispositivo. + Fazer signin Senha Limpar dados pessoais - Atenção: Seus dados pessoais (incluindo chaves de criptografia) ainda estão armazenados neste aparelho. + Aviso: Seus dados pessoais (incluindo chaves de encriptação) ainda estão armazenados neste dispositivo. \n -\nApague-os quando não usar mais este aparelho, ou se quiser entrar em outra conta. +\nLimpe-os quando estiver terminado de usar este dispositivo, ou quiser fazer signin numa outra conta. Limpar todos os dados Limpar dados - Limpar todos os dados atualmente armazenados neste aparelho\? -\nEntre novamente para acessar os dados e mensagens da sua conta. - Você perderá o acesso as mensagens seguras a menos que você faça login para recuperar suas chaves de criptografia. + Limpar todos os dados atualmente armazenados neste dispositivo\? +\nFaça signin de novo para acessar os dados e mensagens de sua conta. + Você vai perder acesso a mensagens seguras a menos que você faça signin para recuperar suas chaves de encriptação. Limpar dados - A sessão atual é para o usuário %1$s e você fornece credenciais para o usuário %2$s. Isto não é suportado no ${app_name}. -\nPor favor, limpe os dados do aplicativo, depois faça o login novamente em outra conta. - Seu link do matrix.to foi malformado + A sessão atual é para usuária(o) %1$s e você provê credenciais para usuária(o) %2$s. Isto não é suportado por ${app_name}. +\nPor favor primeiro limpe dados, então faça signin de novo em uma outra conta. + Seu link matrix.to foi malformado A descrição é curta demais - Sincronia Inicial… - Veja todas as minhas sessões + Sinc Inicial… + Ver todas minhas sessões Configurações avançadas - Modo desenvolvedor - O modo de desenvolvedor permite ativar recursos ocultos, o que pode tornar o aplicativo menos estável. Somente para desenvolvedores! - Agitar celular - Detectar patamar + Modo desenvolvedor(a) + O modo desenvolvedor(a) ativa funcionalidades escondidas e também pode fazer o aplicativo menos estável. Para desenvolvedores(as) somente! + Rageshake + Limiar de detecção Agite seu telefone para testar o limiar de detecção - A sacudida detectada! + Agitação detectada! Configurações Sessão atual Outras sessões - Mostrando apenas os primeiros resultados, digite mais letras… - Relatar imediatamente as falhas - ${app_name} poderá quebrar com mais frequência quando ocorrer um erro inesperado - Adiciona ¯\\_(ツ)_/¯ a uma mensagem de texto - Ativar criptografia - Uma vez ativada, a criptografia não poderá ser desativada. - Seu domínio de e-mail não está permitido a se registrar neste servidor - Entrada não confiável - Correspondem - Não correspondem - Confirme este usuário, comparando os emojis a seguir que serão exibidos na tela dele, na mesma ordem. - Para maior segurança, use outro meio de comunicação confiável ou faça isso pessoalmente. - Procure o escudo verde para garantir que um usuário seja confiável. Confie em todos os usuários numa sala para garantir que a sala é segura. + Mostrando somente os primeiros resultados, digite mais letras… + Rápida-falha + ${app_name} pode crashar com mais frequência quando um erro inesperado ocorre + Prepende ¯\\_(ツ)_/¯ a uma mensagem de texto puro + Ativar encriptação + Uma vez ativada, encriptação não poder ser desativada. + Seu domínio de email não está autorizado a se registrar neste servidor + Signin desconfiado + Eles correspondem + Eles não correspondem + Verifique esta(e) usuária(o) ao confirmar que os seguintes emoji únicos aparecem na tela dela(e), na mesma ordem. + Para máxima segurança, use um outro meio de comunicação confiado ou faça isto em pessoa. + Procure pelo escudo verde para assegurar que um(a) usuário(a) é confiado. Confie em todos(as) os/as usuários(as) numa sala para assegurar que a sala é segura. Não seguro - Um dos seguintes casos pode estar comprometido: + Um dos seguintes pode estar comprometido: \n -\n·- Seu servidor doméstico -\n·- O servidor do usuário que você está verificando -\n·- A sua, ou a conexão de outros usuários à internet -\n·- O seu, ou o aparelho dos outros usuários +\n - Seu servidorcasa +\n - O servidorcasa da/do usuária(o) ao qual você está verificando está conectada(o) +\n - A conexão de internet sua ou da/do outra(o) usuária(o) +\n - O dispositivo seu ou da/do outra(o) usuária(o) Vídeo. Imagem. Áudio Arquivo - Figurinha - Aguardando… + Sticker + Esperando… %s cancelado Você cancelou %s aceitou Você aceitou - Confirmação enviada - Solicitação de confirmação - Confirmar esta sessão - Confirmar manualmente + Verificação Enviada + Requisição de Verificação + Verificar esta sessão + Verificar manualmente Você - Escaneie o código com a câmera do aparelho do outro usuário para confirmar a segurança entre vocês - Escanea o código do seu contato - Não pode escanear - Se você não está presente, alternativamente compare emoji - Confirmar comparando emojis - Confirmar por emojis - Se você não consegue escanear o código acima, confirme via comparação de emojis. - Imagem em código QR - Confirmar %s - Confirmou %s - Aguardando por %s… - Para segurança extra, confirme %s comparando um código único em ambos os aparelhos. + Scanne o código com o dispositivo da/do outra(o) usuária(o) para verificar seguramente um/uma a/o outra(o) + Scannar código dela(e) + Não dá para scannar + Se você não está em pessoa, compare emoji em vez disso + Verificar ao comparar emojis + Verificar por Emoji + Se você não pode scannar o código acima, verifique ao comparar uma seleção curta e única de emoji. + Imagem de QR code + Verificar %s + Verificou %s + Esperando por %s… + Para segurança extra, verifique %s ao checar um código de única vez em ambos seus dispositivos. \n -\nPara máxima segurança, faça isso pessoalmente. - As mensagens nesta sala não estão criptografadas de ponta a ponta. - As mensagens nesta sala estão criptografadas de ponta a ponta. +\nPara máxima segurança, faça isto em pessoa. + Mensagens nesta sala não são encriptadas ponta-a-ponta. + Mensagens nesta sala são encriptadas ponta-a-ponta. \n -\nSuas mensagens estão protegidas com cadeados e somente você e o destinatário têm as chaves exclusivas que permitem a leitura delas. +\nSuas mensagens estão asseguradas com cadeados e somente você e a/o recipente têm as chaves únicas para os destrancar. Segurança Saiba mais Mais - Ações do administrador + Ações de Admin Configurações da sala Notificações Uma pessoa %1$d pessoas - Mídia e arquivos - Sair da sala - Deixando a sala… - Administradores - Moderadores + Uploads + Sair da Sala + Saindo da sala… + Admins + Moderadoras(es) Personalizado Convites - Usuários - Administrador em %1$s - Moderador em %1$s - Padrão em %1$s + Usuárias(os) + Admin em %1$s + Moderador(a) em %1$s + Default em %1$s Personalizado (%1$d) em %2$s - Ir para a confirmação de leitura - ${app_name} não lida com eventos do tipo \'%1$s\' - ${app_name} não lida com mensagens do tipo \'%1$s\' - ${app_name} encontrou um problema ao render o conteúdo de um evento com \'%1$s\' ID - Desbloquear - Esta sessão não pode compartilhar essa confirmação com suas outras sessões. -\nA confirmação será salvada localmente e será compartilhada em uma versão futura do aplicativo. + Pular para recibo de leitura + ${app_name} não lida com eventos de tipo \'%1$s\' + ${app_name} não lida com mensagens de tipo \'%1$s\' + ${app_name} encontrou um problema ao render conteúdo de evento com id \'%1$s\' + Designorar + Esta sessão é incapaz de compartilhar essa verificação com suas outras sessões. +\nA confirmação vai ser salvada localmente e compartilhada numa versão futura do app. Salas recentes Outras salas - Envia a mensagem colorida como arco-íris - Envia o emoji colorido como um arco-íris - Conversas - Campo de texto - Ativar a criptografia de ponta a ponta… - Uma vez ativada, a criptografia não poderá ser desativada. - Ativar criptografia\? - Uma vez ativada, a criptografia de uma sala não pode ser desativada. As mensagens enviadas em uma sala criptografada não podem ser lidas pelo servidor, apenas pelos participantes desta sala. A ativação da criptografia pode impedir que muitos bots e integrações funcionem corretamente. - Ativar criptografia - Para ficar seguro, confirme %s comparando um código único. - Para sua segurança, faça isso pessoalmente ou use outra forma confiável de comunicação. + Envia a dada mensagem colorida como um arcoíris + Envia o dado emote colorido como um arcoíris + Timeline + Editor de mensagem + Ativar encriptação ponta-a-ponta… + Uma vez ativada, encriptação não poder ser desativada. + Ativar encriptação\? + Uma vez ativada, encriptação para uma sala não pode ser desativada. Mensagens enviadas numa sala encriptada não podem ser vistas pelo servidor, somente pelas(os) participantes da sala. Ativar encriptação pode prevenir que muitos bots e bridges de funcionarem corretamente. + Ativar encriptação + Para estar segura(o), verifique %s ao checar um código de única vez. + Para estar segura(o), faça isto em pessoa ou use uma outra forma de se comunicar. Compare os emoji únicos, assegurando que eles apareçam na mesma ordem. - Compare o código com o exibido na tela do outro usuário. - As mensagens com este usuário estão criptografadas de ponta a ponta e não podem ser lidas por terceiros. - Sua nova sessão agora está confirmada. Ela tem acesso às suas mensagens criptografadas, e outros usuários a verão como confirmada. - Autoverificação - A autoverificação está ativada -\nChaves privadas estão no aparelho. - A autoverificação está ativada -\nAs chaves são confiáveis. -\nAs chaves privadas não são conhecidas - A autoverificação está ativada. -\nAs chaves não são confiáveis - A autoverificação não está ativada - O administrador do servidor desativou a criptografia de ponta a ponta por padrão em salas privadas e em conversas. - Sessões ativas - Veja todas as sessões - Gerenciar sessões - Sair desta sessão - Não há informações criptográficas disponíveis - Esta sessão é confiável para o envio de mensagens seguras porque você a confirmou: - Confirme esta sessão para conceder para ela o acesso a mensagens criptografadas. Se você não entrou nesta sessão, sua conta pode estar comprometida: + Compare o código com aquele exibido na tela da/do outra(o) usuária(o). + Mensagens com esta(e) usuária(o) são encriptadas ponta-a-ponta e não podem ser lidas por terceiros. + Sua nova sessão agora está confirmada. Ela tem acesso a suas mensagens encriptadas, e outras(os) usuárias(os) vão vê-la como confiada. + Assinatura Cruzada + Assinatura Cruzada está ativada +\nChaves Privadas em dispositivo. + Assinatura Cruzada está ativada +\nChaves são confiadas. +\nChaves privadas não são conhecidas + Assinatura Cruzada está ativada. +\nChaves não são confiadas + Assinatura Cruzada não está ativada + O/A administrador(a) de seu servidor tem desativado encriptação ponta-a-ponta por default em salas privadas & Mensagens Diretas. + Sessões Ativas + Mostrar Todas as Sessões + Gerenciar Sessões + Fazer signout desta sessão + Nenhuma informação criptográfica disponível + Esta sessão é confiada para mensageria segura porque você a verificou: + Verifique esta sessão para marcá-la como confiada & garantir-lhe acesso a mensagens encriptadas. Se você não fez signin a esta sessão sua conta pode estar comprometida: %d sessão ativa %d sessões ativas @@ -2406,12 +2406,12 @@ Gerenciar Integrações Nenhum widget ativo - A sala foi criada, mas alguns convites não foram enviados pelo seguinte motivo: + A sala tem sido criada, mas alguns convites não têm sido enviados pela seguinte razão: \n \n%s - %1$s, %2$s e %3$d outro leu - %1$s, %2$s e %3$d outros leram + %1$s, %2$s e %3$d outra(o) leu + %1$s, %2$s e %3$d outras(os) leram Código errado, %d tentativa restante @@ -2434,17 +2434,17 @@ Emails e números de telefone Gerenciar emails e números de telefone linkados a sua conta Matrix Código - Por favor, use o formato internacional (o número de telefone precisa começar com \'+\') + Por favor use o formato internacional (número de telefone deve começar com \'+\') Confirme sua identidade verificando este login, concedendo a ele acesso a mensagens criptografadas. Não é possível carregar uma sala da qual você foi banido. Não foi possível encontrar esta sala. Certifique-se de que ela existe. O link não está correto Este número de telefone já está definido. Mostrar eventos de estado de membros da sala - Votação - Botões do bot + Sondagem + Botões de Bot Reagiu com: %s - Confirmação concluída + Conclusão de Verificação Remover os dados de %1$s desta conta\? \n \nProssiga com cuidado, pois não há como reverter esta escolha. @@ -2473,12 +2473,12 @@ As mensagens nesta sala estão criptografadas de ponta a ponta. Sair Configurações - As mensagens nesta conversa estão criptografadas de ponta a ponta. + Mensagens aqui são criptografadas ponta-a-ponta. \n -\nSuas mensagens estão protegidas, pois só você e seu contato têm as chaves únicas para desbloqueá-las. - As mensagens nesta sala não estão criptografadas de ponta a ponta. - Este servidor local está executando uma versão antiga do Element. Peça ao administrador do servidor para atualizá-lo. Você pode prosseguir, mas alguns recursos poderão não funcionar corretamente. - Exibir histórico completo em salas criptografadas +\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para os destrancar. + Mensagens aqui não são encriptadas ponta-a-ponta. + Este servidorcasa está rodando uma versão antiga. Peça à/ao admin de seu servidorcasa para fazer upgrade. Você pode continuar, mas algumas funcionalidades podem não funcionar corretamente. + Mostrar histórico completo em salas encriptadas %1$s e %2$s %1$s em %2$s e %3$s A notificação tem sido clicada! @@ -2492,8 +2492,8 @@ Você não tem permissão para começar uma chamada Você não tem permissão para começar uma chamada de conferência Resettar - %1$s tornou a sala acessível somente com convite. - Você definiu que a sala só receberá integrantes com convite. + %1$s fez isto somente convite. + Você fez isto somente convite. %s entrou. Filtrar usuárias(os) banidas(os) Testar Push @@ -2501,27 +2501,27 @@ %d convite %d convites - Remover baixa prioridade - Definir como baixa prioridade - Adicionar imagem + Remover de baixa prioridade + Adicionar a baixa prioridade + Adicionar imagem de Descartar alterações Existem alterações não salvas. Descartar as alterações\? A sala ainda não foi criada. Cancelar a criação da sala\? - Girar e recortar + Rotar e recortar Configurações da sala - Descrição - Descrição da sala (opcional) + Tópico + Tópico da sala (opcional) Nome da sala Enviar histórico de requisições de compartilhamento de chaves Mais nenhum resultado Exportar auditoria - Enviar mensagem - Mostrar mais - Esconder mais + Mensagem direta + Mostrar avaçadas + Esconder avançadas Link na Matrix %s para que as pessoas saibam do que se trata esta sala. - Digite o endereço da sala - Recentes + Por favor proveja um endereço da sala + Recente Código QR não escaneado! Código QR inválido (URL inválido)! Não é possível enviar mensagens para si mesmo! @@ -2543,31 +2543,31 @@ Este é o começo do seu histórico de mensagens com %s. Este é o começo desta conversa. Este é o início de %s. - Você não tem permissão para ativar a criptografia nesta sala. + Você não tem permissão para ativar encriptação nesta sala. Criando sala… Alguns caracteres não são permitidos Este endereço já está em uso Endereço da sala - Você pode habilitar essa opção se a sala for usada apenas para colaboração com equipes internas em seu servidor local. Essa opção não poderá ser alterada mais tarde. - Impedir que qualquer pessoa que não faça parte de %s jamais entre nesta sala + Você pode ativar 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 nunca se juntar a esta sala %1$d de %2$d - Começar uma nova conversa escaneando um código QR - Começar uma nova conversa com um ID na Matrix - De modo a descobrir contatos a partir de pessoas que você conhece, você aceita enviar seus dados de contato (números de telefone e/ou e-mails) para o servidor de identidade configurado (%1$s)\? + Criar uma nova conversa direta ao scannar um QR code + Criar uma nova conversa direta por ID Matrix + A fim de descobrir contatos existente que você conhece, você aceita enviar seus dados de contato (números de telefone e/ou e-mails) para o Servidor de Identidade configurado (%1$s)\? \n -\nPara obter mais privacidade, os dados enviados serão criptografados antes de serem enviados. - Enviar e-mails e números de telefone - Autorizar - Revogar minha autorização - Você não autorizou o envio de e-mails e números de telefone para este servidor de identidade, de modo a descobrir outras pessoas a partir dos seus contatos. - Você autorizou o envio de e-mails e números de telefone para este servidor de identidade, de modo a descobrir outras pessoas a partir dos seus contatos. - Enviar e-mails e números de telefone +\nPara mais privacidade, os dados enviados serão hashados antes de serem enviados. + Enviar emails e números de telefone + Dar consentimento + Revogar meu consentimento + Você não 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. + 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. + Enviar emails e números de telefone Sugestões Contatos - Pessoas conhecidas - Código QR - Adicionar por código QR - Pesquise por nome ou ID + Usuárias(os) Conhecidas(os) + QR code + Adicionar por QR code + Pesquisar por nome ou ID Aceite permissão para acessar seus contatos. Para scannear um QR code, você precisa permitir acesso a câmera. Começar a Conversar @@ -2589,9 +2589,9 @@ Adicionar Alterar o seu PIN atual Alterar o PIN - Esta sala não pode ser visualizada. Você quer entrar nela\? - Esta sala não está acessível no momento. -\nTente novamente mais tarde, ou peça ao administrador da sala para verificar se você tem acesso. + Esta sala não pode ser previsualizada. Você quer se judar a ela\? + Esta sala não está acessível neste momento. +\nTente de novo mais tarde, ou peça a um(a) admin da sala para checar se você tem acesso. Incapaz de recuperar a visibilidade atual de diretório de salas (%1$s). Publicar esta sala ao público no direitório de salas de %1$s\? Despublicar este endereço @@ -2604,16 +2604,16 @@ Acesso a sala Mundaças de quem pode ler o histórico só se vão aplicar a mensagens futuras nesta sala. A visibilidade do histórico existente vai ser inalterada. Despublicar - login único + sign-on único Adicionar um botão em compositor de mensagem para abrir teclado de emoji Notificar todo mundo enviar neve ❄️ enviar confetes 🎉 Enviar a mensagem com neve Enviar a mensagem com confetes - Limpar o histórico - Entrar com %s - Registrar-se com %s + Limpar histórico + Fazer signin com %s + Fazer signup com %s Continuar com %s Ou Mostrar teclado de emoji @@ -2687,7 +2687,7 @@ Abrir widgets Captura de tela O limite é desconhecido. - O seu servidor local aceita anexos (arquivos, mídia, etc) com tamanhos de até %s. + Seu servidorcasa aceita anexos (arquivos, mídia, etc.) com um tamanho de até %s. Versão do servidor Nome do servidor Configurações da sala @@ -2741,7 +2741,7 @@ %d entrada %d entradas - Limite do envio de arquivo do servidor + Limite de upload de arquivo do servidor Qualquer pessoa num espaço com esta sala pode encontrar e juntar-se a ela. Somente admins desta sala podem adicioná-la a um espaço. Espaços Qualquer pessoa pode encontrar a sala e juntar-se @@ -2757,4 +2757,16 @@ Convites Salas Sugeridas Mensagem enviada + O arquivo é grande demais para fazer upload. + Esta funcionalidade está em beta + Pesquisar Nome + Comprimindo vídeo %d%% + Comprimindo imagem… + Dar Feedback + O feedback falhou para ser enviado (%s) + Obrigado, seu feedback tem sido enviado com sucesso + Vocês podem me contactar se vocês tiverem quaisquer perguntas subsequentes + Você está usando uma versão beta de espaços. Seu feedback vai ajudar a informar as próximas versões. Sua plataforma e nome de usuária(o) vão ser anotados para nos ajudar a usar o seu feedback tanto quanto nós pudermos. + Feedback + Feedback de espaços \ No newline at end of file From 93fc07e96e76743270652342d8c21f23e6ad18ac Mon Sep 17 00:00:00 2001 From: Mouath Ibrahim Date: Sun, 6 Jun 2021 13:06:16 +0000 Subject: [PATCH 053/254] Translated using Weblate (Arabic) Currently translated at 39.1% (968 of 2475 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 | 99 +++++++++++++++++++++-- 1 file changed, 93 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml index e5de0bfc96..9249228546 100644 --- a/vector/src/main/res/values-ar/strings.xml +++ b/vector/src/main/res/values-ar/strings.xml @@ -1136,11 +1136,98 @@ \nينتظر رد الخادم… غير %1$s اسمه الى %2$s - - أضف كعنوان لهذه الغرفة - - - أضف كعناوان لهذه الغرفة - + %1$s أضاف %2$s كعنوان لهذه الغرفة. + %1$s أضاف %2$s كعنوان لهذه الغرفة. + %1$s أضاف %2$s كعنوانين لهذه الغرفة. + %1$s أضاف %2$s كعناوين لهذه الغرفة. + %1$s أضاف %2$s كعناوين لهذه الغرفة. + %1$s أضاف %2$s كعناوين لهذه الغرفة. + + فقط في هذه الغُرفة + لن يكونوا جزءًا من %s + إنضم إلى مساحتي %1$s %2$s + تخطي في الوقت الراهن + إنشاء مساحة + انضم إلى المساحة + الانضمام على أي حال + هذا الاسم المستعار غير متوفر في الوقت الحالي. +\nحاول مرة أخرى لاحقًا، أو اطلب من مسؤول الغرفة التحقق مما إذا كان لديك وصول. + أنت لست في أي غرفة حتى الآن. فيما يلي بعض الغرف المقترحة، ولكن يمكنك رؤية المزيد بالزر الأخضر أسفل اليمين. + مرحبًا بك في %1$s، %2$s. + + %d شخص تعرفه قد انضم بالفعل + %d شخص تعرفه قد انضم بالفعل + %d شخصان تعرفهم قد انضموا بالفعل + %d أشخاص تعرفهم قد انضموا بالفعل + %d أشخاص تعرفهم قد انضموا بالفعل + %d أشخاص تعرفهم قد انضموا بالفعل + + استكشِف الغُرف + أضف غُرف + غادر المساحة + هل أنت متأكد أنك تريد مغادرة المساحة؟ + انت الشخص الوحيد هنا إذا غادرت، فلن يتمكن أي شخص من الانضمام في المستقبل، بما في ذلك أنت. + هذه المساحة ليست عامة. لن تتمكن من الانضمام مرة أخرى بدون دعوة. + أنت المسؤول عن هذه المساحة، تأكد من أنك قمت بنقل حق المسؤول إلى عضو آخر قبل المغادرة. + أضف الغُرف الموجودة ومساحة + أضف غُرف + مرحبًا بك في المساحات! + تعد المساحات طريقة جديدة لتجميع الغرف والأشخاص. + أنت مدعو + مساحة تجريبية - غُرفة مقيدة. + علم كمقترحة + علم كغير مقترحة + إدارة الغُرف والمساحات + مساحة تجريبية - فقط أعرض المُيتِّمة في الصفحة الرئيسية + تشعر بالتجربة؟ +\nيمكنك إضافة مساحات موجودة إلى مساحة. + يرجى الاتصال بمسؤول الخادم الخاص بك للحصول على مزيد من المعلومات + يبدو أن خادمك لا يدعم المساحات بعد + هذه المساحة لا تحتوي على غُرف + قد تكون بعض الغُرف مخفية لأنها خاصة وأنك بحاجة إلى دعوة. +\nليس لديك إذن لإضافة غُرف. + قد تكون بعض الغُرف مخفية لأنها خاصة وأنك بحاجة إلى دعوة. + يتطلب التحذير دعم الخادم وإصدار الغرفة التجريبية + %s يدعوك + تبحث عن شخص ما ليس في %s؟ + إدارة الغُرف + إجعل هَذِهِ المساحة عَامَّة + مقترح + + %1$s أضاف العنوان البديل %2$s لهذه الغرفة. + %1$s أضاف العنوان البديل %2$s لهذه الغرفة. + %1$s أضاف العنوانين البديل %2$s لهذه الغرفة. + %1$s أضاف العناوين البديل %2$s لهذه الغرفة. + %1$s أضاف العناوين البديل %2$s لهذه الغرفة. + %1$s أضاف العناوين البديل %2$s لهذه الغرفة. + + أنت أزلت العنوان الرئيسي لهذه الغرفة. + %1$s أزال العنوان الرئيسي لهذه الغُرفة. + أنت غيرت العنوان الرئيسي لهذه الغرفة إلى %1$s. + أنت أضفت %1$s وحذفت %2$s كعنوان لهذه الغرفة. + %1$s أضاف %2$s وحذف %3$s كعناوين لهذه الغرفة. + + أنت أزلت %1$s كعنوان لهذه الغرفة. + أنت أزلت %1$s كعنوان لهذه الغرفة. + أنت أزلت %1$s كعنوانين لهذه الغرفة. + أنت أزلت %1$s كعناوين لهذه الغرفة. + أنت أزلت %1$s كعناوين لهذه الغرفة. + أنت أزلت %1$s كعناوين لهذه الغرفة. + + + %1$s أزال %2$s كعنوان لهذه الغرفة. + %1$s أزال %2$s كعنوان لهذه الغرفة. + %1$s أزال %2$s كعنوانين لهذه الغرفة. + %1$s أزال %2$s كعناوين لهذه الغرفة. + %1$s أزال %2$s كعناوين لهذه الغرفة. + %1$s أزال %2$s كعناوين لهذه الغرفة. + + + أنت أضفت %1$s كعنوان لهذه الغرفة. + أنت أضفت %1$s كعنوان لهذه الغرفة. + أنت أضفت %1$s كعنوانين لهذه الغرفة. + أنت أضفت %1$s كعناوين لهذه الغرفة. + أنت أضفت %1$s كعناوين لهذه الغرفة. + أنت أضفت %1$s كعناوين لهذه الغرفة. \ No newline at end of file From a02d32c5e884ecc1c88b1a37198f42027dc2d611 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Sat, 5 Jun 2021 10:51:54 +0000 Subject: [PATCH 054/254] Translated using Weblate (Swedish) Currently translated at 100.0% (2475 of 2475 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 3341657c1a..345a1876dd 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -662,7 +662,7 @@ %s försökte ladda en specifik punkt i det här rummets tidslinje, men kunde inte hitta den. Skriv en hemserver att visa listan över offentliga rum från Alla rum på %s-servern - Alla %s-rum på Matrix + Alla nativa %srum %d rum %d rum From 209792a9ec57d5d93867f433e3ad832fcea2b1de Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 31 May 2021 18:02:12 +0200 Subject: [PATCH 055/254] Cleanup --- .../sdk/internal/session/room/timeline/DefaultTimeline.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt index e230599f8f..8cc5d943b7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt @@ -24,7 +24,6 @@ import io.realm.RealmQuery import io.realm.RealmResults import io.realm.Sort import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.NoOpMatrixCallback import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.events.model.EventType @@ -168,9 +167,7 @@ internal class DefaultTimeline( timelineEvents.addChangeListener(eventsChangeListener) handleInitialLoad() loadRoomMembersTask - .configureWith(LoadRoomMembersTask.Params(roomId)) { - this.callback = NoOpMatrixCallback() - } + .configureWith(LoadRoomMembersTask.Params(roomId)) .executeBy(taskExecutor) // Ensure ReadReceipt from init sync are loaded From f99600f115ae5eff5f2db4f7b0bb134def34cef3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jun 2021 10:48:55 +0200 Subject: [PATCH 056/254] Convert DefaultTypingService to coroutines --- .../room/typing/DefaultTypingService.kt | 82 ++++++++----------- .../session/room/typing/SendTypingTask.kt | 9 +- 2 files changed, 35 insertions(+), 56 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt index 39b7967bc1..4811fe0a24 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt @@ -18,13 +18,13 @@ package org.matrix.android.sdk.internal.session.room.typing import android.os.SystemClock import dagger.assisted.Assisted -import dagger.assisted.AssistedInject import dagger.assisted.AssistedFactory -import org.matrix.android.sdk.api.MatrixCallback +import dagger.assisted.AssistedInject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.matrix.android.sdk.api.session.room.typing.TypingService -import org.matrix.android.sdk.api.util.Cancelable -import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.task.configureWith import timber.log.Timber /** @@ -35,7 +35,6 @@ import timber.log.Timber */ internal class DefaultTypingService @AssistedInject constructor( @Assisted private val roomId: String, - private val taskExecutor: TaskExecutor, private val sendTypingTask: SendTypingTask ) : TypingService { @@ -44,8 +43,8 @@ internal class DefaultTypingService @AssistedInject constructor( fun create(roomId: String): DefaultTypingService } - private var currentTask: Cancelable? = null - private var currentAutoStopTask: Cancelable? = null + private var job = Job() + private var currentTask: Job? = null // What the homeserver knows private var userIsTyping = false @@ -53,26 +52,24 @@ internal class DefaultTypingService @AssistedInject constructor( // Last time the user is typing event has been sent private var lastRequestTimestamp: Long = 0 + /** + * Notify to the server that the user is typing and schedule the auto typing off + */ override fun userIsTyping() { - scheduleAutoStop() - val now = SystemClock.elapsedRealtime() - - if (userIsTyping && now < lastRequestTimestamp + MIN_DELAY_BETWEEN_TWO_USER_IS_TYPING_REQUESTS_MILLIS) { - Timber.d("Typing: Skip start request") - return - } - - Timber.d("Typing: Send start request") - userIsTyping = true - lastRequestTimestamp = now - currentTask?.cancel() - - val params = SendTypingTask.Params(roomId, true) - currentTask = sendTypingTask - .configureWith(params) - .executeBy(taskExecutor) + currentTask = CoroutineScope(job).launch { + if (userIsTyping && now < lastRequestTimestamp + MIN_DELAY_BETWEEN_TWO_USER_IS_TYPING_REQUESTS_MILLIS) { + Timber.d("Typing: Skip start request") + } else { + Timber.d("Typing: Send start request") + lastRequestTimestamp = now + sendRequest(true) + } + delay(MIN_DELAY_TO_SEND_STOP_TYPING_REQUEST_WHEN_NO_USER_ACTIVITY_MILLIS) + Timber.d("Typing: auto stop") + sendRequest(false) + } } override fun userStopsTyping() { @@ -82,35 +79,22 @@ internal class DefaultTypingService @AssistedInject constructor( } Timber.d("Typing: Send stop request") - userIsTyping = false lastRequestTimestamp = 0 - currentAutoStopTask?.cancel() currentTask?.cancel() - - val params = SendTypingTask.Params(roomId, false) - currentTask = sendTypingTask - .configureWith(params) - .executeBy(taskExecutor) + currentTask = CoroutineScope(job).launch { + sendRequest(false) + } } - private fun scheduleAutoStop() { - Timber.d("Typing: Schedule auto stop") - currentAutoStopTask?.cancel() - - val params = SendTypingTask.Params( - roomId, - false, - delay = MIN_DELAY_TO_SEND_STOP_TYPING_REQUEST_WHEN_NO_USER_ACTIVITY_MILLIS) - currentAutoStopTask = sendTypingTask - .configureWith(params) { - callback = object : MatrixCallback { - override fun onSuccess(data: Unit) { - userIsTyping = false - } - } - } - .executeBy(taskExecutor) + private suspend fun sendRequest(isTyping: Boolean) { + try { + sendTypingTask.execute(SendTypingTask.Params(roomId, isTyping)) + userIsTyping = isTyping + } catch (failure: Throwable) { + // Ignore network error, etc... + Timber.w(failure, "Unable to send typing request") + } } companion object { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/SendTypingTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/SendTypingTask.kt index 0b0df74311..0bdceb9ade 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/SendTypingTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/SendTypingTask.kt @@ -17,11 +17,10 @@ package org.matrix.android.sdk.internal.session.room.typing import org.matrix.android.sdk.internal.di.UserId +import org.matrix.android.sdk.internal.network.GlobalErrorReceiver import org.matrix.android.sdk.internal.network.executeRequest import org.matrix.android.sdk.internal.session.room.RoomAPI import org.matrix.android.sdk.internal.task.Task -import kotlinx.coroutines.delay -import org.matrix.android.sdk.internal.network.GlobalErrorReceiver import javax.inject.Inject internal interface SendTypingTask : Task { @@ -29,9 +28,7 @@ internal interface SendTypingTask : Task { data class Params( val roomId: String, val isTyping: Boolean, - val typingTimeoutMillis: Int? = 30_000, - // Optional delay before sending the request to the homeserver - val delay: Long? = null + val typingTimeoutMillis: Int? = 30_000 ) } @@ -42,8 +39,6 @@ internal class DefaultSendTypingTask @Inject constructor( ) : SendTypingTask { override suspend fun execute(params: SendTypingTask.Params) { - delay(params.delay ?: -1) - executeRequest(globalErrorReceiver) { roomAPI.sendTypingState( params.roomId, From 3be95ca4421ee3e2e5331ec098bba7eecb110506 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jun 2021 16:50:10 +0200 Subject: [PATCH 057/254] Convert KeysExporter to coroutines --- .../sdk/api/session/crypto/CryptoService.kt | 2 +- .../internal/crypto/DefaultCryptoService.kt | 10 ++-- .../im/vector/app/core/di/ScreenComponent.kt | 2 + .../app/features/crypto/keys/KeysExporter.kt | 35 +++++-------- .../setup/KeysBackupSetupActivity.kt | 52 ++++++++++--------- .../VectorSettingsSecurityPrivacyFragment.kt | 34 ++++++------ .../SignOutBottomSheetDialogFragment.kt | 27 ---------- .../workers/signout/SignoutCheckViewModel.kt | 52 +++++++++++-------- 8 files changed, 92 insertions(+), 122 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt index 1b7a5243e2..4f6382bcc5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt @@ -84,7 +84,7 @@ interface CryptoService { fun importRoomKeys(roomKeysAsArray: ByteArray, password: String, progressListener: ProgressListener?, callback: MatrixCallback) - fun exportRoomKeys(password: String, callback: MatrixCallback) + suspend fun exportRoomKeys(password: String): ByteArray fun setRoomBlacklistUnverifiedDevices(roomId: String) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index cbd1ee00a9..4e6ba514f8 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -928,14 +928,10 @@ internal class DefaultCryptoService @Inject constructor( * Export the crypto keys * * @param password the password - * @param callback the exported keys + * @return the exported keys */ - override fun exportRoomKeys(password: String, callback: MatrixCallback) { - cryptoCoroutineScope.launch(coroutineDispatchers.main) { - runCatching { - exportRoomKeys(password, MXMegolmExportEncryption.DEFAULT_ITERATION_COUNT) - }.foldToCallback(callback) - } + override suspend fun exportRoomKeys(password: String): ByteArray { + return exportRoomKeys(password, MXMegolmExportEncryption.DEFAULT_ITERATION_COUNT) } /** diff --git a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt index 9dbfa8fe30..3c11bfcd13 100644 --- a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt +++ b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt @@ -32,6 +32,7 @@ import im.vector.app.features.call.conference.VectorJitsiActivity import im.vector.app.features.call.transfer.CallTransferActivity import im.vector.app.features.createdirect.CreateDirectRoomActivity import im.vector.app.features.crypto.keysbackup.settings.KeysBackupManageActivity +import im.vector.app.features.crypto.keysbackup.setup.KeysBackupSetupActivity import im.vector.app.features.crypto.quads.SharedSecureStorageActivity import im.vector.app.features.crypto.recover.BootstrapBottomSheet import im.vector.app.features.crypto.verification.VerificationBottomSheet @@ -138,6 +139,7 @@ interface ScreenComponent { fun inject(activity: LinkHandlerActivity) fun inject(activity: MainActivity) fun inject(activity: RoomDirectoryActivity) + fun inject(activity: KeysBackupSetupActivity) fun inject(activity: BugReportActivity) fun inject(activity: FilteredRoomsActivity) fun inject(activity: CreateRoomActivity) diff --git a/vector/src/main/java/im/vector/app/features/crypto/keys/KeysExporter.kt b/vector/src/main/java/im/vector/app/features/crypto/keys/KeysExporter.kt index c7e4c26385..2c66a14cb4 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keys/KeysExporter.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keys/KeysExporter.kt @@ -18,35 +18,24 @@ package im.vector.app.features.crypto.keys import android.content.Context import android.net.Uri -import im.vector.app.features.session.coroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.internal.extensions.foldToCallback -import org.matrix.android.sdk.internal.util.awaitCallback - -class KeysExporter(private val session: Session) { +import javax.inject.Inject +class KeysExporter @Inject constructor( + private val session: Session, + private val context: Context +) { /** - * Export keys and return the file path with the callback + * Export keys and write them to the provided uri */ - fun export(context: Context, password: String, uri: Uri, callback: MatrixCallback) { - session.coroutineScope.launch(Dispatchers.Main) { - runCatching { - withContext(Dispatchers.IO) { - val data = awaitCallback { session.cryptoService().exportRoomKeys(password, it) } - val os = context.contentResolver?.openOutputStream(uri) - if (os == null) { - false - } else { - os.write(data) - os.flush() - true - } - } - }.foldToCallback(callback) + suspend fun export(password: String, uri: Uri) { + return withContext(Dispatchers.IO) { + val data = session.cryptoService().exportRoomKeys(password) + context.contentResolver.openOutputStream(uri) + ?.use { it.write(data) } + ?: throw IllegalStateException("Unable to open file for writting") } } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt index 586c461fac..7cc46ef62c 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupActivity.kt @@ -18,10 +18,13 @@ package im.vector.app.features.crypto.keysbackup.setup import android.app.Activity import android.content.Context import android.content.Intent +import android.net.Uri import androidx.core.view.isVisible import androidx.fragment.app.FragmentManager +import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R +import im.vector.app.core.di.ScreenComponent import im.vector.app.core.dialogs.ExportKeysDialog import im.vector.app.core.extensions.observeEvent import im.vector.app.core.extensions.queryExportKeys @@ -30,7 +33,8 @@ import im.vector.app.core.extensions.replaceFragment import im.vector.app.core.platform.SimpleFragmentActivity import im.vector.app.core.utils.toast import im.vector.app.features.crypto.keys.KeysExporter -import org.matrix.android.sdk.api.MatrixCallback +import kotlinx.coroutines.launch +import javax.inject.Inject class KeysBackupSetupActivity : SimpleFragmentActivity() { @@ -38,6 +42,13 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() { private lateinit var viewModel: KeysBackupSetupSharedViewModel + @Inject lateinit var keysExporter: KeysExporter + + override fun injectWith(injector: ScreenComponent) { + super.injectWith(injector) + injector.inject(this) + } + override fun initUiAndData() { super.initUiAndData() if (isFirstCreation()) { @@ -132,30 +143,7 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() { ExportKeysDialog().show(this, object : ExportKeysDialog.ExportKeyDialogListener { override fun onPassphrase(passphrase: String) { showWaitingView() - - KeysExporter(session) - .export(this@KeysBackupSetupActivity, - passphrase, - uri, - object : MatrixCallback { - override fun onSuccess(data: Boolean) { - if (data) { - toast(getString(R.string.encryption_exported_successfully)) - Intent().apply { - putExtra(MANUAL_EXPORT, true) - }.let { - setResult(Activity.RESULT_OK, it) - finish() - } - } - hideWaitingView() - } - - override fun onFailure(failure: Throwable) { - toast(failure.localizedMessage ?: getString(R.string.unexpected_error)) - hideWaitingView() - } - }) + export(passphrase, uri) } }) } else { @@ -165,6 +153,20 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() { } } + private fun export(passphrase: String, uri: Uri) { + lifecycleScope.launch { + try { + keysExporter.export(passphrase, uri) + toast(getString(R.string.encryption_exported_successfully)) + setResult(Activity.RESULT_OK, Intent().apply { putExtra(MANUAL_EXPORT, true) }) + finish() + } catch (failure: Throwable) { + toast(failure.localizedMessage ?: getString(R.string.unexpected_error)) + } + hideWaitingView() + } + } + override fun onBackPressed() { if (viewModel.shouldPromptOnBack) { if (waitingView?.isVisible == true) { diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt index 4fd2c72b33..1ae434f2f5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt @@ -20,6 +20,7 @@ package im.vector.app.features.settings import android.annotation.SuppressLint import android.app.Activity import android.content.Intent +import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.ViewGroup @@ -60,6 +61,7 @@ import im.vector.app.features.raw.wellknown.isE2EByDefault import im.vector.app.features.themes.ThemeUtils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable +import kotlinx.coroutines.launch import me.gujun.android.span.span import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.getFingerprintHumanReadable @@ -75,6 +77,7 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( private val vectorPreferences: VectorPreferences, private val activeSessionHolder: ActiveSessionHolder, private val pinCodeStore: PinCodeStore, + private val keysExporter: KeysExporter, private val navigator: Navigator ) : VectorSettingsBaseFragment() { @@ -320,29 +323,24 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( override fun onPassphrase(passphrase: String) { displayLoadingView() - KeysExporter(session) - .export(requireContext(), - passphrase, - uri, - object : MatrixCallback { - override fun onSuccess(data: Boolean) { - if (data) { - requireActivity().toast(getString(R.string.encryption_exported_successfully)) - } else { - requireActivity().toast(getString(R.string.unexpected_error)) - } - hideLoadingView() - } - - override fun onFailure(failure: Throwable) { - onCommonDone(failure.localizedMessage) - } - }) + export(passphrase, uri) } }) } } + private fun export(passphrase: String, uri: Uri) { + lifecycleScope.launch { + try { + keysExporter.export(passphrase, uri) + requireActivity().toast(getString(R.string.encryption_exported_successfully)) + } catch (failure: Throwable) { + requireActivity().toast(errorFormatter.toHumanReadable(failure)) + } + hideLoadingView() + } + } + private val pinActivityResultLauncher = registerStartForActivityResult { if (it.resultCode == Activity.RESULT_OK) { doOpenPinCodePreferenceScreen() diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt b/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt index 389d0f0cfc..48459cdd9e 100644 --- a/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt +++ b/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt @@ -42,9 +42,7 @@ import im.vector.app.features.crypto.keysbackup.setup.KeysBackupSetupActivity import im.vector.app.features.crypto.recover.BootstrapBottomSheet import im.vector.app.features.crypto.recover.SetupMode -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupState -import timber.log.Timber import javax.inject.Inject // TODO this needs to be refactored to current standard and remove legacy @@ -113,31 +111,6 @@ class SignOutBottomSheetDialogFragment : views.setupMegolmBackupButton.action = { setupBackupActivityResultLauncher.launch(KeysBackupSetupActivity.intent(requireContext(), true)) } - - viewModel.observeViewEvents { - when (it) { - is SignoutCheckViewModel.ViewEvents.ExportKeys -> { - it.exporter - .export(requireContext(), - it.passphrase, - it.uri, - object : MatrixCallback { - override fun onSuccess(data: Boolean) { - if (data) { - viewModel.handle(SignoutCheckViewModel.Actions.KeySuccessfullyManuallyExported) - } else { - viewModel.handle(SignoutCheckViewModel.Actions.KeyExportFailed) - } - } - - override fun onFailure(failure: Throwable) { - Timber.e("## Failed to export manually keys ${failure.localizedMessage}") - viewModel.handle(SignoutCheckViewModel.Actions.KeyExportFailed) - } - }) - } - } - } } override fun invalidate() = withState(viewModel) { state -> diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt b/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt index 21c0c7481a..df7a826b48 100644 --- a/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt @@ -17,6 +17,7 @@ package im.vector.app.features.workers.signout import android.net.Uri +import androidx.lifecycle.viewModelScope import com.airbnb.mvrx.ActivityViewModelContext import com.airbnb.mvrx.Async import com.airbnb.mvrx.FragmentViewModelContext @@ -27,13 +28,14 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.ViewModelContext import dagger.assisted.Assisted -import dagger.assisted.AssistedInject import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import im.vector.app.core.extensions.exhaustive -import im.vector.app.core.platform.VectorViewEvents +import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModelAction import im.vector.app.features.crypto.keys.KeysExporter +import kotlinx.coroutines.launch import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME @@ -41,6 +43,7 @@ import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_S import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupState import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupStateListener import org.matrix.android.sdk.rx.rx +import timber.log.Timber data class SignoutCheckViewState( val userId: String = "", @@ -50,18 +53,15 @@ data class SignoutCheckViewState( val hasBeenExportedToFile: Async = Uninitialized ) : MvRxState -class SignoutCheckViewModel @AssistedInject constructor(@Assisted initialState: SignoutCheckViewState, - private val session: Session) - : VectorViewModel(initialState), KeysBackupStateListener { +class SignoutCheckViewModel @AssistedInject constructor( + @Assisted initialState: SignoutCheckViewState, + private val session: Session, + private val keysExporter: KeysExporter +) : VectorViewModel(initialState), KeysBackupStateListener { sealed class Actions : VectorViewModelAction { data class ExportKeys(val passphrase: String, val uri: Uri) : Actions() object KeySuccessfullyManuallyExported : Actions() - object KeyExportFailed : Actions() - } - - sealed class ViewEvents : VectorViewEvents { - data class ExportKeys(val exporter: KeysExporter, val passphrase: String, val uri: Uri) : ViewEvents() } @AssistedFactory @@ -128,22 +128,32 @@ class SignoutCheckViewModel @AssistedInject constructor(@Assisted initialState: override fun handle(action: Actions) { when (action) { - is Actions.ExportKeys -> { - setState { - copy(hasBeenExportedToFile = Loading()) - } - _viewEvents.post(ViewEvents.ExportKeys(KeysExporter(session), action.passphrase, action.uri)) - } + is Actions.ExportKeys -> handleExportKeys(action) Actions.KeySuccessfullyManuallyExported -> { setState { copy(hasBeenExportedToFile = Success(true)) } } - Actions.KeyExportFailed -> { - setState { - copy(hasBeenExportedToFile = Uninitialized) - } - } }.exhaustive } + + private fun handleExportKeys(action: Actions.ExportKeys) { + setState { + copy(hasBeenExportedToFile = Loading()) + } + + viewModelScope.launch { + val newState = try { + keysExporter.export(action.passphrase, action.uri) + Success(true) + } catch (failure: Throwable) { + Timber.e("## Failed to export manually keys ${failure.localizedMessage}") + Uninitialized + } + + setState { + copy(hasBeenExportedToFile = newState) + } + } + } } From 04f06b280367499aec6f6a176eaf07061e7027de Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jun 2021 17:04:48 +0200 Subject: [PATCH 058/254] Convert KeysImporter to coroutines --- .../sdk/api/session/crypto/CryptoService.kt | 5 +- .../internal/crypto/DefaultCryptoService.kt | 51 +++++++++---------- .../app/features/crypto/keys/KeysImporter.kt | 48 +++++------------ .../VectorSettingsSecurityPrivacyFragment.kt | 47 +++++++---------- 4 files changed, 58 insertions(+), 93 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt index 4f6382bcc5..e3f00a24b6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt @@ -42,7 +42,6 @@ import org.matrix.android.sdk.internal.crypto.model.event.RoomKeyWithHeldContent import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo import org.matrix.android.sdk.internal.crypto.model.rest.DevicesListResponse import org.matrix.android.sdk.internal.crypto.model.rest.RoomKeyRequestBody -import kotlin.jvm.Throws interface CryptoService { @@ -82,7 +81,9 @@ interface CryptoService { fun getDeviceTrackingStatus(userId: String): Int - fun importRoomKeys(roomKeysAsArray: ByteArray, password: String, progressListener: ProgressListener?, callback: MatrixCallback) + suspend fun importRoomKeys(roomKeysAsArray: ByteArray, + password: String, + progressListener: ProgressListener?): ImportRoomKeysResult suspend fun exportRoomKeys(password: String): ByteArray diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index 4e6ba514f8..d170ae3dd3 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -959,42 +959,37 @@ internal class DefaultCryptoService @Inject constructor( * @param roomKeysAsArray the room keys as array. * @param password the password * @param progressListener the progress listener - * @param callback the asynchronous callback. + * @return the result ImportRoomKeysResult */ - override fun importRoomKeys(roomKeysAsArray: ByteArray, - password: String, - progressListener: ProgressListener?, - callback: MatrixCallback) { - cryptoCoroutineScope.launch(coroutineDispatchers.main) { - runCatching { - withContext(coroutineDispatchers.crypto) { - Timber.v("## CRYPTO | importRoomKeys starts") + override suspend fun importRoomKeys(roomKeysAsArray: ByteArray, + password: String, + progressListener: ProgressListener?): ImportRoomKeysResult { + return withContext(coroutineDispatchers.crypto) { + Timber.v("## CRYPTO | importRoomKeys starts") - val t0 = System.currentTimeMillis() - val roomKeys = MXMegolmExportEncryption.decryptMegolmKeyFile(roomKeysAsArray, password) - val t1 = System.currentTimeMillis() + val t0 = System.currentTimeMillis() + val roomKeys = MXMegolmExportEncryption.decryptMegolmKeyFile(roomKeysAsArray, password) + val t1 = System.currentTimeMillis() - Timber.v("## CRYPTO | importRoomKeys : decryptMegolmKeyFile done in ${t1 - t0} ms") + Timber.v("## CRYPTO | importRoomKeys : decryptMegolmKeyFile done in ${t1 - t0} ms") - val importedSessions = MoshiProvider.providesMoshi() - .adapter>(Types.newParameterizedType(List::class.java, MegolmSessionData::class.java)) - .fromJson(roomKeys) + val importedSessions = MoshiProvider.providesMoshi() + .adapter>(Types.newParameterizedType(List::class.java, MegolmSessionData::class.java)) + .fromJson(roomKeys) - val t2 = System.currentTimeMillis() + val t2 = System.currentTimeMillis() - Timber.v("## CRYPTO | importRoomKeys : JSON parsing ${t2 - t1} ms") + Timber.v("## CRYPTO | importRoomKeys : JSON parsing ${t2 - t1} ms") - if (importedSessions == null) { - throw Exception("Error") - } + if (importedSessions == null) { + throw Exception("Error") + } - megolmSessionDataImporter.handle( - megolmSessionsData = importedSessions, - fromBackup = false, - progressListener = progressListener - ) - } - }.foldToCallback(callback) + megolmSessionDataImporter.handle( + megolmSessionsData = importedSessions, + fromBackup = false, + progressListener = progressListener + ) } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keys/KeysImporter.kt b/vector/src/main/java/im/vector/app/features/crypto/keys/KeysImporter.kt index 3d93b26edd..50c85c3e5f 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keys/KeysImporter.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keys/KeysImporter.kt @@ -20,49 +20,27 @@ import android.content.Context import android.net.Uri import im.vector.app.core.intent.getMimeTypeFromUri import im.vector.app.core.resources.openResource -import im.vector.app.features.session.coroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.internal.crypto.model.ImportRoomKeysResult -import org.matrix.android.sdk.internal.extensions.foldToCallback -import org.matrix.android.sdk.internal.util.awaitCallback -import timber.log.Timber - -class KeysImporter(private val session: Session) { +import javax.inject.Inject +class KeysImporter @Inject constructor( + private val context: Context, + private val session: Session +) { /** * Import keys from provided Uri */ - fun import(context: Context, - uri: Uri, - mimetype: String?, - password: String, - callback: MatrixCallback) { - session.coroutineScope.launch(Dispatchers.Main) { - runCatching { - withContext(Dispatchers.IO) { - val resource = openResource(context, uri, mimetype ?: getMimeTypeFromUri(context, uri)) - - if (resource?.mContentStream == null) { - throw Exception("Error") - } - - val data: ByteArray - try { - data = resource.mContentStream!!.use { it.readBytes() } - } catch (e: Exception) { - Timber.e(e, "## importKeys()") - throw e - } - - awaitCallback { - session.cryptoService().importRoomKeys(data, password, null, it) - } - } - }.foldToCallback(callback) + suspend fun import(uri: Uri, + mimetype: String?, + password: String): ImportRoomKeysResult { + return withContext(Dispatchers.IO) { + val resource = openResource(context, uri, mimetype ?: getMimeTypeFromUri(context, uri)) + val stream = resource?.mContentStream ?: throw Exception("Error") + val data = stream.use { it.readBytes() } + session.cryptoService().importRoomKeys(data, password, null) } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt index 1ae434f2f5..bb946ace7d 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt @@ -66,7 +66,6 @@ import me.gujun.android.span.span import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.getFingerprintHumanReadable import org.matrix.android.sdk.internal.crypto.crosssigning.isVerified -import org.matrix.android.sdk.internal.crypto.model.ImportRoomKeysResult import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo import org.matrix.android.sdk.internal.crypto.model.rest.DevicesListResponse import org.matrix.android.sdk.rx.SecretsSynchronisationInfo @@ -78,6 +77,7 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( private val activeSessionHolder: ActiveSessionHolder, private val pinCodeStore: PinCodeStore, private val keysExporter: KeysExporter, + private val keysImporter: KeysImporter, private val navigator: Navigator ) : VectorSettingsBaseFragment() { @@ -472,34 +472,25 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( displayLoadingView() - KeysImporter(session) - .import(requireContext(), - uri, - mimetype, - password, - object : MatrixCallback { - override fun onSuccess(data: ImportRoomKeysResult) { - if (!isAdded) { - return - } - - hideLoadingView() - - MaterialAlertDialogBuilder(thisActivity) - .setMessage(resources.getQuantityString(R.plurals.encryption_import_room_keys_success, - data.successfullyNumberOfImportedKeys, - data.successfullyNumberOfImportedKeys, - data.totalNumberOfKeys)) - .setPositiveButton(R.string.ok) { dialog, _ -> dialog.dismiss() } - .show() - } - - override fun onFailure(failure: Throwable) { - appContext.toast(failure.localizedMessage ?: getString(R.string.unexpected_error)) - hideLoadingView() - } - }) + lifecycleScope.launch { + val data = try { + keysImporter.import(uri, mimetype, password) + } catch (failure: Throwable) { + appContext.toast(errorFormatter.toHumanReadable(failure)) + null + } + hideLoadingView() + if (data != null) { + MaterialAlertDialogBuilder(thisActivity) + .setMessage(resources.getQuantityString(R.plurals.encryption_import_room_keys_success, + data.successfullyNumberOfImportedKeys, + data.successfullyNumberOfImportedKeys, + data.totalNumberOfKeys)) + .setPositiveButton(R.string.ok) { dialog, _ -> dialog.dismiss() } + .show() + } + } importDialog.dismiss() } } From 8dccdf7339e8474c2cd3ec1574f8f29e23409d83 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jun 2021 17:21:44 +0200 Subject: [PATCH 059/254] change --- newsfragment/2449.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 newsfragment/2449.feature diff --git a/newsfragment/2449.feature b/newsfragment/2449.feature new file mode 100644 index 0000000000..7fca1730b6 --- /dev/null +++ b/newsfragment/2449.feature @@ -0,0 +1 @@ +Migrate DefaultTypingService, KeysImporter and KeysExporter to coroutines \ No newline at end of file From f7f4ec3ecc46380559f25406e5e0127d78cd5069 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 8 Jun 2021 20:20:49 +0200 Subject: [PATCH 060/254] Dominaezzz review --- .../internal/session/room/typing/DefaultTypingService.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt index 4811fe0a24..b76829e893 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/typing/DefaultTypingService.kt @@ -43,7 +43,7 @@ internal class DefaultTypingService @AssistedInject constructor( fun create(roomId: String): DefaultTypingService } - private var job = Job() + private val coroutineScope = CoroutineScope(Job()) private var currentTask: Job? = null // What the homeserver knows @@ -58,7 +58,7 @@ internal class DefaultTypingService @AssistedInject constructor( override fun userIsTyping() { val now = SystemClock.elapsedRealtime() currentTask?.cancel() - currentTask = CoroutineScope(job).launch { + currentTask = coroutineScope.launch { if (userIsTyping && now < lastRequestTimestamp + MIN_DELAY_BETWEEN_TWO_USER_IS_TYPING_REQUESTS_MILLIS) { Timber.d("Typing: Skip start request") } else { @@ -82,7 +82,7 @@ internal class DefaultTypingService @AssistedInject constructor( lastRequestTimestamp = 0 currentTask?.cancel() - currentTask = CoroutineScope(job).launch { + currentTask = coroutineScope.launch { sendRequest(false) } } From 0c6506da8ce4764379c255ab9c70176e8301c057 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 9 Jun 2021 16:20:21 +0200 Subject: [PATCH 061/254] Account data : define 2 services --- .../org/matrix/android/sdk/rx/RxSession.kt | 4 +- .../sdk/internal/crypto/ssss/QuadSTests.kt | 8 +-- .../matrix/android/sdk/api/session/Session.kt | 6 +-- .../accountdata/SessionAccountDataService.kt | 53 +++++++++++++++++++ .../android/sdk/api/session/room/Room.kt | 5 +- .../accountdata/RoomAccountDataService.kt} | 7 +-- .../DefaultSharedSecretStorageService.kt | 24 ++++----- .../sdk/internal/session/DefaultSession.kt | 7 ++- .../sdk/internal/session/SessionModule.kt | 6 +-- .../sdk/internal/session/room/DefaultRoom.kt | 6 +-- .../sdk/internal/session/room/RoomFactory.kt | 4 +- .../accountdata/RoomAccountDataService.kt | 9 ++-- ...kt => DefaultSessionAccountDataService.kt} | 16 +++--- .../KeysBackupRestoreSharedViewModel.kt | 2 +- .../quads/SharedSecureStorageViewModel.kt | 4 +- .../settings/devtools/AccountDataViewModel.kt | 2 +- .../features/widgets/WidgetPostAPIHandler.kt | 2 +- 17 files changed, 110 insertions(+), 55 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/SessionAccountDataService.kt rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/{accountdata/AccountDataService.kt => room/accountdata/RoomAccountDataService.kt} (89%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/{UserAccountDataService.kt => DefaultSessionAccountDataService.kt} (80%) diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt index 252359193d..89475585ce 100644 --- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt +++ b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt @@ -178,9 +178,9 @@ class RxSession(private val session: Session) { } fun liveUserAccountData(types: Set): Observable> { - return session.userAccountDataService().getLiveAccountDataEvents(types).asObservable() + return session.accountDataService().getLiveUserAccountDataEvents(types).asObservable() .startWithCallable { - session.userAccountDataService().getAccountDataEvents(types) + session.accountDataService().getUserAccountDataEvents(types) } } diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt index 25c22bca57..ce6da664c3 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt @@ -76,7 +76,7 @@ class QuadSTests : InstrumentedTest { var accountData: AccountDataEvent? = null val liveAccountData = runBlocking(Dispatchers.Main) { - aliceSession.userAccountDataService().getLiveAccountDataEvent("${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID") + aliceSession.accountDataService().getLiveUserAccountDataEvent("${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID") } val accountDataObserver = Observer?> { t -> if (t?.getOrNull()?.type == "${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID") { @@ -104,7 +104,7 @@ class QuadSTests : InstrumentedTest { val defaultDataLock = CountDownLatch(1) val liveDefAccountData = runBlocking(Dispatchers.Main) { - aliceSession.userAccountDataService().getLiveAccountDataEvent(DefaultSharedSecretStorageService.DEFAULT_KEY_ID) + aliceSession.accountDataService().getLiveUserAccountDataEvent(DefaultSharedSecretStorageService.DEFAULT_KEY_ID) } val accountDefDataObserver = Observer?> { t -> if (t?.getOrNull()?.type == DefaultSharedSecretStorageService.DEFAULT_KEY_ID) { @@ -206,7 +206,7 @@ class QuadSTests : InstrumentedTest { ) } - val accountDataEvent = aliceSession.userAccountDataService().getAccountDataEvent("my.secret") + val accountDataEvent = aliceSession.accountDataService().getUserAccountDataEvent("my.secret") val encryptedContent = accountDataEvent?.content?.get("encrypted") as? Map<*, *> assertEquals("Content should contains two encryptions", 2, encryptedContent?.keys?.size ?: 0) @@ -280,7 +280,7 @@ class QuadSTests : InstrumentedTest { var accountData: AccountDataEvent? = null val liveAccountData = runBlocking(Dispatchers.Main) { - session.userAccountDataService().getLiveAccountDataEvent(type) + session.accountDataService().getLiveUserAccountDataEvent(type) } val accountDataObserver = Observer?> { t -> if (t?.getOrNull()?.type == type) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt index e888e5d2de..2f981ffbbe 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt @@ -24,7 +24,7 @@ import org.matrix.android.sdk.api.failure.GlobalError import org.matrix.android.sdk.api.federation.FederationService import org.matrix.android.sdk.api.pushrules.PushRuleService import org.matrix.android.sdk.api.session.account.AccountService -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.cache.CacheService import org.matrix.android.sdk.api.session.call.CallSignalingService import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker @@ -239,9 +239,9 @@ interface Session : fun openIdService(): OpenIdService /** - * Returns the user account data service associated with the session + * Returns the account data service associated with the session */ - fun userAccountDataService(): AccountDataService + fun accountDataService(): SessionAccountDataService /** * Add a listener to the session. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/SessionAccountDataService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/SessionAccountDataService.kt new file mode 100644 index 0000000000..ac10f80911 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/SessionAccountDataService.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2020 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api.session.accountdata + +import androidx.lifecycle.LiveData +import org.matrix.android.sdk.api.session.events.model.Content +import org.matrix.android.sdk.api.util.Optional + +/** + * This service is attached globally to the session. + */ +interface SessionAccountDataService { + /** + * Retrieve the account data with the provided type or null if not found + */ + fun getUserAccountDataEvent(type: String): AccountDataEvent? + + /** + * Observe the account data with the provided type + */ + fun getLiveUserAccountDataEvent(type: String): LiveData> + + /** + * Retrieve the account data with the provided types. The return list can have a different size that + * the size of the types set, because some AccountData may not exist. + * If an empty set is provided, all the AccountData are retrieved + */ + fun getUserAccountDataEvents(types: Set): List + + /** + * Observe the account data with the provided types. If an empty set is provided, all the AccountData are observed + */ + fun getLiveUserAccountDataEvents(types: Set): LiveData> + + /** + * Update the account data with the provided type and the provided account data content + */ + suspend fun updateUserAccountData(type: String, content: Content) +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/Room.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/Room.kt index 41bcbf8ff6..21d4d55179 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/Room.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/Room.kt @@ -17,7 +17,8 @@ package org.matrix.android.sdk.api.session.room import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService +import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataService import org.matrix.android.sdk.api.session.room.alias.AliasService import org.matrix.android.sdk.api.session.room.call.RoomCallService import org.matrix.android.sdk.api.session.room.crypto.RoomCryptoService @@ -57,7 +58,7 @@ interface Room : RelationService, RoomCryptoService, RoomPushRuleService, - AccountDataService { + RoomAccountDataService { /** * The roomId of this room diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/AccountDataService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataService.kt similarity index 89% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/AccountDataService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataService.kt index 77f3eb0cd9..045070d2b4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/AccountDataService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataService.kt @@ -14,16 +14,17 @@ * limitations under the License. */ -package org.matrix.android.sdk.api.session.accountdata +package org.matrix.android.sdk.api.session.room.accountdata import androidx.lifecycle.LiveData +import org.matrix.android.sdk.api.session.accountdata.AccountDataEvent import org.matrix.android.sdk.api.session.events.model.Content import org.matrix.android.sdk.api.util.Optional /** - * This service can be attached globally to the session so it represents user data or attached to a single room. + * This service is attached to a single room. */ -interface AccountDataService { +interface RoomAccountDataService { /** * Retrieve the account data with the provided type or null if not found */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt index 1f80ce2c81..fb10cf4482 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt @@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.crypto.secrets import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.listeners.ProgressListener -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.securestorage.EncryptedSecretContent import org.matrix.android.sdk.api.session.securestorage.IntegrityResult @@ -56,7 +56,7 @@ import kotlin.experimental.and internal class DefaultSharedSecretStorageService @Inject constructor( @UserId private val userId: String, - private val accountDataService: AccountDataService, + private val accountDataService: SessionAccountDataService, private val outgoingGossipingRequestManager: OutgoingGossipingRequestManager, private val coroutineDispatchers: MatrixCoroutineDispatchers, private val cryptoCoroutineScope: CoroutineScope @@ -84,7 +84,7 @@ internal class DefaultSharedSecretStorageService @Inject constructor( ) } ?: storageKeyContent - accountDataService.updateAccountData("$KEY_ID_BASE.$keyId", signedContent.toContent()) + accountDataService.updateUserAccountData("$KEY_ID_BASE.$keyId", signedContent.toContent()) SsssKeyCreationInfo( keyId = keyId, content = storageKeyContent, @@ -113,7 +113,7 @@ internal class DefaultSharedSecretStorageService @Inject constructor( ) } ?: storageKeyContent - accountDataService.updateAccountData( + accountDataService.updateUserAccountData( "$KEY_ID_BASE.$keyId", signedContent.toContent() ) @@ -127,11 +127,11 @@ internal class DefaultSharedSecretStorageService @Inject constructor( } override fun hasKey(keyId: String): Boolean { - return accountDataService.getAccountDataEvent("$KEY_ID_BASE.$keyId") != null + return accountDataService.getUserAccountDataEvent("$KEY_ID_BASE.$keyId") != null } override fun getKey(keyId: String): KeyInfoResult { - val accountData = accountDataService.getAccountDataEvent("$KEY_ID_BASE.$keyId") + val accountData = accountDataService.getUserAccountDataEvent("$KEY_ID_BASE.$keyId") ?: return KeyInfoResult.Error(SharedSecretStorageError.UnknownKey(keyId)) return SecretStorageKeyContent.fromJson(accountData.content)?.let { KeyInfoResult.Success( @@ -143,14 +143,14 @@ internal class DefaultSharedSecretStorageService @Inject constructor( override suspend fun setDefaultKey(keyId: String) { val existingKey = getKey(keyId) if (existingKey is KeyInfoResult.Success) { - accountDataService.updateAccountData(DEFAULT_KEY_ID, mapOf("key" to keyId)) + accountDataService.updateUserAccountData(DEFAULT_KEY_ID, mapOf("key" to keyId)) } else { throw SharedSecretStorageError.UnknownKey(keyId) } } override fun getDefaultKey(): KeyInfoResult { - val accountData = accountDataService.getAccountDataEvent(DEFAULT_KEY_ID) + val accountData = accountDataService.getUserAccountDataEvent(DEFAULT_KEY_ID) ?: return KeyInfoResult.Error(SharedSecretStorageError.UnknownKey(DEFAULT_KEY_ID)) val keyId = accountData.content["key"] as? String ?: return KeyInfoResult.Error(SharedSecretStorageError.UnknownKey(DEFAULT_KEY_ID)) @@ -178,7 +178,7 @@ internal class DefaultSharedSecretStorageService @Inject constructor( } } - accountDataService.updateAccountData( + accountDataService.updateUserAccountData( type = name, content = mapOf("encrypted" to encryptedContents) ) @@ -288,7 +288,7 @@ internal class DefaultSharedSecretStorageService @Inject constructor( } override fun getAlgorithmsForSecret(name: String): List { - val accountData = accountDataService.getAccountDataEvent(name) + val accountData = accountDataService.getUserAccountDataEvent(name) ?: return listOf(KeyInfoResult.Error(SharedSecretStorageError.UnknownSecret(name))) val encryptedContent = accountData.content[ENCRYPTED] as? Map<*, *> ?: return listOf(KeyInfoResult.Error(SharedSecretStorageError.SecretNotEncrypted(name))) @@ -303,7 +303,7 @@ internal class DefaultSharedSecretStorageService @Inject constructor( } override suspend fun getSecret(name: String, keyId: String?, secretKey: SsssKeySpec): String { - val accountData = accountDataService.getAccountDataEvent(name) ?: throw SharedSecretStorageError.UnknownSecret(name) + val accountData = accountDataService.getUserAccountDataEvent(name) ?: throw SharedSecretStorageError.UnknownSecret(name) val encryptedContent = accountData.content[ENCRYPTED] as? Map<*, *> ?: throw SharedSecretStorageError.SecretNotEncrypted(name) val key = keyId?.let { getKey(it) } as? KeyInfoResult.Success ?: getDefaultKey() as? KeyInfoResult.Success ?: throw SharedSecretStorageError.UnknownKey(name) @@ -368,7 +368,7 @@ internal class DefaultSharedSecretStorageService @Inject constructor( } secretNames.forEach { secretName -> - val secretEvent = accountDataService.getAccountDataEvent(secretName) + val secretEvent = accountDataService.getUserAccountDataEvent(secretName) ?: return IntegrityResult.Error(SharedSecretStorageError.UnknownSecret(secretName)) if ((secretEvent.content["encrypted"] as? Map<*, *>)?.get(keyInfo.id) == null) { return IntegrityResult.Error(SharedSecretStorageError.SecretNotEncryptedWithKey(secretName, keyInfo.id)) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index 1f47978198..1cf99bbbd7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -29,7 +29,7 @@ import org.matrix.android.sdk.api.pushrules.PushRuleService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.SessionLifecycleObserver import org.matrix.android.sdk.api.session.account.AccountService -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.cache.CacheService import org.matrix.android.sdk.api.session.call.CallSignalingService import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker @@ -74,7 +74,6 @@ import org.matrix.android.sdk.internal.session.identity.DefaultIdentityService import org.matrix.android.sdk.internal.session.sync.SyncTokenStore import org.matrix.android.sdk.internal.session.sync.job.SyncThread import org.matrix.android.sdk.internal.session.sync.job.SyncWorker -import org.matrix.android.sdk.internal.session.user.accountdata.UserAccountDataService import org.matrix.android.sdk.internal.util.createUIHandler import timber.log.Timber import javax.inject.Inject @@ -118,7 +117,7 @@ internal class DefaultSession @Inject constructor( private val contentDownloadStateTracker: ContentDownloadStateTracker, private val initialSyncProgressService: Lazy, private val homeServerCapabilitiesService: Lazy, - private val accountDataService: Lazy, + private val accountDataService: Lazy, private val _sharedSecretStorageService: Lazy, private val accountService: Lazy, private val eventService: Lazy, @@ -293,7 +292,7 @@ internal class DefaultSession @Inject constructor( override fun openIdService(): OpenIdService = openIdService.get() - override fun userAccountDataService(): AccountDataService = accountDataService.get() + override fun accountDataService(): SessionAccountDataService = accountDataService.get() override fun getOkHttpClient(): OkHttpClient { return unauthenticatedWithCertificateOkHttpClient.get() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt index 49ce92372e..e6da21315b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt @@ -34,7 +34,7 @@ import org.matrix.android.sdk.api.auth.data.sessionId import org.matrix.android.sdk.api.crypto.MXCryptoConfig import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.SessionLifecycleObserver -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.events.EventService import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService @@ -93,7 +93,7 @@ import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProces import org.matrix.android.sdk.internal.session.room.tombstone.RoomTombstoneEventProcessor import org.matrix.android.sdk.internal.session.securestorage.DefaultSecureStorageService import org.matrix.android.sdk.internal.session.typing.DefaultTypingUsersTracker -import org.matrix.android.sdk.internal.session.user.accountdata.UserAccountDataService +import org.matrix.android.sdk.internal.session.user.accountdata.DefaultSessionAccountDataService import org.matrix.android.sdk.internal.session.widgets.DefaultWidgetURLFormatter import org.matrix.android.sdk.internal.util.md5 import retrofit2.Retrofit @@ -364,7 +364,7 @@ internal abstract class SessionModule { abstract fun bindHomeServerCapabilitiesService(service: DefaultHomeServerCapabilitiesService): HomeServerCapabilitiesService @Binds - abstract fun bindAccountDataService(service: UserAccountDataService): AccountDataService + abstract fun bindSessionAccountDataService(service: DefaultSessionAccountDataService): SessionAccountDataService @Binds abstract fun bindEventService(service: DefaultEventService): EventService diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt index 5a2eef7e8a..d56702ced5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt @@ -17,10 +17,11 @@ package org.matrix.android.sdk.internal.session.room import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.room.Room +import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataService import org.matrix.android.sdk.api.session.room.alias.AliasService import org.matrix.android.sdk.api.session.room.call.RoomCallService import org.matrix.android.sdk.api.session.room.members.MembershipService @@ -42,7 +43,6 @@ import org.matrix.android.sdk.api.session.space.Space import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM import org.matrix.android.sdk.internal.session.permalinks.ViaParameterFinder -import org.matrix.android.sdk.internal.session.room.accountdata.RoomAccountDataService import org.matrix.android.sdk.internal.session.room.state.SendStateTask import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryDataSource import org.matrix.android.sdk.internal.session.search.SearchTask @@ -86,7 +86,7 @@ internal class DefaultRoom(override val roomId: String, RelationService by relationService, MembershipService by roomMembersService, RoomPushRuleService by roomPushRuleService, - AccountDataService by roomAccountDataService { + RoomAccountDataService by roomAccountDataService { override fun getRoomSummaryLive(): LiveData> { return roomSummaryDataSource.getRoomSummaryLive(roomId) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomFactory.kt index 8efbf2360a..9ddb8f1177 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomFactory.kt @@ -19,8 +19,8 @@ package org.matrix.android.sdk.internal.session.room import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.internal.session.SessionScope -import org.matrix.android.sdk.internal.session.room.accountdata.RoomAccountDataService import org.matrix.android.sdk.internal.session.permalinks.ViaParameterFinder +import org.matrix.android.sdk.internal.session.room.accountdata.DefaultRoomAccountDataService import org.matrix.android.sdk.internal.session.room.alias.DefaultAliasService import org.matrix.android.sdk.internal.session.room.call.DefaultRoomCallService import org.matrix.android.sdk.internal.session.room.draft.DefaultDraftService @@ -61,7 +61,7 @@ internal class DefaultRoomFactory @Inject constructor(private val cryptoService: private val relationServiceFactory: DefaultRelationService.Factory, private val membershipServiceFactory: DefaultMembershipService.Factory, private val roomPushRuleServiceFactory: DefaultRoomPushRuleService.Factory, - private val roomAccountDataServiceFactory: RoomAccountDataService.Factory, + private val roomAccountDataServiceFactory: DefaultRoomAccountDataService.Factory, private val sendStateTask: SendStateTask, private val viaParameterFinder: ViaParameterFinder, private val searchTask: SearchTask) : diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/RoomAccountDataService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/RoomAccountDataService.kt index 9e9e9dc322..6035160de2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/RoomAccountDataService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/accountdata/RoomAccountDataService.kt @@ -21,18 +21,19 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import org.matrix.android.sdk.api.session.accountdata.AccountDataEvent -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.events.model.Content +import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataService import org.matrix.android.sdk.api.util.Optional -internal class RoomAccountDataService @AssistedInject constructor(@Assisted private val roomId: String, +internal class DefaultRoomAccountDataService @AssistedInject constructor(@Assisted private val roomId: String, private val dataSource: RoomAccountDataDataSource, private val updateRoomAccountDataTask: UpdateRoomAccountDataTask -) : AccountDataService { +) : RoomAccountDataService { @AssistedFactory interface Factory { - fun create(roomId: String): RoomAccountDataService + fun create(roomId: String): DefaultRoomAccountDataService } override fun getAccountDataEvent(type: String): AccountDataEvent? { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UserAccountDataService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DefaultSessionAccountDataService.kt similarity index 80% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UserAccountDataService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DefaultSessionAccountDataService.kt index b15d1d0f8b..fac92deefd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UserAccountDataService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/DefaultSessionAccountDataService.kt @@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.session.user.accountdata import androidx.lifecycle.LiveData import com.zhuinden.monarchy.Monarchy -import org.matrix.android.sdk.api.session.accountdata.AccountDataService +import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.events.model.Content import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.di.SessionDatabase @@ -29,31 +29,31 @@ import org.matrix.android.sdk.internal.task.configureWith import org.matrix.android.sdk.internal.util.awaitCallback import javax.inject.Inject -internal class UserAccountDataService @Inject constructor( +internal class DefaultSessionAccountDataService @Inject constructor( @SessionDatabase private val monarchy: Monarchy, private val updateUserAccountDataTask: UpdateUserAccountDataTask, private val userAccountDataSyncHandler: UserAccountDataSyncHandler, private val accountDataDataSource: UserAccountDataDataSource, private val taskExecutor: TaskExecutor -) : AccountDataService { +) : SessionAccountDataService { - override fun getAccountDataEvent(type: String): AccountDataEvent? { + override fun getUserAccountDataEvent(type: String): AccountDataEvent? { return accountDataDataSource.getAccountDataEvent(type) } - override fun getLiveAccountDataEvent(type: String): LiveData> { + override fun getLiveUserAccountDataEvent(type: String): LiveData> { return accountDataDataSource.getLiveAccountDataEvent(type) } - override fun getAccountDataEvents(types: Set): List { + override fun getUserAccountDataEvents(types: Set): List { return accountDataDataSource.getAccountDataEvents(types) } - override fun getLiveAccountDataEvents(types: Set): LiveData> { + override fun getLiveUserAccountDataEvents(types: Set): LiveData> { return accountDataDataSource.getLiveAccountDataEvents(types) } - override suspend fun updateAccountData(type: String, content: Content) { + override suspend fun updateUserAccountData(type: String, content: Content) { val params = UpdateUserAccountDataTask.AnyParams(type = type, any = content) awaitCallback { callback -> updateUserAccountDataTask.configureWith(params) { diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSharedViewModel.kt index f8290c0321..c323024bd9 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreSharedViewModel.kt @@ -252,7 +252,7 @@ class KeysBackupRestoreSharedViewModel @Inject constructor( } private fun isBackupKeyInQuadS(): Boolean { - val sssBackupSecret = session.userAccountDataService().getAccountDataEvent(KEYBACKUP_SECRET_SSSS_NAME) + val sssBackupSecret = session.accountDataService().getUserAccountDataEvent(KEYBACKUP_SECRET_SSSS_NAME) ?: return false // Some sanity ? diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt index f55b482124..d246d33f40 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt @@ -218,7 +218,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor( withContext(Dispatchers.IO) { args.requestedSecrets.forEach { - if (session.userAccountDataService().getAccountDataEvent(it) != null) { + if (session.accountDataService().getUserAccountDataEvent(it) != null) { val res = session.sharedSecretStorageService.getSecret( name = it, keyId = keyInfo.id, @@ -287,7 +287,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor( withContext(Dispatchers.IO) { args.requestedSecrets.forEach { - if (session.userAccountDataService().getAccountDataEvent(it) != null) { + if (session.accountDataService().getUserAccountDataEvent(it) != null) { val res = session.sharedSecretStorageService.getSecret( name = it, keyId = keyInfo.id, diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt index 421bc53396..9ee7e48ed7 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt @@ -57,7 +57,7 @@ class AccountDataViewModel @AssistedInject constructor(@Assisted initialState: A private fun handleDeleteAccountData(action: AccountDataAction.DeleteAccountData) { viewModelScope.launch { - session.userAccountDataService().updateAccountData(action.type, emptyMap()) + session.accountDataService().updateUserAccountData(action.type, emptyMap()) } } diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt index de88baa692..7d2d89e1bd 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt @@ -284,7 +284,7 @@ class WidgetPostAPIHandler @AssistedInject constructor(@Assisted private val roo ) ) launchWidgetAPIAction(widgetPostAPIMediator, eventData) { - session.userAccountDataService().updateAccountData( + session.accountDataService().updateUserAccountData( type = UserAccountDataTypes.TYPE_WIDGETS, content = addUserWidgetBody ) From 2f4aecd5901d1498cb1fd8d899678d476a795a41 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 9 Jun 2021 17:35:01 +0200 Subject: [PATCH 062/254] Composer update Author: Onuray. Update colors by bmarty and squashed --- newsfragment/3182.feature | 1 + .../home/room/detail/RoomDetailFragment.kt | 19 ++++--- .../room/detail/composer/ComposerEditText.kt | 7 +++ .../room/detail/composer/TextComposerView.kt | 13 +++-- .../res/drawable/bg_composer_edit_text.xml | 13 +++++ .../src/main/res/drawable/ic_attachment.xml | 30 +++++------ .../src/main/res/drawable/ic_insert_emoji.xml | 32 +++++------ vector/src/main/res/drawable/ic_keyboard.xml | 6 +-- .../src/main/res/layout/composer_layout.xml | 16 ++---- ...composer_layout_constraint_set_compact.xml | 54 +++++++++---------- ...omposer_layout_constraint_set_expanded.xml | 43 ++++++++------- .../main/res/layout/fragment_room_detail.xml | 1 + vector/src/main/res/values/styles_riot.xml | 2 +- 13 files changed, 125 insertions(+), 112 deletions(-) create mode 100644 newsfragment/3182.feature create mode 100644 vector/src/main/res/drawable/bg_composer_edit_text.xml diff --git a/newsfragment/3182.feature b/newsfragment/3182.feature new file mode 100644 index 0000000000..83eee3c29c --- /dev/null +++ b/newsfragment/3182.feature @@ -0,0 +1 @@ +Update Message Composer design \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index ea28a0901b..0d4fcc31b5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -547,15 +547,15 @@ class RoomDetailFragment @Inject constructor( .fromRootView(views.rootConstraintLayout) .setKeyboardAnimationStyle(R.style.emoji_fade_animation_style) .setOnEmojiPopupShownListener { - views.composerLayout.views.composerEmojiButton.let { - it.setImageResource(R.drawable.ic_keyboard) - it.contentDescription = getString(R.string.a11y_close_emoji_picker) + views.composerLayout.views.composerEmojiButton.apply { + contentDescription = getString(R.string.a11y_close_emoji_picker) + setImageResource(R.drawable.ic_keyboard) } } .setOnEmojiPopupDismissListener { - views.composerLayout.views.composerEmojiButton.let { - it.setImageResource(R.drawable.ic_insert_emoji) - it.contentDescription = getString(R.string.a11y_open_emoji_picker) + views.composerLayout.views.composerEmojiButton.apply { + contentDescription = getString(R.string.a11y_open_emoji_picker) + setImageResource(R.drawable.ic_insert_emoji) } } .build(views.composerLayout.views.composerEditText) @@ -1188,6 +1188,10 @@ class RoomDetailFragment @Inject constructor( override fun onRichContentSelected(contentUri: Uri): Boolean { return sendUri(contentUri) } + + override fun onTextBlankStateChanged(isBlank: Boolean) { + // No op + } } } @@ -1201,6 +1205,7 @@ class RoomDetailFragment @Inject constructor( views.composerLayout.collapse(true) lockSendButton = true roomDetailViewModel.handle(RoomDetailAction.SendMessage(text, vectorPreferences.isMarkdownEnabled())) + emojiPopup.dismiss() } } @@ -1250,7 +1255,7 @@ class RoomDetailFragment @Inject constructor( if (state.tombstoneEvent == null) { if (state.canSendMessage) { views.composerLayout.visibility = View.VISIBLE - views.composerLayout.setRoomEncrypted(summary.isEncrypted, summary.roomEncryptionTrustLevel) + views.composerLayout.setRoomEncrypted(summary.isEncrypted) views.notificationAreaView.render(NotificationAreaView.State.Hidden) } else { views.composerLayout.visibility = View.GONE diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt index 45c937ca5e..bc1f5f7fe8 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt @@ -37,9 +37,11 @@ class ComposerEditText @JvmOverloads constructor(context: Context, attrs: Attrib interface Callback { fun onRichContentSelected(contentUri: Uri): Boolean + fun onTextBlankStateChanged(isBlank: Boolean) } var callback: Callback? = null + var isBlankText = true override fun onCreateInputConnection(editorInfo: EditorInfo): InputConnection? { val ic = super.onCreateInputConnection(editorInfo) ?: return null @@ -93,6 +95,11 @@ class ComposerEditText @JvmOverloads constructor(context: Context, attrs: Attrib } spanToRemove = null } + // Report blank status of EditText to be able to arrange other elements of the composer + if (s.isBlank() != isBlankText) { + isBlankText = !isBlankText + callback?.onTextBlankStateChanged(isBlankText) + } } } ) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt index 6c7721ca02..94a6b29481 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerView.kt @@ -24,6 +24,7 @@ import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.core.text.toSpannable +import androidx.core.view.isVisible import androidx.transition.ChangeBounds import androidx.transition.Fade import androidx.transition.Transition @@ -70,6 +71,10 @@ class TextComposerView @JvmOverloads constructor( override fun onRichContentSelected(contentUri: Uri): Boolean { return callback?.onRichContentSelected(contentUri) ?: false } + + override fun onTextBlankStateChanged(isBlank: Boolean) { + views.sendButton.isVisible = currentConstraintSetId == R.layout.composer_layout_constraint_set_expanded || !isBlank + } } views.composerRelatedMessageCloseButton.setOnClickListener { collapse() @@ -93,6 +98,7 @@ class TextComposerView @JvmOverloads constructor( } currentConstraintSetId = R.layout.composer_layout_constraint_set_compact applyNewConstraintSet(animate, transitionComplete) + views.sendButton.isVisible = !views.composerEditText.text.isNullOrBlank() } fun expand(animate: Boolean = true, transitionComplete: (() -> Unit)? = null) { @@ -102,6 +108,7 @@ class TextComposerView @JvmOverloads constructor( } currentConstraintSetId = R.layout.composer_layout_constraint_set_expanded applyNewConstraintSet(animate, transitionComplete) + views.sendButton.isVisible = true } private fun applyNewConstraintSet(animate: Boolean, transitionComplete: (() -> Unit)?) { @@ -110,8 +117,6 @@ class TextComposerView @JvmOverloads constructor( } ConstraintSet().also { it.clone(context, currentConstraintSetId) - // in case shield is hidden, we will have glitch without this - it.getConstraint(R.id.composerShieldImageView).propertySet.visibility = views.composerShieldImageView.visibility it.applyTo(this) } } @@ -139,13 +144,11 @@ class TextComposerView @JvmOverloads constructor( TransitionManager.beginDelayedTransition((parent as? ViewGroup ?: this), transition) } - fun setRoomEncrypted(isEncrypted: Boolean, roomEncryptionTrustLevel: RoomEncryptionTrustLevel?) { + fun setRoomEncrypted(isEncrypted: Boolean) { if (isEncrypted) { views.composerEditText.setHint(R.string.room_message_placeholder) - views.composerShieldImageView.render(roomEncryptionTrustLevel) } else { views.composerEditText.setHint(R.string.room_message_placeholder) - views.composerShieldImageView.render(null) } } } diff --git a/vector/src/main/res/drawable/bg_composer_edit_text.xml b/vector/src/main/res/drawable/bg_composer_edit_text.xml new file mode 100644 index 0000000000..8398fb3dc3 --- /dev/null +++ b/vector/src/main/res/drawable/bg_composer_edit_text.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/drawable/ic_attachment.xml b/vector/src/main/res/drawable/ic_attachment.xml index ea01e94372..8f2deff482 100644 --- a/vector/src/main/res/drawable/ic_attachment.xml +++ b/vector/src/main/res/drawable/ic_attachment.xml @@ -3,19 +3,19 @@ android:height="32dp" android:viewportWidth="32" android:viewportHeight="32"> - - - + + + diff --git a/vector/src/main/res/drawable/ic_insert_emoji.xml b/vector/src/main/res/drawable/ic_insert_emoji.xml index c35000342b..ed1a94c2ff 100644 --- a/vector/src/main/res/drawable/ic_insert_emoji.xml +++ b/vector/src/main/res/drawable/ic_insert_emoji.xml @@ -1,21 +1,15 @@ - - - - + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + + + diff --git a/vector/src/main/res/drawable/ic_keyboard.xml b/vector/src/main/res/drawable/ic_keyboard.xml index 5e5d431abb..ad22a97eb9 100644 --- a/vector/src/main/res/drawable/ic_keyboard.xml +++ b/vector/src/main/res/drawable/ic_keyboard.xml @@ -1,4 +1,4 @@ - - + + diff --git a/vector/src/main/res/layout/composer_layout.xml b/vector/src/main/res/layout/composer_layout.xml index 25347d1bf9..08af999ec9 100644 --- a/vector/src/main/res/layout/composer_layout.xml +++ b/vector/src/main/res/layout/composer_layout.xml @@ -25,13 +25,6 @@ android:background="?vctr_list_separator" tools:ignore="MissingConstraints" /> - - - + android:background="@drawable/bg_composer_edit_text" /> + app:tint="?vctr_content_quaternary" + tools:ignore="MissingConstraints,MissingPrefix" /> - - - - + + app:layout_constraintTop_toTopOf="@id/attachmentButton" + app:layout_goneMarginEnd="8dp" + app:tint="?vctr_content_quaternary" + tools:ignore="MissingPrefix" /> + tools:ignore="MissingPrefix" + tools:visibility="visible" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml b/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml index ff2a67f4f8..4c5034ed96 100644 --- a/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml +++ b/vector/src/main/res/layout/composer_layout_constraint_set_expanded.xml @@ -26,15 +26,6 @@ app:layout_constraintStart_toStartOf="@+id/related_message_background" app:layout_constraintTop_toTopOf="@id/related_message_background" /> - - - + app:layout_constraintTop_toBottomOf="@id/composer_preview_barrier" + app:layout_goneMarginEnd="12dp" /> + app:layout_goneMarginBottom="52dp" + app:layout_goneMarginEnd="8dp" + app:tint="?vctr_content_quaternary" + tools:ignore="MissingPrefix" /> + tools:ignore="MissingPrefix" + tools:visibility="visible" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_room_detail.xml b/vector/src/main/res/layout/fragment_room_detail.xml index 1d6c272a11..ae7494894c 100644 --- a/vector/src/main/res/layout/fragment_room_detail.xml +++ b/vector/src/main/res/layout/fragment_room_detail.xml @@ -173,6 +173,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:colorBackground" + android:minHeight="56dp" android:transitionName="composer" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/values/styles_riot.xml b/vector/src/main/res/values/styles_riot.xml index 5f285a13c7..56f7f95d87 100644 --- a/vector/src/main/res/values/styles_riot.xml +++ b/vector/src/main/res/values/styles_riot.xml @@ -225,7 +225,7 @@ - - - - - - - @@ -74,40 +52,6 @@ 0dp - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/values/theme_black.xml b/vector/src/main/res/values/theme_black.xml index cb7381843f..e0df15b65b 100644 --- a/vector/src/main/res/values/theme_black.xml +++ b/vector/src/main/res/values/theme_black.xml @@ -20,6 +20,7 @@ @color/vctr_reaction_background_off_black @color/vctr_reaction_background_on_black #FF4D4D4D + @color/element_background_black @android:color/black diff --git a/vector/src/main/res/values/theme_dark.xml b/vector/src/main/res/values/theme_dark.xml index 040e73501a..3904ac5b45 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/vector/src/main/res/values/theme_dark.xml @@ -32,6 +32,7 @@ @color/vctr_bottom_nav_icon_color_dark @color/vctr_waiting_background_color_dark @color/vctr_chat_effect_snow_background_dark + @color/element_system_dark #61708B @@ -65,7 +66,7 @@ @style/VectorButtonStyle - @style/VectorToolbarStyle + @style/VectorToolbar @style/VectorAlertDialogStyleDark @@ -89,13 +90,6 @@ sans - - @style/Vector.Styled.ActionBar - @style/Vector.Styled.ActionBar - - - @style/Vector.ActionBarTheme - @null diff --git a/vector/src/main/res/values/theme_light.xml b/vector/src/main/res/values/theme_light.xml index 9469b0f5e6..61e7242c94 100644 --- a/vector/src/main/res/values/theme_light.xml +++ b/vector/src/main/res/values/theme_light.xml @@ -32,6 +32,7 @@ @color/vctr_bottom_nav_icon_color_light @color/vctr_waiting_background_color_light @color/vctr_chat_effect_snow_background_light + @color/element_background_light #61708B @@ -65,7 +66,7 @@ @style/VectorButtonStyle - @style/VectorToolbarStyle + @style/VectorToolbar @style/VectorAlertDialogStyleLight @@ -89,13 +90,6 @@ sans - - @style/Vector.Styled.ActionBar - @style/Vector.Styled.ActionBar - - - @style/Vector.ActionBarTheme - @null From 8162d1100db4688b0a96c6d41a7be91028b08626 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 10 Jun 2021 17:43:43 +0200 Subject: [PATCH 083/254] Update navigation colors --- .../color/bottom_navigation_icon_tint_selector.xml | 2 +- .../src/main/res/drawable/bg_bottom_navigation.xml | 6 ++++++ vector/src/main/res/layout/fragment_home_detail.xml | 4 ---- .../src/main/res/values/styles_bottom_navigation.xml | 12 ++++++++++++ vector/src/main/res/values/theme_dark.xml | 1 + vector/src/main/res/values/theme_light.xml | 1 + 6 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 vector/src/main/res/drawable/bg_bottom_navigation.xml create mode 100644 vector/src/main/res/values/styles_bottom_navigation.xml diff --git a/vector/src/main/res/color/bottom_navigation_icon_tint_selector.xml b/vector/src/main/res/color/bottom_navigation_icon_tint_selector.xml index a6cf578295..403ed865e7 100644 --- a/vector/src/main/res/color/bottom_navigation_icon_tint_selector.xml +++ b/vector/src/main/res/color/bottom_navigation_icon_tint_selector.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/vector/src/main/res/drawable/bg_bottom_navigation.xml b/vector/src/main/res/drawable/bg_bottom_navigation.xml new file mode 100644 index 0000000000..3011da0026 --- /dev/null +++ b/vector/src/main/res/drawable/bg_bottom_navigation.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_home_detail.xml b/vector/src/main/res/layout/fragment_home_detail.xml index df21c6af80..3b8030a828 100644 --- a/vector/src/main/res/layout/fragment_home_detail.xml +++ b/vector/src/main/res/layout/fragment_home_detail.xml @@ -164,10 +164,6 @@ android:id="@+id/bottomNavigationView" android:layout_width="0dp" android:layout_height="wrap_content" - android:background="?vctr_system" - app:itemIconSize="20dp" - app:itemIconTint="@color/bottom_navigation_icon_tint_selector" - app:labelVisibilityMode="unlabeled" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/values/styles_bottom_navigation.xml b/vector/src/main/res/values/styles_bottom_navigation.xml new file mode 100644 index 0000000000..ddd5e7d30a --- /dev/null +++ b/vector/src/main/res/values/styles_bottom_navigation.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/values/theme_dark.xml b/vector/src/main/res/values/theme_dark.xml index 3904ac5b45..4d200149ed 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/vector/src/main/res/values/theme_dark.xml @@ -68,6 +68,7 @@ @style/VectorButtonStyle @style/VectorToolbar @style/VectorAlertDialogStyleDark + @style/VectorBottomNavigation @style/VectorTextInputLayout diff --git a/vector/src/main/res/values/theme_light.xml b/vector/src/main/res/values/theme_light.xml index 61e7242c94..1b46d09726 100644 --- a/vector/src/main/res/values/theme_light.xml +++ b/vector/src/main/res/values/theme_light.xml @@ -68,6 +68,7 @@ @style/VectorButtonStyle @style/VectorToolbar @style/VectorAlertDialogStyleLight + @style/VectorBottomNavigation @style/VectorTextInputLayout From 3473d669d30980f60d11babdd09931d9746ca1af Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 10 Jun 2021 20:25:00 +0200 Subject: [PATCH 084/254] Use MaterialToolbar and AppBarLayout in all screens --- .../check/forbidden_strings_in_resources.txt | 4 + .../root/src/app_package/Activity.kt.ftl | 4 +- .../layout/activity_test_material_theme.xml | 20 +- .../app/core/platform/ToolbarConfigurable.kt | 4 +- .../app/core/platform/VectorBaseActivity.kt | 4 +- .../app/core/platform/VectorBaseFragment.kt | 4 +- .../preview/AttachmentsPreviewActivity.kt | 4 +- .../vector/app/features/home/HomeActivity.kt | 4 +- .../home/room/detail/RoomDetailActivity.kt | 4 +- .../app/features/login/LoginActivity.kt | 4 +- .../app/features/login2/LoginActivity2.kt | 4 +- .../im/vector/app/features/pin/PinActivity.kt | 4 +- .../reactions/EmojiReactionPickerActivity.kt | 5 +- .../createroom/CreateRoomActivity.kt | 4 +- .../roompreview/RoomPreviewActivity.kt | 4 +- .../RoomMemberProfileActivity.kt | 4 +- .../roomprofile/RoomProfileActivity.kt | 4 +- .../features/share/IncomingShareActivity.kt | 4 +- .../spaces/manage/SpaceManageActivity.kt | 4 +- .../app/features/widgets/WidgetActivity.kt | 4 +- vector/src/main/res/layout/activity.xml | 15 +- .../res/layout/activity_big_image_viewer.xml | 19 +- .../main/res/layout/activity_bug_report.xml | 12 +- .../res/layout/activity_call_transfer.xml | 30 +-- .../layout/activity_emoji_reaction_picker.xml | 7 +- .../res/layout/activity_filtered_rooms.xml | 35 ++-- .../res/layout/activity_incoming_share.xml | 35 ++-- .../src/main/res/layout/activity_search.xml | 35 ++-- .../res/layout/activity_vector_settings.xml | 21 ++- .../res/layout/activity_vector_web_view.xml | 19 +- .../src/main/res/layout/activity_widget.xml | 15 +- .../layout/fragment_attachments_preview.xml | 21 ++- .../res/layout/fragment_contacts_book.xml | 172 ++++++++--------- ...ent_create_direct_room_directory_users.xml | 122 ++++++------ .../main/res/layout/fragment_create_room.xml | 82 +++++---- .../main/res/layout/fragment_home_detail.xml | 173 +++++++++--------- .../res/layout/fragment_incoming_share.xml | 35 ++-- .../main/res/layout/fragment_login_web.xml | 17 +- .../res/layout/fragment_matrix_profile.xml | 4 +- .../main/res/layout/fragment_public_rooms.xml | 12 +- .../fragment_recyclerview_with_search.xml | 7 +- .../main/res/layout/fragment_room_detail.xml | 133 +++++++------- .../layout/fragment_room_directory_picker.xml | 14 +- .../fragment_room_preview_no_preview.xml | 89 ++++----- .../layout/fragment_room_setting_generic.xml | 92 +++++----- .../main/res/layout/fragment_room_uploads.xml | 6 +- .../res/layout/fragment_space_add_rooms.xml | 13 +- .../res/layout/fragment_space_preview.xml | 115 ++++++------ .../res/layout/fragment_user_code_show.xml | 84 +++++---- .../res/layout/fragment_user_directory.xml | 125 ++++++------- .../main/res/layout/fragment_user_list.xml | 162 ++++++++-------- vector/src/main/res/values/styles_riot.xml | 4 - vector/src/main/res/values/styles_toolbar.xml | 8 +- 53 files changed, 956 insertions(+), 874 deletions(-) diff --git a/tools/check/forbidden_strings_in_resources.txt b/tools/check/forbidden_strings_in_resources.txt index 92eec6cdfd..4ebc4008c1 100644 --- a/tools/check/forbidden_strings_in_resources.txt +++ b/tools/check/forbidden_strings_in_resources.txt @@ -98,6 +98,10 @@ layout_constraintLeft_ ### Use com.google.android.material.switchmaterial.SwitchMaterial instead of Switch, the inflater will not automatically inflate Material Views for Switch. - + app:layout_constraintTop_toTopOf="parent"> + + + + + app:layout_constraintTop_toBottomOf="@+id/appBarLayout"> : AppCompatActivity(), HasScr /** * Configure the Toolbar, with default back button. */ - protected fun configureToolbar(toolbar: Toolbar, displayBack: Boolean = true) { + protected fun configureToolbar(toolbar: MaterialToolbar, displayBack: Boolean = true) { setSupportActionBar(toolbar) supportActionBar?.let { it.setDisplayShowHomeEnabled(displayBack) diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt index b5b6937aad..c513007c3d 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt @@ -29,7 +29,7 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper import androidx.annotation.MainThread -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.lifecycle.ViewModelProvider import androidx.viewbinding.ViewBinding import com.airbnb.mvrx.BaseMvRxFragment @@ -224,7 +224,7 @@ abstract class VectorBaseFragment : BaseMvRxFragment(), HasScre /** * Configure the Toolbar. */ - protected fun setupToolbar(toolbar: Toolbar) { + protected fun setupToolbar(toolbar: MaterialToolbar) { val parentActivity = vectorBaseActivity if (parentActivity is ToolbarConfigurable) { parentActivity.configure(toolbar) diff --git a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt index f282cc3358..6c25f688bd 100644 --- a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt +++ b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewActivity.kt @@ -19,7 +19,7 @@ package im.vector.app.features.attachments.preview import android.content.Context import android.content.Intent -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import im.vector.app.R import im.vector.app.core.extensions.addFragment import im.vector.app.core.platform.ToolbarConfigurable @@ -72,7 +72,7 @@ class AttachmentsPreviewActivity : VectorBaseActivity(), finish() } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } } 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 64c87d00e9..4a563b563a 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 @@ -24,7 +24,7 @@ import android.os.Bundle import android.os.Parcelable import android.view.Menu import android.view.MenuItem -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.GravityCompat import androidx.core.view.isVisible import androidx.drawerlayout.widget.DrawerLayout @@ -437,7 +437,7 @@ class HomeActivity : serverBackupStatusViewModel.refreshRemoteStateIfNeeded() } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar, false) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt index 640e9a62ff..ce3346f8a6 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt @@ -20,7 +20,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.widget.Toast -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout import com.airbnb.mvrx.viewModel @@ -132,7 +132,7 @@ class RoomDetailActivity : super.onDestroy() } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt index ae099dba3f..07dfc62602 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt @@ -21,7 +21,7 @@ import android.content.Intent import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.core.view.isVisible @@ -356,7 +356,7 @@ open class LoginActivity : VectorBaseActivity(), ToolbarCo } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt index 9adf4bd6c2..60eb1934d0 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginActivity2.kt @@ -21,7 +21,7 @@ import android.content.Intent import android.view.View import android.view.ViewGroup import androidx.annotation.CallSuper -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.core.view.isVisible @@ -388,7 +388,7 @@ open class LoginActivity2 : VectorBaseActivity(), ToolbarC } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } diff --git a/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt b/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt index 66ebfa929d..6866afa0a6 100644 --- a/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt +++ b/vector/src/main/java/im/vector/app/features/pin/PinActivity.kt @@ -18,7 +18,7 @@ package im.vector.app.features.pin import android.content.Context import android.content.Intent -import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.MaterialToolbar import com.airbnb.mvrx.MvRx import im.vector.app.R import im.vector.app.core.extensions.addFragment @@ -47,7 +47,7 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigur } } - override fun configure(toolbar: Toolbar) { + override fun configure(toolbar: MaterialToolbar) { configureToolbar(toolbar) } } diff --git a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt index b2f1c3c15a..ecfaf93747 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt @@ -24,7 +24,6 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.widget.SearchView -import androidx.appcompat.widget.Toolbar import androidx.core.view.isVisible import com.airbnb.mvrx.viewModel import com.google.android.material.tabs.TabLayout @@ -150,13 +149,13 @@ class EmojiReactionPickerActivity : VectorBaseActivity